Files
aurum/frontend/src/hooks/useTransactions.ts
ZProger f3fbe4d546 feat: add year switcher to Dashboard, Transactions and Budget
Year was previously hardcoded to the current year on all three pages
(useState with no setter) — only the month could be changed via
MonthSelector, making it impossible to look at or compare older years
even though transaction history goes back further than the current
year.

Adds GET /transactions/years (contiguous range from the earliest
transaction through the current year) and a YearSelector component
matching MonthSelector's style, wired into all three pages alongside
a real year useState.
2026-08-16 22:10:49 +03:00

66 lines
2.1 KiB
TypeScript

import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import {
createTransaction,
deleteTransaction,
fetchTransactions,
fetchTransactionYears,
updateTransaction,
type TransactionFilters,
} from "@/api/transactions";
import type { TransactionInput } from "@/types";
function useInvalidateAfterTransactionChange() {
const queryClient = useQueryClient();
return () => {
queryClient.invalidateQueries({ queryKey: ["transactions"] });
queryClient.invalidateQueries({ queryKey: ["transaction-years"] });
queryClient.invalidateQueries({ queryKey: ["dashboard-summary"] });
queryClient.invalidateQueries({ queryKey: ["net-worth-summary"] });
queryClient.invalidateQueries({ queryKey: ["category-spending-report"] });
queryClient.invalidateQueries({ queryKey: ["category-ranking"] });
queryClient.invalidateQueries({ queryKey: ["budget-status"] });
queryClient.invalidateQueries({ queryKey: ["financial-alerts"] });
queryClient.invalidateQueries({ queryKey: ["advice"] });
queryClient.invalidateQueries({ queryKey: ["cash-flow"] });
};
}
export function useTransactions(filters: TransactionFilters) {
return useQuery({
queryKey: ["transactions", filters],
queryFn: () => fetchTransactions(filters),
});
}
export function useTransactionYears() {
return useQuery({
queryKey: ["transaction-years"],
queryFn: fetchTransactionYears,
});
}
export function useCreateTransaction() {
const invalidate = useInvalidateAfterTransactionChange();
return useMutation({
mutationFn: (input: TransactionInput) => createTransaction(input),
onSuccess: invalidate,
});
}
export function useUpdateTransaction() {
const invalidate = useInvalidateAfterTransactionChange();
return useMutation({
mutationFn: ({ id, input }: { id: number; input: Partial<TransactionInput> }) =>
updateTransaction(id, input),
onSuccess: invalidate,
});
}
export function useDeleteTransaction() {
const invalidate = useInvalidateAfterTransactionChange();
return useMutation({
mutationFn: (id: number) => deleteTransaction(id),
onSuccess: invalidate,
});
}