refactor: integrate EvaluationClient and remove legacy evaluation actions

- Added EvaluationClient to clients/index.ts and created an instance for use.
- Updated client-wrapper.tsx and welcome-screen.tsx to utilize EvaluationClient for evaluation actions.
- Removed obsolete evaluation-actions.ts file to streamline codebase and reduce redundancy.
This commit is contained in:
Julien Froidefond
2025-08-25 08:06:23 +02:00
parent 1a0877f51d
commit 26496e7473
5 changed files with 135 additions and 178 deletions

View File

@@ -0,0 +1,122 @@
import { BaseHttpClient } from "../base/http-client";
import { SkillLevel } from "../../lib/types";
export class EvaluationClient extends BaseHttpClient {
/**
* Met à jour le niveau d'une compétence
*/
updateSkillLevel = async (
category: string,
skillId: string,
level: SkillLevel
): Promise<void> => {
try {
await this.put("/evaluations/skills", {
action: "updateLevel",
category,
skillId,
level,
});
} catch (error) {
console.error("Failed to update skill level:", error);
throw error;
}
};
/**
* Met à jour le statut mentor d'une compétence
*/
updateSkillMentorStatus = async (
category: string,
skillId: string,
canMentor: boolean
): Promise<void> => {
try {
await this.put("/evaluations/skills", {
action: "updateMentorStatus",
category,
skillId,
canMentor,
});
} catch (error) {
console.error("Failed to update skill mentor status:", error);
throw error;
}
};
/**
* Met à jour le statut d'apprentissage d'une compétence
*/
updateSkillLearningStatus = async (
category: string,
skillId: string,
wantsToLearn: boolean
): Promise<void> => {
try {
await this.put("/evaluations/skills", {
action: "updateLearningStatus",
category,
skillId,
wantsToLearn,
});
} catch (error) {
console.error("Failed to update skill learning status:", error);
throw error;
}
};
/**
* Ajoute une compétence à l'évaluation
*/
addSkillToEvaluation = async (
category: string,
skillId: string
): Promise<void> => {
try {
await this.put("/evaluations/skills", {
action: "addSkill",
category,
skillId,
});
} catch (error) {
console.error("Failed to add skill to evaluation:", error);
throw error;
}
};
/**
* Supprime une compétence de l'évaluation
*/
removeSkillFromEvaluation = async (
category: string,
skillId: string
): Promise<void> => {
try {
await this.put("/evaluations/skills", {
action: "removeSkill",
category,
skillId,
});
} catch (error) {
console.error("Failed to remove skill from evaluation:", error);
throw error;
}
};
/**
* Initialise une évaluation vide pour un profil
*/
initializeEmptyEvaluation = async (
profile: import("../../lib/types").UserProfile
): Promise<void> => {
try {
// Simplement créer le profil via l'auth, pas besoin de créer une évaluation vide
// Le backend créera automatiquement l'évaluation lors du premier accès
const { authClient } = await import("../index");
await authClient.login(profile);
} catch (error) {
console.error("Failed to initialize evaluation:", error);
throw error;
}
};
}

View File

@@ -2,13 +2,16 @@
import { SkillsClient } from "./domains/skills-client"; import { SkillsClient } from "./domains/skills-client";
import { AuthClient } from "./domains/auth-client"; import { AuthClient } from "./domains/auth-client";
import { AdminClient } from "./domains/admin-client"; import { AdminClient } from "./domains/admin-client";
import { EvaluationClient } from "./domains/evaluation-client";
// Export all client classes // Export all client classes
export { SkillsClient } from "./domains/skills-client"; export { SkillsClient } from "./domains/skills-client";
export { AuthClient } from "./domains/auth-client"; export { AuthClient } from "./domains/auth-client";
export { AdminClient } from "./domains/admin-client"; export { AdminClient } from "./domains/admin-client";
export { EvaluationClient } from "./domains/evaluation-client";
// Create and export client instances // Create and export client instances
export const skillsClient = new SkillsClient(); export const skillsClient = new SkillsClient();
export const authClient = new AuthClient(); export const authClient = new AuthClient();
export const adminClient = new AdminClient(); export const adminClient = new AdminClient();
export const evaluationClient = new EvaluationClient();

View File

@@ -9,13 +9,14 @@ import {
UserProfile, UserProfile,
CategoryEvaluation, CategoryEvaluation,
} from "@/lib/types"; } from "@/lib/types";
import { import { evaluationClient } from "@/clients";
updateSkillLevel as updateSkillLevelAction, const {
updateSkillMentorStatus as updateSkillMentorStatusAction, updateSkillLevel: updateSkillLevelAction,
updateSkillLearningStatus as updateSkillLearningStatusAction, updateSkillMentorStatus: updateSkillMentorStatusAction,
addSkillToEvaluation as addSkillToEvaluationAction, updateSkillLearningStatus: updateSkillLearningStatusAction,
removeSkillFromEvaluation as removeSkillFromEvaluationAction, addSkillToEvaluation: addSkillToEvaluationAction,
} from "@/lib/evaluation-actions"; removeSkillFromEvaluation: removeSkillFromEvaluationAction,
} = evaluationClient;
import { createEmptyEvaluation } from "@/lib/evaluation-utils"; import { createEmptyEvaluation } from "@/lib/evaluation-utils";
interface EvaluationClientWrapperProps { interface EvaluationClientWrapperProps {

View File

@@ -3,7 +3,7 @@
import { useState } from "react"; import { useState } from "react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { ProfileForm } from "@/components/profile-form"; import { ProfileForm } from "@/components/profile-form";
import { initializeEmptyEvaluation } from "@/lib/evaluation-actions"; import { evaluationClient } from "@/clients";
import { Team, UserProfile } from "@/lib/types"; import { Team, UserProfile } from "@/lib/types";
import { Code2 } from "lucide-react"; import { Code2 } from "lucide-react";
@@ -20,7 +20,7 @@ export function WelcomeEvaluationScreen({
const handleProfileSubmit = async (profile: UserProfile) => { const handleProfileSubmit = async (profile: UserProfile) => {
setIsSubmitting(true); setIsSubmitting(true);
try { try {
await initializeEmptyEvaluation(profile); await evaluationClient.initializeEmptyEvaluation(profile);
// Rafraîchir la page pour que le SSR prenne en compte la nouvelle évaluation // Rafraîchir la page pour que le SSR prenne en compte la nouvelle évaluation
router.refresh(); router.refresh();
} catch (error) { } catch (error) {

View File

@@ -1,169 +0,0 @@
"use client";
import { SkillLevel } from "@/lib/types";
/**
* Actions d'évaluation standalone pour SSR
* Ces fonctions utilisent directement l'API sans refetch de toutes les données
*/
export async function updateSkillLevel(
category: string,
skillId: string,
level: SkillLevel
): Promise<void> {
try {
const response = await fetch("/api/evaluations/skills", {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
credentials: "same-origin",
body: JSON.stringify({
action: "updateLevel",
category,
skillId,
level,
}),
});
if (!response.ok) {
const errorData = await response.text();
console.error("API Error:", response.status, errorData);
throw new Error(
`Failed to update skill level: ${response.status} - ${errorData}`
);
}
// Note: La page se rafraîchira via router.refresh() appelé par le composant
} catch (error) {
console.error("Failed to update skill level:", error);
throw error;
}
}
export async function updateSkillMentorStatus(
category: string,
skillId: string,
canMentor: boolean
): Promise<void> {
try {
const response = await fetch("/api/evaluations/skills", {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
credentials: "same-origin",
body: JSON.stringify({
action: "updateMentorStatus",
category,
skillId,
canMentor,
}),
});
if (!response.ok) {
throw new Error("Failed to update skill mentor status");
}
} catch (error) {
console.error("Failed to update skill mentor status:", error);
throw error;
}
}
export async function updateSkillLearningStatus(
category: string,
skillId: string,
wantsToLearn: boolean
): Promise<void> {
try {
const response = await fetch("/api/evaluations/skills", {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
credentials: "same-origin",
body: JSON.stringify({
action: "updateLearningStatus",
category,
skillId,
wantsToLearn,
}),
});
if (!response.ok) {
throw new Error("Failed to update skill learning status");
}
} catch (error) {
console.error("Failed to update skill learning status:", error);
throw error;
}
}
export async function addSkillToEvaluation(
category: string,
skillId: string
): Promise<void> {
try {
const response = await fetch("/api/evaluations/skills", {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
credentials: "same-origin",
body: JSON.stringify({
action: "addSkill",
category,
skillId,
}),
});
if (!response.ok) {
throw new Error("Failed to add skill to evaluation");
}
} catch (error) {
console.error("Failed to add skill to evaluation:", error);
throw error;
}
}
export async function removeSkillFromEvaluation(
category: string,
skillId: string
): Promise<void> {
try {
const response = await fetch("/api/evaluations/skills", {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
credentials: "same-origin",
body: JSON.stringify({
action: "removeSkill",
category,
skillId,
}),
});
if (!response.ok) {
throw new Error("Failed to remove skill from evaluation");
}
} catch (error) {
console.error("Failed to remove skill from evaluation:", error);
throw error;
}
}
export async function initializeEmptyEvaluation(
profile: import("@/lib/types").UserProfile
): Promise<void> {
try {
// Simplement créer le profil via l'auth, pas besoin de créer une évaluation vide
// Le backend créera automatiquement l'évaluation lors du premier accès
const { authClient } = await import("@/clients");
await authClient.login(profile);
} catch (error) {
console.error("Failed to initialize evaluation:", error);
throw error;
}
}