Improve the frontend and repository layer

This commit is contained in:
Urtzi Alfaro
2025-10-23 07:44:54 +02:00
parent 8d30172483
commit 07c33fa578
112 changed files with 14726 additions and 2733 deletions

View File

@@ -0,0 +1,140 @@
// frontend/src/api/hooks/settings.ts
/**
* React Query hooks for Tenant Settings
* Provides data fetching, caching, and mutation hooks
*/
import { useQuery, useMutation, useQueryClient, UseQueryOptions } from '@tanstack/react-query';
import { settingsApi } from '../services/settings';
import { useToast } from '../../hooks/ui/useToast';
import type {
TenantSettings,
TenantSettingsUpdate,
SettingsCategory,
CategoryResetResponse,
} from '../types/settings';
// Query keys
export const settingsKeys = {
all: ['settings'] as const,
tenant: (tenantId: string) => ['settings', tenantId] as const,
category: (tenantId: string, category: SettingsCategory) =>
['settings', tenantId, category] as const,
};
/**
* Hook to fetch all settings for a tenant
*/
export const useSettings = (
tenantId: string,
options?: Omit<UseQueryOptions<TenantSettings, Error>, 'queryKey' | 'queryFn'>
) => {
return useQuery<TenantSettings, Error>({
queryKey: settingsKeys.tenant(tenantId),
queryFn: () => settingsApi.getSettings(tenantId),
staleTime: 5 * 60 * 1000, // 5 minutes
...options,
});
};
/**
* Hook to fetch settings for a specific category
*/
export const useCategorySettings = (
tenantId: string,
category: SettingsCategory,
options?: Omit<UseQueryOptions<Record<string, any>, Error>, 'queryKey' | 'queryFn'>
) => {
return useQuery<Record<string, any>, Error>({
queryKey: settingsKeys.category(tenantId, category),
queryFn: () => settingsApi.getCategorySettings(tenantId, category),
staleTime: 5 * 60 * 1000, // 5 minutes
...options,
});
};
/**
* Hook to update tenant settings
*/
export const useUpdateSettings = () => {
const queryClient = useQueryClient();
const { addToast } = useToast();
return useMutation<
TenantSettings,
Error,
{ tenantId: string; updates: TenantSettingsUpdate }
>({
mutationFn: ({ tenantId, updates }) => settingsApi.updateSettings(tenantId, updates),
onSuccess: (data, variables) => {
// Invalidate all settings queries for this tenant
queryClient.invalidateQueries({ queryKey: settingsKeys.tenant(variables.tenantId) });
addToast('Ajustes guardados correctamente', { type: 'success' });
},
onError: (error) => {
console.error('Failed to update settings:', error);
addToast('Error al guardar los ajustes', { type: 'error' });
},
});
};
/**
* Hook to update a specific category
*/
export const useUpdateCategorySettings = () => {
const queryClient = useQueryClient();
const { addToast } = useToast();
return useMutation<
TenantSettings,
Error,
{ tenantId: string; category: SettingsCategory; settings: Record<string, any> }
>({
mutationFn: ({ tenantId, category, settings }) =>
settingsApi.updateCategorySettings(tenantId, category, settings),
onSuccess: (data, variables) => {
// Invalidate all settings queries for this tenant
queryClient.invalidateQueries({ queryKey: settingsKeys.tenant(variables.tenantId) });
// Also invalidate the specific category query
queryClient.invalidateQueries({
queryKey: settingsKeys.category(variables.tenantId, variables.category),
});
addToast('Ajustes de categoría guardados correctamente', { type: 'success' });
},
onError: (error) => {
console.error('Failed to update category settings:', error);
addToast('Error al guardar los ajustes de categoría', { type: 'error' });
},
});
};
/**
* Hook to reset a category to defaults
*/
export const useResetCategory = () => {
const queryClient = useQueryClient();
const { addToast } = useToast();
return useMutation<
CategoryResetResponse,
Error,
{ tenantId: string; category: SettingsCategory }
>({
mutationFn: ({ tenantId, category }) => settingsApi.resetCategory(tenantId, category),
onSuccess: (data, variables) => {
// Invalidate all settings queries for this tenant
queryClient.invalidateQueries({ queryKey: settingsKeys.tenant(variables.tenantId) });
// Also invalidate the specific category query
queryClient.invalidateQueries({
queryKey: settingsKeys.category(variables.tenantId, variables.category),
});
addToast(`Categoría '${variables.category}' restablecida a valores predeterminados`, {
type: 'success',
});
},
onError: (error) => {
console.error('Failed to reset category:', error);
addToast('Error al restablecer la categoría', { type: 'error' });
},
});
};