All files / hooks useDisciplinesManagement.ts

98.52% Statements 67/68
100% Branches 8/8
100% Functions 17/17
98.33% Lines 59/60

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 1142x 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
  };
}