Code Smell Corrections
continuous-integration/drone/push Build is passing Details

Tests
Louison PARANT 2 years ago
parent 2a5e43ded9
commit ef5c4f1eb1

@ -1,21 +1,18 @@
import {StatusBar} from 'expo-status-bar'; import {StatusBar} from 'expo-status-bar'
import {SafeAreaProvider} from 'react-native-safe-area-context'; import {SafeAreaProvider} from 'react-native-safe-area-context'
import useCachedResources from './hooks/useCachedResources'; import useCachedResources from './hooks/useCachedResources'
import useColorScheme from './hooks/useColorScheme'; import useColorScheme from './hooks/useColorScheme'
import Navigation from './navigation'; import Navigation from './navigation'
import {View} from "react-native"; import store from "./redux/store"
import store from "./redux/store"; import {Provider} from "react-redux"
import {Provider, useDispatch} from "react-redux"; import {useState} from "react"
import {useEffect, useState} from "react";
import {getTrendingID} from "./redux/actions/actionGetTrendingID";
export default function App() { export default function App() {
const isLoadingComplete = useCachedResources(); const isLoadingComplete = useCachedResources()
const colorScheme = useColorScheme(); const colorScheme = useColorScheme()
if (!isLoadingComplete) { if (!isLoadingComplete) {
return null; return null
} else { } else {
return ( return (
<Provider store={store}> <Provider store={store}>

@ -1,55 +1,42 @@
/** import {FontAwesomeIcon} from "@fortawesome/react-native-fontawesome"
* If you are not familiar with React Navigation, refer to the "Fundamentals" guide: import {faClock, faFilm, faHeart} from "@fortawesome/free-solid-svg-icons"
* https://reactnavigation.org/docs/getting-started import {createBottomTabNavigator} from '@react-navigation/bottom-tabs'
* import {NavigationContainer, DefaultTheme, DarkTheme} from '@react-navigation/native'
*/ import {createNativeStackNavigator} from '@react-navigation/native-stack'
import {FontAwesome} from '@expo/vector-icons'; import * as React from 'react'
import {FontAwesomeIcon} from "@fortawesome/react-native-fontawesome"; import {ColorSchemeName} from 'react-native'
import {faClock, faFilm, faHeart} from "@fortawesome/free-solid-svg-icons"; import useColorScheme from '../hooks/useColorScheme'
import Ionicons from '@expo/vector-icons/Ionicons'; import NotFoundScreen from '../screens/NotFoundScreen'
import {createBottomTabNavigator} from '@react-navigation/bottom-tabs'; import WatchLaterScreen from '../screens/WatchLaterScreen'
import {NavigationContainer, DefaultTheme, DarkTheme} from '@react-navigation/native'; import FavoriteScreen from '../screens/FavoriteScreen'
import {createNativeStackNavigator} from '@react-navigation/native-stack'; import HomeScreen from '../screens/HomeScreen'
import * as React from 'react'; import InfoScreen from '../screens/InfoScreen'
import {Appearance, ColorSchemeName, Pressable} from 'react-native'; import {RootStackParamList, RootTabParamList, RootTabScreenProps} from '../types'
import LinkingConfiguration from './LinkingConfiguration'
import Colors from '../constants/Colors'; import {useCallback, useEffect, useState} from "react"
import useColorScheme from '../hooks/useColorScheme'; import {useDispatch} from "react-redux"
import NotFoundScreen from '../screens/NotFoundScreen'; import {getTrendingID, loadWatchLater} from "../redux/actions/actions"
import WatchLaterScreen from '../screens/WatchLaterScreen'; import * as SplashScreen from 'expo-splash-screen'
import FavoriteScreen from '../screens/FavoriteScreen';
import HomeScreen from '../screens/HomeScreen';
import InfoScreen from '../screens/InfoScreen';
import {RootStackParamList, RootTabParamList, RootTabScreenProps} from '../types';
import LinkingConfiguration from './LinkingConfiguration';
import {useCallback, useEffect, useState} from "react";
import {useDispatch} from "react-redux";
import {getTrendingID, loadWatchLater} from "../redux/actions/actionGetTrendingID";
import * as SplashScreen from 'expo-splash-screen';
import {getWatchLaterList} from "../storage/storageFavourite";
export default function Navigation({colorScheme}: { colorScheme: ColorSchemeName }) { export default function Navigation({colorScheme}: { colorScheme: ColorSchemeName }) {
const [appIsReady, setAppIsReady] = useState(false); const [appIsReady, setAppIsReady] = useState(false)
const dispatch = useDispatch(); const dispatch = useDispatch()
useEffect(() => { useEffect(() => {
async function prepare() { async function prepare() {
try { try {
const loadTrendingID = async () => { const loadTrendingID = async () => {
// @ts-ignore // @ts-ignore
await dispatch(getTrendingID()); dispatch(getTrendingID())
}; };
//console.log("test1:", trendingMovies); loadTrendingID()
loadTrendingID();
const list = dispatch(loadWatchLater()); const list = dispatch(loadWatchLater())
console.log("test1:", list); loadWatchLater(list)
loadWatchLater(list);
} catch (e) { } catch (e) {
//console.warn(e);
} finally { } finally {
// Tell the application to render // Tell the application to render
setAppIsReady(true); setAppIsReady(true)
} }
} }
@ -57,14 +44,14 @@ export default function Navigation({colorScheme}: { colorScheme: ColorSchemeName
prepare(); prepare();
}, []); }, []);
const onLayoutRootView = useCallback(async () => { useCallback(async () => {
if (appIsReady) { if (appIsReady) {
// This tells the splash screen to hide immediately! If we call this after // This tells the splash screen to hide immediately! If we call this after
// `setAppIsReady`, then we may see a blank screen while the app is // `setAppIsReady`, then we may see a blank screen while the app is
// loading its initial state and rendering its first pixels. So instead, // loading its initial state and rendering its first pixels. So instead,
// we hide the splash screen once we know the root view has already // we hide the splash screen once we know the root view has already
// performed layout. // performed layout.
await SplashScreen.hideAsync(); await SplashScreen.hideAsync()
} }
}, [appIsReady]); }, [appIsReady]);
if (!appIsReady) { if (!appIsReady) {
@ -83,7 +70,7 @@ export default function Navigation({colorScheme}: { colorScheme: ColorSchemeName
* A root stack navigator is often used for displaying modals on top of all other content. * A root stack navigator is often used for displaying modals on top of all other content.
* https://reactnavigation.org/docs/modal * https://reactnavigation.org/docs/modal
*/ */
const Stack = createNativeStackNavigator<RootStackParamList>(); const Stack = createNativeStackNavigator<RootStackParamList>()
function RootNavigator() { function RootNavigator() {
return ( return (
@ -102,10 +89,10 @@ function RootNavigator() {
* A bottom tab navigator displays tab buttons on the bottom of the display to switch screens. * A bottom tab navigator displays tab buttons on the bottom of the display to switch screens.
* https://reactnavigation.org/docs/bottom-tab-navigator * https://reactnavigation.org/docs/bottom-tab-navigator
*/ */
const BottomTab = createBottomTabNavigator<RootTabParamList>(); const BottomTab = createBottomTabNavigator<RootTabParamList>()
function BottomTabNavigator() { function BottomTabNavigator() {
let colorScheme = useColorScheme(); let colorScheme = useColorScheme()
const isLightTheme = colorScheme === "light" const isLightTheme = colorScheme === "light"
return ( return (

@ -1,7 +1,7 @@
import {ADD_FAVOURITE, ADD_WATCHLATER, FETCH_FAVOURITE, FETCH_TRENDING_MOVIE, FETCH_WATCHLATER, LOAD_FAVOURITE, LOAD_WATCHLATER, POP_FIRST_TRENDING} from '../constants'; import {ADD_FAVOURITE, ADD_WATCHLATER, FETCH_TRENDING_MOVIE, LOAD_FAVOURITE, LOAD_WATCHLATER, POP_FIRST_TRENDING} from '../constants'
import config from "../../constants/config"; import config from "../../constants/config"
import Movie from "../../model/Movie"; import Movie from "../../model/Movie"
import {getFavouriteList, getWatchLaterList} from "../../storage/storageFavourite"; import {getFavouriteList, getWatchLaterList} from "../../storage/storage"
@ -9,14 +9,14 @@ export const setWatchLater = (TrendingMovieList: null | Movie[]) => {
return { return {
type: LOAD_WATCHLATER, type: LOAD_WATCHLATER,
payload: TrendingMovieList, payload: TrendingMovieList,
}; }
} }
export const setFavourite = (FavouriteList: null | Movie[]) => { export const setFavourite = (FavouriteList: null | Movie[]) => {
return { return {
type: LOAD_FAVOURITE, type: LOAD_FAVOURITE,
payload: FavouriteList, payload: FavouriteList,
}; }
} }

@ -1,6 +1,5 @@
import {POP_FIRST_TRENDING, FETCH_TRENDING_MOVIE, FETCH_TRENDING_ID, ADD_WATCHLATER, FETCH_WATCHLATER, ADD_FAVOURITE, FETCH_FAVOURITE, LOAD_WATCHLATER, LOAD_FAVOURITE} from "../constants"; import {POP_FIRST_TRENDING, FETCH_TRENDING_MOVIE, FETCH_TRENDING_ID, ADD_WATCHLATER, FETCH_WATCHLATER, ADD_FAVOURITE, FETCH_FAVOURITE, LOAD_WATCHLATER, LOAD_FAVOURITE} from "../constants";
import Movie from "../../model/Movie"; import Movie from "../../model/Movie";
import {getFavouriteList, getWatchLaterList} from "../../storage/storageFavourite";
const initialState = { const initialState = {
trendingIDs: [], trendingIDs: [],

@ -6,7 +6,7 @@ import {RootTabScreenProps} from "../types";
import {useSafeAreaInsets} from "react-native-safe-area-context"; import {useSafeAreaInsets} from "react-native-safe-area-context";
import {useDispatch, useSelector} from 'react-redux'; import {useDispatch, useSelector} from 'react-redux';
import {useEffect, useState} from 'react'; import {useEffect, useState} from 'react';
import {getFavourite} from "../redux/actions/actionGetTrendingID"; import {getFavourite} from "../redux/actions/actions";
import Movie from "../model/Movie"; import Movie from "../model/Movie";
import {MovieListComponent} from "../components/MovieListComponent"; import {MovieListComponent} from "../components/MovieListComponent";

@ -3,7 +3,7 @@ import {TouchableOpacity, View, Text, StyleSheet, Image, ImageBackground, SafeAr
import {RootStackScreenProps} from "../types"; import {RootStackScreenProps} from "../types";
import {useEffect, useRef, useState} from "react"; import {useEffect, useRef, useState} from "react";
import {useSafeAreaInsets} from "react-native-safe-area-context"; import {useSafeAreaInsets} from "react-native-safe-area-context";
import {addMovieToWatchLater, addMovieToFavourite, removeMovieTrending,} from "../redux/actions/actionGetTrendingID"; import {addMovieToWatchLater, addMovieToFavourite, removeMovieTrending,} from "../redux/actions/actions";
import {useDispatch, useSelector} from 'react-redux'; import {useDispatch, useSelector} from 'react-redux';
import Movie from "../model/Movie"; import Movie from "../model/Movie";
import moment from 'moment'; import moment from 'moment';
@ -12,27 +12,27 @@ import AnimatedLottieView from "lottie-react-native";
import {Timer, Timer2} from "../components/TimerComponent"; import {Timer, Timer2} from "../components/TimerComponent";
import {HeaderMovie} from "../components/HeaderMovieComponent"; import {HeaderMovie} from "../components/HeaderMovieComponent";
import {NewCard, SuggestedCard} from "../components/cards"; import {NewCard, SuggestedCard} from "../components/cards";
import {setFavouriteList,setWatchLaterList} from "../storage/storageFavourite" import {setFavouriteList,setWatchLaterList} from "../storage/storage"
export default function HomeScreen({navigation}: RootStackScreenProps<'Home'>) { export default function HomeScreen({navigation}: RootStackScreenProps<'Home'>) {
// @ts-ignore // @ts-ignore
const trendingMovies = useSelector(state => state.appReducer.trendingMovies); const trendingMovies = useSelector(state => state.appReducer.trendingMovies)
// @ts-ignore // @ts-ignore
const watchLaterMovies = useSelector(state => state.appReducer.watchLaterMovies); const watchLaterMovies = useSelector(state => state.appReducer.watchLaterMovies)
// @ts-ignore // @ts-ignore
const favouriteMovies = useSelector(state => state.appReducer.favouriteMovies); const favouriteMovies = useSelector(state => state.appReducer.favouriteMovies)
const dispatch = useDispatch(); const dispatch = useDispatch()
const [hours, setHours] = useState(0); const [hours, setHours] = useState(0)
const [minutes, setMinutes] = useState(0); const [minutes, setMinutes] = useState(0)
const [seconds, setSeconds] = useState(0); const [seconds, setSeconds] = useState(0)
const [displayIndex, setdisplayIndex] = useState(0); const [displayIndex, setdisplayIndex] = useState(0);
const [suggestedMovies, setSuggestedMovies] = useState<number[]>([]); const [suggestedMovies, setSuggestedMovies] = useState<number[]>([])
var swiper: any = null; var swiper: any = null
const insets = useSafeAreaInsets(); const insets = useSafeAreaInsets()
const styles = StyleSheet.create({ const styles = StyleSheet.create({
background1: { background1: {
@ -132,71 +132,63 @@ export default function HomeScreen({navigation}: RootStackScreenProps<'Home'>) {
} }
}); })
useEffect(() => { useEffect(() => {
/*const clearAllStorage = async () => {
try {
await AsyncStorage.clear()
} catch (e) {
console.log("An error occurred", e);
}
}
clearAllStorage()*/
const interval = setInterval(() => { const interval = setInterval(() => {
const today = moment(); const today = moment()
today.set({hour: 0, minute: 0, second: 0, millisecond: 0}); today.set({hour: 0, minute: 0, second: 0, millisecond: 0})
const tonight = today.add(1, 'days'); const tonight = today.add(1, 'days')
const timestamp = tonight.valueOf(); const timestamp = tonight.valueOf()
const now = new Date(); const now = new Date()
const difference = timestamp - now.getTime(); const difference = timestamp - now.getTime()
const h = Math.floor( const h = Math.floor(
(difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60) (difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
); )
setHours(h); setHours(h)
const m = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60)); const m = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60))
setMinutes(m); setMinutes(m)
const s = Math.floor((difference % (1000 * 60)) / 1000); const s = Math.floor((difference % (1000 * 60)) / 1000)
setSeconds(s); setSeconds(s)
}); });
getSuggested(); getSuggested()
}, []); }, []);
const getSuggested = async () => { const getSuggested = async () => {
const suggestedResponse = (await fetch("https://codefirst.iut.uca.fr/containers/lucasdelanier-containermoviefinder/api/Suggested")); const suggestedResponse = (await fetch("https://codefirst.iut.uca.fr/containers/lucasdelanier-containermoviefinder/api/Suggested"))
const suggestedJson = await suggestedResponse.json(); const suggestedJson = await suggestedResponse.json()
//console.log("trailer", trailerJson) //console.log("trailer", trailerJson)
// @ts-ignore // @ts-ignore
const suggestedMovies = suggestedJson.map((element) => { const suggestedMovies = suggestedJson.map((element) => {
return element; return element
}) })
console.log("suggested", suggestedMovies) console.log("suggested", suggestedMovies)
setSuggestedMovies(suggestedMovies); setSuggestedMovies(suggestedMovies)
} }
function addWatchLater(props: Movie) { function addWatchLater(props: Movie) {
const newwatchLaterMovies = [props, ...watchLaterMovies] const newWatchLaterMovies = [props, ...watchLaterMovies]
if(watchLaterMovies.filter((movie : Movie) => movie.original_title === props.original_title).length > 0){ if(watchLaterMovies.filter((movie : Movie) => movie.original_title === props.original_title).length > 0){
return null return null
} }
else{ else{
dispatch(addMovieToWatchLater(props)); dispatch(addMovieToWatchLater(props))
dispatch(removeMovieTrending(props)); dispatch(removeMovieTrending(props))
setWatchLaterList(newwatchLaterMovies); setWatchLaterList(newWatchLaterMovies)
console.log("movie: ", props.id, props.full_date, new Date(props.full_date).getTime()), new Date(trendingMovies[displayIndex].full_date).getTime(); console.log("movie: ", props.id, props.full_date, new Date(props.full_date).getTime()), new Date(trendingMovies[displayIndex].full_date).getTime()
if (displayIndex == trendingMovies.length - 1) { if (displayIndex == trendingMovies.length - 1) {
setdisplayIndex(0); setdisplayIndex(0)
swiper.swipeLeft(); swiper.swipeLeft()
} }
} }
@ -208,26 +200,24 @@ export default function HomeScreen({navigation}: RootStackScreenProps<'Home'>) {
return null return null
} }
else{ else{
dispatch(addMovieToFavourite(props))
dispatch(addMovieToFavourite(props)); dispatch(removeMovieTrending(props))
dispatch(removeMovieTrending(props));
console.log(favouriteMovies) console.log(favouriteMovies)
setFavouriteList(newFavouriteMovies); setFavouriteList(newFavouriteMovies)
console.log("movie: ", props.id, props.full_date, new Date(props.full_date).getTime()), new Date(trendingMovies[displayIndex].full_date).getTime(); console.log("movie: ", props.id, props.full_date, new Date(props.full_date).getTime()), new Date(trendingMovies[displayIndex].full_date).getTime()
if (displayIndex == trendingMovies.length - 1) { if (displayIndex == trendingMovies.length - 1) {
setdisplayIndex(0); setdisplayIndex(0)
swiper.swipeLeft(); swiper.swipeLeft()
} }
} }
} }
function popFirstTrending(props: Movie) { function popFirstTrending(props: Movie) {
dispatch(removeMovieTrending(props)); dispatch(removeMovieTrending(props))
if (displayIndex == trendingMovies.length - 1) { if (displayIndex == trendingMovies.length - 1) {
setdisplayIndex(0); setdisplayIndex(0)
swiper.swipeLeft(); swiper.swipeLeft()
} }
} }

@ -6,7 +6,7 @@ import {RootTabScreenProps} from "../types";
import {useSafeAreaInsets} from "react-native-safe-area-context"; import {useSafeAreaInsets} from "react-native-safe-area-context";
import {useDispatch, useSelector} from 'react-redux'; import {useDispatch, useSelector} from 'react-redux';
import {useEffect, useState} from 'react'; import {useEffect, useState} from 'react';
import {getWatchLater} from "../redux/actions/actionGetTrendingID"; import {getWatchLater} from "../redux/actions/actions";
import Movie from "../model/Movie"; import Movie from "../model/Movie";
import {MovieListComponent} from "../components/MovieListComponent"; import {MovieListComponent} from "../components/MovieListComponent";

@ -1,47 +1,68 @@
import AsyncStorage from '@react-native-async-storage/async-storage'; import AsyncStorage from '@react-native-async-storage/async-storage'
import Movie from "../model/Movie"; import Movie from "../model/Movie"
import {useDispatch, useSelector} from "react-redux";
export const getFavouriteList = async () => { export const getFavouriteList = async () => {
try { try {
const value = await AsyncStorage.getItem('favourite'); const value = await AsyncStorage.getItem('favourite');
if (value === null) { if (value === null) {
return []; return null
} }
const favouriteList: Movie[] = await JSON.parse(value!) const favouriteList: Movie[] = await JSON.parse(value!)
return favouriteList; return favouriteList
} catch (error) { } catch (error) {
console.log(error) console.log(error)
return []; return null
} }
}; }
export const setFavouriteList = async (favouriteList: Movie[]) => { export const setFavouriteList = async (favouriteList: Movie[]) => {
try { try {
await AsyncStorage.setItem('favourite', JSON.stringify(favouriteList)); await AsyncStorage.setItem('favourite', JSON.stringify(favouriteList))
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} }
}; }
export const getWatchLaterList = async () => { export const getWatchLaterList = async () => {
try { try {
const value = await AsyncStorage.getItem('watchLater'); const value = await AsyncStorage.getItem('watchLater')
if (value === null) { if (value === null) {
return []; return null
} }
const watchLaterList: Movie[] = await JSON.parse(value!) const watchLaterList: Movie[] = await JSON.parse(value!)
return watchLaterList; return watchLaterList
} catch (error) { } catch (error) {
console.log(error) console.log(error)
return []; return null
} }
}; };
export const setWatchLaterList = async (watchLaterList: Movie[]) => { export const setWatchLaterList = async (watchLaterList: Movie[]) => {
try { try {
await AsyncStorage.setItem('watchLater', JSON.stringify(watchLaterList)); await AsyncStorage.setItem('watchLater', JSON.stringify(watchLaterList))
} catch (error) {
console.log(error)
}
}
export const getMovieList = async () => {
try {
const value = await AsyncStorage.getItem('movie')
if (value === null) {
return null
}
const movieList: Movie[] = await JSON.parse(value!)
return movieList
} catch (error) {
console.log(error)
return null
}
}
export const setMovieList = async (movieList: Movie[]) => {
try {
await AsyncStorage.setItem('movie', JSON.stringify(movieList))
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} }
}; }
Loading…
Cancel
Save