64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
import { api } from "@/api/client";
|
|
import type { AdminAPIKey, AdminCreateAPIKeyRequest } from "@/api/types";
|
|
import { adminKeys } from "../keys";
|
|
import { toast } from "sonner";
|
|
|
|
const ADMIN_STALE_TIME = 30_000;
|
|
|
|
export function useAdminApiKeys() {
|
|
return useQuery({
|
|
queryKey: adminKeys.apiKeys(),
|
|
queryFn: () => api<AdminAPIKey[]>("/admin/api-keys").then((d) => d ?? []),
|
|
staleTime: ADMIN_STALE_TIME,
|
|
});
|
|
}
|
|
|
|
export function useAdminCreateApiKey() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (body: AdminCreateAPIKeyRequest) =>
|
|
api<AdminAPIKey>("/admin/api-keys", {
|
|
method: "POST",
|
|
body: JSON.stringify(body),
|
|
}),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: adminKeys.apiKeys() });
|
|
},
|
|
onError: (err) => {
|
|
toast.error(err instanceof Error ? err.message : "Failed to create API key");
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useAdminDeleteApiKey() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: number) => api(`/admin/api-keys/${id}`, { method: "DELETE" }),
|
|
onSuccess: () => {
|
|
toast.success("API key revoked");
|
|
queryClient.invalidateQueries({ queryKey: adminKeys.apiKeys() });
|
|
},
|
|
onError: (err) => {
|
|
toast.error(err instanceof Error ? err.message : "Failed to revoke API key");
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useAdminUpdateApiKeyTier() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ id, tier }: { id: number; tier: string }) =>
|
|
api(`/admin/api-keys/${id}/tier`, {
|
|
method: "PUT",
|
|
body: JSON.stringify({ tier }),
|
|
}),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: adminKeys.apiKeys() });
|
|
},
|
|
onError: (err) => {
|
|
toast.error(err instanceof Error ? err.message : "Failed to update tier");
|
|
},
|
|
});
|
|
}
|