diff --git a/package-lock.json b/package-lock.json
index a9882157..398b0116 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ecole-directe-plus",
- "version": "0.2.5",
+ "version": "0.3.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "ecole-directe-plus",
- "version": "0.2.5",
+ "version": "0.3.0",
"dependencies": {
"@floating-ui/react": "^0.25.4",
"@vitejs/plugin-basic-ssl": "^1.0.1",
@@ -14,6 +14,7 @@
"body-scroll-lock": "^4.0.0-beta.0",
"crypto-js": "^4.1.1",
"dompurify": "^3.1.0",
+ "js-sha256": "^0.11.0",
"react-content-loader": "^6.2.1",
"react-router-dom": "^6.16.0",
"uuid": "^9.0.1",
@@ -1047,6 +1048,11 @@
"node": ">=4"
}
},
+ "node_modules/js-sha256": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.0.tgz",
+ "integrity": "sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q=="
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -2023,6 +2029,11 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
+ "js-sha256": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.0.tgz",
+ "integrity": "sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q=="
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
diff --git a/package.json b/package.json
index 5adb7928..4900b676 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ecole-directe-plus",
- "version": "0.2.5",
+ "version": "0.3.0",
"type": "module",
"description": "Ecole Directe plus is a React web app that is designed to replace and improve EcoleDirecte",
"dependencies": {
@@ -10,6 +10,7 @@
"body-scroll-lock": "^4.0.0-beta.0",
"crypto-js": "^4.1.1",
"dompurify": "^3.1.0",
+ "js-sha256": "^0.11.0",
"react-content-loader": "^6.2.1",
"react-router-dom": "^6.16.0",
"uuid": "^9.0.1",
diff --git a/public/images/new/about-arrow.svg b/public/images/about-arrow.svg
similarity index 100%
rename from public/images/new/about-arrow.svg
rename to public/images/about-arrow.svg
diff --git a/public/images/canardman-sleeping.svg b/public/images/canardman-sleeping.svg
new file mode 100644
index 00000000..9a24714d
--- /dev/null
+++ b/public/images/canardman-sleeping.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/App.jsx b/src/App.jsx
index f43398e3..0a133add 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -69,7 +69,7 @@ function consoleLogEDPLogo() {
consoleLogEDPLogo();
-const currentEDPVersion = "0.2.5";
+const currentEDPVersion = "0.3.0";
const apiVersion = "4.53.4";
// secret webhooks
@@ -936,6 +936,7 @@ export default function App() {
enabledFeatures.moyenneMin = settings.moyenneMin;
enabledFeatures.moyenneMax = settings.moyenneMax;
+ enabledFeatures.coefficient = settings.coefficientNote;
// add the average of all subjects a special type of chart
for (const period in periods) {
@@ -964,20 +965,44 @@ export default function App() {
setDefaultPeriod(periods)
}
- function sortNextHomeworks(homeworks) { // This function will sort (I would rather call it translate) the EcoleDirecte response to a better js object
+ function sortNextHomeworks(homeworks) { // This function will sort (I would rather call it translate) the EcoleDirecte response to a better js object
+ const upcomingAssignments = []
const sortedHomeworks = Object.fromEntries(Object.entries(homeworks).map((day) => {
- return [day[0], day[1].map((homework) => {
+ return [day[0], day[1].map((homework, i) => {
const { codeMatiere, donneLe, effectue, idDevoir, interrogation, matiere, /* rendreEnLigne, documentsAFaire // I don't know what to do with that for now */ } = homework;
- return ({
+ const task = {
id: idDevoir,
subjectCode: codeMatiere,
subject: matiere,
addDate: donneLe,
isInterrogation: interrogation,
isDone: effectue,
- })
+ }
+
+ if (interrogation && upcomingAssignments.length < 3) {
+ upcomingAssignments.push({
+ date: day[0],
+ id: idDevoir,
+ index: i,
+ subject: matiere,
+ subjectCode: codeMatiere,
+ });
+ }
+
+ return task;
})]
}))
+
+ if (upcomingAssignments.length > 0) {
+ let i = 0;
+ while (upcomingAssignments.length < 3) {
+ upcomingAssignments.push({
+ id: "dummy" + i,
+ });
+ i++;
+ }
+ }
+ changeUserData("upcomingAssignments", upcomingAssignments)
return sortedHomeworks
}
@@ -988,9 +1013,9 @@ export default function App() {
if (!aFaire) {
return null;
}
-
+
const { donneLe, effectue, contenu, contenuDeSeance, document } = aFaire;
- return ({
+ return {
id: id,
subjectCode: codeMatiere,
subject: matiere,
@@ -1002,10 +1027,9 @@ export default function App() {
files: document,
sessionContent: contenuDeSeance.contenu,
sessionContentFiles: contenuDeSeance.documents,
- })
+ }
}).filter((item) => item)]
}))
- console.log("sortedHomeworks:", sortedHomeworks)
return sortedHomeworks
}
@@ -1401,56 +1425,57 @@ export default function App() {
} else {
endpoint = "cahierdetexte/" + getISODate(date);
}
-
- fetch(
- getProxiedURL(`https://api.ecoledirecte.com/v3/Eleves/${accountsListState[userId].id}/${endpoint}.awp?verbe=get&v=${apiVersion}`, true),
- {
- method: "POST",
- headers: {
- "x-token": tokenState
+ if (accountsListState[activeAccount].firstName === "Guest") {
+ if (date === "incoming") {
+ import("./data/homeworks.json").then((module) => {
+ changeUserData("sortedHomeworks", sortNextHomeworks(module.data))
+ })
+ } else {
+ import("./data/detailed_homeworks.json").then((module) => {
+ changeUserData("sortedHomeworks", { ...getUserData("sortedHomeworks"), ...sortDayHomeworks({ [module.data.date]: module.data.matieres }) })
+ })
+ }
+ abortControllers.current.splice(abortControllers.current.indexOf(controller), 1);
+ } else {
+ fetch(
+ getProxiedURL(`https://api.ecoledirecte.com/v3/Eleves/${accountsListState[userId].id}/${endpoint}.awp?verbe=get&v=${apiVersion}`, true),
+ {
+ method: "POST",
+ headers: {
+ "x-token": tokenState
+ },
+ body: "data={}",
+ signal: controller.signal
},
- body: "data={}",
- signal: controller.signal
- },
- )
- .then((response) => response.json())
- .then((response) => {
- let code;
- if (accountsListState[activeAccount].firstName === "Guest") {
- code = 49969;
- } else {
- code = response.code;
- }
- if (code === 200) {
- if (date === "incoming") {
- changeUserData("sortedHomeworks", { ...sortNextHomeworks(response.data), ...getUserData("sortedHomeworks") })
- } else {
- changeUserData("sortedHomeworks", { ...getUserData("sortedHomeworks"), ...sortDayHomeworks({ [response.data.date]: response.data.matieres }) })
+ )
+ .then((response) => response.json())
+ .then((response) => {
+ const code = response.code;
+ if (code === 200) {
+ if (date === "incoming") {
+ changeUserData("sortedHomeworks", { ...sortNextHomeworks(response.data), ...getUserData("sortedHomeworks") })
+ } else {
+ changeUserData("sortedHomeworks", { ...getUserData("sortedHomeworks"), ...sortDayHomeworks({ [response.data.date]: response.data.matieres }) })
+ }
+ } else if (code === 520 || code === 525) {
+ // token invalide
+ console.log("INVALID TOKEN: LOGIN REQUIRED");
+ requireLogin();
}
- } else if (code === 520 || code === 525) {
- // token invalide
- console.log("INVALID TOKEN: LOGIN REQUIRED");
- requireLogin();
- } else if (code === 49969) {
- let userHomeworks = structuredClone(homeworks);
- import("./data/homeworks.json").then((module) => {
- userHomeworks[userId] = module.data;
- setHomeworks(userHomeworks);
- })
- }
- setTokenState((old) => (response?.token || old));
- })
- .catch((error) => {
- if (error.message === "Unexpected token 'P', \"Proxy error\" is not valid JSON") {
- setProxyError(true);
- }
- })
- .finally(() => {
- abortControllers.current.splice(abortControllers.current.indexOf(controller), 1);
- })
+ setTokenState((old) => (response?.token || old));
+ })
+ .catch((error) => {
+ if (error.message === "Unexpected token 'P', \"Proxy error\" is not valid JSON") {
+ setProxyError(true);
+ }
+ })
+ .finally(() => {
+ abortControllers.current.splice(abortControllers.current.indexOf(controller), 1);
+ })
+ }
}
- async function fetchHomeworksDone({ tasksDone=[], tasksNotDone=[]}, controller = (new AbortController())) {
+ async function fetchHomeworksDone({ tasksDone = [], tasksNotDone = [] }, controller = (new AbortController())) {
/**
* Change the state of selected homeworks
* @param tasksDone Tasks switched to true
@@ -1468,7 +1493,7 @@ export default function App() {
headers: {
"x-token": tokenState
},
- body: "data=" + JSON.stringify({idDevoirsEffectues: tasksDone, idDevoirsNonEffectues: tasksNotDone}),
+ body: "data=" + JSON.stringify({ idDevoirsEffectues: tasksDone, idDevoirsNonEffectues: tasksNotDone }),
signal: controller.signal
},
)
diff --git a/src/components/EdpUnblock/EdpUnblock.css b/src/components/EdpUnblock/EdpUnblock.css
index c9dca02a..f57dd26b 100644
--- a/src/components/EdpUnblock/EdpUnblock.css
+++ b/src/components/EdpUnblock/EdpUnblock.css
@@ -85,7 +85,7 @@
font-size: var(--font-size-36);
}
-.edpu-page main > div > p {
+.edpu-page main > div > p, .edpu-page main > div > p span {
max-width: 650px;
font-size: var(--font-size-20);
color: #b4b4f0;
diff --git a/src/components/EdpUnblock/EdpUnblock.jsx b/src/components/EdpUnblock/EdpUnblock.jsx
index 4b86690a..f9746aa3 100644
--- a/src/components/EdpUnblock/EdpUnblock.jsx
+++ b/src/components/EdpUnblock/EdpUnblock.jsx
@@ -106,7 +106,7 @@ export default function EdpUnblock() {
Ecole Directe Plus a besoin de cette extension de navigateur pour accéder au contenu fourni par l’API d’EcoleDirecte.
+Ecole Directe Plus a besoin de cette extension de navigateur pour fonctionner correctement et accéder à l’API d’EcoleDirecte.
{compatibilityCondition ? <>Malheureusement, l'extension Ecole Directe Plus Unblock n'est pas disponible sur votre navigateur. 😥
S'il vous plaît considérez l'usage d'un navigateur compatible comme le {userOS === "iOS" ? "navigateur Orion" : "navigateur Firefox"}.
> : null} {browserLogosInfos[userBrowser].logo} @@ -136,9 +136,9 @@ export default function EdpUnblock() {EDP Unblock est une extension de navigateur qui offre un accès ininterrompu à Ecole Directe Plus en donnant l'accès en continu aux données fournies par l'API d'EcoleDirecte. Cette extension est nécessaire au bon fonctionnement d'Ecole Directe Plus.
EDP Unblock étant une extension de navigateur, la source d'installation diffère en fonction de votre navigateur et votre OS. Cliquez sur le bouton "Ajouter l'extension" ci-dessus et vous devriez être redirigé automatiquement vers la boutique d'extensions compatible avec votre navigateur. Mise en garde : EDP Unblock n'est pas disponible sur tous les navigateurs suivant les plateformes. Sur iOS et iPadOS, Apple restreint fortement la distribution d'extensions, EDP Unblock sera donc uniquement disponible sur le navigateur Orion. Si vous êtes sur un appareil Android, considérez l'usage du navigateur Firefox ou KiwiBrowser. Si vous êtes sur MacOS, tous les navigateurs hormis Safari devrait être compatibles avec EDP Unblock. Enfin, si vous utilisez un ordinateur sous Windows ou Linux, la grande majorité des navigateurs devraient être compatibles avec l'extension (basé sur Chromium : Chrome, Edge, Brave, Opera, ... ; basé sur Gecko : Firefox)
+EDP Unblock étant une extension de navigateur, la source d'installation diffère en fonction de votre navigateur et votre OS. Cliquez sur le bouton "Ajouter l'extension" ci-dessus et vous devriez être redirigé automatiquement vers la boutique d'extensions compatible avec votre navigateur. Mise en garde : EDP Unblock n'est pas disponible sur tous les navigateurs suivant les plateformes. Sur iOS et iPadOS, Apple restreint fortement la distribution d'extensions, EDP Unblock sera donc uniquement disponible sur le navigateur Orion. Si vous êtes sur un appareil Android, considérez l'usage du navigateur Firefox ou KiwiBrowser. Si vous êtes sur MacOS, tous les navigateurs hormis Safari devraient être compatibles avec EDP Unblock. Enfin, si vous utilisez un ordinateur sous Windows ou Linux, la grande majorité des navigateurs devraient être compatibles avec l'extension (basé sur Chromium : Chrome, Edge, Brave, Opera, ... ; basé sur Gecko : Firefox)
EDP Unblock est exclusivement active sur les domaines `ecole-directe.plus` ainsi que `ecoledirecte.com`. L'extension ne peut pas accéder aux informations provenant de n'importe quel autre site web. De plus, EDP Unblock ne lit aucune donnée : l'extension sert simplement de passerelle aux requêtes pour "arriver correctement à destination", mais n'a pas accès à leur contenu. Ainsi, EDP Unblock ne collecte aucune donnée et effectue toutes ces opérations en local sur l'appareil du client.
+EDP Unblock est exclusivement active sur les domaines `ecole-directe.plus` ainsi que `ecoledirecte.com`. L'extension ne peut pas accéder aux informations provenant de n'importe quel autre site web. De plus, EDP Unblock ne lit aucune donnée : l'extension joue simplement le rôle de passerelle aux requêtes pour "les amener correctement à destination", mais n'a pas accès à leur contenu. Ainsi, EDP Unblock ne collecte aucune donnée et effectue toutes ces opérations en local sur l'appareil client.
L'extension Ecole Directe Plus Unblock, tout comme le site Ecole Directe Plus, est un projet open-source sous license MIT, le code source est donc disponible en ligne : dépôt Github.
diff --git a/src/components/Feedback/FeedbackForm.jsx b/src/components/Feedback/FeedbackForm.jsx index 88f12a2e..d9a9d9b9 100644 --- a/src/components/Feedback/FeedbackForm.jsx +++ b/src/components/Feedback/FeedbackForm.jsx @@ -16,6 +16,7 @@ import AtWhite from "../graphics/AtWhite" import { getProxiedURL } from "../../utils/requests"; import "./FeedbackForm.css"; +import { getBrowser, getOS } from "../../utils/utils"; export default function FeedbackForm({ activeUser, carpeConviviale, onSubmit=() => {} }) { @@ -28,6 +29,7 @@ export default function FeedbackForm({ activeUser, carpeConviviale, onSubmit=() ### Étapes pour reproduire : ### Navigateur/OS/Appareil : +${getBrowser()} ; ${getOS()} ;{errorMessage}
+{errorMessage}
}Chargement en cours...
+ : Array.from({ length: 3 }, (_, i) =>coefficient : {selectedElement.coef}{selectedElement.isSignificant ? "" : (selectedElement.isReal ? " (non significatif)" : " (note simulée)")}
-coefficient : {selectedElement.coef}{selectedElement.isSignificant ? "" : (selectedElement.isReal ? " (non significatif)" : " (note simulée)")}
} +- La version 0.2.5 est arrivée ! Cette mise à jour n'apporte certainement pas toutes les nouvelles fonctionnalités que vous auriez pu espérer. Toutefois, nous avons quelques nouveautés pour vous... + Canardman va enfin pouvoir se mettre au travail ! Après une longue attente, nous sommes impatients de vous faire découvrir des fonctionnalités attendues :
-
Rencontrez la communauté et les développeurs d'Ecole Directe Plus en rejoignant le serveur Discord !
- -- Nous avons récemment créé un serveur Discord communautaire pour Ecole Directe Plus. Vous pourrez y retrouver les autres adeptes d'EDP, discuter avec les développeurs, nous aider à corriger les bugs que vous rencontrez, etc. - Vous serez également aux premières loges en cas d'annonce importante. De plus, vous pourrez consulter les retours des utilisateurs et découvrir ce qu'ils pensent d'EDP. - Rejoignez le Canardman-Gang en cliquant ici
-+ La version 0.2.5 est arrivée ! Cette mise à jour n'apporte certainement pas toutes les nouvelles fonctionnalités que vous auriez pu espérer. Toutefois, nous avons quelques nouveautés pour vous... +
++
Rencontrez la communauté et les développeurs d'Ecole Directe Plus en rejoignant le serveur Discord !
+ ++ Nous avons récemment créé un serveur Discord communautaire pour Ecole Directe Plus. Vous pourrez y retrouver les autres adeptes d'EDP, discuter avec les développeurs, nous aider à corriger les bugs que vous rencontrez, etc. + Vous serez également aux premières loges en cas d'annonce importante. De plus, vous pourrez consulter les retours des utilisateurs et découvrir ce qu'ils pensent d'EDP. + Rejoignez le Canardman-Gang en cliquant ici
+diff --git a/src/components/generic/Policy.jsx b/src/components/generic/Policy.jsx index 57ea32bd..3979d5af 100644 --- a/src/components/generic/Policy.jsx +++ b/src/components/generic/Policy.jsx @@ -24,11 +24,11 @@ export default function Policy({ onCloseNavigateURL }) {
✅ Ecole Directe Plus ne collecte aucune information sur les utilisateurs du service.
✅ Ecole Directe Plus ne crée pas de compte lors de la connexion, la connexion a lieu sur les serveurs d'Aplim. Autrement dit, nous ne STOCKONS PAS les identifiants des utilisateurs se connectant.
✅ Ecole Directe Plus ne permet, ni ne prétend donner accès à des données auxquelles l'élève n'a pas accès, incluant, mais ne se limitant pas aux : points aux examens* et au rang de l'élève*.
-ℹ️ Les seules données collectées le sont par Aplim (EcoleDirecte) conformément à leur politique de confidentialité décrite dans les Mentions Légales.
+ℹ️ Les seules données collectées le sont par Aplim (EcoleDirecte) conformément à leur politique de confidentialité décrite dans leurs Mentions Légales.
*Si l'accès à ces données est possible par l'utilisateur sur la plateforme officielle d'EcoleDirecte, ces données peuvent être affichées sur Ecole Directe Plus. Par ailleurs, si les moyennes de l'utilisateur ne sont pas disponibles, elles seront calculées, mais ce de façon locale sur l'appareil du client, les informations ne sont PAS transmises à nos serveurs.