починка багов
This commit is contained in:
196
src/hook/useSheetQueries.ts
Normal file
196
src/hook/useSheetQueries.ts
Normal 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,
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user