46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
|
import { api, unwrap } from "../api/client";
|
|
import { qk } from "../api/queryKeys";
|
|
|
|
export function useMyInvitations() {
|
|
return useQuery({
|
|
queryKey: qk.invitations,
|
|
queryFn: async () => unwrap(await api.GET("/api/invitations")),
|
|
});
|
|
}
|
|
|
|
// Принятие/отклонение меняет приглашения, состав групп и активную группу.
|
|
function invalidateAll(qc: ReturnType<typeof useQueryClient>) {
|
|
qc.invalidateQueries({ queryKey: qk.invitations });
|
|
qc.invalidateQueries({ queryKey: qk.me });
|
|
qc.invalidateQueries({ queryKey: qk.groups });
|
|
qc.invalidateQueries({ queryKey: qk.home });
|
|
}
|
|
|
|
export function useAcceptInvitation() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: async (invitationId: number) =>
|
|
unwrap(
|
|
await api.POST("/api/invitations/{invitation_id}/accept", {
|
|
params: { path: { invitation_id: invitationId } },
|
|
}),
|
|
),
|
|
onSuccess: () => invalidateAll(qc),
|
|
});
|
|
}
|
|
|
|
export function useDeclineInvitation() {
|
|
const qc = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: async (invitationId: number) =>
|
|
unwrap(
|
|
await api.POST("/api/invitations/{invitation_id}/decline", {
|
|
params: { path: { invitation_id: invitationId } },
|
|
}),
|
|
),
|
|
onSuccess: () => invalidateAll(qc),
|
|
});
|
|
}
|