Tests
Lucas Delanier 2 years ago
parent c85637aacd
commit 5dd284539c

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@ -1,25 +1,30 @@
class Movie {
public id: number
public original_title: string
public poster_path: string
public poster_path_min: string
public runtime: number
public vote_average: number
public release_date: string
public overview: string
public genres: string[]
public backdrop_path: string
constructor(original_title: string, poster_path: string, runtime: number, vote_average: number, release_date: string, genres: string[], overview: string, id: number) {
constructor(id: number, original_title: string, poster_path: string, runtime: number, vote_average: number, release_date: string, genres: string[], overview: string, backdrop_path: string) {
this.id = id;
this.original_title = original_title;
this.poster_path = 'https://image.tmdb.org/t/p/w780' + poster_path;
this.poster_path_min = 'https://image.tmdb.org/t/p/w500' + poster_path;
this.runtime = runtime;
this.release_date = release_date.substring(0, 4);
this.genres = genres;
this.overview = overview;
this.vote_average = vote_average;
this.backdrop_path = 'https://image.tmdb.org/t/p/w780' + backdrop_path;
}

@ -4,38 +4,44 @@
* https://reactnavigation.org/docs/configuring-links
*/
import { LinkingOptions } from '@react-navigation/native';
import {LinkingOptions} from '@react-navigation/native';
import * as Linking from 'expo-linking';
import { RootStackParamList } from '../types';
import {RootStackParamList} from '../types';
const linking: LinkingOptions<RootStackParamList> = {
prefixes: [Linking.createURL('/')],
config: {
screens: {
Root: {
prefixes: [Linking.createURL('/')],
config: {
screens: {
WatchLater: {
screens: {
WatchLaterScreen: 'WatchLater',
},
},
Home: {
screens: {
HomeScreen: 'Home',
},
},
Favorite: {
screens: {
FavoriteScreen: 'Favorite',
Root: {
screens: {
WatchLater: {
screens: {
WatchLaterScreen: 'WatchLater',
},
},
Home: {
screens: {
HomeScreen: 'Home',
},
},
Favorite: {
screens: {
FavoriteScreen: 'Favorite',
},
},
Info: {
screens: {
FavoriteScreen: 'InfoScreen',
},
},
},
},
},
Modal: 'modal',
NotFound: '*',
},
},
Modal: 'modal',
NotFound: '*',
},
},
};
export default linking;

@ -19,6 +19,7 @@ import NotFoundScreen from '../screens/NotFoundScreen';
import WatchLaterScreen from '../screens/WatchLaterScreen';
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";
@ -85,6 +86,7 @@ function RootNavigator() {
<Stack.Screen name="NotFound" component={NotFoundScreen} options={{title: 'Oops!'}}/>
<Stack.Screen name="Favorite" component={FavoriteScreen} options={{headerShown: false}}/>
<Stack.Screen name="WatchLater" component={WatchLaterScreen} options={{headerShown: false}}/>
<Stack.Screen name="Info" component={InfoScreen} options={{headerShown: false}}/>
</Stack.Navigator>
);
}

330
package-lock.json generated

@ -30,6 +30,7 @@
"expo-status-bar": "~1.4.2",
"expo-system-ui": "~2.0.1",
"expo-web-browser": "~12.0.0",
"lottie-react-native": "^5.1.5",
"moment": "^2.29.4",
"react": "18.1.0",
"react-dom": "18.1.0",
@ -42,7 +43,12 @@
"react-native-safe-area-context": "4.4.1",
"react-native-screens": "~3.18.0",
"react-native-svg": "^13.7.0",
"react-native-vector-icons": "^9.2.0",
"react-native-video": "^2.3.1",
"react-native-video-player": "^0.14.0",
"react-native-web": "~0.18.9",
"react-native-webview": "11.23.1",
"react-native-youtube-iframe": "^2.2.2",
"react-redux": "^8.0.5",
"redux": "^4.2.1",
"rive-react-native": "^3.0.41"
@ -7571,6 +7577,11 @@
"node": ">=0.10"
}
},
"node_modules/dedent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz",
"integrity": "sha512-cSfRWjXJtZQeRuZGVvDrJroCR5V2UvBNUMHsPCdNYzuAG8b9V8aAy3KUcdQrGQPXs17Y+ojbPh1aOCplg9YR9g=="
},
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@ -8018,6 +8029,14 @@
"node": ">=6"
}
},
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/exec-async": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz",
@ -12422,6 +12441,11 @@
"graceful-fs": "^4.1.6"
}
},
"node_modules/keymirror": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/keymirror/-/keymirror-0.1.1.tgz",
"integrity": "sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg=="
},
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@ -12541,6 +12565,32 @@
"loose-envify": "cli.js"
}
},
"node_modules/lottie-ios": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/lottie-ios/-/lottie-ios-3.5.0.tgz",
"integrity": "sha512-DM6BYLhHTzvUsK89AjY+K9RwVGkOBwbH/iytjyZUmFbXz8DVsoPEyy+c7L5NZmVouZHvLnOQp6NaYTkwMo+iOg==",
"peer": true
},
"node_modules/lottie-react-native": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/lottie-react-native/-/lottie-react-native-5.1.5.tgz",
"integrity": "sha512-xl6uEo50joQeIqso5SvPKt1uGBqMhgNgs+36S4725Nfigf4zAY23/I9QEEkJF+1BHq7wKCeYha2KafLTm20gqA==",
"dependencies": {
"invariant": "^2.2.2",
"react-native-safe-modules": "^1.0.3"
},
"peerDependencies": {
"lottie-ios": "^3.4.0",
"react": "*",
"react-native": ">=0.46",
"react-native-windows": ">=0.63.x"
},
"peerDependenciesMeta": {
"react-native-windows": {
"optional": true
}
}
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -14951,6 +15001,17 @@
"react-native": "*"
}
},
"node_modules/react-native-safe-modules": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/react-native-safe-modules/-/react-native-safe-modules-1.0.3.tgz",
"integrity": "sha512-DUxti4Z+AgJ/ZsO5U7p3uSCUBko8JT8GvFlCeOXk9bMd+4qjpoDvMYpfbixXKgL88M+HwmU/KI1YFN6gsQZyBA==",
"dependencies": {
"dedent": "^0.6.0"
},
"peerDependencies": {
"react-native": "*"
}
},
"node_modules/react-native-screens": {
"version": "3.18.2",
"resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.18.2.tgz",
@ -14977,6 +15038,96 @@
"react-native": "*"
}
},
"node_modules/react-native-vector-icons": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-9.2.0.tgz",
"integrity": "sha512-wKYLaFuQST/chH3AJRjmOLoLy3JEs1JR6zMNgTaemFpNoXs0ztRnTxcxFD9xhX7cJe1/zoN5BpQYe7kL0m5yyA==",
"dependencies": {
"prop-types": "^15.7.2",
"yargs": "^16.1.1"
},
"bin": {
"fa5-upgrade": "bin/fa5-upgrade.sh",
"generate-icon": "bin/generate-icon.js"
}
},
"node_modules/react-native-vector-icons/node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/react-native-vector-icons/node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"engines": {
"node": ">=10"
}
},
"node_modules/react-native-vector-icons/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/react-native-vector-icons/node_modules/yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"engines": {
"node": ">=10"
}
},
"node_modules/react-native-video": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/react-native-video/-/react-native-video-2.3.1.tgz",
"integrity": "sha512-fTeVcp0IXL4MY/IjzISqdCCikWb5hfmkLfJTSa1B5qvmbca3R4gFvFICQO4CFvfetInra8P9g1LFnvmfMhy7Gw==",
"dependencies": {
"keymirror": "0.1.1",
"prop-types": "^15.5.10"
}
},
"node_modules/react-native-video-player": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/react-native-video-player/-/react-native-video-player-0.14.0.tgz",
"integrity": "sha512-lgdqq9h3Mi2poRII3sCE9RgrZIA140bWd83NEzyZp3andKaUiXKYSFcWu+BoySn2Y24dCrDFnhVEkvPq6sTndg==",
"dependencies": {
"deprecated-react-native-prop-types": "^2.3.0"
},
"peerDependencies": {
"prop-types": "*",
"react": "*",
"react-native": "*",
"react-native-vector-icons": ">= 2.1.0",
"react-native-video": "^2.0.0"
}
},
"node_modules/react-native-video-player/node_modules/deprecated-react-native-prop-types": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.3.0.tgz",
"integrity": "sha512-pWD0voFtNYxrVqvBMYf5gq3NA2GCpfodS1yNynTPc93AYA/KEMGeWDqqeUB6R2Z9ZofVhks2aeJXiuQqKNpesA==",
"dependencies": {
"@react-native/normalize-color": "*",
"invariant": "*",
"prop-types": "*"
}
},
"node_modules/react-native-web": {
"version": "0.18.12",
"resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.18.12.tgz",
@ -14995,6 +15146,49 @@
"react-dom": "^17.0.2 || ^18.0.0"
}
},
"node_modules/react-native-webview": {
"version": "11.23.1",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.23.1.tgz",
"integrity": "sha512-bmqsdg4RYOUYD37R9XTrQALm7eD62KbLNPRfgvpLGd1SjaurvAjjsLrLN4mt6yOtKOMKeZvlcAl3x6De6cCQsA==",
"dependencies": {
"escape-string-regexp": "2.0.0",
"invariant": "2.2.4"
},
"peerDependencies": {
"react": "*",
"react-native": "*"
}
},
"node_modules/react-native-webview/node_modules/escape-string-regexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
"engines": {
"node": ">=8"
}
},
"node_modules/react-native-youtube-iframe": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/react-native-youtube-iframe/-/react-native-youtube-iframe-2.2.2.tgz",
"integrity": "sha512-og2KW21kCwAHKcnWoyWWBYC6J2Xtqjjwpghhoy9G6zfwZkr8Ej27BbQIAKM/TheJJUZ5/YUrqsgqAdnFYDx5TQ==",
"dependencies": {
"events": "^3.2.0"
},
"peerDependencies": {
"react": ">=16.8.6",
"react-native": ">=0.60",
"react-native-web-webview": ">=1.0.2",
"react-native-webview": ">=7.0.0"
},
"peerDependenciesMeta": {
"react-native-web-webview": {
"optional": true
},
"react-native-webview": {
"optional": true
}
}
},
"node_modules/react-native/node_modules/@jest/create-cache-key-function": {
"version": "29.4.3",
"resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.4.3.tgz",
@ -23572,6 +23766,11 @@
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
"integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="
},
"dedent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.6.0.tgz",
"integrity": "sha512-cSfRWjXJtZQeRuZGVvDrJroCR5V2UvBNUMHsPCdNYzuAG8b9V8aAy3KUcdQrGQPXs17Y+ojbPh1aOCplg9YR9g=="
},
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@ -23885,6 +24084,11 @@
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
},
"events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
},
"exec-async": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz",
@ -27239,6 +27443,11 @@
"graceful-fs": "^4.1.6"
}
},
"keymirror": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/keymirror/-/keymirror-0.1.1.tgz",
"integrity": "sha512-vIkZAFWoDijgQT/Nvl2AHCMmnegN2ehgTPYuyy2hWQkQSntI0S7ESYqdLkoSe1HyEBFHHkCgSIvVdSEiWwKvCg=="
},
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@ -27331,6 +27540,21 @@
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"lottie-ios": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/lottie-ios/-/lottie-ios-3.5.0.tgz",
"integrity": "sha512-DM6BYLhHTzvUsK89AjY+K9RwVGkOBwbH/iytjyZUmFbXz8DVsoPEyy+c7L5NZmVouZHvLnOQp6NaYTkwMo+iOg==",
"peer": true
},
"lottie-react-native": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/lottie-react-native/-/lottie-react-native-5.1.5.tgz",
"integrity": "sha512-xl6uEo50joQeIqso5SvPKt1uGBqMhgNgs+36S4725Nfigf4zAY23/I9QEEkJF+1BHq7wKCeYha2KafLTm20gqA==",
"requires": {
"invariant": "^2.2.2",
"react-native-safe-modules": "^1.0.3"
}
},
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -29312,6 +29536,14 @@
"integrity": "sha512-N9XTjiuD73ZpVlejHrUWIFZc+6Z14co1K/p1IFMkImU7+avD69F3y+lhkqA2hN/+vljdZrBSiOwXPkuo43nFQA==",
"requires": {}
},
"react-native-safe-modules": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/react-native-safe-modules/-/react-native-safe-modules-1.0.3.tgz",
"integrity": "sha512-DUxti4Z+AgJ/ZsO5U7p3uSCUBko8JT8GvFlCeOXk9bMd+4qjpoDvMYpfbixXKgL88M+HwmU/KI1YFN6gsQZyBA==",
"requires": {
"dedent": "^0.6.0"
}
},
"react-native-screens": {
"version": "3.18.2",
"resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.18.2.tgz",
@ -29330,6 +29562,80 @@
"css-tree": "^1.1.3"
}
},
"react-native-vector-icons": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-9.2.0.tgz",
"integrity": "sha512-wKYLaFuQST/chH3AJRjmOLoLy3JEs1JR6zMNgTaemFpNoXs0ztRnTxcxFD9xhX7cJe1/zoN5BpQYe7kL0m5yyA==",
"requires": {
"prop-types": "^15.7.2",
"yargs": "^16.1.1"
},
"dependencies": {
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
},
"yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
}
},
"yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
}
}
},
"react-native-video": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/react-native-video/-/react-native-video-2.3.1.tgz",
"integrity": "sha512-fTeVcp0IXL4MY/IjzISqdCCikWb5hfmkLfJTSa1B5qvmbca3R4gFvFICQO4CFvfetInra8P9g1LFnvmfMhy7Gw==",
"requires": {
"keymirror": "0.1.1",
"prop-types": "^15.5.10"
}
},
"react-native-video-player": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/react-native-video-player/-/react-native-video-player-0.14.0.tgz",
"integrity": "sha512-lgdqq9h3Mi2poRII3sCE9RgrZIA140bWd83NEzyZp3andKaUiXKYSFcWu+BoySn2Y24dCrDFnhVEkvPq6sTndg==",
"requires": {
"deprecated-react-native-prop-types": "^2.3.0"
},
"dependencies": {
"deprecated-react-native-prop-types": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-2.3.0.tgz",
"integrity": "sha512-pWD0voFtNYxrVqvBMYf5gq3NA2GCpfodS1yNynTPc93AYA/KEMGeWDqqeUB6R2Z9ZofVhks2aeJXiuQqKNpesA==",
"requires": {
"@react-native/normalize-color": "*",
"invariant": "*",
"prop-types": "*"
}
}
}
},
"react-native-web": {
"version": "0.18.12",
"resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.18.12.tgz",
@ -29344,6 +29650,30 @@
"styleq": "^0.1.2"
}
},
"react-native-webview": {
"version": "11.23.1",
"resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-11.23.1.tgz",
"integrity": "sha512-bmqsdg4RYOUYD37R9XTrQALm7eD62KbLNPRfgvpLGd1SjaurvAjjsLrLN4mt6yOtKOMKeZvlcAl3x6De6cCQsA==",
"requires": {
"escape-string-regexp": "2.0.0",
"invariant": "2.2.4"
},
"dependencies": {
"escape-string-regexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
}
}
},
"react-native-youtube-iframe": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/react-native-youtube-iframe/-/react-native-youtube-iframe-2.2.2.tgz",
"integrity": "sha512-og2KW21kCwAHKcnWoyWWBYC6J2Xtqjjwpghhoy9G6zfwZkr8Ej27BbQIAKM/TheJJUZ5/YUrqsgqAdnFYDx5TQ==",
"requires": {
"events": "^3.2.0"
}
},
"react-redux": {
"version": "8.0.5",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz",

@ -35,6 +35,7 @@
"expo-status-bar": "~1.4.2",
"expo-system-ui": "~2.0.1",
"expo-web-browser": "~12.0.0",
"lottie-react-native": "^5.1.5",
"moment": "^2.29.4",
"react": "18.1.0",
"react-dom": "18.1.0",
@ -47,7 +48,12 @@
"react-native-safe-area-context": "4.4.1",
"react-native-screens": "~3.18.0",
"react-native-svg": "^13.7.0",
"react-native-vector-icons": "^9.2.0",
"react-native-video": "^2.3.1",
"react-native-video-player": "^0.14.0",
"react-native-web": "~0.18.9",
"react-native-webview": "11.23.1",
"react-native-youtube-iframe": "^2.2.2",
"react-redux": "^8.0.5",
"redux": "^4.2.1",
"rive-react-native": "^3.0.41"

@ -59,40 +59,40 @@ export const getTrendingID = () => {
// @ts-ignore
return async dispatch => {
try {
const IDPromise = await fetch(config.base_url + "trending/movie/day?api_key="+config.api_key);
const IDPromise = await fetch(config.base_url + "trending/movie/day?api_key=" + config.api_key);
const IDListJson = await IDPromise.json();
// @ts-ignore
const idList: String[] = IDListJson.results.map(elt => elt["id"]);
const MovieList: Movie[] = [];
Promise.all(idList.map(async elt => {
try{
const infoPromise = await fetch(config.base_url + "movie/"+elt+"?api_key=" + config.api_key + "&language=fr-FR");
try {
const infoPromise = await fetch(config.base_url + "movie/" + elt + "?api_key=" + config.api_key + "&language=fr-FR");
//const infoJson = await infoPromise.json();
//console.log('infos---------', infoJson);
//MovieList.push(new Movie(infoJson["original_title"], infoJson["poster_path"],infoJson["runtime"], infoJson["vote_average"], infoJson["release_date"]))
return infoPromise;
}catch (err){
} catch (err) {
//console.log('ErrorGet---------', err);
}
})).then(function (responses){
Promise.all(responses.map(result=>result.json()))
.then(function (elements){
elements.map(elt=> {
})).then(function (responses) {
Promise.all(responses.map(result => result.json()))
.then(function (elements) {
elements.map(elt => {
const infoJson = elt;
const genreRow : String[]= [];
const genreRow: String[] = [];
const videoPath: String = "";
// @ts-ignore
elt["genres"].map(genre => {
genreRow.push(genre.name);
});
console.log('infos---------', elt);
// @ts-ignore
MovieList.push(new Movie(infoJson["title"], infoJson["poster_path"],infoJson["runtime"], infoJson["vote_average"], infoJson["release_date"], genreRow, infoJson["overview"]))
MovieList.push(new Movie(infoJson["id"], infoJson["title"], infoJson["poster_path"], infoJson["runtime"], infoJson["vote_average"], infoJson["release_date"], genreRow, infoJson["overview"], infoJson["backdrop_path"]))
})
try {
//console.log("tortue", MovieList)
dispatch(setinfoMovie(MovieList));
}
catch (err){
} catch (err) {
//console.log('ErrorGet---------', err);
}
})
@ -106,21 +106,21 @@ export const getTrendingID = () => {
}
export const removeMovieTrending = (movie: Movie) => {
return{
return {
type: POP_FIRST_TRENDING,
payload: movie
}
}
export const addMovieToWatchLater = (movie : Movie) => {
return{
export const addMovieToWatchLater = (movie: Movie) => {
return {
type: ADD_WATCHLATER,
payload: movie
}
}
export const addMovieToFavourite = (movie : Movie) => {
return{
export const addMovieToFavourite = (movie: Movie) => {
return {
type: ADD_FAVOURITE,
payload: movie
}

@ -20,6 +20,7 @@ import Movie from "../model/Movie";
import * as url from "url";
import moment from 'moment';
import CardsSwipe from 'react-native-cards-swipe';
import AnimatedLottieView from "lottie-react-native";
export default function HomeScreen({navigation}: RootStackScreenProps<'Home'>) {
// @ts-ignore
@ -122,14 +123,7 @@ export default function HomeScreen({navigation}: RootStackScreenProps<'Home'>) {
//console.log("timer", h, m, s);
});
setTimeout(() => interval, 10000);
const loadTrendingID = async () => {
// @ts-ignore
await dispatch(getTrendingID());
};
//console.log("test1:", trendingMovies);
loadTrendingID();
}, [dispatch]);
}, []);
type ItemProps = {
movie: Movie
@ -306,10 +300,7 @@ export default function HomeScreen({navigation}: RootStackScreenProps<'Home'>) {
<SafeAreaView style={styles.background2}>
<View style={{alignItems: "center", width: "100%", height: "100%", justifyContent: "center", zIndex: 1}}>
<Text style={{color: "white", fontWeight: "600", fontSize: 35}}>Félicitations !</Text>
<Image
source={require('../assets/images/confetti.gif')}
style={{width: 200, height: 200, marginVertical: 50}}
/>
<AnimatedLottieView source={require("../assets/animation.json")} autoPlay={true} loop={true} style={{height: 200}}/>
<Text style={{color: "grey", fontWeight: "400", paddingHorizontal: 70, textAlign: "center"}}>Vous avez fini la collection du jour.
{"\n"}Revenez à la fin du décompte pour découvrir de nouvelles propositions.</Text>

@ -0,0 +1,140 @@
import * as React from 'react';
import {
Button,
TouchableOpacity,
ScrollView,
View,
Text,
StyleSheet,
Image,
ImageBackground,
SafeAreaView,
ActivityIndicator, FlatList
} from 'react-native';
import {RootStackScreenProps} from "../types";
import {useSafeAreaInsets} from "react-native-safe-area-context";
import Movie from "../model/Movie";
import {LinearGradient} from 'expo-linear-gradient';
import {Stars} from "./HomeScreen";
import {useEffect, useState} from "react";
import config from "../constants/config";
import YoutubeIframe from "react-native-youtube-iframe";
import Icon from "react-native-ionicons";
import Ionicons from "@expo/vector-icons/Ionicons";
export default function InfoScreen({navigation, route}: RootStackScreenProps<'Info'>) {
const item: Movie = route.params.item
console.log("current", item);
const insets = useSafeAreaInsets();
const styles = StyleSheet.create({
background1: {
height: '100%',
width: '100%',
paddingTop: insets.top,
},
});
const [trailerPath, setTrailerPath] = useState("");
const getTriller = async () => {
const trailerResponse = (await fetch(config.base_url + "movie/" + item.id + "/videos?api_key=" + config.api_key + "&language=fr-FR"));
const trailerJson = await trailerResponse.json();
console.log("trailer", trailerJson)
const trailer_key = trailerJson.results.slice(0, 1).map((elt) => {
if (elt["type"] === "Trailer" && elt["site"] === "YouTube") {
return elt["key"];
}
});
console.log("key", trailer_key)
setTrailerPath(trailer_key);
}
useEffect(() => {
getTriller();
}, []);
function formatTime(time: number) {
console.log(time);
const hours = Math.floor(time / 60);
const minutes = time % 60;
return `${hours}h ${minutes < 10 ? `0${minutes}` : minutes}m`;
}
return (
<View style={{backgroundColor: "#0F0F19"}}>
<View style={{height: "100%", width: "100%", position: "absolute"}}>
<Image
style={{
height: "45%",
width: '100%',
opacity: 0.5,
position: "absolute"
}}
source={{
uri: item.backdrop_path,
}}
></Image>
<LinearGradient
// Background Linear Gradient
colors={['rgba(0,0,0,0.8)', 'transparent']}
/>
<LinearGradient style={{height: "30%", top: "25%",}}
// Button Linear Gradient
colors={['rgba(15,15,25,0)', 'rgba(15,15,25,0.7)', 'rgba(15,15,25,1)', 'rgba(15,15,25,1)']}>
</LinearGradient>
</View>
<SafeAreaView style={styles.background1}>
<TouchableOpacity onPress={() => navigation.goBack()} style={{zIndex: 100}}>
<Ionicons name="ios-arrow-back" size={30} color="white" style={{position: "absolute", top: 10, left: 10}}/>
</TouchableOpacity>
<ScrollView style={{paddingHorizontal: 35, height: "100%"}}>
<View>
<Text style={{color: "white", fontSize: 43, fontWeight: "bold", paddingBottom: 10, paddingTop: "45%"}} numberOfLines={2}>{item.original_title}</Text>
<View style={{flexDirection: "row", width: "100%", justifyContent: "flex-start"}}>
<InfoBadge texte={`${item.genres[0]} ${item.genres[1] !== undefined ? ", " + item.genres[1] : ""}`}></InfoBadge>
<InfoBadge texte={item.release_date}></InfoBadge>
<InfoBadge texte={formatTime(item.runtime)}></InfoBadge>
</View>
<View style={{flexDirection: "row", width: "100%", justifyContent: "flex-start", alignItems: "center", paddingBottom: 30}}>
<Stars note={item.vote_average} size={120}></Stars>
<Text style={{color: "#FFC42D", fontWeight: "bold", paddingLeft: 10, fontSize: 16}}>{item.vote_average.toFixed(1)}</Text>
</View>
{trailerPath !== "" && (
<YoutubeIframe webViewStyle={{borderRadius: 10, overflow: "hidden"}}
height={195}
play={false}
videoId={trailerPath}
/>)}
<Text style={{color: "#B3B3B3", paddingTop: 30, fontSize: 17}}>{item.overview}</Text>
</View>
</ScrollView>
</SafeAreaView>
</View>
)
}
type InfoBadgeProps = {
texte: string
}
export function InfoBadge(props: InfoBadgeProps) {
return (<View style={{paddingHorizontal: 15, paddingVertical: 7, backgroundColor: 'rgba(255,255,255,0.2)', borderRadius: 10, justifyContent: "center", marginRight: 10}}>
<Text style={{color: "white", fontSize: 15}}>{props.texte}</Text>
</View>);
}

@ -11,6 +11,7 @@ import {useEffect, useState} from 'react';
import {getTrendingID, getWatchLater, getWatchLaterMovies} from "../redux/actions/actionGetTrendingID";
import Movie from "../model/Movie";
import Swipeable from "react-native-gesture-handler/Swipeable";
import {useNavigation} from "@react-navigation/native";
export default function WatchLaterScreen({navigation}: RootTabScreenProps<'WatchLater'>) {
const [search, setSearch] = useState('');
@ -88,7 +89,7 @@ export default function WatchLaterScreen({navigation}: RootTabScreenProps<'Watch
<FlatList
data={search.length !== 0 ? filteredDataSource : watchLaterMovies}
keyExtractor={item => item.original_title}
renderItem={({item}) => <ListWidget movie={item}></ListWidget>}
renderItem={({item}) => <TouchableHighlight onPress={() => navigation.navigate("Info", {"item": item})}><ListWidget movie={item}></ListWidget></TouchableHighlight>}
/>
</SafeAreaView>
);
@ -100,7 +101,6 @@ type ListWidgetProps = {
}
export function ListWidget(props: ListWidgetProps) {
const insets = useSafeAreaInsets();
const styles = StyleSheet.create({
@ -130,6 +130,7 @@ export function ListWidget(props: ListWidgetProps) {
marginHorizontal: 20,
marginBottom: 15
}}>
<Image
style={styles.filmCard}
source={{

@ -3,39 +3,44 @@
* https://reactnavigation.org/docs/typescript/
*/
import { BottomTabScreenProps } from '@react-navigation/bottom-tabs';
import { CompositeScreenProps, NavigatorScreenParams } from '@react-navigation/native';
import { NativeStackScreenProps } from '@react-navigation/native-stack';
import {BottomTabScreenProps} from '@react-navigation/bottom-tabs';
import {CompositeScreenProps, NavigatorScreenParams} from '@react-navigation/native';
import {NativeStackScreenProps} from '@react-navigation/native-stack';
declare global {
namespace ReactNavigation {
interface RootParamList extends RootStackParamList {}
}
namespace ReactNavigation {
interface RootParamList extends RootStackParamList {
}
}
}
export type RootStackParamList = {
Root: NavigatorScreenParams<RootTabParamList> | undefined;
Modal: undefined;
NotFound: undefined;
Home: undefined;
WatchLater: undefined;
Root: NavigatorScreenParams<RootTabParamList> | undefined;
Modal: undefined;
NotFound: undefined;
Home: undefined;
WatchLater: undefined;
Favorite: undefined;
Info: undefined;
Favorite: undefined;
};
export type RootStackScreenProps<Screen extends keyof RootStackParamList> = NativeStackScreenProps<
RootStackParamList,
Screen
RootStackParamList,
Screen
>;
export type RootTabParamList = {
WatchLater: undefined;
Home: undefined;
Favorite: undefined;
WatchLater: undefined;
Home: undefined;
Favorite: undefined;
Info: undefined;
};
export type RootTabScreenProps<Screen extends keyof RootTabParamList> = CompositeScreenProps<
BottomTabScreenProps<RootTabParamList, Screen>,
NativeStackScreenProps<RootStackParamList>
BottomTabScreenProps<RootTabParamList, Screen>,
NativeStackScreenProps<RootStackParamList>
>;

Loading…
Cancel
Save