reafctor: pages for management and split components
This commit is contained in:
199
hooks/use-skills-management.ts
Normal file
199
hooks/use-skills-management.ts
Normal file
@@ -0,0 +1,199 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { useToast } from "@/hooks/use-toast";
|
||||
import { SkillCategory } from "@/lib/types";
|
||||
import {
|
||||
AdminManagementService,
|
||||
Skill,
|
||||
} from "@/services/admin-management-service";
|
||||
|
||||
interface SkillFormData {
|
||||
name: string;
|
||||
categoryId: string;
|
||||
description: string;
|
||||
icon: string;
|
||||
}
|
||||
|
||||
export function useSkillsManagement(skillCategories: SkillCategory[]) {
|
||||
const [skills, setSkills] = useState<Skill[]>([]);
|
||||
const [isLoading, setIsLoading] = useState(true);
|
||||
const [editingSkill, setEditingSkill] = useState<Skill | null>(null);
|
||||
const [skillFormData, setSkillFormData] = useState<SkillFormData>({
|
||||
name: "",
|
||||
categoryId: "",
|
||||
description: "",
|
||||
icon: "",
|
||||
});
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const { toast } = useToast();
|
||||
|
||||
// Charger les skills depuis l'API
|
||||
const fetchSkills = async () => {
|
||||
try {
|
||||
setIsLoading(true);
|
||||
const skillsData = await AdminManagementService.getSkills();
|
||||
setSkills(skillsData);
|
||||
} catch (error) {
|
||||
console.error("Error fetching skills:", error);
|
||||
toast({
|
||||
title: "Erreur",
|
||||
description: "Impossible de charger les skills",
|
||||
variant: "destructive",
|
||||
});
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// Charger les skills au montage du composant
|
||||
useEffect(() => {
|
||||
fetchSkills();
|
||||
}, []);
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
const newSkill = await AdminManagementService.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 AdminManagementService.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 AdminManagementService.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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user