Files
finance/frontend/src/hooks/useAccounts.ts
T

73 lines
2.9 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
import { api } from '@/api/endpoints'
import { invalidationRoots, queryKeys } from '@/api/queryKeys'
import type { AdjustBalancePayload, CreateAccountPayload } from '@/api/types'
import { isSystemAccount } from '@/api/types'
import { useToast } from '@/components/ui/Toaster'
import { useTranslation } from 'react-i18next'
import { describeApiError } from '@/lib/apiErrors'
export function useAccounts() {
return useQuery({ queryKey: queryKeys.accounts(), queryFn: api.accounts.list })
}
export function useActiveAccounts() {
const accounts = useAccounts()
return { ...accounts, data: accounts.data?.filter((account) => account.status === 'active') }
}
/** Active non-system accounts: the savings system account is not a valid
* target for statements, expenses, incomes or refunds. */
export function useUserAccounts() {
const accounts = useActiveAccounts()
return { ...accounts, data: accounts.data?.filter((account) => !isSystemAccount(account)) }
}
export function useCreateAccount() {
const queryClient = useQueryClient()
const { t } = useTranslation()
const toast = useToast()
return useMutation({
mutationFn: (payload: CreateAccountPayload) => api.accounts.create(payload),
onSuccess: (account) => {
void queryClient.invalidateQueries({ queryKey: invalidationRoots.accounts })
void queryClient.invalidateQueries({ queryKey: invalidationRoots.analytics })
toast.push('success', t('toast.accountCreated', { name: account.name }))
},
onError: (error) => toast.push('error', describeApiError(error, t)),
})
}
export function useArchiveAccount() {
const queryClient = useQueryClient()
const { t } = useTranslation()
const toast = useToast()
return useMutation({
mutationFn: (id: string) => api.accounts.archive(id),
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: invalidationRoots.accounts })
void queryClient.invalidateQueries({ queryKey: invalidationRoots.analytics })
toast.push('success', t('toast.accountArchived'))
},
onError: (error) => toast.push('error', describeApiError(error, t)),
})
}
export function useAdjustBalance() {
const queryClient = useQueryClient()
const { t } = useTranslation()
const toast = useToast()
return useMutation({
mutationFn: ({ id, payload }: { id: string; payload: AdjustBalancePayload }) =>
api.accounts.adjustBalance(id, payload),
onSuccess: () => {
void queryClient.invalidateQueries({ queryKey: invalidationRoots.accounts })
void queryClient.invalidateQueries({ queryKey: invalidationRoots.operations })
void queryClient.invalidateQueries({ queryKey: invalidationRoots.budget })
void queryClient.invalidateQueries({ queryKey: invalidationRoots.analytics })
toast.push('success', t('toast.balanceAdjusted'))
},
onError: (error) => toast.push('error', describeApiError(error, t)),
})
}