mirror of
https://github.com/Zproger/Aurum.git
synced 2026-10-13 02:56:39 +07:00
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.
66 lines
2.1 KiB
TypeScript
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,
|
|
});
|
|
}
|