// 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, 'queryKey' | 'queryFn'> ) => { return useQuery({ 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, Error>, 'queryKey' | 'queryFn'> ) => { return useQuery, 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 } >({ 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' }); }, }); };