Files
ncd-fe/packages/pl-fe/src/queries/admin/use-accounts.ts
nicole mikołajczyk 40441b7125 pl-fe: do not make admin api requests when unauthenticated lol
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
2025-10-18 16:53:40 +02:00

203 lines
6.8 KiB
TypeScript

import { InfiniteData, useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { importEntities } from 'pl-fe/actions/importer';
import { useAccount } from 'pl-fe/api/hooks/accounts/use-account';
import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch';
import { useClient } from 'pl-fe/hooks/use-client';
import { useOwnAccount } from 'pl-fe/hooks/use-own-account';
import { filterById } from '../utils/filter-id';
import { makePaginatedResponseQuery } from '../utils/make-paginated-response-query';
import { makePaginatedResponseQueryOptions } from '../utils/make-paginated-response-query-options';
import { minifyAdminAccount, minifyAdminAccountList } from '../utils/minify-list';
import type { AdminPerformAccountActionParams, PaginatedResponse, AdminAccount, AdminGetAccountsParams, PaginationParams, AdminAccountAction } from 'pl-api';
const useAdminAccounts = makePaginatedResponseQuery(
(params: Omit<AdminGetAccountsParams, keyof PaginationParams>) => ['admin', 'accountLists', params],
(client, [params]) => client.admin.accounts.getAccounts(params).then(minifyAdminAccountList),
undefined,
'isAdmin',
);
const useAdminAccount = (accountId: string) => {
const client = useClient();
const dispatch = useAppDispatch();
const query = useQuery<AdminAccount>({
queryKey: ['admin', 'accounts', accountId],
queryFn: () => client.admin.accounts.getAccount(accountId).then(({ account, ...adminAccount }) => {
dispatch(importEntities({ accounts: [account] }));
return adminAccount as AdminAccount;
}),
});
const { account } = useAccount(query.data ? accountId : undefined);
if (query.data && account) query.data.account = account;
return query;
};
const pendingUsersQuery = makePaginatedResponseQueryOptions(
['admin', 'accountLists', { origin: 'local', status: 'pending' }],
(client) => client.admin.accounts.getAccounts({ origin: 'local', status: 'pending' }).then(minifyAdminAccountList),
)();
const usePendingUsersCount = () => {
const { account } = useOwnAccount();
return useInfiniteQuery({
...pendingUsersQuery,
select: (data) => data.pages.at(-1)?.total || data.pages.map(page => page.items).flat().length || 0,
enabled: !!(account?.is_admin || account?.is_moderator),
});
};
const useAdminApproveAccountMutation = (accountId: string) => {
const client = useClient();
const dispatch = useAppDispatch();
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: () => client.admin.accounts.approveAccount(accountId),
onSuccess: ({ account, ...adminAccount }) => {
dispatch(importEntities({ accounts: [account] }));
queryClient.setQueryData(['admin', 'accounts', adminAccount.id], adminAccount);
queryClient.setQueriesData<InfiniteData<PaginatedResponse<string>>>({
queryKey: ['admin', 'accountLists', {
status: 'pending',
}],
exact: false,
}, filterById(accountId));
},
});
};
const useAdminRejectAccountMutation = (accountId: string) => {
const client = useClient();
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: () => client.admin.accounts.rejectAccount(accountId),
onSuccess: () => {
queryClient.setQueriesData<InfiniteData<PaginatedResponse<string>>>({
queryKey: ['admin', 'accountLists', {
status: 'pending',
}],
exact: false,
}, filterById(accountId));
},
});
};
const useAdminDeleteAccountMutation = (accountId: string) => {
const client = useClient();
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: () => client.admin.accounts.deleteAccount(accountId),
onSuccess: () => {
queryClient.setQueriesData<InfiniteData<PaginatedResponse<string>>>({
queryKey: ['admin', 'accountLists'],
exact: false,
}, filterById(accountId));
},
});
};
const useAdminPerformAccountActionMutation = (accountId: string, type: AdminAccountAction) => {
const client = useClient();
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: (params?: AdminPerformAccountActionParams) => client.admin.accounts.performAccountAction(accountId, type, params),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['admin', 'accountLists'], exact: false });
},
});
};
const useAdminEnableAccountMutation = (accountId: string) => {
const client = useClient();
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: () => client.admin.accounts.enableAccount(accountId),
onSuccess: (account) => {
queryClient.setQueriesData<InfiniteData<PaginatedResponse<string>>>({
queryKey: ['admin', 'accountLists', { status: 'disabled' }],
exact: false,
}, filterById(accountId));
minifyAdminAccount(account);
},
});
};
const useAdminUnsilenceAccountMutation = (accountId: string) => {
const client = useClient();
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: () => client.admin.accounts.unsilenceAccount(accountId),
onSuccess: (account) => {
queryClient.setQueriesData<InfiniteData<PaginatedResponse<string>>>({
queryKey: ['admin', 'accountLists', { status: 'silenced' }],
exact: false,
}, filterById(accountId));
minifyAdminAccount(account);
},
});
};
const useAdminUnsuspendAccountMutation = (accountId: string) => {
const client = useClient();
const queryClient = useQueryClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: () => client.admin.accounts.unsuspendAccount(accountId),
onSuccess: (account) => {
queryClient.setQueriesData<InfiniteData<PaginatedResponse<string>>>({
queryKey: ['admin', 'accountLists', { status: 'suspended' }],
exact: false,
}, filterById(accountId));
minifyAdminAccount(account);
},
});
};
const useAdminUnsensitiveAccountMutation = (accountId: string) => {
const client = useClient();
return useMutation({
mutationKey: ['admin', 'acounts', accountId],
mutationFn: () => client.admin.accounts.unsensitiveAccount(accountId),
onSuccess: (account) => {
minifyAdminAccount(account);
},
});
};
export {
useAdminAccount,
useAdminAccounts,
usePendingUsersCount,
useAdminApproveAccountMutation,
useAdminRejectAccountMutation,
useAdminDeleteAccountMutation,
useAdminPerformAccountActionMutation,
useAdminEnableAccountMutation,
useAdminUnsilenceAccountMutation,
useAdminUnsuspendAccountMutation,
useAdminUnsensitiveAccountMutation,
};