From 51ceb3511fbf868f1c9028f6c16cefa350583a27 Mon Sep 17 00:00:00 2001 From: tonyfages Date: Sun, 31 Mar 2024 18:51:58 +0200 Subject: [PATCH] tp8 --- JokesApp/App.tsx | 1 + JokesApp/components/DetailJoke.tsx | 3 +-- JokesApp/redux/store.ts | 24 +++++++++++++-------- JokesApp/screens/ListFavoriteJokeScreen.tsx | 4 +++- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/JokesApp/App.tsx b/JokesApp/App.tsx index 6cfeeaa..b7f5ad1 100644 --- a/JokesApp/App.tsx +++ b/JokesApp/App.tsx @@ -5,6 +5,7 @@ import {Navigation} from "./navigation/Navigation"; import {darksalmonColor, indigo, purpleColor} from "./Theme"; import {Provider} from "react-redux"; import store from "./redux/store"; +import AsyncStorage from "@react-native-async-storage/async-storage"; export default function App() { diff --git a/JokesApp/components/DetailJoke.tsx b/JokesApp/components/DetailJoke.tsx index f391f4e..54b9055 100644 --- a/JokesApp/components/DetailJoke.tsx +++ b/JokesApp/components/DetailJoke.tsx @@ -15,7 +15,6 @@ export function DetailJoke(props: DetailJokeProps) { const [isActivated, setIsActivated] = useState(false); const [isActivated2, setIsActivated2] = useState(false); - const favoriteJokes = useAppSelector(state => state.customReducer.favoriteJokes) as [CustomJoke, SampleJoke]; const dispatch = useAppDispatch(); @@ -23,7 +22,7 @@ export function DetailJoke(props: DetailJokeProps) { setIsActivated(!isActivated); if (isActivated) { console.log("Joke retirée des favoris"); - dispatch(removeFavoriteJoke()); + dispatch(removeFavoriteJoke(props.item)); } else { dispatch(storeFavoriteJoke(props.item)); diff --git a/JokesApp/redux/store.ts b/JokesApp/redux/store.ts index 84ca830..f6d0d30 100644 --- a/JokesApp/redux/store.ts +++ b/JokesApp/redux/store.ts @@ -9,6 +9,7 @@ import {setFavoriteJoke} from "./actions/customAction"; import {TypedUseSelectorHook, useDispatch, useSelector} from "react-redux"; import {SampleJoke} from "../model/SampleJoke"; import {Joke} from "../model/Joke"; +import {JokeFactory} from "../model/JokeFactory"; const reducer = { categorieReducer: categorieReducer, @@ -46,21 +47,19 @@ export const getTheme = async () => { } } -export const storeFavoriteJoke = (joke : Joke) => { +export const storeFavoriteJoke = (joke : CustomJoke) => { return async dispatch => { try { const favoriteJokes = await AsyncStorage.getItem('favorites'); - const favoriteJokesList = favoriteJokes != null ? JSON.parse(favoriteJokes) : []; + const favoriteJokesList: CustomJoke[] = favoriteJokes != null ? JokeFactory.createCustomJokes(favoriteJokes) : []; favoriteJokesList.push(joke); - await AsyncStorage.setItem('favorites', JSON.stringify(favoriteJokesList)); - const favorites = favoriteJokesList.map(joke => new SampleJoke(joke["type"], joke["setup"], joke["punchline"], joke["image"], joke["id"])) - dispatch(setFavoriteJoke(favorites)); + await AsyncStorage.setItem('favorites', JSON.stringify(favoriteJokesList.map(j => ({type: j.type, setup: j.setup, punchline: j.punchline, image: j.image, id: j.id})))); + dispatch(setFavoriteJoke(favoriteJokesList)); } catch (e) { console.log(e); } } } - export const getFavorite = () => { return async (dispatch) => { try { @@ -76,16 +75,23 @@ export const getFavorite = () => { } } -export const removeFavoriteJoke = () => { +export const removeFavoriteJoke = (joke : CustomJoke) => { return async dispatch => { try { - await AsyncStorage.clear() + const favoriteJokes = await AsyncStorage.getItem('favorites'); + let favoriteJokesList: CustomJoke[] = favoriteJokes != null ? JokeFactory.createCustomJokes(favoriteJokes) : []; + const index = favoriteJokesList.findIndex((j) => j.id === joke.id); + if (index !== -1) { + favoriteJokesList.splice(index, 1); + await AsyncStorage.setItem('favorites', JSON.stringify(favoriteJokesList.map(j => ({type: j.type, setup: j.setup, punchline: j.punchline, image: j.image, id: j.id})))); + dispatch(setFavoriteJoke(favoriteJokesList)); + } + } catch (e) { console.log("An error occurred", e); } } } - export type AppDispatch = typeof store.dispatch; export type AppStore = ReturnType; diff --git a/JokesApp/screens/ListFavoriteJokeScreen.tsx b/JokesApp/screens/ListFavoriteJokeScreen.tsx index ee17f7e..5cbc6a3 100644 --- a/JokesApp/screens/ListFavoriteJokeScreen.tsx +++ b/JokesApp/screens/ListFavoriteJokeScreen.tsx @@ -10,7 +10,7 @@ import {useAppSelector, useAppDispatch} from "../redux/store"; import {useDispatch} from "react-redux"; export function ListFavoriteJokeScreen({route, navigation}){ - const favoriteJokes = useAppSelector((state) => state.customReducer.favoriteJokes as [CustomJoke, SampleJoke]); + const favoriteJokes: CustomJoke[] = useAppSelector((state) => state.customReducer.favoriteJokes); const dispatch = useDispatch(); useEffect(() => { @@ -20,6 +20,8 @@ export function ListFavoriteJokeScreen({route, navigation}){ } getFavoriteJokes(); }, []); + + let fav = true; if (favoriteJokes.length <= 0) { fav = false;