ultisuite-client/lib/hooks/use-sidebar-nav-api.ts
2026-05-25 13:52:40 +02:00

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
},
}
}