Add API requests

pull/3/head
Antoine PEREDERII 1 year ago
parent 086ea9fd3d
commit b2a19dcd44

@ -2,12 +2,18 @@ import { SafeAreaView } from 'react-native'
import {StyleSheet} from 'react-native'; import {StyleSheet} from 'react-native';
import NavigationBar from "./navigation/NavigationBar"; import NavigationBar from "./navigation/NavigationBar";
import {indigoColor} from "./assets/Theme"; import {indigoColor} from "./assets/Theme";
import store from "./redux/store";
import React from "react";
import {Provider} from "react-redux";
export default function App() { export default function App() {
return ( return (
<Provider store={store}>
<SafeAreaView style={{flex: 0, backgroundColor: 'darksalmon'}}/>
<SafeAreaView style={styles.container}> <SafeAreaView style={styles.container}>
<NavigationBar /> <NavigationBar />
</SafeAreaView> </SafeAreaView>
</Provider>
); );
} }

@ -21,11 +21,12 @@ export class SampleJoke extends Joke {
* @param {string} punchline - La chute de la blague. * @param {string} punchline - La chute de la blague.
* @param {string} image - L'URL de l'image associée à la blague. * @param {string} image - L'URL de l'image associée à la blague.
*/ */
constructor(id: number, type: string, setup: string, punchline: string, image: string) { constructor(id: number, type: string, setup: string, image: string, punchline: string = "") {
super(type, setup, punchline, image); // Assuming Joke class has these properties super(type, setup, punchline, image); // Assuming Joke class has these properties
this._id = id; this._id = id;
} }
/** /**
* @brief Obtient l'identifiant de la blague d'échantillon. * @brief Obtient l'identifiant de la blague d'échantillon.
* @return {number} L'identifiant de la blague d'échantillon. * @return {number} L'identifiant de la blague d'échantillon.

100
src/package-lock.json generated

@ -10,12 +10,16 @@
"dependencies": { "dependencies": {
"@react-navigation/bottom-tabs": "^6.5.11", "@react-navigation/bottom-tabs": "^6.5.11",
"@react-navigation/native": "^6.1.9", "@react-navigation/native": "^6.1.9",
"@reduxjs/toolkit": "^2.2.1",
"@types/react": "~18.2.45", "@types/react": "~18.2.45",
"expo": "~50.0.3", "expo": "~50.0.3",
"expo-status-bar": "~1.11.1", "expo-status-bar": "~1.11.1",
"react": "18.2.0", "react": "18.2.0",
"react-native": "0.73.2", "react-native": "0.73.2",
"react-native-gesture-handler": "^2.14.1", "react-native-gesture-handler": "^2.14.1",
"react-native-safe-area-context": "^4.9.0",
"react-redux": "^9.1.0",
"redux": "^5.0.1",
"typescript": "^5.3.0" "typescript": "^5.3.0"
}, },
"devDependencies": { "devDependencies": {
@ -5958,6 +5962,29 @@
"nanoid": "^3.1.23" "nanoid": "^3.1.23"
} }
}, },
"node_modules/@reduxjs/toolkit": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz",
"integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==",
"dependencies": {
"immer": "^10.0.3",
"redux": "^5.0.1",
"redux-thunk": "^3.1.0",
"reselect": "^5.0.1"
},
"peerDependencies": {
"react": "^16.9.0 || ^17.0.0 || ^18",
"react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
},
"peerDependenciesMeta": {
"react": {
"optional": true
},
"react-redux": {
"optional": true
}
}
},
"node_modules/@segment/loosely-validate-event": { "node_modules/@segment/loosely-validate-event": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz",
@ -6065,6 +6092,11 @@
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
"integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="
}, },
"node_modules/@types/use-sync-external-store": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
"integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
},
"node_modules/@types/yargs": { "node_modules/@types/yargs": {
"version": "17.0.32", "version": "17.0.32",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
@ -8374,6 +8406,15 @@
"node": ">=16.x" "node": ">=16.x"
} }
}, },
"node_modules/immer": {
"version": "10.0.3",
"resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz",
"integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
}
},
"node_modules/import-fresh": { "node_modules/import-fresh": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
@ -11487,10 +11528,9 @@
} }
}, },
"node_modules/react-native-safe-area-context": { "node_modules/react-native-safe-area-context": {
"version": "4.8.2", "version": "4.9.0",
"resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.8.2.tgz", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.9.0.tgz",
"integrity": "sha512-ffUOv8BJQ6RqO3nLml5gxJ6ab3EestPiyWekxdzO/1MQ7NF8fW1Mzh1C5QE9yq573Xefnc7FuzGXjtesZGv7cQ==", "integrity": "sha512-/OJD9Pb8IURyvn+1tWTszWPJqsbZ4hyHBU9P0xhOmk7h5owSuqL0zkfagU0pg7Vh0G2NKQkaPpUKUMMCUMDh/w==",
"peer": true,
"peerDependencies": { "peerDependencies": {
"react": "*", "react": "*",
"react-native": "*" "react-native": "*"
@ -11531,6 +11571,32 @@
"async-limiter": "~1.0.0" "async-limiter": "~1.0.0"
} }
}, },
"node_modules/react-redux": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz",
"integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==",
"dependencies": {
"@types/use-sync-external-store": "^0.0.3",
"use-sync-external-store": "^1.0.0"
},
"peerDependencies": {
"@types/react": "^18.2.25",
"react": "^18.0",
"react-native": ">=0.69",
"redux": "^5.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
},
"react-native": {
"optional": true
},
"redux": {
"optional": true
}
}
},
"node_modules/react-refresh": { "node_modules/react-refresh": {
"version": "0.14.0", "version": "0.14.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
@ -11592,6 +11658,19 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/redux": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="
},
"node_modules/redux-thunk": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
"integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
"peerDependencies": {
"redux": "^5.0.0"
}
},
"node_modules/regenerate": { "node_modules/regenerate": {
"version": "1.4.2", "version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@ -11703,6 +11782,11 @@
"path-parse": "^1.0.5" "path-parse": "^1.0.5"
} }
}, },
"node_modules/reselect": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz",
"integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg=="
},
"node_modules/resolve": { "node_modules/resolve": {
"version": "1.22.8", "version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@ -12812,6 +12896,14 @@
"react": ">=16.8" "react": ">=16.8"
} }
}, },
"node_modules/use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/util-deprecate": { "node_modules/util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",

@ -12,6 +12,7 @@
"dependencies": { "dependencies": {
"@react-navigation/bottom-tabs": "^6.5.11", "@react-navigation/bottom-tabs": "^6.5.11",
"@react-navigation/native": "^6.1.9", "@react-navigation/native": "^6.1.9",
"@reduxjs/toolkit": "^2.2.1",
"@types/react": "~18.2.45", "@types/react": "~18.2.45",
"expo": "~50.0.3", "expo": "~50.0.3",
"expo-status-bar": "~1.11.1", "expo-status-bar": "~1.11.1",
@ -19,6 +20,8 @@
"react-native": "0.73.2", "react-native": "0.73.2",
"react-native-gesture-handler": "^2.14.1", "react-native-gesture-handler": "^2.14.1",
"react-native-safe-area-context": "^4.9.0", "react-native-safe-area-context": "^4.9.0",
"react-redux": "^9.1.0",
"redux": "^5.0.1",
"typescript": "^5.3.0" "typescript": "^5.3.0"
}, },
"devDependencies": { "devDependencies": {

@ -0,0 +1,20 @@
import {CustomJoke} from "../../model/CustomJoke";
import {SampleJoke} from "../../model/SampleJoke";
export enum ActionType {
FETCH_JOKES = 'FETCH_JOKE',
}
interface actionFetch {
type: ActionType.FETCH_JOKES;
payload: (CustomJoke | SampleJoke)[];
}
export type Action = actionFetch;
export const setJokesList = (jokesList: (CustomJoke | SampleJoke)[]) => {
return {
type: ActionType.FETCH_JOKES,
payload: jokesList,
};
}

@ -0,0 +1,27 @@
import {CustomJoke} from "../../model/CustomJoke";
import {SampleJoke} from "../../model/SampleJoke";
import {Action} from "redux";
import {ActionType} from "../actions/JokeAction";
interface State {
jokes: (CustomJoke | SampleJoke)[];
favoriteJokes: (CustomJoke | SampleJoke)[],
}
const initialState = {
jokes: [],
favoriteJokes: [],
}
const appReducer = (state: State = initialState, action: Action) => {
switch (action.type) {
case ActionType.FETCH_JOKES:
// @ts-ignore
return {...state, jokes: action.payload};
//case ActionType....
default:
return state;
}
}
export default appReducer;

@ -0,0 +1,18 @@
import {configureStore} from '@reduxjs/toolkit'
import appReducer from './reducers/jokeReducer';
// Reference here all your application reducers
const reducer = {
appReducer: appReducer,
}
// @ts-ignore
const store = configureStore({
reducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: false
})
},);
export default store;

@ -0,0 +1,23 @@
//Define your action creators that will be responsible for asynchronous operations
import {CustomJoke} from "../../model/CustomJoke";
import {SampleJoke} from "../../model/SampleJoke";
import {setJokesList} from "../actions/JokeAction";
export const getSampleJokesList = () => {
//In order to use await your callback must be asynchronous using async keyword.
return async dispatch => {
//Then perform your asynchronous operations.
try {
//Have it first fetch data from our starwars url.
const jokesPromise = await fetch('https://iut-weather-api.azurewebsites.net/jokes/samples');
//Then use the json method to get json data from api/
const jokesListJson = await jokesPromise.json();
const jokesList: SampleJoke[] = jokesListJson.map(elt => new SampleJoke(elt["id"], elt["type"], elt["setup"], elt["image"]));
dispatch(setJokesList(jokesList));
} catch (error) {
console.log('Error---------', error);
//You can dispatch to another action if you want to display an error message in the application
//dispatch(fetchDataRejected(error))
}
}
}

@ -0,0 +1,23 @@
//Define your action creators that will be responsible for asynchronous operations
import {CustomJoke} from "../../model/CustomJoke";
import {SampleJoke} from "../../model/SampleJoke";
import {setJokesList} from "../actions/JokeAction";
export const getLastSampleJokesList = () => {
//In order to use await your callback must be asynchronous using async keyword.
return async dispatch => {
//Then perform your asynchronous operations.
try {
//Have it first fetch data from our starwars url.
const jokesPromise = await fetch('https://iut-weather-api.azurewebsites.net/jokes/lasts');
//Then use the json method to get json data from api/
const jokesListJson = await jokesPromise.json();
const jokesList: SampleJoke[] = jokesListJson.map(elt => new SampleJoke(elt["id"], elt["type"], elt["setup"], elt["image"]));
dispatch(setJokesList(jokesList));
} catch (error) {
console.log('Error---------', error);
//You can dispatch to another action if you want to display an error message in the application
//dispatch(fetchDataRejected(error))
}
}
}

@ -2,10 +2,34 @@ import { customJokeStub } from '../data/stub/CustomJokeStub';
import { sampleJokeStub } from '../data/stub/SampleJokeStub'; import { sampleJokeStub } from '../data/stub/SampleJokeStub';
import JokeItems from "../components/JokeItems"; import JokeItems from "../components/JokeItems";
import '../types/extension'; import '../types/extension';
import {useDispatch, useSelector} from "react-redux";
import {StyleSheet, View} from "react-native";
import {purpleColor} from "../assets/Theme";
import {getSampleJokesList} from "../redux/thunk/CatalogueSampleJokeThunk";
import {useEffect} from "react";
export default function Catalogue() { export default function Catalogue() {
const allJokes = [...customJokeStub, ...sampleJokeStub]; // const allJokes = [...customJokeStub, ...sampleJokeStub];
// @ts-ignore
const allJokes = useSelector(state => state.appReducer.jokes);
const dispatch = useDispatch();
useEffect(() => {
const loadJokes = async () => {
// @ts-ignore
await dispatch(getSampleJokesList());
};
loadJokes();
}, [dispatch]);
return ( return (
<View style={styles.container}>
<JokeItems jokes={allJokes}/> <JokeItems jokes={allJokes}/>
</View>
) )
}; };
const styles = StyleSheet.create({
container: {
backgroundColor: purpleColor
}
});

@ -2,10 +2,34 @@ import { customJokeStub } from '../data/stub/CustomJokeStub';
import { sampleJokeStub } from '../data/stub/SampleJokeStub'; import { sampleJokeStub } from '../data/stub/SampleJokeStub';
import JokeItems from "../components/JokeItems"; import JokeItems from "../components/JokeItems";
import '../types/extension'; import '../types/extension';
import {StyleSheet, View} from "react-native";
import {purpleColor} from "../assets/Theme";
import {useDispatch, useSelector} from "react-redux";
import {useEffect} from "react";
import {getSampleJokesList} from "../redux/thunk/CatalogueSampleJokeThunk";
export default function Catalogue() { export default function Catalogue() {
const allJokes = [...customJokeStub, ...sampleJokeStub]; // const allJokes = [...customJokeStub, ...sampleJokeStub];
// @ts-ignore
const allJokes = useSelector(state => state.appReducer.jokes);
const dispatch = useDispatch();
useEffect(() => {
const loadJokes = async () => {
// @ts-ignore
await dispatch(getSampleJokesList());
};
loadJokes();
}, [dispatch]);
return ( return (
<View style={styles.container}>
<JokeItems jokes={allJokes}/> <JokeItems jokes={allJokes}/>
</View>
) )
}; };
const styles = StyleSheet.create({
container: {
backgroundColor: purpleColor
}
});

@ -2,10 +2,20 @@ import { customJokeStub } from '../data/stub/CustomJokeStub';
import { sampleJokeStub } from '../data/stub/SampleJokeStub'; import { sampleJokeStub } from '../data/stub/SampleJokeStub';
import JokeItems from "../components/JokeItems"; import JokeItems from "../components/JokeItems";
import '../types/extension'; import '../types/extension';
import {StyleSheet, View} from "react-native";
import {purpleColor} from "../assets/Theme";
export default function Catalogue() { export default function Catalogue() {
const allJokes = [...customJokeStub, ...sampleJokeStub]; const allJokes = [...customJokeStub, ...sampleJokeStub];
return ( return (
<View style={styles.container}>
<JokeItems jokes={allJokes}/> <JokeItems jokes={allJokes}/>
</View>
) )
}; };
const styles = StyleSheet.create({
container: {
backgroundColor: purpleColor
}
});

@ -1,13 +1,24 @@
import {Image, StyleSheet, Text, View} from 'react-native'; import {Image, StyleSheet, Text, View} from 'react-native';
import { customJokeStub } from '../data/stub/CustomJokeStub';
import { sampleJokeStub } from '../data/stub/SampleJokeStub';
import '../types/extension'; import '../types/extension';
import {darksalmonColor, purpleColor, whiteColor} from "../assets/Theme"; import {darksalmonColor, purpleColor, whiteColor} from "../assets/Theme";
import JokesHomeSquare from "../components/JokesHomeSquare"; import JokesHomeSquare from "../components/JokesHomeSquare";
import Categs from "../components/Categs"; import Categs from "../components/Categs";
import {useDispatch, useSelector} from "react-redux";
import {useEffect} from "react";
import {getLastSampleJokesList} from "../redux/thunk/RecentsJokesThunk";
export default function Catalogue() { export default function Catalogue() {
const allJokes = [...customJokeStub, ...sampleJokeStub]; // @ts-ignore
const allJokes = useSelector(state => state.appReducer.jokes);
const dispatch = useDispatch();
useEffect(() => {
const loadJokes = async () => {
// @ts-ignore
await dispatch(getLastSampleJokesList());
};
loadJokes();
}, [dispatch]);
return ( return (
<> <>
<View style={styles.container}> <View style={styles.container}>

@ -2,10 +2,20 @@ import { customJokeStub } from '../data/stub/CustomJokeStub';
import { sampleJokeStub } from '../data/stub/SampleJokeStub'; import { sampleJokeStub } from '../data/stub/SampleJokeStub';
import JokeItems from "../components/JokeItems"; import JokeItems from "../components/JokeItems";
import '../types/extension'; import '../types/extension';
import {StyleSheet, View} from "react-native";
import {purpleColor} from "../assets/Theme";
export default function Catalogue() { export default function Catalogue() {
const allJokes = [...customJokeStub, ...sampleJokeStub]; const allJokes = [...customJokeStub, ...sampleJokeStub];
return ( return (
<View style={styles.container}>
<JokeItems jokes={allJokes}/> <JokeItems jokes={allJokes}/>
</View>
) )
}; };
const styles = StyleSheet.create({
container: {
backgroundColor: purpleColor
}
});

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save