From 9bbb4d508be4af0acad929057673a2ba80a1aa63 Mon Sep 17 00:00:00 2001 From: tonyfages Date: Fri, 22 Mar 2024 15:24:33 +0100 Subject: [PATCH] tp7 --- JokesApp/.idea/.gitignore | 2 + JokesApp/Theme.ts | 72 +++++++++- JokesApp/assets/darkmode_icon.png | Bin 0 -> 8378 bytes JokesApp/assets/delete-icon.png | Bin 0 -> 7842 bytes JokesApp/navigation/Navigation.tsx | 65 +++++++-- JokesApp/package-lock.json | 31 +++++ JokesApp/package.json | 1 + JokesApp/redux/actions/customAction.ts | 26 ++++ JokesApp/redux/reducers/customJokeReducer.ts | 7 + JokesApp/redux/store.ts | 21 +++ JokesApp/screens/JokeDetailScreen.tsx | 30 +++- JokesApp/screens/ListJokeScreen.tsx | 98 +++++++++++-- JokesApp/screens/SettingsScreen.tsx | 136 ++++++++++++++++--- 13 files changed, 439 insertions(+), 50 deletions(-) create mode 100644 JokesApp/assets/darkmode_icon.png create mode 100644 JokesApp/assets/delete-icon.png diff --git a/JokesApp/.idea/.gitignore b/JokesApp/.idea/.gitignore index b58b603..7abb13d 100644 --- a/JokesApp/.idea/.gitignore +++ b/JokesApp/.idea/.gitignore @@ -3,3 +3,5 @@ /workspace.xml # Editor-based HTTP Client requests /httpRequests/ +# GitHub Copilot persisted chat sessions +/copilot/chatSessions diff --git a/JokesApp/Theme.ts b/JokesApp/Theme.ts index 752b5c1..f6f5792 100644 --- a/JokesApp/Theme.ts +++ b/JokesApp/Theme.ts @@ -1,5 +1,75 @@ +import {DarkTheme, Theme, useTheme} from "@react-navigation/native"; +import React, {useEffect, useState} from "react"; +import DefaultTheme from "@react-navigation/native/src/theming/DefaultTheme"; +import {useColorScheme} from "react-native"; + export const indigo = "rgba(14, 14, 44, 1)"; export const purpleColor = "rgba(74, 74, 104, 1)"; export const darksalmonColor = "rgba(233, 150, 122, 1)"; export const greyColor = "rgba(140, 140, 161, 1)"; -export const whiteColor = "rgba(239, 239, 253, 1)"; \ No newline at end of file +export const whiteColor = "rgba(239, 239, 253, 1)"; + +export const blackColor = "rgba(0, 0, 0, 1)"; + + +export default function usePersonalTheme() { + + + useTheme() + const theme = React.useContext(ThemeContext); + const [isDark, setIsDark] = useState(false); + + if (isDark) { + theme.dark = true; + theme.colors = MyDarkTheme.colors; + } + else { + theme.dark = false; + theme.colors = MyLightTheme.colors; + } + + + + + + + + return theme; +} + + + +//const isDark = false; + + +const MyDarkTheme: Theme = { + dark: true, + colors: { + primary: indigo, + background: purpleColor, + card: darksalmonColor, + text: whiteColor, + border: whiteColor, + notification: whiteColor, + }, +}; + +const MyLightTheme: Theme = { + dark: false, + colors: { + primary: whiteColor, + background: greyColor, + card: '', + text: blackColor, + border: blackColor, + notification: blackColor, + }, +}; + + +const ThemeContext = React.createContext(MyDarkTheme); + + + + + diff --git a/JokesApp/assets/darkmode_icon.png b/JokesApp/assets/darkmode_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3803edcfb1954e51c5c78552b5506da64ec9843b GIT binary patch literal 8378 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 + + useEffect(() => { + const fetchTheme = async () => { + const theme = await getTheme(); + setThemes(theme); + }; + + fetchTheme(); + }); + + if (themes == null) { + return null; + } + + console.log("ici le theme", themes); + + return ( - - + + }}> ( @@ -108,3 +130,30 @@ const styles = StyleSheet.create({ }); + + +const stylesDark = StyleSheet.create({ + + title: { + fontSize: 24, + color: 'darksalmon', + textAlign: 'center', + fontWeight: 'bold', + marginVertical: 20, + }, + top: { + backgroundColor : indigo + }, + addJoke: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: greyColor, + width: '70%', + height: '100%', + borderRadius: 4, + marginTop: 4, + }, + + +}); diff --git a/JokesApp/package-lock.json b/JokesApp/package-lock.json index d912438..3b4e5ff 100644 --- a/JokesApp/package-lock.json +++ b/JokesApp/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "dependencies": { "@expo/ngrok": "^2.5.0", + "@react-native-async-storage/async-storage": "^1.23.1", "@react-navigation/bottom-tabs": "^6.5.11", "@react-navigation/native": "^6.1.10", "@react-navigation/stack": "^6.3.21", @@ -3883,6 +3884,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz", + "integrity": "sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA==", + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.60 <1.0" + } + }, "node_modules/@react-native-community/cli": { "version": "12.3.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.0.tgz", @@ -9112,6 +9124,14 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -10329,6 +10349,17 @@ "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==" }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", diff --git a/JokesApp/package.json b/JokesApp/package.json index c8dc118..6e9c2a0 100644 --- a/JokesApp/package.json +++ b/JokesApp/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@expo/ngrok": "^2.5.0", + "@react-native-async-storage/async-storage": "^1.23.1", "@react-navigation/bottom-tabs": "^6.5.11", "@react-navigation/native": "^6.1.10", "@react-navigation/stack": "^6.3.21", diff --git a/JokesApp/redux/actions/customAction.ts b/JokesApp/redux/actions/customAction.ts index be5a602..afc68b4 100644 --- a/JokesApp/redux/actions/customAction.ts +++ b/JokesApp/redux/actions/customAction.ts @@ -5,6 +5,7 @@ export enum CustomActionType { POST_CUSTOM_JOKE = 'POST_CUSTOM_JOKE', FETCH_CUSTOMS_JOKE = 'FETCH_CUSTOMS_JOKE', FETCH_CUSTOMS_JOKE_BY_ID = 'FETCH_CUSTOMS_JOKE_BY_ID', + DELETE_CUSTOM_JOKE = 'DELETE_CUSTOM_JOKE', } export interface CustomAction { @@ -47,6 +48,13 @@ export const setCustomsJokeById = (completCustomJoke: CustomJoke): postCustomAct } +export const setDeleteCustomJoke = (deleteCustomJoke: CustomJoke): postCustomAction => { + return { + type: CustomActionType.DELETE_CUSTOM_JOKE, + payload: deleteCustomJoke + } +} + export const postJoke = (type : string, setup : string, punchline : string) => { @@ -101,3 +109,21 @@ export const getJokesCustomsById = (id : number) => { } } } + +export const deleteJoke = (id : number) => { + return async dispatch => { + try { + const custom = await fetch('https://iut-weather-api.azurewebsites.net/jokes/' + id, { + method: 'DELETE', + headers: { + Accept: "application/json", + "Content-Type": "application/json", + } + }); + console.log('Suppression'); + dispatch(setDeleteCustomJoke({} as CustomJoke)); + } catch (error) { + console.log('Error---------', error); + } + } +} diff --git a/JokesApp/redux/reducers/customJokeReducer.ts b/JokesApp/redux/reducers/customJokeReducer.ts index d7d3bae..1d09c84 100644 --- a/JokesApp/redux/reducers/customJokeReducer.ts +++ b/JokesApp/redux/reducers/customJokeReducer.ts @@ -7,6 +7,7 @@ interface state { postJoke: CustomJoke; customJokes: CustomJoke[]; completCustomJoke: CustomJoke; + deleteCustomJoke: CustomJoke; } // initial state for sampleJokes @@ -14,6 +15,7 @@ const initialState: state = { postJoke: {} as CustomJoke, customJokes: [], completCustomJoke: {} as CustomJoke, + deleteCustomJoke: {} as CustomJoke, } // app reducer for sampleJokes @@ -35,6 +37,11 @@ export default appReducer = (state = initialState, action: Action) => { ...state, completCustomJoke: action.payload, } + case CustomActionType.DELETE_CUSTOM_JOKE: + return { + ...state, + deleteCustomJoke: action.payload, + } default: return state; diff --git a/JokesApp/redux/store.ts b/JokesApp/redux/store.ts index 5d7f017..ca1d53a 100644 --- a/JokesApp/redux/store.ts +++ b/JokesApp/redux/store.ts @@ -2,6 +2,8 @@ import { configureStore } from '@reduxjs/toolkit'; import categorieReducer from './reducers/categoryReducer'; import sampleReducer from './reducers/sampleJokeReducer'; import customReducer from "./reducers/customJokeReducer"; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import {Theme} from "@react-navigation/native"; const reducer = { categorieReducer: categorieReducer, @@ -20,4 +22,23 @@ const store = configureStore({ }) }); + +export const storeTheme = async (theme) => { + try { + const jsonValue = JSON.stringify(theme) + await AsyncStorage.setItem('@theme', jsonValue) + console.log("theme stored") + } catch (e) { + console.log(e); + } +} + +export const getTheme = async () => { + try { + const jsonValue = await AsyncStorage.getItem('@theme') + return jsonValue != null ? JSON.parse(jsonValue) as Theme : null; + } catch(e) { + console.log(e); + } +} export default store; diff --git a/JokesApp/screens/JokeDetailScreen.tsx b/JokesApp/screens/JokeDetailScreen.tsx index 812c391..60b3d46 100644 --- a/JokesApp/screens/JokeDetailScreen.tsx +++ b/JokesApp/screens/JokeDetailScreen.tsx @@ -1,4 +1,4 @@ -import {View, Text, StyleSheet} from "react-native"; +import {View, Text, StyleSheet, TouchableOpacity, Image} from "react-native"; import {indigo, purpleColor, whiteColor} from "../Theme"; import React, {useEffect} from "react"; import {CustomJoke} from "../model/CustomJoke"; @@ -6,19 +6,20 @@ import {DetailJoke} from "../components/DetailJoke"; import {Joke} from "../model/Joke"; import {useDispatch, useSelector} from "react-redux"; import {getCompletJokes, setCompletJokes, setSample} from "../redux/actions/sampleAction"; -import {validatePathConfig} from "@react-navigation/native"; -import {getJokesCustomsById} from "../redux/actions/customAction"; -//svjh +import {useIsFocused, useNavigation, validatePathConfig} from "@react-navigation/native"; +import {deleteJoke, getJokesCustomsById} from "../redux/actions/customAction"; +import {Navigation} from "../navigation/Navigation"; export default function JokeDetailScreen({route}) { + const navigation = useNavigation(); + const isFocused = useIsFocused(); + const dispatch = useDispatch(); const jokeId = route.params.joke; const state = route.params.state; console.log(state); - // Déterminer quelle donnée utiliser en fonction de l'état de `state` const DataGen = state ? useSelector((state: any) => state.customReducer.completCustomJoke) : useSelector((state: any) => state.sampleReducer.completJoke); // const DataGen = useSelector((state: any) => state.sampleReducer.completJoke); - const dispatch = useDispatch(); useEffect(() => { const getDetails = async () => { // @ts-ignore @@ -27,10 +28,19 @@ export default function JokeDetailScreen({route}) { }; getDetails(); }, [dispatch]); + + async function deleteJokes() { + // @ts-ignore + await dispatch(deleteJoke(jokeId)); + navigation.goBack(); + } + return ( - + {state ? + + : null} ); } @@ -48,5 +58,11 @@ const styles = StyleSheet.create({ textAlign: 'center', fontWeight: 'bold', marginVertical: 20, + }, + img: { + width: 50, + height: 50, + margin: 20, + alignSelf: 'center' } }); \ No newline at end of file diff --git a/JokesApp/screens/ListJokeScreen.tsx b/JokesApp/screens/ListJokeScreen.tsx index fb6d87b..cc4e855 100644 --- a/JokesApp/screens/ListJokeScreen.tsx +++ b/JokesApp/screens/ListJokeScreen.tsx @@ -1,33 +1,52 @@ import {FlatList, Image, SafeAreaView, StyleSheet, Text, TouchableHighlight, TouchableOpacity, View} from "react-native"; -import React, {useEffect, useState} from "react"; +import React, {useContext, useEffect, useState} from "react"; import {JokeListItems} from "../components/ListeJokeComponent"; -import {darksalmonColor, indigo, purpleColor, whiteColor} from "../Theme"; +import {darksalmonColor, greyColor, indigo, purpleColor, whiteColor} from "../Theme"; import {CustomJoke} from "../model/CustomJoke"; import {useDispatch, useSelector} from 'react-redux'; import {getSampleJoke, setSample} from "../redux/actions/sampleAction"; import {getJokesCustoms} from "../redux/actions/customAction"; +import {useIsFocused} from "@react-navigation/native"; export function ListJokeScreen({route, navigation}) { const [isActivated2, setIsActivated2] = useState(false); + const isFocused = useIsFocused(); + + + const [styles, setStyles] = useState(stylesLight); + + function toggleActivation2() { setIsActivated2(!isActivated2); - getCustoms(); + + } const DataGen = useSelector((state: any) => state.sampleReducer.sampleJoke); const DataCustomsJoke = useSelector((state : any) => state.customReducer.customJokes) const dispatch = useDispatch(); - useEffect(() => { - const getJokes = async () => { - // @ts-ignore - await dispatch(getSampleJoke()); - }; - getJokes(); - }, [dispatch]); + const getCustoms = async () => { // @ts-ignore await dispatch(getJokesCustoms()); } + + const getSamples = async () => { + // @ts-ignore + await dispatch(getSampleJoke()); + + } + + useEffect(() => { + if (isFocused) { + if (isActivated2) { + getCustoms(); + } else { + getSamples(); + } + } + }, [isFocused, isActivated2]); + return ( @@ -48,8 +67,7 @@ export function ListJokeScreen({route, navigation}) { ); } - -const styles = StyleSheet.create({ +const stylesDark = StyleSheet.create({ title: { fontSize: 24, @@ -103,4 +121,60 @@ const styles = StyleSheet.create({ }, +}); + +const stylesLight = StyleSheet.create({ + + title: { + fontSize: 24, + color: darksalmonColor, + textAlign: 'center', + fontWeight: 'bold', + marginVertical: 20, + }, + titleResume: { + fontSize: 15, + fontWeight: 'bold', + marginBottom: 20, + }, + container: { + flex: 1, + backgroundColor: greyColor, + + }, + top: { + backgroundColor : indigo, + }, + header: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + margin: 9, + }, + headerText: { + fontSize: 18, + color: whiteColor, + textAlign: 'center', + fontWeight: 'bold', + }, + img2: { + tintColor: whiteColor, + justifyContent: "center", + alignItems: "center", + }, + button2:{ + flexDirection: "row", + justifyContent: "center", + marginRight: 10, + borderRadius: 10, + alignItems: "center", + height: 30, + width: 70, + + borderColor: darksalmonColor, + borderWidth: 1, + backgroundColor: darksalmonColor, + }, + + }); \ No newline at end of file diff --git a/JokesApp/screens/SettingsScreen.tsx b/JokesApp/screens/SettingsScreen.tsx index d2dd723..27590ea 100644 --- a/JokesApp/screens/SettingsScreen.tsx +++ b/JokesApp/screens/SettingsScreen.tsx @@ -1,33 +1,125 @@ -import React from "react"; +import React, {useContext, useEffect, useState} from "react"; + +import { + Appearance, + Button, + FlatList, + Image, + SafeAreaView, + ScrollView, + SectionListComponent, + StyleSheet, Switch, SwitchComponent, + Text, useColorScheme, + View +} from "react-native"; +import usePersonalTheme, { + blackColor, + darksalmonColor, + greyColor, + indigo, + purpleColor, + whiteColor +} from "../Theme"; +import {isEnabled} from "react-native/Libraries/Performance/Systrace"; +import {DarkTheme, DefaultTheme, useTheme} from "@react-navigation/native"; +import {storeTheme} from "../redux/store"; + -import {FlatList, Image, SafeAreaView, ScrollView, SectionListComponent, StyleSheet, Text, View} from "react-native"; -import {indigo, purpleColor} from "../Theme"; export function SettingsScreen() { + + const [isEnabled, setIsEnabled] = useState(false); + + const toggleSwitch = () => { + setIsEnabled(previousState => { + const newIsEnabled = !previousState; + const newTheme = newIsEnabled ? DarkTheme : DefaultTheme; + console.log("newTheme", newTheme); + storeTheme(newTheme); + return newIsEnabled; + }); + }; + + const styles = themeSettings(); + return ( - - Settings Page - In Work - + + Réglages + + + + + Dark Mode + + + + + ); -} +}; + + +export function themeSettings() { + const theme = useTheme(); + const colors = theme.colors; + console.log("themeSettings", colors) + const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: colors.background, + }, + header: { + padding: 16, + alignItems: 'center', + }, + headerText: { + color: whiteColor, + fontSize: 18, + }, + settingsContainer: { + backgroundColor: indigo, + margin: 16, + }, + title: { + color: whiteColor, + fontSize: 20, + fontWeight: 'bold', + marginTop: 7, + marginLeft: 15, + marginBottom: 8, + }, + settingRow: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: 12, -const styles = StyleSheet.create({ - font: { - backgroundColor: indigo, - width: '100%', - height: '100%', - }, - text: { - fontSize: 24, - color: 'darksalmon', - textAlign: 'center', - fontWeight: 'bold', - marginVertical: 20, - } + }, + settingText: { + color: whiteColor, + marginLeft: 10, + }, + img: { + marginLeft: 10, + width: 30, + height: 30, + tintColor: darksalmonColor, + }, + switch: { + marginRight: 10, + } + }); + + return styles; + +} -}); \ No newline at end of file