feat: refactor user preferences management

- Marked all user preferences actions as complete in TODO.md.
- Updated `user-preferences-client.ts` to remove outdated mutation methods, now handled by server actions.
- Deleted unused API routes for column visibility, kanban filters, and view preferences.
- Refactored `UserPreferencesContext.tsx` to utilize server actions for updates, improving performance with `useTransition`.
This commit is contained in:
Julien Froidefond
2025-09-18 13:10:04 +02:00
parent cece09d150
commit aeb4e17939
7 changed files with 347 additions and 270 deletions

218
src/actions/preferences.ts Normal file
View File

@@ -0,0 +1,218 @@
'use server';
import { userPreferencesService } from '@/services/user-preferences';
import { KanbanFilters, ViewPreferences, ColumnVisibility, TaskStatus } from '@/lib/types';
import { revalidatePath } from 'next/cache';
/**
* Met à jour les préférences de vue
*/
export async function updateViewPreferences(updates: Partial<ViewPreferences>): Promise<{
success: boolean;
error?: string;
}> {
try {
await userPreferencesService.updateViewPreferences(updates);
revalidatePath('/');
return { success: true };
} catch (error) {
console.error('Erreur updateViewPreferences:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Met à jour les filtres Kanban
*/
export async function updateKanbanFilters(updates: Partial<KanbanFilters>): Promise<{
success: boolean;
error?: string;
}> {
try {
await userPreferencesService.updateKanbanFilters(updates);
revalidatePath('/kanban');
return { success: true };
} catch (error) {
console.error('Erreur updateKanbanFilters:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Met à jour la visibilité des colonnes
*/
export async function updateColumnVisibility(updates: Partial<ColumnVisibility>): Promise<{
success: boolean;
error?: string;
}> {
try {
const preferences = await userPreferencesService.getAllPreferences();
const newColumnVisibility: ColumnVisibility = {
...preferences.columnVisibility,
...updates
};
await userPreferencesService.saveColumnVisibility(newColumnVisibility);
revalidatePath('/kanban');
return { success: true };
} catch (error) {
console.error('Erreur updateColumnVisibility:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Toggle la visibilité des objectifs
*/
export async function toggleObjectivesVisibility(): Promise<{
success: boolean;
error?: string;
}> {
try {
const preferences = await userPreferencesService.getAllPreferences();
const showObjectives = !preferences.viewPreferences.showObjectives;
await userPreferencesService.updateViewPreferences({ showObjectives });
revalidatePath('/');
return { success: true };
} catch (error) {
console.error('Erreur toggleObjectivesVisibility:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Toggle le mode collapse des objectifs
*/
export async function toggleObjectivesCollapse(): Promise<{
success: boolean;
error?: string;
}> {
try {
const preferences = await userPreferencesService.getAllPreferences();
const collapseObjectives = !preferences.viewPreferences.collapseObjectives;
await userPreferencesService.updateViewPreferences({ collapseObjectives });
revalidatePath('/');
return { success: true };
} catch (error) {
console.error('Erreur toggleObjectivesCollapse:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Change le thème (light/dark)
*/
export async function setTheme(theme: 'light' | 'dark'): Promise<{
success: boolean;
error?: string;
}> {
try {
await userPreferencesService.updateViewPreferences({ theme });
revalidatePath('/');
return { success: true };
} catch (error) {
console.error('Erreur setTheme:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Toggle le thème entre light et dark
*/
export async function toggleTheme(): Promise<{
success: boolean;
error?: string;
}> {
try {
const preferences = await userPreferencesService.getAllPreferences();
const newTheme = preferences.viewPreferences.theme === 'dark' ? 'light' : 'dark';
await userPreferencesService.updateViewPreferences({ theme: newTheme });
revalidatePath('/');
return { success: true };
} catch (error) {
console.error('Erreur toggleTheme:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Toggle la taille de police
*/
export async function toggleFontSize(): Promise<{
success: boolean;
error?: string;
}> {
try {
const preferences = await userPreferencesService.getAllPreferences();
const fontSizes: ('small' | 'medium' | 'large')[] = ['small', 'medium', 'large'];
const currentIndex = fontSizes.indexOf(preferences.viewPreferences.fontSize);
const nextIndex = (currentIndex + 1) % fontSizes.length;
const newFontSize = fontSizes[nextIndex];
await userPreferencesService.updateViewPreferences({ fontSize: newFontSize });
revalidatePath('/');
return { success: true };
} catch (error) {
console.error('Erreur toggleFontSize:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}
/**
* Toggle la visibilité d'une colonne Kanban
*/
export async function toggleColumnVisibility(status: TaskStatus): Promise<{
success: boolean;
error?: string;
}> {
try {
const preferences = await userPreferencesService.getAllPreferences();
const hiddenStatuses = new Set(preferences.columnVisibility.hiddenStatuses);
if (hiddenStatuses.has(status)) {
hiddenStatuses.delete(status);
} else {
hiddenStatuses.add(status);
}
await userPreferencesService.saveColumnVisibility({
hiddenStatuses: Array.from(hiddenStatuses)
});
revalidatePath('/kanban');
return { success: true };
} catch (error) {
console.error('Erreur toggleColumnVisibility:', error);
return {
success: false,
error: error instanceof Error ? error.message : 'Erreur inconnue'
};
}
}