import { type QueryClient } from '@tanstack/react-query' import i18next from 'i18next' import { toast } from 'sonner' import { updateModelStatus, deleteModel as deleteModelAPI } from '../api' import { modelsQueryKeys } from './query-keys' // ============================================================================ // Model Status Actions // ============================================================================ /** * Enable a model */ export async function handleEnableModel( id: number, queryClient?: QueryClient, onSuccess?: () => void ): Promise { try { const response = await updateModelStatus(id, 1) if (response.success) { toast.success(i18next.t('Model enabled successfully')) queryClient?.invalidateQueries({ queryKey: modelsQueryKeys.lists() }) onSuccess?.() } else { toast.error(response.message || i18next.t('Failed to enable model')) } } catch (error: unknown) { toast.error( (error as Error)?.message || i18next.t('Failed to enable model') ) } } /** * Disable a model */ export async function handleDisableModel( id: number, queryClient?: QueryClient, onSuccess?: () => void ): Promise { try { const response = await updateModelStatus(id, 0) if (response.success) { toast.success(i18next.t('Model disabled successfully')) queryClient?.invalidateQueries({ queryKey: modelsQueryKeys.lists() }) onSuccess?.() } else { toast.error(response.message || i18next.t('Failed to disable model')) } } catch (error: unknown) { toast.error( (error as Error)?.message || i18next.t('Failed to disable model') ) } } /** * Toggle model status */ export async function handleToggleModelStatus( id: number, currentStatus: number, queryClient?: QueryClient, onSuccess?: () => void ): Promise { if (currentStatus === 1) { await handleDisableModel(id, queryClient, onSuccess) } else { await handleEnableModel(id, queryClient, onSuccess) } } // ============================================================================ // Model Delete Actions // ============================================================================ /** * Delete a single model */ export async function handleDeleteModel( id: number, queryClient?: QueryClient, onSuccess?: () => void ): Promise { try { const response = await deleteModelAPI(id) if (response.success) { toast.success(i18next.t('Model deleted successfully')) queryClient?.invalidateQueries({ queryKey: modelsQueryKeys.lists() }) onSuccess?.() } else { toast.error(response.message || i18next.t('Failed to delete model')) } } catch (error: unknown) { toast.error( (error as Error)?.message || i18next.t('Failed to delete model') ) } } /** * Batch delete models */ export async function handleBatchDeleteModels( ids: number[], queryClient?: QueryClient, onSuccess?: (deletedCount: number) => void ): Promise { if (ids.length === 0) { toast.error(i18next.t('Please select at least one model')) return } try { const deletePromises = ids.map((id) => deleteModelAPI(id)) const results = await Promise.all(deletePromises) let successCount = 0 let failedCount = 0 results.forEach((res, index) => { if (res.success) { successCount++ } else { failedCount++ // eslint-disable-next-line no-console console.error(`Failed to delete model ${ids[index]}:`, res.message) } }) if (successCount > 0) { toast.success( i18next.t('Successfully deleted {{count}} model(s)', { count: successCount, }) ) queryClient?.invalidateQueries({ queryKey: modelsQueryKeys.lists() }) onSuccess?.(successCount) } if (failedCount > 0) { toast.error( i18next.t('Failed to delete {{count}} model(s)', { count: failedCount }) ) } } catch (error: unknown) { toast.error((error as Error)?.message || i18next.t('Batch delete failed')) } } // ============================================================================ // Batch Status Actions // ============================================================================ /** * Batch enable models */ export async function handleBatchEnableModels( ids: number[], queryClient?: QueryClient, onSuccess?: () => void ): Promise { if (ids.length === 0) { toast.error(i18next.t('Please select at least one model')) return } try { const enablePromises = ids.map((id) => updateModelStatus(id, 1)) const results = await Promise.all(enablePromises) let successCount = 0 let failedCount = 0 results.forEach((res) => { if (res.success) { successCount++ } else { failedCount++ } }) if (successCount > 0) { toast.success( i18next.t('Successfully enabled {{count}} model(s)', { count: successCount, }) ) queryClient?.invalidateQueries({ queryKey: modelsQueryKeys.lists() }) onSuccess?.() } if (failedCount > 0) { toast.error( i18next.t('Failed to enable {{count}} model(s)', { count: failedCount }) ) } } catch (error: unknown) { toast.error((error as Error)?.message || i18next.t('Batch enable failed')) } } /** * Batch disable models */ export async function handleBatchDisableModels( ids: number[], queryClient?: QueryClient, onSuccess?: () => void ): Promise { if (ids.length === 0) { toast.error(i18next.t('Please select at least one model')) return } try { const disablePromises = ids.map((id) => updateModelStatus(id, 0)) const results = await Promise.all(disablePromises) let successCount = 0 let failedCount = 0 results.forEach((res) => { if (res.success) { successCount++ } else { failedCount++ } }) if (successCount > 0) { toast.success( i18next.t('Successfully disabled {{count}} model(s)', { count: successCount, }) ) queryClient?.invalidateQueries({ queryKey: modelsQueryKeys.lists() }) onSuccess?.() } if (failedCount > 0) { toast.error( i18next.t('Failed to disable {{count}} model(s)', { count: failedCount, }) ) } } catch (error: unknown) { toast.error((error as Error)?.message || i18next.t('Batch disable failed')) } }