diff --git a/src/views/account/Home/Home.tsx b/src/views/account/Home/Home.tsx
index abe801b77..2f175873c 100644
--- a/src/views/account/Home/Home.tsx
+++ b/src/views/account/Home/Home.tsx
@@ -51,7 +51,7 @@ import {Elements} from "./ElementIndex";
import {animPapillon} from "@/utils/ui/animations";
import {useBottomTabBarHeight} from "@react-navigation/bottom-tabs";
-let headerHeight = Dimensions.get("window").height / 2.8;
+let headerHeight = Dimensions.get("window").height / 2.75;
if (headerHeight < 275) {
headerHeight = 275;
}
diff --git a/src/widgets/Components/LastGrade.tsx b/src/widgets/Components/LastGrade.tsx
new file mode 100644
index 000000000..380bad5b7
--- /dev/null
+++ b/src/widgets/Components/LastGrade.tsx
@@ -0,0 +1,176 @@
+import { useTheme } from "@react-navigation/native";
+import { CheckSquare } from "lucide-react-native"; // Utilisation de PieChart comme icône de matière
+import React, { forwardRef, useEffect, useImperativeHandle, useMemo } from "react";
+import { Text, View } from "react-native";
+import Reanimated, { LinearTransition } from "react-native-reanimated";
+
+import AnimatedNumber from "@/components/Global/AnimatedNumber";
+import { NativeText } from "@/components/Global/NativeComponents";
+import { WidgetProps } from "@/components/Home/Widget";
+import { updateGradesAndAveragesInCache } from "@/services/grades";
+import { getSubjectData } from "@/services/shared/Subject"; // Importation pour l'obtention des données sur la matière
+import { useCurrentAccount } from "@/stores/account";
+import { useGradesStore } from "@/stores/grades";
+
+// Déclaration du composant LastGradeWidget en utilisant forwardRef pour exposer des méthodes au parent
+const LastGradeWidget = forwardRef(({
+ setLoading,
+ setHidden,
+ loading,
+}: WidgetProps, ref) => {
+ // Récupération du thème pour les couleurs
+ const theme = useTheme();
+ const { colors } = theme;
+
+ // Accès à l'information du compte utilisateur courant
+ const account = useCurrentAccount((store) => store.account);
+
+ // Accès aux notes et à la période par défaut depuis le store
+ const grades = useGradesStore((store) => store.grades);
+ const defaultPeriod = useGradesStore((store) => store.defaultPeriod);
+
+ // Expose la méthode handlePress au parent via ref
+ useImperativeHandle(ref, () => ({
+ handlePress: () => "Grades"
+ }));
+
+ // Utilisation de useMemo pour calculer la dernière note
+ const lastGrade = useMemo(() => {
+ const periodGrades = grades[defaultPeriod] || [];
+ return periodGrades[periodGrades.length - 1]; // Récupération de la dernière note.
+ }, [grades, defaultPeriod]);
+
+ // Extraction de la valeur de la note et de l'échelle de notation
+ const gradeValue = lastGrade?.student.value ?? 0;
+ const maxGradeValue = lastGrade?.outOf?.value ?? 20; // Récupération de l'échelle de notation du professeur
+
+ // Détermination de la couleur de la note en fonction du pourcentage
+
+ // Récupération des données de la matière pour obtenir l'émoji associé
+ const subjectData = getSubjectData(lastGrade?.subjectName || "");
+ const subjectEmoji = subjectData.emoji;
+ const subjectColor = subjectData.color;
+
+ // Effet pour mettre à jour les notes et moyennes en cache
+ useEffect(() => {
+ void async function () {
+ if (!account?.instance || !defaultPeriod) return;
+ setLoading(true);
+
+ await updateGradesAndAveragesInCache(account, defaultPeriod);
+ setLoading(false);
+ }();
+ }, [defaultPeriod]);
+
+ // Détermination du texte à afficher pour la description
+ const descriptionText = getSubjectData(lastGrade?.subjectName || "").pretty;
+
+ // Effet pour cacher le widget si la valeur de la note n'est pas un nombre valide
+ useEffect(() => {
+ setHidden(typeof gradeValue !== "number" || gradeValue < 0);
+ }, [gradeValue]);
+
+ // Cacher le widget si aucune note n'est disponible
+ if (!lastGrade) {
+ setHidden(true);
+ }
+
+ return (
+ <>
+ {/* Titre du widget */}
+
+
+
+ Dernière note
+
+
+
+ {/* Contenu principal : Emoji + Description */}
+
+ {/* Affichage de l'émoji dans un cadre rond */}
+
+ {subjectEmoji}
+
+
+ {/* Affichage du nom de la matière en gras */}
+
+ {descriptionText}
+
+
+
+ {/* Affichage de la note en bas */}
+
+ {/* Affichage de la valeur de la note */}
+
+ {/* Affichage de l'unité de notation */}
+
+ /{maxGradeValue}
+
+
+ >
+ );
+});
+
+export default LastGradeWidget;
diff --git a/src/widgets/index.tsx b/src/widgets/index.tsx
index 1195edd38..c1efe8a55 100644
--- a/src/widgets/index.tsx
+++ b/src/widgets/index.tsx
@@ -1,7 +1,9 @@
import GeneralAverageWidget from "./Components/GeneralAverage";
import NextCourseWidget from "./Components/NextCourse";
+import LastGradeWidget from "./Components/LastGrade";
export const Widgets = [
NextCourseWidget,
GeneralAverageWidget,
+ LastGradeWidget
];
\ No newline at end of file