Files
towercontrol/src/actions/preferences.ts
Julien Froidefond 89af1fc597 feat: refactor theme handling and update TODO.md
- Replaced references from theme-config to ui-config for better organization and clarity in theme management.
- Updated Solarized icon in ui-config to a pill emoji for improved visual representation.
- Marked the Solarized icon correction task as complete in TODO.md.
- Deleted the now redundant theme-config file to streamline the codebase.
2025-10-04 10:53:57 +02:00

292 lines
8.3 KiB
TypeScript

'use server';
import { userPreferencesService } from '@/services/core/user-preferences';
import { KanbanFilters, ViewPreferences, ColumnVisibility, TaskStatus } from '@/lib/types';
import { Theme } from '@/lib/ui-config';
import { revalidatePath } from 'next/cache';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
/**
* Met à jour les préférences de vue
*/
export async function updateViewPreferences(updates: Partial<ViewPreferences>): Promise<{
success: boolean;
error?: string;
}> {
try {
const session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
await userPreferencesService.updateViewPreferences(session.user.id, 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 l'image de fond
*/
export async function setBackgroundImage(backgroundImage: string | undefined): Promise<{
success: boolean;
error?: string;
}> {
try {
const session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
await userPreferencesService.updateViewPreferences(session.user.id, { backgroundImage });
revalidatePath('/');
return { success: true };
} catch (error) {
console.error('Erreur setBackgroundImage:', 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 {
const session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
await userPreferencesService.updateKanbanFilters(session.user.id, 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 session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
const preferences = await userPreferencesService.getAllPreferences(session.user.id);
const newColumnVisibility: ColumnVisibility = {
...preferences.columnVisibility,
...updates
};
await userPreferencesService.saveColumnVisibility(session.user.id, 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 session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
const preferences = await userPreferencesService.getAllPreferences(session.user.id);
const showObjectives = !preferences.viewPreferences.showObjectives;
await userPreferencesService.updateViewPreferences(session.user.id, { 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 session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
const preferences = await userPreferencesService.getAllPreferences(session.user.id);
const collapseObjectives = !preferences.viewPreferences.collapseObjectives;
await userPreferencesService.updateViewPreferences(session.user.id, { 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/dracula/monokai/nord)
*/
export async function setTheme(theme: Theme): Promise<{
success: boolean;
error?: string;
}> {
try {
const session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
await userPreferencesService.updateViewPreferences(session.user.id, { 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 session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
const preferences = await userPreferencesService.getAllPreferences(session.user.id);
const newTheme = preferences.viewPreferences.theme === 'dark' ? 'light' : 'dark';
await userPreferencesService.updateViewPreferences(session.user.id, { 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 session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
const preferences = await userPreferencesService.getAllPreferences(session.user.id);
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(session.user.id, { 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 session = await getServerSession(authOptions);
if (!session?.user?.id) {
return { success: false, error: 'Non authentifié' };
}
const preferences = await userPreferencesService.getAllPreferences(session.user.id);
const hiddenStatuses = new Set(preferences.columnVisibility.hiddenStatuses);
if (hiddenStatuses.has(status)) {
hiddenStatuses.delete(status);
} else {
hiddenStatuses.add(status);
}
await userPreferencesService.saveColumnVisibility(session.user.id, {
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'
};
}
}