// @ts-nocheck import { QueryClient, UseMutationOptions, UseMutationResult, UseQueryOptions, UseQueryResult, useInfiniteQuery, useMutation, useQuery, useQueryClient, } from 'react-query'; import useApiRequest from '../useRequest'; import { transformToCamelCase } from '@/utils'; import t from './types'; const QUERY_KEY = { BANK_RULES: 'BANK_RULE', BANK_TRANSACTION_MATCHES: 'BANK_TRANSACTION_MATCHES', EXCLUDED_BANK_TRANSACTIONS_INFINITY: 'EXCLUDED_BANK_TRANSACTIONS_INFINITY', RECOGNIZED_BANK_TRANSACTIONS_INFINITY: 'RECOGNIZED_BANK_TRANSACTIONS_INFINITY', }; const commonInvalidateQueries = (query: QueryClient) => { query.invalidateQueries(QUERY_KEY.BANK_RULES); query.invalidateQueries(QUERY_KEY.RECOGNIZED_BANK_TRANSACTIONS_INFINITY); }; interface CreateBankRuleValues { value: any; } interface CreateBankRuleResponse {} /** * Creates a new bank rule. * @param {UseMutationOptions} options - * @returns {UseMutationResult} */ export function useCreateBankRule( options?: UseMutationOptions< CreateBankRuleValues, Error, CreateBankRuleValues >, ): UseMutationResult { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); return useMutation( (values) => apiRequest.post(`/banking/rules`, values).then((res) => res.data), { ...options, onSuccess: () => { commonInvalidateQueries(queryClient); }, }, ); } interface EditBankRuleValues { id: number; value: any; } interface EditBankRuleResponse {} /** * Edits the given bank rule. * @param {UseMutationOptions} options - * @returns */ export function useEditBankRule( options?: UseMutationOptions, ): UseMutationResult { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); return useMutation( ({ id, value }) => apiRequest.post(`/banking/rules/${id}`, values), { ...options, onSuccess: () => { commonInvalidateQueries(queryClient); }, }, ); } interface DeleteBankRuleResponse {} type DeleteBankRuleValue = number; /** * Deletes the given bank rule. * @param {UseMutationOptions} options * @returns {UseMutationResult, ): UseMutationResult { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); return useMutation( (id: number) => apiRequest.delete(`/banking/rules/${id}`), { onSuccess: (res, id) => { commonInvalidateQueries(queryClient); }, ...options, }, ); } interface BankRulesResponse {} /** * Retrieves all bank rules. * @param {UseQueryOptions} params - * @returns {UseQueryResult} */ export function useBankRules( options?: UseQueryOptions, ): UseQueryResult { const apiRequest = useApiRequest(); return useQuery( [QUERY_KEY.BANK_RULES], () => apiRequest.get('/banking/rules').then((res) => res.data.bank_rules), { ...options }, ); } interface GetBankRuleRes {} /** * Retrieve the given bank rule. * @param {number} bankRuleId - * @param {UseQueryOptions} options - * @returns {UseQueryResult} */ export function useBankRule( bankRuleId: number, options?: UseQueryOptions, ): UseQueryResult { const apiRequest = useApiRequest(); return useQuery( [QUERY_KEY.BANK_RULES, bankRuleId], () => apiRequest .get(`/banking/rules/${bankRuleId}`) .then((res) => res.data.bank_rule), { ...options }, ); } type GetBankTransactionsMatchesValue = number; interface GetBankTransactionsMatchesResponse { perfectMatches: Array; possibleMatches: Array; } /** * Retrieves the bank transactions matches. * @param {UseQueryOptions} params - * @returns {UseQueryResult} */ export function useGetBankTransactionsMatches( uncategorizedTransactionId: number, options?: UseQueryOptions, ): UseQueryResult { const apiRequest = useApiRequest(); return useQuery( [QUERY_KEY.BANK_TRANSACTION_MATCHES, uncategorizedTransactionId], () => apiRequest .get(`/cashflow/transactions/${uncategorizedTransactionId}/matches`) .then((res) => transformToCamelCase(res.data)), options, ); } type ExcludeUncategorizedTransactionValue = number; interface ExcludeUncategorizedTransactionRes {} /** * Excludes the given uncategorized transaction. * @param {UseMutationOptions} * @returns {UseMutationResult } */ export function useExcludeUncategorizedTransaction( options?: UseMutationOptions< ExcludeUncategorizedTransactionRes, Error, ExcludeUncategorizedTransactionValue >, ): UseMutationResult< ExcludeUncategorizedTransactionRes, Error, ExcludeUncategorizedTransactionValue > { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); return useMutation< ExcludeUncategorizedTransactionRes, Error, ExcludeUncategorizedTransactionValue >( (uncategorizedTransactionId: number) => apiRequest.put( `/cashflow/transactions/${uncategorizedTransactionId}/exclude`, ), { onSuccess: (res, id) => { // Invalidate queries. queryClient.invalidateQueries( QUERY_KEY.EXCLUDED_BANK_TRANSACTIONS_INFINITY, ); }, ...options, }, ); } type ExcludeBankTransactionValue = number; interface ExcludeBankTransactionResponse {} /** * Excludes the uncategorized bank transaction. * @param {UseMutationResult} options * @returns {UseMutationResult} */ export function useUnexcludeUncategorizedTransaction( options?: UseMutationOptions< ExcludeBankTransactionResponse, Error, ExcludeBankTransactionValue >, ): UseMutationResult< ExcludeBankTransactionResponse, Error, ExcludeBankTransactionValue > { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); return useMutation< ExcludeBankTransactionResponse, Error, ExcludeBankTransactionValue >( (uncategorizedTransactionId: number) => apiRequest.put( `/cashflow/transactions/${uncategorizedTransactionId}/unexclude`, ), { onSuccess: (res, id) => { // Invalidate queries. queryClient.invalidateQueries( QUERY_KEY.EXCLUDED_BANK_TRANSACTIONS_INFINITY, ); }, ...options, }, ); } interface MatchUncategorizedTransactionValues { id: number; value: any; } interface MatchUncategorizedTransactionRes {} /** * Matchess the given uncateogrized transaction. * @param props * @returns */ export function useMatchUncategorizedTransaction( props?: UseMutationOptions< MatchUncategorizedTransactionRes, Error, MatchUncategorizedTransactionValues >, ): UseMutationResult< MatchUncategorizedTransactionRes, Error, MatchUncategorizedTransactionValues > { const queryClient = useQueryClient(); const apiRequest = useApiRequest(); return useMutation< MatchUncategorizedTransactionRes, Error, MatchUncategorizedTransactionValues >(({ id, value }) => apiRequest.post(`/banking/matches/${id}`, value), { onSuccess: (res, id) => { queryClient.invalidateQueries( t.CASHFLOW_ACCOUNT_UNCATEGORIZED_TRANSACTIONS_INFINITY, ); }, ...props, }); } /** * @returns */ export function useRecognizedBankTransactionsInfinity( query, infinityProps, axios, ) { const apiRequest = useApiRequest(); return useInfiniteQuery( [QUERY_KEY.RECOGNIZED_BANK_TRANSACTIONS_INFINITY, query], async ({ pageParam = 1 }) => { const response = await apiRequest.http({ ...axios, method: 'get', url: `/api/banking/recognized`, params: { page: pageParam, ...query }, }); return response.data; }, { getPreviousPageParam: (firstPage) => firstPage.pagination.page - 1, getNextPageParam: (lastPage) => { const { pagination } = lastPage; return pagination.total > pagination.page_size * pagination.page ? lastPage.pagination.page + 1 : undefined; }, ...infinityProps, }, ); } export function useExcludedBankTransactionsInfinity( query, infinityProps, axios, ) { const apiRequest = useApiRequest(); return useInfiniteQuery( [QUERY_KEY.EXCLUDED_BANK_TRANSACTIONS_INFINITY, query], async ({ pageParam = 1 }) => { const response = await apiRequest.http({ ...axios, method: 'get', url: `/api/cashflow/excluded`, params: { page: pageParam, ...query }, }); return response.data; }, { getPreviousPageParam: (firstPage) => firstPage.pagination.page - 1, getNextPageParam: (lastPage) => { const { pagination } = lastPage; return pagination.total > pagination.page_size * pagination.page ? lastPage.pagination.page + 1 : undefined; }, ...infinityProps, }, ); }