feat: frontend core — auth, layout, transactions, categories

This commit is contained in:
Nox (OpenClaw)
2026-03-17 16:36:47 +00:00
parent 21339d771d
commit 9f7378cb69
16 changed files with 2042 additions and 5 deletions
+43
View File
@@ -0,0 +1,43 @@
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import {
createCategory,
deleteCategory,
getCategories,
updateCategory,
} from "../api/client";
import type {
CreateCategoryPayload,
UpdateCategoryPayload,
} from "../api/types";
export function useCategories() {
return useQuery({
queryKey: ["categories"],
queryFn: () => getCategories(),
});
}
export function useCreateCategory() {
const qc = useQueryClient();
return useMutation({
mutationFn: (payload: CreateCategoryPayload) => createCategory(payload),
onSuccess: () => qc.invalidateQueries({ queryKey: ["categories"] }),
});
}
export function useUpdateCategory() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ id, payload }: { id: string; payload: UpdateCategoryPayload }) =>
updateCategory(id, payload),
onSuccess: () => qc.invalidateQueries({ queryKey: ["categories"] }),
});
}
export function useDeleteCategory() {
const qc = useQueryClient();
return useMutation({
mutationFn: (id: string) => deleteCategory(id),
onSuccess: () => qc.invalidateQueries({ queryKey: ["categories"] }),
});
}
+50
View File
@@ -0,0 +1,50 @@
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import {
createTransaction,
deleteTransaction,
getTransactions,
updateTransaction,
} from "../api/client";
import type {
CreateTransactionPayload,
TransactionFilters,
UpdateTransactionPayload,
} from "../api/types";
export function useTransactions(filters: TransactionFilters) {
return useQuery({
queryKey: ["transactions", filters],
queryFn: () => getTransactions(filters),
});
}
export function useCreateTransaction() {
const qc = useQueryClient();
return useMutation({
mutationFn: (payload: CreateTransactionPayload) =>
createTransaction(payload),
onSuccess: () => qc.invalidateQueries({ queryKey: ["transactions"] }),
});
}
export function useUpdateTransaction() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({
id,
payload,
}: {
id: string;
payload: UpdateTransactionPayload;
}) => updateTransaction(id, payload),
onSuccess: () => qc.invalidateQueries({ queryKey: ["transactions"] }),
});
}
export function useDeleteTransaction() {
const qc = useQueryClient();
return useMutation({
mutationFn: (id: string) => deleteTransaction(id),
onSuccess: () => qc.invalidateQueries({ queryKey: ["transactions"] }),
});
}