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

Beta 6.6.5 #243

Merged
merged 92 commits into from
May 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
5bf7eff
fix(user): Propreté du code de `user.ts`
camarm-dev Apr 14, 2024
e4e71d5
fix(timetable): Propreté du code de `timetable.ts`
camarm-dev Apr 14, 2024
b81fd34
fix(connector): Propreté du code de `connector.ts`
camarm-dev Apr 14, 2024
67867f6
fix(timetable): Propreté du code de `vie_scolaire.ts`
camarm-dev Apr 14, 2024
7d56f36
feat(evaluations): POC de la récupération des évaluations
camarm-dev Apr 14, 2024
49438ee
fix(uuid): utilisation d'un module (préinstallé avec ed-core) pour la…
camarm-dev Apr 14, 2024
f0d9f3c
feat(doubleauth): POC de l'authentification à facteurs
camarm-dev Apr 14, 2024
ddf514a
feat(evaluations): renvoie des notes de la période demandée seulement
camarm-dev Apr 14, 2024
11422c3
feat(ecoledirecte): mise à jour du module `papillon-ed-core`
camarm-dev Apr 14, 2024
d2da09a
Merge branch 'PapillonApp:development' into development
LeMaitre4523 Apr 15, 2024
3d9bc2a
Merge branch 'PapillonApp:development' into development
LeMaitre4523 Apr 16, 2024
f8586cd
Merge branch 'PapillonApp:development' into development
LeMaitre4523 Apr 16, 2024
bf3279c
feat(doubleauth): POC de l'implémentation de la double authentificati…
camarm-dev Apr 16, 2024
c677f47
Merge remote-tracking branch 'origin/development' into development
camarm-dev Apr 16, 2024
d86a10b
feat(timetable): ajout distinction cours "vacances"
LeMaitre4523 Apr 16, 2024
107c6d8
nouvelle version ed-core
LeMaitre4523 Apr 16, 2024
c66013b
feat(login): Support de la double auth
LeMaitre4523 Apr 16, 2024
a4ea0e1
fix: propreté du code
camarm-dev Apr 16, 2024
fcb2ff9
Merge branch 'PapillonApp:development' into development
LeMaitre4523 Apr 16, 2024
6e55af5
Merge branch 'PapillonApp:development' into development
LeMaitre4523 Apr 24, 2024
0453e6c
Merge branch 'PapillonApp:development' into development
LeMaitre4523 Apr 25, 2024
2a756d6
Merge branch 'PapillonApp:development' into development
camarm-dev Apr 27, 2024
06fbc32
fix(grades): le nom de la matière était en double
Vilerio May 1, 2024
18b6bc3
fix(grades): affichage de la moyenne groupe en dessous de la moyenne …
Vilerio May 1, 2024
0bf4d88
fix(grades): suppression du warning
Vilerio May 1, 2024
56f7852
Merge branch 'PapillonApp:development' into development
LeMaitre4523 May 7, 2024
8714bc5
Merge branch 'PapillonApp:development' into development
LeMaitre4523 May 16, 2024
2ebbec5
Merge branch 'PapillonApp:development' into development
LeMaitre4523 May 18, 2024
120cd70
feat(android perm): add write to external storage perm
LeGeek01 May 18, 2024
de6f39e
fix(connector): ajout des variables de cache
LeMaitre4523 May 19, 2024
2d17aac
fix(timetable): suppression des cours de type permanence (vide)
LeMaitre4523 May 19, 2024
bf40213
feat(datainstance): ajout des fonctions pour ecoledirecte only (docs,…
LeMaitre4523 May 19, 2024
009e087
feat(appstack): ajout des menus cloud et docs pour ed
LeMaitre4523 May 19, 2024
f81bb6d
feat(tabstack): ajout du menu eténdu si instance ed
LeMaitre4523 May 19, 2024
f39887b
feat(ED_ExetendedMenu): ajout du menu eténdu ED
LeMaitre4523 May 19, 2024
9422151
feat(fetch): ajout des "fetch" pour le menu étendu (cloud, docs)
LeMaitre4523 May 19, 2024
c8dfbbe
fix: :construction: Update iOS
ecnivtwelve May 19, 2024
a8347b8
build: :construction: Updates iOS
ecnivtwelve May 19, 2024
7d2ed67
fix: :lipstick: Suppression de l'icône refresh DEGEULASSE sous iOS
ecnivtwelve May 19, 2024
5adca84
fix: :bug: Couleurs dans l'ajout au calendrier
ecnivtwelve May 19, 2024
6422a09
fix: :bug: Export des couleurs iOS
ecnivtwelve May 19, 2024
e9b56ee
fix: :lipstick: Icône de l'export des couleurs
ecnivtwelve May 19, 2024
e07b488
feat: :sparkles: Modal de la moyenne d'une matière
ecnivtwelve May 20, 2024
dd887e8
fix: :lipstick: Couleurs sur la modal de visualisation de moyenne de …
ecnivtwelve May 20, 2024
451c39c
feat: :lipstick: Apparence Android de la modal de moyennes matière
ecnivtwelve May 20, 2024
75333d0
feat: :lipstick: Apparence bouton envoi de copie
ecnivtwelve May 20, 2024
c53ba57
fix: :speech_balloon: Indication du dépot de fichier plus descriptive
ecnivtwelve May 20, 2024
cc8cff3
fix: :speech_balloon: Indications plus descriptives pour l'envoi de m…
ecnivtwelve May 20, 2024
de36eec
fix: :lipstick: Réajustement du marginBottom sur la boucle des messages
ecnivtwelve May 20, 2024
b58d91a
feat: :lipstick: Menus contextuels pour les messages + affichage des …
ecnivtwelve May 20, 2024
79db8d9
Merge branch 'PapillonApp:development' into development
LeMaitre4523 May 20, 2024
b642ec5
fix(extended_menu): suppression temporaire de messagerie
LeMaitre4523 May 20, 2024
cfebbd7
draft(courscolor): quelques tentatives sur l'export qui ne fonctionne…
LeGeek01 May 20, 2024
a3f9e47
feat: :sparkles: Nouvel écran d'accueil
ecnivtwelve May 20, 2024
0bec989
fix: :lipstick: Ouverture du cours à l'appui
ecnivtwelve May 20, 2024
68e52da
fix: :zap: Séparation chargement cours / devoirs
ecnivtwelve May 20, 2024
9dd6061
Merge pull request #228 from PapillonApp/ui/new-homescreen
ecnivtwelve May 20, 2024
d7155e2
fix(about_screen): correciton clicks --> cliques
LeMaitre4523 May 20, 2024
05319eb
fix(lesson_screen): conversion de la date
LeMaitre4523 May 20, 2024
e5390e1
fix: :lipstick: Apparence des cours en modal
ecnivtwelve May 20, 2024
69a99c4
fix: :lipstick: Affichage des messages de l'équipe Papillon
ecnivtwelve May 20, 2024
d1275ca
fix: :dizzy: Animations élement prochain cours
ecnivtwelve May 20, 2024
8b6a641
Merge pull request #229 from PapillonApp/new-course-anim
ecnivtwelve May 20, 2024
03a55f2
fix: :dizzy: Animation au chargement
ecnivtwelve May 20, 2024
199eb1a
Merge pull request #230 from PapillonApp/development
ecnivtwelve May 20, 2024
a10ef87
Merge pull request #231 from PapillonApp/new-course-anim
ecnivtwelve May 20, 2024
533a38f
Merge branch 'development' into development
LeGeek01 May 21, 2024
c5ff0d8
Update NotificationsScreen.tsx
Slysoks May 21, 2024
1612050
Merge pull request #232 from SupRMinecraftien/patch-2
LeGeek01 May 21, 2024
7237754
Merge branch 'development' into doublon
LeGeek01 May 21, 2024
f833d4b
Merge branch 'PapillonApp:development' into development
LeMaitre4523 May 21, 2024
5339390
fix(lesson_screen): fixe durée du cours
LeMaitre4523 May 21, 2024
38c7d80
fix: :bug: Nom du prochain cours qui dépasse
ecnivtwelve May 22, 2024
9123d47
Merge pull request #235 from PapillonApp:fix/homescreen-new-course-name
ecnivtwelve May 22, 2024
f8dd275
Merge pull request #225 from LeMaitre4523/development
LeGeek01 May 22, 2024
ceb1276
fix(grades): undo removing formattedCourseName
Vilerio May 22, 2024
dc781a6
fix(typo): accord de justifié à retard
Vilerio May 22, 2024
a359a7c
fix(typo): correction orthographique
Vilerio May 22, 2024
4788262
fix(typo): accord
Vilerio May 22, 2024
89079e6
Merge pull request #236 from Vilerio/fixs2
LeGeek01 May 22, 2024
ffca338
Merge pull request #205 from Vilerio/doublon
LeGeek01 May 22, 2024
6db2f15
fix(cours): rendering html description
Vilerio May 25, 2024
1d187f4
fix: :bug: Ouverture des URL depuis l'écran d'accueil
ecnivtwelve May 25, 2024
7644ac1
Merge pull request #238 from PapillonApp:fix/new-homescreen-url
ecnivtwelve May 25, 2024
a4a179d
fix: :speech_balloon: Textes du prochain cours plus descriptifs
ecnivtwelve May 25, 2024
48ea725
Merge pull request #239 from PapillonApp:fix/next-cours-description
ecnivtwelve May 25, 2024
ebfc092
fix: :lipstick: Logo de connexion EcoleDirecte
ecnivtwelve May 25, 2024
000ef10
Merge pull request #240 from PapillonApp:enhancement/ui-ed
ecnivtwelve May 25, 2024
ba94bf9
Merge pull request #237 from Vilerio/fixs2
LeGeek01 May 25, 2024
f073761
fix(exportColors): fix de l'export des couleurs
LeGeek01 May 25, 2024
14ee4e0
Merge remote-tracking branch 'upstream/development' into fixissue-223
LeGeek01 May 25, 2024
0db1d63
Merge pull request #242 from LeGeek01/fixissue-223
LeGeek01 May 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ import FlashMessage from 'react-native-flash-message';
startNetworkLogging();
const provider = new IndexDataInstance();

import {
BottomSheetModalProvider,
} from '@gorhom/bottom-sheet';

function App() {
const [loggedIn, setLoggedIn] = useState(false);
const [loading, setLoading] = useState(true);
Expand Down Expand Up @@ -93,18 +97,20 @@ function App() {
return (
<View style={{ flex: 1 }}>
<AppContextProvider state={ctxValue}>
<Stack.Navigator>
{loading ? (
<Stack.Screen name="Loading" component={LoadingScreen} options={{ headerShown: false }} />
) : loggedIn ? (
<Stack.Screen name="AppStack" component={AppStack} options={{ headerShown: false, animation: 'fade', animationDuration: 150 }} />
) : (
<Stack.Screen name="AuthStack" component={AuthStack} options={{ headerShown: false }} />
)}
{AltScreens.map((screen, index) => (
<Stack.Screen key={index} name={screen.name} component={screen.component} options={screen.options} />
))}
</Stack.Navigator>
<BottomSheetModalProvider>
<Stack.Navigator>
{loading ? (
<Stack.Screen name="Loading" component={LoadingScreen} options={{ headerShown: false }} />
) : loggedIn ? (
<Stack.Screen name="AppStack" component={AppStack} options={{ headerShown: false, animation: 'fade', animationDuration: 150 }} />
) : (
<Stack.Screen name="AuthStack" component={AuthStack} options={{ headerShown: false }} />
)}
{AltScreens.map((screen, index) => (
<Stack.Screen key={index} name={screen.name} component={screen.component} options={screen.options} />
))}
</Stack.Navigator>
</BottomSheetModalProvider>
</AppContextProvider>
<FlashMessage position="top" />
</View>
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<data android:scheme="https"/>
</intent>
</queries>
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme">
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme" android:requestLegacyExternalStorage="true">
<meta-data android:name="expo.modules.notifications.default_notification_icon" android:resource="@drawable/notification_icon"/>
<meta-data android:name="expo.modules.updates.ENABLED" android:value="false"/>
<meta-data android:name="expo.modules.updates.EXPO_SDK_VERSION" android:value="49.0.0"/>
Expand Down
60 changes: 60 additions & 0 deletions fetch/EcoleDirecteData/cloud.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import AsyncStorage from '@react-native-async-storage/async-storage';

import { AsyncStorageEcoleDirecteKeys } from './connector';
import { EDCore } from '@papillonapp/ed-core';

import type { cloudResFolder } from '@papillonapp/ed-core/dist/src/types/v3';

interface CachedED_Cloud {
root_folder: cloudResFolder[],
timestamp: number
}

export const EDCloudHandler = async (instance?: EDCore, force = false): Promise<cloudResFolder[] | null> => {

const cache = await AsyncStorage.getItem(AsyncStorageEcoleDirecteKeys.CACHE_CLOUD);
const now = Date.now();


if (cache && !force) {
const data: CachedED_Cloud = JSON.parse(cache);

const userCacheDate = new Date(data.timestamp);
const today = new Date();

userCacheDate.setHours(0, 0, 0, 0);
today.setHours(0, 0, 0, 0);

if (userCacheDate.getTime() === today.getTime()) {
return data.root_folder;
}

await AsyncStorage.removeItem(AsyncStorageEcoleDirecteKeys.CACHE_CLOUD);
return EDCloudHandler(instance, true);
}

if (!instance) return null;

try {

const cloudFromED = await instance.cloud.fetch();


let cachedCloud: CachedED_Cloud = {
timestamp: now,
root_folder: cloudFromED
};
if (cache) cachedCloud = JSON.parse(cache);

await AsyncStorage.setItem(AsyncStorageEcoleDirecteKeys.CACHE_CLOUD, JSON.stringify(cachedCloud));
return cloudFromED;

}
catch (error) {
if (!cache) return null;
const data: CachedED_Cloud = JSON.parse(cache);

console.info('[ecoledirecte/cloud]: network failed, recover with cache');
return data.root_folder;
}
};
98 changes: 48 additions & 50 deletions fetch/EcoleDirecteData/connector.ts
Original file line number Diff line number Diff line change
@@ -1,59 +1,57 @@
import { EDCore } from "@papillonapp/ed-core";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { EDCore } from '@papillonapp/ed-core';
import AsyncStorage from '@react-native-async-storage/async-storage';

export const AsyncStorageEcoleDirecteKeys = {
TOKEN: 'ecoledirecte:token',
DEVICE_UUID: 'ecoledirecte:device_uuid',
USERNAME: 'ecoledirecte:username',
ACCESS_TOKEN: 'ecoledirecte:access_token',

CACHE_GRADES: 'ecoledirecte:cache_grades',
CACHE_USER: 'ecoledirecte:cache_user',
CACHE_TIMETABLE: 'ecoledirecte:cache_timetable',
CACHE_HOMEWORK: 'ecoledirecte:cache_homework',
CACHE_VIE_SCOLAIRE: 'ecoledirecte:cache_vie_scolaire',
TOKEN: 'ecoledirecte:token',
DEVICE_UUID: 'ecoledirecte:device_uuid',
USERNAME: 'ecoledirecte:username',
ACCESS_TOKEN: 'ecoledirecte:access_token',

CACHE_GRADES: 'ecoledirecte:cache_grades',
CACHE_USER: 'ecoledirecte:cache_user',
CACHE_TIMETABLE: 'ecoledirecte:cache_timetable',
CACHE_HOMEWORK: 'ecoledirecte:cache_homework',
CACHE_VIE_SCOLAIRE: 'ecoledirecte:cache_vie_scolaire',
CACHE_DOCUMENTS: 'ecoledirecte:cache_documents',
CACHE_CLOUD: 'ecoledirecte:cache_cloud',
};

export const removeEcoleDirecteConnector = async () => {
await AsyncStorage.multiRemove(Object.values(AsyncStorageEcoleDirecteKeys));
await AsyncStorage.removeItem('service');
};
await AsyncStorage.multiRemove(Object.values(AsyncStorageEcoleDirecteKeys));
await AsyncStorage.removeItem('service');
};

export async function loadEcoleDirecteConnector() {
let ed = new EDCore();
const values = await AsyncStorage.multiGet([
AsyncStorageEcoleDirecteKeys.ACCESS_TOKEN,
AsyncStorageEcoleDirecteKeys.USERNAME,
AsyncStorageEcoleDirecteKeys.DEVICE_UUID,
]);

const access_token = values[0][1];
const username = values[1][1];
const uuid = values[2][1];

if (!access_token || !username || !uuid) {
console.warn('loadEcoleDirecteConnector: information are outdated, logging out...');
await removeEcoleDirecteConnector();
return null;
}



try {
await ed.auth.renewToken(username, uuid, access_token);

if(ed._token) await AsyncStorage.setItem(AsyncStorageEcoleDirecteKeys.TOKEN, ed._token);

return ed;
let ed = new EDCore();
const values = await AsyncStorage.multiGet([
AsyncStorageEcoleDirecteKeys.ACCESS_TOKEN,
AsyncStorageEcoleDirecteKeys.USERNAME,
AsyncStorageEcoleDirecteKeys.DEVICE_UUID,
]);

const access_token = values[0][1];
const username = values[1][1];
const uuid = values[2][1];

if (!access_token || !username || !uuid) {
console.warn('loadEcoleDirecteConnector: information are outdated, logging out...');
await removeEcoleDirecteConnector();
return null;
}

try {
await ed.auth.renewToken(username, uuid, access_token);

if(ed._token) await AsyncStorage.setItem(AsyncStorageEcoleDirecteKeys.TOKEN, ed._token);

return ed;
} catch (error) {
if (error instanceof Error) {
console.error('loadEcoleDirecteConnector: to handle', error);
return null;
}

catch (error) {
if (error instanceof Error) {
console.error('loadEcoleDirecteConnector: to handle', error);
return null;
}

console.error('loadEcoleDirecteConnector: Unknown error.', error);
throw error;
}
}
console.error('loadEcoleDirecteConnector: Unknown error.', error);
throw error;
}
}
62 changes: 62 additions & 0 deletions fetch/EcoleDirecteData/documents.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import AsyncStorage from '@react-native-async-storage/async-storage';
import type { CachedPapillonTimetable, PapillonLesson } from '../types/timetable';
import { dateToFrenchFormat } from '../../utils/dates';

import { AsyncStorageEcoleDirecteKeys } from './connector';
import { EDCore } from '@papillonapp/ed-core';

import type { studentDocsResData } from '@papillonapp/ed-core/dist/src/types/v3';


interface CachedED_Documents {
documents: studentDocsResData,
timestamp: number
}

export const EDDocumentsHandler = async (instance?: EDCore, force = false): Promise<studentDocsResData | null> => {

const cache = await AsyncStorage.getItem(AsyncStorageEcoleDirecteKeys.CACHE_DOCUMENTS);
const now = Date.now();


if (cache && !force) {
const data: CachedED_Documents = JSON.parse(cache);

const userCacheDate = new Date(data.timestamp);
const today = new Date();

userCacheDate.setHours(0, 0, 0, 0);
today.setHours(0, 0, 0, 0);

if (userCacheDate.getTime() === today.getTime()) {
return data.documents;
}

await AsyncStorage.removeItem(AsyncStorageEcoleDirecteKeys.CACHE_DOCUMENTS);
return EDDocumentsHandler(instance, true);
}

if (!instance) return null;

try {

const documentsFromED = await instance.documents.fetch();


let cachedDocuments: CachedED_Documents = {
timestamp: now,
documents: documentsFromED,
};
if (cache) cachedDocuments = JSON.parse(cache);

await AsyncStorage.setItem(AsyncStorageEcoleDirecteKeys.CACHE_DOCUMENTS, JSON.stringify(cachedDocuments));
return documentsFromED;
}
catch (error) {
if (!cache) return null;
const data: CachedED_Documents = JSON.parse(cache);

console.info('[ecoledirecte/documents]: network failed, recover with cache');
return data.documents;
}
};
56 changes: 56 additions & 0 deletions fetch/EcoleDirecteData/evaluations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { EDCore } from '@papillonapp/ed-core';
import {gradesResData} from '@papillonapp/ed-core/dist/src/types/v3';
import type {PapillonEvaluation, PapillonEvaluationAcquisition} from '../types/evaluations';

export const EDEvaluationsHandler = async (period: string, force = false, instance?: EDCore): Promise<PapillonEvaluation[]> => {

// TODO cache

try {
if (!instance) throw new Error('No instance available.');


const gradesData: gradesResData = await instance.grades.fetch();
const data: PapillonEvaluation[] = [];

for (const gradeObject of gradesData.notes) {
if (gradeObject.codePeriode != period) continue;
const acquisitions: PapillonEvaluationAcquisition[] = [];
for (const skill of gradeObject.elementsProgramme) {
acquisitions.push({
id: skill.idCompetence.toString(),
name: skill.libelleCompetence,
// TODO correctly fill coef
coefficient: 0,
abbreviation: skill.libelleCompetence,
level: skill.valeur,
});
}
data.push({
// TODO add id
id: '',
subject: {
id: gradeObject.codeMatiere,
name: gradeObject.libelleMatiere,
// TODO, pas cette option sur ED ?
groups: false
},
name: gradeObject.typeDevoir,
description: gradeObject.devoir,
// TODO
teacher: '',
// TODO La date faut la mettre en number, quel format ?
// date: gradeObject.dateSaisie,
date: 0,
// TODO
paliers: [],
coefficient: parseInt(gradeObject.coef),
acquisitions
});
}
return data;
}
catch {
return [];
}
};
Loading