Группы: приглашения вместо авто-добавления (согласиться/отказаться)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 20:07:20 +03:00
co-authored by Claude Opus 4.8
parent 66370c7df4
commit a5c54512a5
20 changed files with 742 additions and 98 deletions
+3 -4
View File
@@ -92,17 +92,16 @@ export function useSetGroupExpansions(groupId: number) {
});
}
export function useAddMember(groupId: number) {
const qc = useQueryClient();
// Приглашение игрока в группу по нику (вместо прямого добавления).
export function useInviteMember(groupId: number) {
return useMutation({
mutationFn: async (nickname: string) =>
unwrap(
await api.POST("/api/groups/{group_id}/members", {
await api.POST("/api/groups/{group_id}/invitations", {
params: { path: { group_id: groupId } },
body: { nickname },
}),
),
onSuccess: () => qc.invalidateQueries({ queryKey: qk.groupMembers(groupId) }),
});
}
+45
View File
@@ -0,0 +1,45 @@
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),
});
}