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

59 lines
1.8 KiB
TypeScript

'use client'
import { useQueries, useQuery } from '@tanstack/react-query'
import { apiClient } from '../client'
import { useAuthReady } from '../use-auth-ready'
import { useMailAccounts } from './use-mail-queries'
import type { ApiFolder } from '../types'
function unwrapFolders(res: ApiFolder[] | { folders: ApiFolder[] }): ApiFolder[] {
return Array.isArray(res) ? res : (res.folders ?? [])
}
/** Fetch IMAP folders for every connected mail account. */
export function useImapFolders() {
const { ready, authenticated } = useAuthReady()
const { data: accounts = [] } = useMailAccounts()
const queries = useQueries({
queries: accounts.map((account) => ({
queryKey: ['folders', account.id] as const,
queryFn: async () => {
const res = await apiClient.get<ApiFolder[] | { folders: ApiFolder[] }>(
'/mail/folders',
{ account_id: account.id }
)
return unwrapFolders(res)
},
enabled: ready && authenticated && !!account.id,
staleTime: 60_000,
retry: 1,
})),
})
const isLoading = queries.some((q) => q.isLoading)
const isFetched = accounts.length === 0 || queries.every((q) => q.isFetched)
const folders = queries.flatMap((q) => q.data ?? [])
return { folders, isLoading, isFetched }
}
/** IMAP folders for a single mail account. */
export function useImapFoldersForAccount(accountId: string | undefined) {
const { ready, authenticated } = useAuthReady()
return useQuery({
queryKey: ['folders', accountId] as const,
queryFn: async () => {
const res = await apiClient.get<ApiFolder[] | { folders: ApiFolder[] }>(
'/mail/folders',
{ account_id: accountId! }
)
return unwrapFolders(res)
},
enabled: ready && authenticated && !!accountId,
staleTime: 60_000,
retry: 1,
})
}