починка багов

This commit is contained in:
2025-07-23 16:08:50 +03:00
parent 3fc352f8e9
commit 907b3e315e
24 changed files with 1249 additions and 1430 deletions

196
src/hook/useSheetQueries.ts Normal file
View File

@@ -0,0 +1,196 @@
import {
createSheet,
getSheet,
getSheets,
getSheetsByTemplate,
patchSheet,
type ApiSheet,
type GetSheetsOutput,
type PatchSheetInput,
} from '@/service/sheetApiService'
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
// Ключи для React Query
export const sheetKeys = {
all: ['sheets'] as const,
byTemplate: (templateId: string) =>
[...sheetKeys.all, 'template', templateId] as const,
detail: (sheetId: string) => [...sheetKeys.all, 'detail', sheetId] as const,
}
// Хук для получения всех листов
export function useSheets() {
return useQuery({
queryKey: sheetKeys.all,
queryFn: getSheets,
staleTime: 2 * 60 * 1000, // 2 минуты
gcTime: 10 * 60 * 1000, // 10 минут кеш
})
}
// Хук для получения листов по template_id с кешированием
export function useSheetsByTemplate(templateId: string | undefined) {
return useQuery({
queryKey: sheetKeys.byTemplate(templateId || ''),
queryFn: () => getSheetsByTemplate(templateId!),
enabled: !!templateId,
staleTime: 1 * 60 * 1000, // 1 минута для активных данных
gcTime: 5 * 60 * 1000, // 5 минут кеш
refetchOnWindowFocus: false, // Не перезапрашивать при фокусе окна
})
}
// Хук для получения конкретного листа
export function useSheet(sheetId: string | undefined) {
return useQuery({
queryKey: sheetKeys.detail(sheetId || ''),
queryFn: () => getSheet(sheetId!),
enabled: !!sheetId,
staleTime: 5 * 60 * 1000, // 5 минут
gcTime: 10 * 60 * 1000, // 10 минут кеш
})
}
// Хук для создания листа
export function useCreateSheet() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: createSheet,
onSuccess: (data, variables) => {
// Инвалидируем кеши после создания листа
queryClient.invalidateQueries({
queryKey: sheetKeys.byTemplate(variables.template_id),
})
queryClient.invalidateQueries({
queryKey: sheetKeys.all,
})
// Добавляем новый лист в кеш списка листов для шаблона
queryClient.setQueryData<GetSheetsOutput>(
sheetKeys.byTemplate(variables.template_id),
oldData => {
if (!oldData) return { sheets: [] }
const newSheet: ApiSheet = {
id: data.id,
name: variables.name,
cells: variables.cells,
template_id: variables.template_id,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
}
return {
sheets: [...oldData.sheets, newSheet],
}
}
)
},
})
}
// Хук для обновления листа
export function usePatchSheet() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: ({
sheetId,
data,
}: {
sheetId: string
data: PatchSheetInput
}) => patchSheet(sheetId, data),
onSuccess: (result, variables) => {
// Обновляем конкретный лист в кеше
queryClient.setQueryData(
sheetKeys.detail(variables.sheetId),
(oldData: any) => {
if (!oldData?.sheet) return oldData
return {
sheet: {
...oldData.sheet,
...variables.data,
updated_at: new Date().toISOString(),
},
}
}
)
// Обновляем лист в списке листов для шаблона
const sheetDetail = queryClient.getQueryData(
sheetKeys.detail(variables.sheetId)
) as any
const templateId = sheetDetail?.sheet?.template_id
if (templateId) {
queryClient.setQueryData<GetSheetsOutput>(
sheetKeys.byTemplate(templateId),
oldData => {
if (!oldData) return oldData
return {
sheets: oldData.sheets.map(sheet =>
sheet.id === variables.sheetId
? {
...sheet,
name: variables.data.name || sheet.name,
cells: variables.data.cells || sheet.cells,
updated_at: new Date().toISOString(),
}
: sheet
),
}
}
)
}
},
})
}
// Хук для массового обновления листов (для автосохранения)
export function useBatchUpdateSheets() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: async (
updates: Array<{
sheetId: string
data: PatchSheetInput
templateId: string
}>
) => {
// Выполняем все обновления параллельно
const results = await Promise.allSettled(
updates.map(({ sheetId, data }) => patchSheet(sheetId, data))
)
return results
},
onSuccess: (results, variables) => {
// Обновляем кеши для всех затронутых шаблонов
const templateIds = new Set(variables.map(v => v.templateId))
templateIds.forEach(templateId => {
queryClient.invalidateQueries({
queryKey: sheetKeys.byTemplate(templateId),
})
})
},
})
}
// Хук для предзагрузки листов шаблона
export function usePrefetchSheetsByTemplate() {
const queryClient = useQueryClient()
return (templateId: string) => {
queryClient.prefetchQuery({
queryKey: sheetKeys.byTemplate(templateId),
queryFn: () => getSheetsByTemplate(templateId),
staleTime: 1 * 60 * 1000,
})
}
}