98 lines
2.9 KiB
TypeScript
98 lines
2.9 KiB
TypeScript
'use client'
|
|
|
|
import { useCallback } from 'react'
|
|
import { useQueryClient } from '@tanstack/react-query'
|
|
import { useAuthReady } from '@/lib/api/use-auth-ready'
|
|
import {
|
|
useCreateLabel,
|
|
useUpdateLabel,
|
|
useDeleteLabel,
|
|
useReorderLabels,
|
|
} from '@/lib/api/hooks/use-folder-label-queries'
|
|
import {
|
|
useCreateUnifiedFolder,
|
|
useUpdateUnifiedFolder,
|
|
useDeleteUnifiedFolder,
|
|
useReorderUnifiedFolders,
|
|
} from '@/lib/api/hooks/use-unified-folder-queries'
|
|
import type {
|
|
LabelReorderItem,
|
|
UnifiedFolderReorderItem,
|
|
} from '@/lib/nav-reorder-plan'
|
|
|
|
export function useSidebarNavApiSync() {
|
|
const { ready, authenticated } = useAuthReady()
|
|
const queryClient = useQueryClient()
|
|
const apiEnabled = ready && authenticated
|
|
|
|
const invalidateNav = useCallback(() => {
|
|
void queryClient.invalidateQueries({ queryKey: ['labels'] })
|
|
void queryClient.invalidateQueries({ queryKey: ['unified-folders'] })
|
|
}, [queryClient])
|
|
|
|
const createLabel = useCreateLabel()
|
|
const updateLabel = useUpdateLabel()
|
|
const deleteLabel = useDeleteLabel()
|
|
const reorderLabels = useReorderLabels()
|
|
const createFolder = useCreateUnifiedFolder()
|
|
const updateFolder = useUpdateUnifiedFolder()
|
|
const deleteFolder = useDeleteUnifiedFolder()
|
|
const reorderFolders = useReorderUnifiedFolders()
|
|
|
|
return {
|
|
apiEnabled,
|
|
invalidateNav,
|
|
createLabel: (payload: { name: string; color: string }) => {
|
|
if (!apiEnabled) return false
|
|
createLabel.mutate(payload, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
updateLabel: (payload: { id: string; name?: string; color?: string }) => {
|
|
if (!apiEnabled) return false
|
|
updateLabel.mutate(payload, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
deleteLabel: (id: string) => {
|
|
if (!apiEnabled) return false
|
|
deleteLabel.mutate(id, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
reorderLabels: (items: LabelReorderItem[]) => {
|
|
if (!apiEnabled || items.length === 0) return false
|
|
reorderLabels.mutate(items, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
createFolder: (payload: {
|
|
name: string
|
|
color?: string
|
|
account_id?: string
|
|
parent_id?: string
|
|
}) => {
|
|
if (!apiEnabled) return false
|
|
createFolder.mutate(payload, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
updateFolder: (payload: {
|
|
id: string
|
|
name: string
|
|
color: string
|
|
sort_order?: number
|
|
parent_id?: string | null
|
|
}) => {
|
|
if (!apiEnabled) return false
|
|
updateFolder.mutate(payload, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
deleteFolder: (id: string) => {
|
|
if (!apiEnabled) return false
|
|
deleteFolder.mutate(id, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
reorderFolders: (items: UnifiedFolderReorderItem[]) => {
|
|
if (!apiEnabled || items.length === 0) return false
|
|
reorderFolders.mutate(items, { onSuccess: invalidateNav })
|
|
return true
|
|
},
|
|
}
|
|
}
|