Skip to content
This repository has been archived by the owner on Aug 25, 2024. It is now read-only.

Commit

Permalink
Merge pull request #268 from LeGeek01/fixissue-171
Browse files Browse the repository at this point in the history
Ajout de l'édition d'un devoir custom
  • Loading branch information
LeGeek01 authored Jun 12, 2024
2 parents 8445182 + ddf61dd commit 49b5da0
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 62 deletions.
54 changes: 47 additions & 7 deletions views/Devoirs/CreateHomeworkScreen.android.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -32,8 +40,27 @@ function CreateHomeworkScreenAndroid({ navigation }) {
const [newSubjectName, setNewSubjectName] = React.useState<string>()
const [newSubjectColor, setNewSubjectColor] = React.useState<string>(UIColors.text)
const [colorModalOpen, setColorModalOpen] = React.useState(false)
const [editedHomework, setEditedHomework] = React.useState()
const textInputRef = React.useRef(null);
const createNewSubjectModal = React.useRef<BottomSheetModal>(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(() => {
Expand All @@ -52,6 +79,11 @@ function CreateHomeworkScreenAndroid({ navigation }) {
BackHandler.removeEventListener('hardwareBackPress', onBackPress);
}, [createNewSubjectModal, createNewSubjectModalOpen]),
);
React.useEffect(() => {
if(homeworkLocalID) {
setupEdit()
}
}, [])
React.useEffect(() => {
navigation.setOptions({
headerRight: () => (
Expand All @@ -63,14 +95,21 @@ function CreateHomeworkScreenAndroid({ navigation }) {

}}
>
<Check size={24} color={UIColors.text} onPress={async() => {
<Check size={24} color={UIColors.text} onPress={async() => {
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),
Expand All @@ -92,20 +131,21 @@ 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,
position: 'top'
});

RegisterTrophy('trophy_add_hw');

await AsyncStorage.setItem("refreshHomeworks", "true")
if(editedHomework) navigation.goBack();
navigation.goBack();
});
}}/>
}}/>
</TouchableOpacity>
),
});
Expand Down
91 changes: 68 additions & 23 deletions views/Devoirs/CreateHomeworkScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -37,16 +37,52 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route
const [titleMissingAlert, setTitleMissingAlert] = useState<boolean>(false);

const [homeworkTitle, setHomeworkTitle] = useState<string>('');
const [editedHomework, setEditedHomework] = useState()

const inputRef = useRef<TextInput>(null);
if(Platform.OS === "android") return (<CreateHomeworkScreenAndroid navigation={navigation} />)
if (Platform.OS === "android") return (<CreateHomeworkScreenAndroid navigation={navigation} route={route} />)

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',
'Veuillez entrer le nom de la matière que vous souhaitez ajouter.',
[
{
text: 'Annuler',
onPress: () => {},
onPress: () => { },
style: 'destructive'
},
{
Expand All @@ -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,
};
Expand All @@ -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,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -151,7 +193,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route
navigation.goBack();
});
});

}

useEffect(() => {
Expand All @@ -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,
Expand All @@ -188,7 +230,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route
]);
}

setNativeSubjects ((prev) => [
setNativeSubjects((prev) => [
...prev,
{
type: 'menu',
Expand All @@ -213,6 +255,9 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route
}, 200);
}
});
if (homeworkLocalID) {
setupEdit()
}
}, []);

// change the header title
Expand Down Expand Up @@ -253,11 +298,11 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route

return (
<KeyboardAvoidingView
style={{flex: 1, backgroundColor: UIColors.modalBackground}} behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
style={{ flex: 1, backgroundColor: UIColors.modalBackground }} behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
keyboardVerticalOffset={Platform.OS === 'ios' ? 100 : 0}
>
<View onLayout={(event) => {layouted()}} style={{ backgroundColor: UIColors.element, borderBottomColor: UIColors.borderLight, borderBottomWidth: 0.5, gap: 9, paddingBottom: 16, zIndex: 99 }}>
<View style={[styles.newHwInput, {borderColor: UIColors.text + '18'}]}>
<View onLayout={(event) => { layouted() }} style={{ backgroundColor: UIColors.element, borderBottomColor: UIColors.borderLight, borderBottomWidth: 0.5, gap: 9, paddingBottom: 16, zIndex: 99 }}>
<View style={[styles.newHwInput, { borderColor: UIColors.text + '18' }]}>
<SFSymbol style={[styles.newHwIcon]} size={20} color={UIColors.text + '80'} name="square.and.pencil" />
<TextInput
placeholder="Titre du devoir"
Expand All @@ -278,15 +323,15 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route
/>
</View>

{ loading ? (
<View style={[styles.newHwSubjectInput, {borderColor: UIColors.text + '18', paddingVertical: 11.5}]}>
{loading ? (
<View style={[styles.newHwSubjectInput, { borderColor: UIColors.text + '18', paddingVertical: 11.5 }]}>
<ActivityIndicator size="small" />
<NativeText heading="p2">
Chargement des matières...
</NativeText>
</View>
) : (
<View style={[styles.newHwSubjectInput, {borderColor: UIColors.text + '18'}]}>
<View style={[styles.newHwSubjectInput, { borderColor: UIColors.text + '18' }]}>
<View
style={{
width: 15,
Expand All @@ -302,7 +347,7 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route
menuItems: nativeSubjects,
}}
isMenuPrimaryAction={true}
onPressMenuItem={({nativeEvent}) => {
onPressMenuItem={({ nativeEvent }) => {
if (nativeEvent.actionKey === 'new') {
addSubject();
return;
Expand All @@ -328,14 +373,14 @@ const CreateHomeworkScreen: React.FC<{ route: any; navigation: any }> = ({ route
)}
</View>
<View
style={{ flex: 1, alignContent: 'center', justifyContent: 'center'}}
style={{ flex: 1, alignContent: 'center', justifyContent: 'center' }}
>
<StatusBar animated backgroundColor="#fff" barStyle="light-content" />

<PapillonLoading
title="Ajouter un devoir"
subtitle={'Indiquez un titre et une matière pour votre devoir personnalisé le ' + new Date(date).toLocaleDateString('fr-FR', { weekday: 'short', month: 'long', day: 'numeric' }) + '.'}
icon={<SFSymbol color={UIColors.text} name="book" size={26} style={{marginBottom:15}} />}
icon={<SFSymbol color={UIColors.text} name="book" size={26} style={{ marginBottom: 15 }} />}
/>

<AlertBottomSheet
Expand Down Expand Up @@ -438,7 +483,7 @@ const styles = StyleSheet.create({

borderWidth: 1,
},
newHwIcon : {
newHwIcon: {
marginTop: 8,
},
newHwTextInput: {
Expand All @@ -450,7 +495,7 @@ const styles = StyleSheet.create({
paddingRight: 10,

marginBottom: 'auto',

marginTop: -5,
paddingBottom: 4,
},
Expand Down
Loading

0 comments on commit 49b5da0

Please sign in to comment.