73 lines
2.9 KiB
TypeScript
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)),
|
|
})
|
|
}
|