Files
peakskills/hooks/use-skills-management.ts
2025-08-25 09:20:36 +02:00

179 lines
4.5 KiB
TypeScript

import { useState, useEffect } from "react";
import { useToast } from "@/hooks/use-toast";
import { SkillCategory } from "@/lib/types";
import { adminClient } from "@/clients";
import { Skill } from "@/clients/domains/admin-client";
interface SkillFormData {
name: string;
categoryId: string;
description: string;
icon: string;
}
export function useSkillsManagement(
skillCategories: SkillCategory[],
initialSkills?: any[]
) {
const [skills, setSkills] = useState<Skill[]>(initialSkills || []);
const [isLoading, setIsLoading] = useState(!initialSkills);
const [editingSkill, setEditingSkill] = useState<Skill | null>(null);
const [skillFormData, setSkillFormData] = useState<SkillFormData>({
name: "",
categoryId: "",
description: "",
icon: "",
});
const [isSubmitting, setIsSubmitting] = useState(false);
const { toast } = useToast();
const resetForm = () => {
setSkillFormData({ name: "", categoryId: "", description: "", icon: "" });
setEditingSkill(null);
};
const handleCreateSkill = async () => {
if (!skillFormData.name || !skillFormData.categoryId) {
toast({
title: "Erreur",
description: "Veuillez remplir tous les champs obligatoires",
variant: "destructive",
});
return false;
}
try {
setIsSubmitting(true);
const categoryIndex = parseInt(skillFormData.categoryId);
const category = skillCategories[categoryIndex];
const skillData = {
...skillFormData,
category: category.category,
categoryId: category.id,
};
const newSkill = await adminClient.createSkill(skillData);
setSkills([...skills, newSkill]);
resetForm();
toast({
title: "Succès",
description: "Skill créée avec succès",
});
return true;
} catch (error: any) {
toast({
title: "Erreur",
description: error.message || "Erreur lors de la création de la skill",
variant: "destructive",
});
return false;
} finally {
setIsSubmitting(false);
}
};
const handleEditSkill = (skill: Skill) => {
setEditingSkill(skill);
const categoryIndex = skillCategories.findIndex(
(cat) => cat.category === skill.category
);
setSkillFormData({
name: skill.name,
categoryId: categoryIndex !== -1 ? categoryIndex.toString() : "",
description: skill.description,
icon: skill.icon,
});
};
const handleUpdateSkill = async () => {
if (!editingSkill || !skillFormData.name || !skillFormData.categoryId) {
toast({
title: "Erreur",
description: "Veuillez remplir tous les champs obligatoires",
variant: "destructive",
});
return false;
}
try {
setIsSubmitting(true);
const categoryIndex = parseInt(skillFormData.categoryId);
const category = skillCategories[categoryIndex];
const skillData = {
id: editingSkill.id,
...skillFormData,
category: category.category,
usageCount: editingSkill.usageCount,
};
const updatedSkill = await adminClient.updateSkill(skillData);
const updatedSkills = skills.map((skill) =>
skill.id === editingSkill.id ? updatedSkill : skill
);
setSkills(updatedSkills);
resetForm();
toast({
title: "Succès",
description: "Skill mise à jour avec succès",
});
return true;
} catch (error: any) {
toast({
title: "Erreur",
description:
error.message || "Erreur lors de la mise à jour de la skill",
variant: "destructive",
});
return false;
} finally {
setIsSubmitting(false);
}
};
const handleDeleteSkill = async (skillId: string) => {
if (
!confirm(
"Êtes-vous sûr de vouloir supprimer cette skill ? Cette action est irréversible."
)
) {
return;
}
try {
await adminClient.deleteSkill(skillId);
setSkills(skills.filter((s) => s.id !== skillId));
toast({
title: "Succès",
description: "Skill supprimée avec succès",
});
} catch (error: any) {
toast({
title: "Erreur",
description:
error.message || "Erreur lors de la suppression de la skill",
variant: "destructive",
});
}
};
return {
skills,
isLoading,
editingSkill,
skillFormData,
isSubmitting,
setSkillFormData,
resetForm,
handleCreateSkill,
handleEditSkill,
handleUpdateSkill,
handleDeleteSkill,
};
}