diff --git a/views/Devoirs/CreateHomeworkScreen.android.tsx b/views/Devoirs/CreateHomeworkScreen.android.tsx index 4534c10c..7744c180 100644 --- a/views/Devoirs/CreateHomeworkScreen.android.tsx +++ b/views/Devoirs/CreateHomeworkScreen.android.tsx @@ -18,8 +18,16 @@ import { RegisterTrophy } from "../Settings/TrophiesScreen"; import { BottomSheetModal, BottomSheetView } from "@gorhom/bottom-sheet"; import { useFocusEffect } from "@react-navigation/native"; import ColorPicker, { HueSlider, Panel1, Preview, Swatches } from "reanimated-color-picker"; +import { useAppContext } from "../../utils/AppContext"; -function CreateHomeworkScreenAndroid({ navigation }) { +function CreateHomeworkScreenAndroid({ route, navigation }: { + navigation: any, + route: { + params: { + homeworkLocalID: string, + } + } +}) { const theme = useTheme(); const UIColors = GetUIColors(); const insets = useSafeAreaInsets(); @@ -32,8 +40,27 @@ function CreateHomeworkScreenAndroid({ navigation }) { const [newSubjectName, setNewSubjectName] = React.useState() const [newSubjectColor, setNewSubjectColor] = React.useState(UIColors.text) const [colorModalOpen, setColorModalOpen] = React.useState(false) + const [editedHomework, setEditedHomework] = React.useState() const textInputRef = React.useRef(null); const createNewSubjectModal = React.useRef(null); + const { homeworkLocalID } = route.params; + const appContext = useAppContext(); + + async function setupEdit() { + let customHomeworks = await AsyncStorage.getItem('pap_homeworksCustom') + let hw = []; + if (customHomeworks) { + hw = JSON.parse(customHomeworks); + } + let homework = hw.find(h => h.localID === homeworkLocalID) + navigation.setOptions({ + headerTitle: "Modifier un devoir", + }); + setHomeworkContent(homework.description) + setSelectedSubject({name: homework.subject.name, color: homework.background_color}) + setCalendarDate(new Date(homework.date)) + setEditedHomework(homework) + } useFocusEffect( React.useCallback(() => { @@ -52,6 +79,11 @@ function CreateHomeworkScreenAndroid({ navigation }) { BackHandler.removeEventListener('hardwareBackPress', onBackPress); }, [createNewSubjectModal, createNewSubjectModalOpen]), ); + React.useEffect(() => { + if(homeworkLocalID) { + setupEdit() + } + }, []) React.useEffect(() => { navigation.setOptions({ headerRight: () => ( @@ -63,14 +95,21 @@ function CreateHomeworkScreenAndroid({ navigation }) { }} > - { + { let customHomeworks = await AsyncStorage.getItem('pap_homeworksCustom') let hw = []; if (customHomeworks) { hw = JSON.parse(customHomeworks); } + if(homeworkLocalID) { + for (let i = 0; i < hw.length; i++) { + if (hw[i].id === editedHomework.id) { + hw.splice(i, 1); + } + } + } if(!selectedSubject.name) return Alert.alert("Aucune matière", "Veuillez renseigner une matière") - if(!homeworkContent) return Alert.alert("Devoir vide", "Veuillez renseigner le contenu du devoir") + if(!homeworkContent || homeworkContent.trim() === "") return Alert.alert("Devoir vide", "Veuillez renseigner le contenu du devoir") let newHw = { id: Math.random().toString(36).substring(7), localID: Math.random().toString(36).substring(7), @@ -92,9 +131,9 @@ function CreateHomeworkScreenAndroid({ navigation }) { custom: true, }; hw.push(newHw) - AsyncStorage.setItem('pap_homeworksCustom', JSON.stringify(hw)).then(() => { + AsyncStorage.setItem('pap_homeworksCustom', JSON.stringify(hw)).then(async() => { showMessage({ - message: 'Devoir ajouté', + message: `Devoir ${editedHomework ? 'modifié' : 'ajouté'}`, type: 'success', icon: 'auto', floating: true, @@ -102,10 +141,11 @@ function CreateHomeworkScreenAndroid({ navigation }) { }); RegisterTrophy('trophy_add_hw'); - + await AsyncStorage.setItem("refreshHomeworks", "true") + if(editedHomework) navigation.goBack(); navigation.goBack(); }); - }}/> + }}/> ), }); diff --git a/views/Devoirs/CreateHomeworkScreen.tsx b/views/Devoirs/CreateHomeworkScreen.tsx index fc75304f..88676008 100644 --- a/views/Devoirs/CreateHomeworkScreen.tsx +++ b/views/Devoirs/CreateHomeworkScreen.tsx @@ -12,7 +12,7 @@ import DateTimePicker from '@react-native-community/datetimepicker'; import NativeList from '../../components/NativeList'; import NativeItem from '../../components/NativeItem'; import NativeText from '../../components/NativeText'; -import { getSavedCourseColor } from '../../utils/cours/ColorCoursName'; +import { getSavedCourseColor, normalizeCoursName } from '../../utils/cours/ColorCoursName'; import { useAppContext } from '../../utils/AppContext'; import PapillonLoading from '../../components/PapillonLoading'; import formatCoursName from '../../utils/cours/FormatCoursName'; @@ -37,8 +37,44 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route const [titleMissingAlert, setTitleMissingAlert] = useState(false); const [homeworkTitle, setHomeworkTitle] = useState(''); + const [editedHomework, setEditedHomework] = useState() + const inputRef = useRef(null); - if(Platform.OS === "android") return () + if (Platform.OS === "android") return () + + let homeworkLocalID = null; + + if (route.params) { + homeworkLocalID = route.params.homeworkLocalID; + } + + + let hw = []; + + async function setupEdit() { + let customHomeworks = await AsyncStorage.getItem('pap_homeworksCustom') + if (customHomeworks) { + hw = JSON.parse(customHomeworks); + } + let homework = hw.find(h => h.localID === homeworkLocalID) + let index = nativeSubjects.findIndex((item) => item.actionKey === normalizeCoursName(homework.subject.name)); + setSelectedSubject(index) + setHomeworkTitle(homework.description) + setEditedHomework(homework) + } + + useEffect(() => { + (async () => { + let customHomeworks = await AsyncStorage.getItem('pap_homeworksCustom') + if (customHomeworks) { + hw = JSON.parse(customHomeworks); + } + let homework = hw.find(h => h.localID === homeworkLocalID) + let index = nativeSubjects.findIndex((item) => item.actionKey === normalizeCoursName(homework.subject.name)); + setSelectedSubject(index) + })() + }, [nativeSubjects]) + function addSubject() { Alert.prompt( 'Ajouter une matière', @@ -46,7 +82,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route [ { text: 'Annuler', - onPress: () => {}, + onPress: () => { }, style: 'destructive' }, { @@ -64,7 +100,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route } let newColor = { - systemCourseName: text.toLowerCase().replace(' ','').normalize('NFD').replace(/[\u0300-\u036f]/g, ''), + systemCourseName: text.toLowerCase().replace(' ', '').normalize('NFD').replace(/[\u0300-\u036f]/g, ''), originalCourseName: text.toUpperCase(), color: UIColors.primary, }; @@ -73,7 +109,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route AsyncStorage.setItem('savedColors', JSON.stringify(colors)).then(() => { // add before the last item - setNativeSubjects ((prev) => [ + setNativeSubjects((prev) => [ ...prev.slice(0, prev.length - 1), { actionKey: newColor.systemCourseName, @@ -113,7 +149,13 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route if (customHomeworks) { hw = JSON.parse(customHomeworks); } - + if (homeworkLocalID) { + for (let i = 0; i < hw.length; i++) { + if (hw[i].id === editedHomework.id) { + hw.splice(i, 1); + } + } + } // console.log(hw); let hwDate = new Date(date); @@ -151,7 +193,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route navigation.goBack(); }); }); - + } useEffect(() => { @@ -163,11 +205,11 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route for (let i = 0; i < savedColorsKeys.length; i++) { let item = savedColors[savedColorsKeys[i]]; - if(savedColorsKeys[i].trim() == '') continue; - if(savedColorsKeys[i].trim() == '0') continue; - if(savedColorsKeys[i].trim() == 'ajouterunematiere') continue; + if (savedColorsKeys[i].trim() == '') continue; + if (savedColorsKeys[i].trim() == '0') continue; + if (savedColorsKeys[i].trim() == 'ajouterunematiere') continue; - setNativeSubjects ((prev) => [ + setNativeSubjects((prev) => [ ...prev, { actionKey: item.systemCourseName, @@ -188,7 +230,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route ]); } - setNativeSubjects ((prev) => [ + setNativeSubjects((prev) => [ ...prev, { type: 'menu', @@ -213,6 +255,9 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route }, 200); } }); + if (homeworkLocalID) { + setupEdit() + } }, []); // change the header title @@ -253,11 +298,11 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route return ( - {layouted()}} style={{ backgroundColor: UIColors.element, borderBottomColor: UIColors.borderLight, borderBottomWidth: 0.5, gap: 9, paddingBottom: 16, zIndex: 99 }}> - + { layouted() }} style={{ backgroundColor: UIColors.element, borderBottomColor: UIColors.borderLight, borderBottomWidth: 0.5, gap: 9, paddingBottom: 16, zIndex: 99 }}> + = ({ route /> - { loading ? ( - + {loading ? ( + Chargement des matières... ) : ( - + = ({ route menuItems: nativeSubjects, }} isMenuPrimaryAction={true} - onPressMenuItem={({nativeEvent}) => { + onPressMenuItem={({ nativeEvent }) => { if (nativeEvent.actionKey === 'new') { addSubject(); return; @@ -328,14 +373,14 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route )} } + icon={} /> { - AsyncStorage.getItem('pap_homeworksCustom').then((customHomeworks) => { + AsyncStorage.getItem('pap_homeworksCustom').then(async(customHomeworks) => { let hw = []; if (customHomeworks) { hw = JSON.parse(customHomeworks); @@ -81,6 +81,7 @@ function HomeworkScreen({ route, navigation }: { } AsyncStorage.setItem('pap_homeworksCustom', JSON.stringify(hw)); + await AsyncStorage.setItem("refreshHomeworks", "true") navigation.goBack(); }); }; @@ -90,14 +91,24 @@ function HomeworkScreen({ route, navigation }: { navigation.setOptions({ headerRight: () => ( homework.custom && ( - { - setDeleteCustomHomeworkAlert(true); - }} - > - - + + { + navigation.navigate("CreateHomework", {homeworkLocalID: homeworkLocalID}); + }} + > + + + { + setDeleteCustomHomeworkAlert(true); + }} + > + + + ) ), }); @@ -457,6 +468,18 @@ const styles = StyleSheet.create({ marginRight: -2, gap: 4, }, + editHw: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#0000ff22', + borderRadius: 12, + borderCurve: 'continuous', + paddingVertical: 8, + paddingHorizontal: 8, + marginRight: 5, + gap: 4, + }, }); export default HomeworkScreen; diff --git a/views/DevoirsScreen.tsx b/views/DevoirsScreen.tsx index ccf7b1bd..26518fcc 100644 --- a/views/DevoirsScreen.tsx +++ b/views/DevoirsScreen.tsx @@ -9,7 +9,7 @@ import { RefreshControl, SectionList, ActivityIndicator, - TouchableOpacity, + TouchableOpacity } from 'react-native'; import { useTheme, Text } from 'react-native-paper'; @@ -38,7 +38,7 @@ import GetUIColors from '../utils/GetUIColors'; import { useAppContext } from '../utils/AppContext'; import NativeText from '../components/NativeText'; -import {PronoteApiHomeworkReturnType } from 'pawnote'; +import { PronoteApiHomeworkReturnType } from 'pawnote'; import * as WebBrowser from 'expo-web-browser'; import type { PapillonHomework } from '../fetch/types/homework'; @@ -62,7 +62,7 @@ const homeworksUntilDateAtom = atom((get) => { return homeworks.filter((homework) => { const homeworkDate = new Date(homework.date); homeworkDate.setHours(0, 0, 0, 0); - + return homeworkDate.getTime() >= dateTimestamp; }); }); @@ -87,7 +87,6 @@ function DevoirsScreen({ navigation }: { const [loading, setLoading] = useState(false); const [isHeadLoading, setHeadLoading] = useState(false); - useLayoutEffect(() => { navigation.setOptions({ headerTitle: 'Travail à faire', @@ -98,7 +97,7 @@ function DevoirsScreen({ navigation }: { marginRight: 16 }} onPress={async () => { - navigation.navigate("CreateHomework") + navigation.navigate("CreateHomework", { homeworkLocalID: false }) }} > @@ -108,9 +107,9 @@ function DevoirsScreen({ navigation }: { }, [navigation, UIColors, loading]); const appContext = useAppContext(); - + type HomeworkItem = { title: string, data: PapillonHomework[] } - + const [fromDate, setFromDate] = useAtom(dateFromAtom); const [totalHomeworks, setTotalHomeworks] = useAtom(homeworksAtom); const [groupedHomeworks] = useAtom( @@ -163,13 +162,18 @@ function DevoirsScreen({ navigation }: { await fetchHomeworks(new Date(), true); })(); }, []); - // Load initial homeworks on first render. useEffect(() => { (async () => { // setLoading(true); await fetchHomeworks(new Date()); })(); + navigation.addListener("focus", () => { + AsyncStorage.getItem("refreshHomeworks").then((h) => { + if (h) onRefresh() + if (h) AsyncStorage.setItem("refreshHomeworks", "") + }) + }) }, []); return ( @@ -180,7 +184,7 @@ function DevoirsScreen({ navigation }: { }} > {(urlOpened && Platform.OS === 'ios') ? ( - + ) : ( } - renderItem={({ item, index }) => ( + renderItem={({ item, index }) => ( ( - + )} renderSectionHeader={({ section: { title } }) => ( Platform.OS === 'ios' ? ( @@ -243,7 +247,7 @@ function DevoirsScreen({ navigation }: { paddingVertical: 7, }} > - + {title} @@ -254,7 +258,7 @@ function DevoirsScreen({ navigation }: { paddingHorizontal: 15, paddingVertical: 16, }}> - + {title} @@ -266,10 +270,10 @@ function DevoirsScreen({ navigation }: { }} /> )} /> - - {Platform.OS === 'ios' && ( + + {Platform.OS === 'ios' && ( { @@ -300,7 +304,7 @@ function Hwitem({ homework, openURL, navigation }: { const handleStateChange = async () => { setCheckStateLoading(true); - + await appContext.dataProvider?.changeHomeworkState(homework, !homework.done); setCheckStateLoading(false); }; @@ -332,7 +336,7 @@ function Hwitem({ homework, openURL, navigation }: { }, []); if (!homework) return; - + return ( - - {homework.subject.name.toUpperCase()} + + {homework.subject.name ? homework.subject.name.toUpperCase() : 'INCONNU'} - + @@ -637,7 +641,7 @@ const styles = StyleSheet.create({ paddingBottom: 18, width: '100%', - + shadowColor: '#000', shadowOpacity: 0.25, shadowRadius: 4,