Files
ncd-fe/packages/pl-fe/src/queries/groups/use-group-blocks.ts
nicole mikołajczyk 5a8519fab9 pl-fe: reuse code
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-07-10 12:54:51 +02:00

58 lines
2.1 KiB
TypeScript

import { useMutation, type InfiniteData } from '@tanstack/react-query';
import { useClient } from 'pl-fe/hooks/use-client';
import { queryClient } from 'pl-fe/queries/client';
import { makePaginatedResponseQuery } from 'pl-fe/queries/utils/make-paginated-response-query';
import { minifyAccountList } from 'pl-fe/queries/utils/minify-list';
import { filterById } from '../utils/filter-id';
import { removeGroupMember } from './use-group-members';
const appendGroupBlock = (groupId: string, accountId: string) =>
queryClient.setQueryData<InfiniteData<ReturnType<typeof minifyAccountList>>>(['accountsLists', 'groupBlocks', groupId], (data) => {
if (!data || data.pages.some(page => page.items.includes(accountId))) return data;
return {
...data,
pages: data.pages.map((page, index) => index === 0 ? ({ ...page, items: [accountId, ...page.items] }) : page),
};
});
const removeGroupBlock = (groupId: string, accountId: string) =>
queryClient.setQueryData<InfiniteData<ReturnType<typeof minifyAccountList>>>(['accountsLists', 'groupBlocks', groupId], filterById(accountId));
const useGroupBlocks = makePaginatedResponseQuery(
(groupId: string) => ['accountsLists', 'groupBlocks', groupId],
(client, [groupId]) => client.experimental.groups.getGroupBlocks(groupId).then(minifyAccountList),
);
const useBlockGroupUserMutation = (groupId: string, accountId: string) => {
const client = useClient();
return useMutation({
mutationKey: ['accountsLists', 'groupBlocks', groupId, accountId],
mutationFn: () => client.experimental.groups.blockGroupUsers(groupId, [accountId]),
onSettled: () => {
removeGroupMember(groupId, accountId);
appendGroupBlock(groupId, accountId);
},
});
};
const useUnblockGroupUserMutation = (groupId: string, accountId: string) => {
const client = useClient();
return useMutation({
mutationKey: ['accountsLists', 'groupBlocks', groupId, accountId],
mutationFn: () => client.experimental.groups.unblockGroupUsers(groupId, [accountId]),
onSettled: () => removeGroupBlock(groupId, accountId),
});
};
export {
useGroupBlocks,
useBlockGroupUserMutation,
useUnblockGroupUserMutation,
};