Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | 2x 2x 2x 36x 36x 36x 36x 36x 36x 36x 17x 17x 17x 17x 36x 16x 1x 17x 36x 2x 2x 2x 2x 3x 1x 1x 1x 2x 36x 2x 2x 2x 2x 2x 1x 3x 2x 1x 1x 1x 2x 36x 2x 1x 1x 3x 36x 3x 3x 2x 1x 36x 63x 6x 6x 38x 36x 14x 36x | import { useState, useEffect } from 'react';
import { disciplineApi } from '@/lib/api/services/evenementSports/disciplineService';
import { Discipline } from '@/types/sportEvenement/discipline';
import { CreateDisciplineRequest, UpdateDisciplineRequest } from '@/lib/api/services/evenementSports/disciplineService';
export function useDisciplinesManagement() {
const [disciplines, setDisciplines] = useState<Discipline[]>([]);
const [searchTerm, setSearchTerm] = useState('');
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const [createLoading, setCreateLoading] = useState(false);
const [createError, setCreateError] = useState<string | null>(null);
const loadDisciplines = async (searchQuery?: string) => {
try {
setLoading(true);
setError(null);
const apiDisciplines = await disciplineApi.getAll(searchQuery ? {
nom: searchQuery
} : undefined);
const sortedDisciplines = apiDisciplines.sort((a, b) => a.nom.localeCompare(b.nom));
setDisciplines(sortedDisciplines);
} catch {
setError('Erreur lors du chargement des disciplines');
} finally {
setLoading(false);
}
};
const createDiscipline = async (disciplineData: CreateDisciplineRequest) => {
try {
setCreateLoading(true);
setCreateError(null);
const newDiscipline = await disciplineApi.create(disciplineData);
setDisciplines(prev => [...prev, newDiscipline].sort((a, b) => a.nom.localeCompare(b.nom)));
return newDiscipline;
} catch (err) {
setCreateError('Erreur lors de la création de la discipline');
throw err;
} finally {
setCreateLoading(false);
}
};
const updateDiscipline = async (id: number, disciplineData: CreateDisciplineRequest) => {
try {
setCreateLoading(true);
setCreateError(null);
const updateData: UpdateDisciplineRequest = {
id: id,
nom: disciplineData.nom,
icone: disciplineData.icone
};
const updatedDiscipline = await disciplineApi.update(updateData);
setDisciplines(prev => prev.map(discipline =>
discipline.id === id ? updatedDiscipline : discipline
).sort((a, b) => a.nom.localeCompare(b.nom)));
return updatedDiscipline;
} catch (err) {
setCreateError('Erreur lors de la modification de la discipline');
throw err;
} finally {
setCreateLoading(false);
}
};
const deleteDiscipline = async (id: number) => {
if (!window.confirm('Êtes-vous sûr de vouloir supprimer cette discipline ?')) return;
try {
await disciplineApi.delete(id);
setDisciplines(prev => prev.filter(discipline => discipline.id !== id));
} catch (err) {
throw err;
}
};
const handleSearch = async (query: string) => {
setSearchTerm(query);
if (query.trim()) {
await loadDisciplines(query);
} else {
await loadDisciplines();
}
};
const filteredDisciplines = disciplines.filter(discipline => {
if (!searchTerm) return true;
const searchLower = searchTerm.toLowerCase();
return discipline.nom.toLowerCase().includes(searchLower);
}).sort((a, b) => a.nom.localeCompare(b.nom));
useEffect(() => {
loadDisciplines();
}, []);
return {
disciplines: filteredDisciplines,
searchTerm,
loading,
error,
createLoading,
createError,
loadDisciplines,
createDiscipline,
updateDiscipline,
deleteDiscipline,
handleSearch,
setCreateError
};
}
|