fix: evaluation on empty eval category was KO
This commit is contained in:
@@ -2,7 +2,13 @@
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import { useUser } from "@/hooks/use-user-context";
|
||||
import { UserEvaluation, Team, SkillLevel } from "@/lib/types";
|
||||
import {
|
||||
UserEvaluation,
|
||||
Team,
|
||||
SkillLevel,
|
||||
UserProfile,
|
||||
CategoryEvaluation,
|
||||
} from "@/lib/types";
|
||||
import {
|
||||
updateSkillLevel as updateSkillLevelAction,
|
||||
updateSkillMentorStatus as updateSkillMentorStatusAction,
|
||||
@@ -10,19 +16,22 @@ import {
|
||||
addSkillToEvaluation as addSkillToEvaluationAction,
|
||||
removeSkillFromEvaluation as removeSkillFromEvaluationAction,
|
||||
} from "@/lib/evaluation-actions";
|
||||
import { createEmptyEvaluation } from "@/lib/evaluation-utils";
|
||||
|
||||
interface EvaluationClientWrapperProps {
|
||||
userEvaluation: UserEvaluation | null;
|
||||
teams: Team[];
|
||||
children: React.ReactNode;
|
||||
skillCategories?: any[]; // Ajouter les catégories pour créer une évaluation vide
|
||||
}
|
||||
|
||||
export function EvaluationClientWrapper({
|
||||
userEvaluation,
|
||||
teams,
|
||||
children,
|
||||
skillCategories = [],
|
||||
}: EvaluationClientWrapperProps) {
|
||||
const { setUserInfo } = useUser();
|
||||
const { userInfo, setUserInfo } = useUser();
|
||||
|
||||
// État local pour l'UI optimiste - commence avec les données SSR
|
||||
const [currentEvaluation, setCurrentEvaluation] =
|
||||
@@ -30,8 +39,18 @@ export function EvaluationClientWrapper({
|
||||
|
||||
// Met à jour l'état local quand les props changent (SSR)
|
||||
useEffect(() => {
|
||||
setCurrentEvaluation(userEvaluation);
|
||||
}, [userEvaluation]);
|
||||
if (userEvaluation) {
|
||||
setCurrentEvaluation(userEvaluation);
|
||||
} else if (skillCategories.length > 0) {
|
||||
// Créer une évaluation vide si aucune n'existe, pour que l'UI puisse fonctionner
|
||||
const emptyEvaluation: UserEvaluation = {
|
||||
profile: { firstName: "", lastName: "", teamId: "" }, // Profile temporaire
|
||||
evaluations: createEmptyEvaluation(skillCategories),
|
||||
lastUpdated: new Date().toISOString(),
|
||||
};
|
||||
setCurrentEvaluation(emptyEvaluation);
|
||||
}
|
||||
}, [userEvaluation, skillCategories]);
|
||||
|
||||
// Fonctions avec UI optimiste
|
||||
const updateSkillLevel = async (
|
||||
@@ -173,9 +192,11 @@ export function EvaluationClientWrapper({
|
||||
const previousEvaluation = currentEvaluation;
|
||||
|
||||
try {
|
||||
const updatedEvaluations = currentEvaluation.evaluations.map(
|
||||
(catEval) => {
|
||||
// 1. Mise à jour optimiste de l'UI (immédiate)
|
||||
let updatedEvaluations: CategoryEvaluation[] =
|
||||
currentEvaluation.evaluations.map((catEval) => {
|
||||
if (catEval.category === category) {
|
||||
// Si la compétence n'est pas déjà ajoutée
|
||||
if (!catEval.selectedSkillIds.includes(skillId)) {
|
||||
return {
|
||||
...catEval,
|
||||
@@ -184,7 +205,7 @@ export function EvaluationClientWrapper({
|
||||
...catEval.skills,
|
||||
{
|
||||
skillId,
|
||||
level: null,
|
||||
level: "never" as SkillLevel,
|
||||
canMentor: false,
|
||||
wantsToLearn: false,
|
||||
},
|
||||
@@ -193,8 +214,28 @@ export function EvaluationClientWrapper({
|
||||
}
|
||||
}
|
||||
return catEval;
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
// Si la catégorie n'existe pas encore, la créer
|
||||
if (
|
||||
!updatedEvaluations.find(
|
||||
(evaluation) => evaluation.category === category
|
||||
)
|
||||
) {
|
||||
const newCategoryEvaluation: CategoryEvaluation = {
|
||||
category,
|
||||
selectedSkillIds: [skillId],
|
||||
skills: [
|
||||
{
|
||||
skillId,
|
||||
level: "never",
|
||||
canMentor: false,
|
||||
wantsToLearn: false,
|
||||
},
|
||||
],
|
||||
};
|
||||
updatedEvaluations = [...updatedEvaluations, newCategoryEvaluation];
|
||||
}
|
||||
|
||||
const newEvaluation: UserEvaluation = {
|
||||
...currentEvaluation,
|
||||
@@ -202,10 +243,14 @@ export function EvaluationClientWrapper({
|
||||
lastUpdated: new Date().toISOString(),
|
||||
};
|
||||
|
||||
// 2. Mettre à jour l'état local immédiatement
|
||||
setCurrentEvaluation(newEvaluation);
|
||||
|
||||
// 3. Persister côté serveur (en arrière-plan)
|
||||
await addSkillToEvaluationAction(category, skillId);
|
||||
} catch (error) {
|
||||
console.error("Failed to add skill to evaluation:", error);
|
||||
console.error("❌ Failed to add skill:", error);
|
||||
// En cas d'erreur, rollback l'état local
|
||||
setCurrentEvaluation(previousEvaluation);
|
||||
}
|
||||
};
|
||||
@@ -219,8 +264,9 @@ export function EvaluationClientWrapper({
|
||||
const previousEvaluation = currentEvaluation;
|
||||
|
||||
try {
|
||||
const updatedEvaluations = currentEvaluation.evaluations.map(
|
||||
(catEval) => {
|
||||
// 1. Mise à jour optimiste de l'UI (immédiate)
|
||||
const updatedEvaluations: CategoryEvaluation[] =
|
||||
currentEvaluation.evaluations.map((catEval) => {
|
||||
if (catEval.category === category) {
|
||||
// Filtrer seulement les compétences qui ne sont pas déjà sélectionnées
|
||||
const newSkillIds = skillIds.filter(
|
||||
@@ -235,7 +281,7 @@ export function EvaluationClientWrapper({
|
||||
...catEval.skills,
|
||||
...newSkillIds.map((skillId) => ({
|
||||
skillId,
|
||||
level: null,
|
||||
level: "never" as SkillLevel,
|
||||
canMentor: false,
|
||||
wantsToLearn: false,
|
||||
})),
|
||||
@@ -244,8 +290,7 @@ export function EvaluationClientWrapper({
|
||||
}
|
||||
}
|
||||
return catEval;
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const newEvaluation: UserEvaluation = {
|
||||
...currentEvaluation,
|
||||
@@ -253,14 +298,16 @@ export function EvaluationClientWrapper({
|
||||
lastUpdated: new Date().toISOString(),
|
||||
};
|
||||
|
||||
// 2. Mettre à jour l'état local immédiatement
|
||||
setCurrentEvaluation(newEvaluation);
|
||||
|
||||
// Ajouter toutes les compétences en parallèle côté API
|
||||
// 3. Persister côté serveur (en arrière-plan)
|
||||
await Promise.all(
|
||||
skillIds.map((skillId) => addSkillToEvaluationAction(category, skillId))
|
||||
);
|
||||
} catch (error) {
|
||||
console.error("Failed to add multiple skills to evaluation:", error);
|
||||
console.error("❌ Failed to add multiple skills:", error);
|
||||
// En cas d'erreur, rollback l'état local
|
||||
setCurrentEvaluation(previousEvaluation);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user