chore: Initial Commit

feat: Gestion des inscriptions [#1]
feat(frontend): Création des vues pour le paramétrage de l'école [#2]
feat: Gestion du login [#6]
fix: Correction lors de la migration des modèle [#8]
feat: Révision du menu principal [#9]
feat: Ajout d'un footer [#10]
feat: Création des dockers compose pour les environnements de
développement et de production [#12]
doc(ci): Mise en place de Husky et d'un suivi de version automatique [#14]
This commit is contained in:
Luc SORIGNET
2024-11-18 10:02:58 +01:00
committed by N3WT DE COMPET
commit af0cd1c840
228 changed files with 22694 additions and 0 deletions

View File

@ -0,0 +1,26 @@
import { useState } from 'react';
import { addDays, addMonths, addYears } from 'date-fns';
export function useCalendar() {
const [currentDate, setCurrentDate] = useState(new Date());
const [viewType, setViewType] = useState('week');
const navigateDate = (direction) => {
const newDate = new Date(currentDate);
const operations = {
week: (date) => direction === 'prev' ? addDays(date, -7) : addDays(date, 7),
month: (date) => direction === 'prev' ? addMonths(date, -1) : addMonths(date, 1),
year: (date) => direction === 'prev' ? addYears(date, -1) : addYears(date, 1)
};
setCurrentDate(operations[viewType](newDate));
};
return {
currentDate,
setCurrentDate,
viewType,
setViewType,
navigateDate
};
}

View File

@ -0,0 +1,29 @@
import { useEffect, useState } from 'react';
import { BK_GET_CSRF } from '@/utils/Url';
const useCsrfToken = () => {
const [token, setToken] = useState('');
useEffect(() => {
fetch(`${BK_GET_CSRF}`, {
method: 'GET',
credentials: 'include' // Inclut les cookies dans la requête
})
.then(response => response.json())
.then(data => {
if (data) {
if(data.csrfToken != token) {
setToken(data.csrfToken);
console.log('------------> CSRF Token reçu:', data.csrfToken);
}
}
})
.catch(error => {
console.error('Error fetching CSRF token:', error);
});
}, []);
return token;
};
export default useCsrfToken;

View File

@ -0,0 +1,63 @@
import { useState } from 'react';
export function useSchedules() {
const [schedules, setSchedules] = useState([
{ id: 'default', name: 'Planning principal', color: '#10b981' },
{ id: 'secondary', name: 'Planning secondaire', color: '#3b82f6' },
{ id: 'special', name: 'Événements spéciaux', color: '#ef4444' },
{ id: 'exam', name: 'Planning examens', color: '#f59e0b' }
]);
const addSchedule = (newSchedule) => {
setSchedules(prev => [...prev, {
...newSchedule,
id: `schedule-${Date.now()}`
}]);
};
const updateSchedule = (id, updates) => {
setSchedules(prev => prev.map(schedule =>
schedule.id === id ? { ...schedule, ...updates } : schedule
));
};
const deleteSchedule = (id) => {
setSchedules(prev => prev.filter(schedule => schedule.id !== id));
};
return {
schedules,
addSchedule,
updateSchedule,
deleteSchedule
};
}
export function useEvents(initialEvents = []) {
const [events, setEvents] = useState(initialEvents);
const addEvent = (newEvent) => {
setEvents(prev => [...prev, {
...newEvent,
id: `event-${Date.now()}`
}]);
};
const updateEvent = (id, updates) => {
setEvents(prev => prev.map(event =>
event.id === id ? { ...event, ...updates } : event
));
};
const deleteEvent = (id) => {
setEvents(prev => prev.filter(event => event.id !== id));
};
return {
events,
setEvents,
addEvent,
updateEvent,
deleteEvent
};
}

View File

@ -0,0 +1,31 @@
import { useState } from "react"
const useLocalStorage = (key, initialValue) => {
const [state, setState] = useState(() => {
// Initialize the state
try {
const value = window.localStorage.getItem(key)
// Check if the local storage already has any values,
// otherwise initialize it with the passed initialValue
return value ? JSON.parse(value) : initialValue
} catch (error) {
console.log(error)
}
})
const setValue = value => {
try {
// If the passed value is a callback function,
// then call it with the existing state.
const valueToStore = value instanceof Function ? value(state) : value
window.localStorage.setItem(key, JSON.stringify(valueToStore))
setState(value)
} catch (error) {
console.log(error)
}
}
return [state, setValue]
}
export default useLocalStorage

View File

@ -0,0 +1,60 @@
import { useState } from 'react';
import { mockEvents, mockSchedules } from '@/data/mockData';
export default function useSchedules() {
const [schedules, setSchedules] = useState(mockSchedules);
const [events, setEvents] = useState(mockEvents);
const [selectedSchedule, setSelectedSchedule] = useState(mockSchedules[0].id);
const addEvent = async (eventData) => {
const newEvent = {
...eventData,
id: `event-${Date.now()}`,
color: schedules.find(s => s.id === eventData.scheduleId)?.color || '#10b981'
};
setEvents(prev => [...prev, newEvent]);
return newEvent;
};
const updateEvent = async (eventId, updates) => {
setEvents(prev => prev.map(event =>
event.id === eventId ? { ...event, ...updates } : event
));
return updates;
};
const deleteEvent = async (eventId) => {
setEvents(prev => prev.filter(event => event.id !== eventId));
return eventId;
};
const addSchedule = (newSchedule) => {
setSchedules(prev => [...prev, {
...newSchedule,
id: `schedule-${Date.now()}`
}]);
};
const updateSchedule = (id, updates) => {
setSchedules(prev => prev.map(schedule =>
schedule.id === id ? { ...schedule, ...updates } : schedule
));
};
const deleteSchedule = (id) => {
setSchedules(prev => prev.filter(schedule => schedule.id !== id));
};
return {
events,
schedules,
selectedSchedule,
setSelectedSchedule,
addEvent,
updateEvent,
deleteEvent,
addSchedule,
updateSchedule,
deleteSchedule
};
}