Files
silo-server/web/src/hooks/queries/admin/inviteCodes.ts
T

88 lines
2.6 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { api } from "@/api/client";
import type {
InviteCode,
CreateInviteCodeRequest,
UpdateInviteCodeRequest,
TopUpInviteCodeRequest,
} from "@/api/types";
import { adminKeys } from "../keys";
import { toast } from "sonner";
const ADMIN_STALE_TIME = 30_000;
export function useAdminInviteCodes() {
return useQuery({
queryKey: adminKeys.inviteCodes(),
queryFn: () => api<InviteCode[]>("/admin/invite-codes").then((d) => d ?? []),
staleTime: ADMIN_STALE_TIME,
});
}
export function useCreateInviteCode() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (body: CreateInviteCodeRequest) =>
api<InviteCode>("/admin/invite-codes", {
method: "POST",
body: JSON.stringify(body),
}),
onSuccess: () => {
toast.success("Invite code created");
queryClient.invalidateQueries({ queryKey: adminKeys.inviteCodes() });
},
onError: (err) => {
toast.error(err instanceof Error ? err.message : "Failed to create invite code");
},
});
}
export function useUpdateInviteCode() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, body }: { id: number; body: UpdateInviteCodeRequest }) =>
api(`/admin/invite-codes/${id}`, {
method: "PUT",
body: JSON.stringify(body),
}),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: adminKeys.inviteCodes() });
},
onError: (err) => {
toast.error(err instanceof Error ? err.message : "Failed to update invite code");
},
});
}
export function useTopUpInviteCode() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, body }: { id: number; body: TopUpInviteCodeRequest }) =>
api<InviteCode>(`/admin/invite-codes/${id}/top-up`, {
method: "POST",
body: JSON.stringify(body),
}),
onSuccess: () => {
toast.success("Invite code topped up");
queryClient.invalidateQueries({ queryKey: adminKeys.inviteCodes() });
},
onError: (err) => {
toast.error(err instanceof Error ? err.message : "Failed to top up invite code");
},
});
}
export function useDeleteInviteCode() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: number) => api(`/admin/invite-codes/${id}`, { method: "DELETE" }),
onSuccess: () => {
toast.success("Invite code deleted");
queryClient.invalidateQueries({ queryKey: adminKeys.inviteCodes() });
},
onError: (err) => {
toast.error(err instanceof Error ? err.message : "Failed to delete invite code");
},
});
}