refactor: userpreferences are now in the DB

This commit is contained in:
Julien Froidefond
2025-09-17 08:30:36 +02:00
parent 4f137455f4
commit 14d300c682
24 changed files with 763 additions and 404 deletions

View File

@@ -1,52 +0,0 @@
import { useState, useEffect } from 'react';
import { TaskStatus } from '@/lib/types';
import { userPreferencesService } from '@/services/user-preferences';
import { getAllStatuses } from '@/lib/status-config';
export function useColumnVisibility() {
const [hiddenStatuses, setHiddenStatuses] = useState<Set<TaskStatus>>(new Set());
// Charger les préférences au montage
useEffect(() => {
const saved = userPreferencesService.getColumnVisibility();
setHiddenStatuses(new Set(saved.hiddenStatuses));
}, []);
const toggleStatusVisibility = (status: TaskStatus) => {
setHiddenStatuses(prev => {
const newSet = new Set(prev);
if (newSet.has(status)) {
newSet.delete(status);
} else {
newSet.add(status);
}
// Sauvegarder dans localStorage
userPreferencesService.saveColumnVisibility({
hiddenStatuses: Array.from(newSet)
});
return newSet;
});
};
const getVisibleStatuses = <T extends { id: TaskStatus }>(statuses: T[]): T[] => {
return statuses.filter(status => !hiddenStatuses.has(status.id));
};
const isStatusVisible = (status: TaskStatus): boolean => {
return !hiddenStatuses.has(status);
};
const getAllAvailableStatuses = () => {
return getAllStatuses();
};
return {
hiddenStatuses,
toggleStatusVisibility,
getVisibleStatuses,
isStatusVisible,
getAllAvailableStatuses
};
}

28
hooks/useDragAndDrop.ts Normal file
View File

@@ -0,0 +1,28 @@
import { useState, useEffect } from 'react';
import { useSensors, useSensor, PointerSensor } from '@dnd-kit/core';
/**
* Hook pour gérer le drag & drop de manière safe avec SSR
* Désactive le DnD jusqu'à l'hydratation pour éviter les erreurs d'hydratation
*/
export function useDragAndDrop() {
const [isMounted, setIsMounted] = useState(false);
useEffect(() => {
// Activer le drag & drop après l'hydratation
setIsMounted(true);
}, []);
const sensors = useSensors(
useSensor(PointerSensor, {
activationConstraint: {
distance: 8,
},
})
);
return {
isMounted,
sensors
};
}

View File

@@ -1,39 +0,0 @@
import { useState, useEffect } from 'react';
const STORAGE_KEY = 'towercontrol_objectives_collapsed';
export function useObjectivesCollapse() {
const [isCollapsed, setIsCollapsed] = useState(false);
// Charger l'état au montage
useEffect(() => {
try {
const saved = localStorage.getItem(STORAGE_KEY);
if (saved !== null) {
setIsCollapsed(JSON.parse(saved));
}
} catch (error) {
console.warn('Erreur lors du chargement de l\'état de collapse des objectifs:', error);
}
}, []);
const toggleCollapse = () => {
setIsCollapsed(prev => {
const newValue = !prev;
// Sauvegarder dans localStorage
try {
localStorage.setItem(STORAGE_KEY, JSON.stringify(newValue));
} catch (error) {
console.warn('Erreur lors de la sauvegarde de l\'état de collapse des objectifs:', error);
}
return newValue;
});
};
return {
isCollapsed,
toggleCollapse
};
}

View File

@@ -1,30 +0,0 @@
import { useState, useEffect } from 'react';
import { userPreferencesService } from '@/services/user-preferences';
export function useObjectivesVisibility() {
const [showObjectives, setShowObjectives] = useState(true);
// Charger les préférences au montage
useEffect(() => {
const saved = userPreferencesService.getViewPreferences();
setShowObjectives(saved.showObjectives);
}, []);
const toggleObjectivesVisibility = () => {
setShowObjectives(prev => {
const newValue = !prev;
// Sauvegarder dans localStorage
userPreferencesService.updateViewPreferences({
showObjectives: newValue
});
return newValue;
});
};
return {
showObjectives,
toggleObjectivesVisibility
};
}