From 328a1b68a17cf09f8938fee35ffcea634aff4f05 Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 20 Aug 2025 17:04:19 +0200 Subject: [PATCH] Add mentor and learning status updates to skill evaluation - Introduced `updateSkillMentorStatus` and `updateSkillLearningStatus` functions to manage mentor and learning preferences for skills. - Updated `SkillEvaluationCard` to include buttons for toggling mentor and learning statuses with corresponding icons. - Enhanced `SkillEvaluationGrid` and `SkillEvaluation` components to pass new status update handlers. - Modified `SkillEvaluation` type to accommodate new properties for mentor and learning status. --- app/evaluation/page.tsx | 4 ++ .../evaluation/skill-evaluation-card.tsx | 69 +++++++++++++++++-- .../evaluation/skill-evaluation-grid.tsx | 41 +++++++++-- components/skill-evaluation.tsx | 14 ++++ hooks/use-evaluation.ts | 64 +++++++++++++++++ lib/types.ts | 2 + 6 files changed, 186 insertions(+), 8 deletions(-) diff --git a/app/evaluation/page.tsx b/app/evaluation/page.tsx index 4897a1b..e886f1b 100644 --- a/app/evaluation/page.tsx +++ b/app/evaluation/page.tsx @@ -21,6 +21,8 @@ export default function EvaluationPage() { loading, updateProfile, updateSkillLevel, + updateSkillMentorStatus, + updateSkillLearningStatus, addSkillToEvaluation, removeSkillFromEvaluation, initializeEmptyEvaluation, @@ -93,6 +95,8 @@ export default function EvaluationPage() { categories={skillCategories} evaluations={userEvaluation.evaluations} onUpdateSkill={updateSkillLevel} + onUpdateMentorStatus={updateSkillMentorStatus} + onUpdateLearningStatus={updateSkillLearningStatus} onAddSkill={addSkillToEvaluation} onRemoveSkill={removeSkillFromEvaluation} /> diff --git a/components/evaluation/skill-evaluation-card.tsx b/components/evaluation/skill-evaluation-card.tsx index 6a9ed00..bcc38e4 100644 --- a/components/evaluation/skill-evaluation-card.tsx +++ b/components/evaluation/skill-evaluation-card.tsx @@ -1,16 +1,18 @@ -import { ExternalLink, Info, X } from "lucide-react"; +import { ExternalLink, Info, X, UserCheck, GraduationCap } from "lucide-react"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; -import { Skill, SkillLevel, SKILL_LEVELS } from "@/lib/types"; +import { Skill, SkillLevel, SKILL_LEVELS, SkillEvaluation } from "@/lib/types"; import { TechIcon } from "@/components/icons/tech-icon"; interface SkillEvaluationCardProps { skill: Skill; - currentLevel: SkillLevel; + skillEvaluation: SkillEvaluation; onUpdateSkill: (skillId: string, level: SkillLevel) => void; + onUpdateMentorStatus: (skillId: string, canMentor: boolean) => void; + onUpdateLearningStatus: (skillId: string, wantsToLearn: boolean) => void; onRemoveSkill: (skillId: string) => void; } @@ -42,10 +44,13 @@ function getLevelColorBorder(level: Exclude) { export function SkillEvaluationCard({ skill, - currentLevel, + skillEvaluation, onUpdateSkill, + onUpdateMentorStatus, + onUpdateLearningStatus, onRemoveSkill, }: SkillEvaluationCardProps) { + const currentLevel = skillEvaluation.level; return (
@@ -135,6 +140,62 @@ export function SkillEvaluationCard({ ); })} + {/* Mentor and Learning Status Icons */} +
+ {/* Mentor Icon */} + + + + + +

+ {skillEvaluation.canMentor + ? "Peut mentorer" + : "Peut mentorer"} +

+
+
+ + {/* Learning Icon */} + + + + + +

+ {skillEvaluation.wantsToLearn + ? "Veut apprendre" + : "J'aimerais apprendre"} +

+
+
+
+ {/* Remove button */}
diff --git a/components/evaluation/skill-evaluation-grid.tsx b/components/evaluation/skill-evaluation-grid.tsx index 357d1a8..0a2d682 100644 --- a/components/evaluation/skill-evaluation-grid.tsx +++ b/components/evaluation/skill-evaluation-grid.tsx @@ -5,6 +5,16 @@ interface SkillEvaluationGridProps { currentCategory: SkillCategory; currentEvaluation: CategoryEvaluation; onUpdateSkill: (category: string, skillId: string, level: SkillLevel) => void; + onUpdateMentorStatus: ( + category: string, + skillId: string, + canMentor: boolean + ) => void; + onUpdateLearningStatus: ( + category: string, + skillId: string, + wantsToLearn: boolean + ) => void; onRemoveSkill: (category: string, skillId: string) => void; } @@ -12,13 +22,22 @@ export function SkillEvaluationGrid({ currentCategory, currentEvaluation, onUpdateSkill, + onUpdateMentorStatus, + onUpdateLearningStatus, onRemoveSkill, }: SkillEvaluationGridProps) { - const getSkillLevel = (skillId: string): SkillLevel => { + const getSkillEvaluation = (skillId: string) => { const skillEval = currentEvaluation?.skills.find( (s) => s.skillId === skillId ); - return skillEval?.level || null; + return ( + skillEval || { + skillId, + level: null, + canMentor: false, + wantsToLearn: false, + } + ); }; if (!currentEvaluation.selectedSkillIds.length) { @@ -44,16 +63,30 @@ export function SkillEvaluationGrid({ const skill = currentCategory.skills.find((s) => s.id === skillId); if (!skill) return null; - const currentLevel = getSkillLevel(skill.id); + const skillEvaluation = getSkillEvaluation(skill.id); return ( onUpdateSkill(currentCategory.category, skillId, level) } + onUpdateMentorStatus={(skillId, canMentor) => + onUpdateMentorStatus( + currentCategory.category, + skillId, + canMentor + ) + } + onUpdateLearningStatus={(skillId, wantsToLearn) => + onUpdateLearningStatus( + currentCategory.category, + skillId, + wantsToLearn + ) + } onRemoveSkill={(skillId) => onRemoveSkill(currentCategory.category, skillId) } diff --git a/components/skill-evaluation.tsx b/components/skill-evaluation.tsx index 8eae501..5ee861c 100644 --- a/components/skill-evaluation.tsx +++ b/components/skill-evaluation.tsx @@ -16,6 +16,16 @@ interface SkillEvaluationProps { categories: SkillCategory[]; evaluations: CategoryEvaluation[]; onUpdateSkill: (category: string, skillId: string, level: SkillLevel) => void; + onUpdateMentorStatus: ( + category: string, + skillId: string, + canMentor: boolean + ) => void; + onUpdateLearningStatus: ( + category: string, + skillId: string, + wantsToLearn: boolean + ) => void; onAddSkill: (category: string, skillId: string) => void; onRemoveSkill: (category: string, skillId: string) => void; } @@ -24,6 +34,8 @@ export function SkillEvaluation({ categories, evaluations, onUpdateSkill, + onUpdateMentorStatus, + onUpdateLearningStatus, onAddSkill, onRemoveSkill, }: SkillEvaluationProps) { @@ -94,6 +106,8 @@ export function SkillEvaluation({ currentCategory={currentCategory} currentEvaluation={currentEvaluation} onUpdateSkill={onUpdateSkill} + onUpdateMentorStatus={onUpdateMentorStatus} + onUpdateLearningStatus={onUpdateLearningStatus} onRemoveSkill={onRemoveSkill} /> )} diff --git a/hooks/use-evaluation.ts b/hooks/use-evaluation.ts index 1c5d8b9..5430ab0 100644 --- a/hooks/use-evaluation.ts +++ b/hooks/use-evaluation.ts @@ -135,6 +135,68 @@ export function useEvaluation() { saveUserEvaluation(newEvaluation); }; + const updateSkillMentorStatus = ( + category: string, + skillId: string, + canMentor: boolean + ) => { + if (!userEvaluation) return; + + const updatedEvaluations = userEvaluation.evaluations.map((catEval) => { + if (catEval.category === category) { + const updatedSkills = catEval.skills.map((skill) => + skill.skillId === skillId ? { ...skill, canMentor } : skill + ); + + return { + ...catEval, + skills: updatedSkills, + }; + } + return catEval; + }); + + const newEvaluation: UserEvaluation = { + ...userEvaluation, + evaluations: updatedEvaluations, + lastUpdated: new Date().toISOString(), + }; + + setUserEvaluation(newEvaluation); + saveUserEvaluation(newEvaluation); + }; + + const updateSkillLearningStatus = ( + category: string, + skillId: string, + wantsToLearn: boolean + ) => { + if (!userEvaluation) return; + + const updatedEvaluations = userEvaluation.evaluations.map((catEval) => { + if (catEval.category === category) { + const updatedSkills = catEval.skills.map((skill) => + skill.skillId === skillId ? { ...skill, wantsToLearn } : skill + ); + + return { + ...catEval, + skills: updatedSkills, + }; + } + return catEval; + }); + + const newEvaluation: UserEvaluation = { + ...userEvaluation, + evaluations: updatedEvaluations, + lastUpdated: new Date().toISOString(), + }; + + setUserEvaluation(newEvaluation); + saveUserEvaluation(newEvaluation); + }; + const addSkillToEvaluation = (category: string, skillId: string) => { if (!userEvaluation) return; @@ -206,6 +268,8 @@ export function useEvaluation() { loading, updateProfile, updateSkillLevel, + updateSkillMentorStatus, + updateSkillLearningStatus, addSkillToEvaluation, removeSkillFromEvaluation, initializeEmptyEvaluation, diff --git a/lib/types.ts b/lib/types.ts index b4ba515..b5365fb 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -48,6 +48,8 @@ export interface UserProfile { export interface SkillEvaluation { skillId: string; level: SkillLevel; + canMentor?: boolean; + wantsToLearn?: boolean; } export interface CategoryEvaluation {