diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 840128c3a..19034c763 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -5445,7 +5445,7 @@ class PlApiClient { /** * Requires features{@link Features.antennas}. */ - getAntennaAccounts: async (antennaId: string) => + getAntennaAccounts: async (antennaId: string) => this.#paginatedGet(`/api/v1/antennas/${antennaId}/accounts`, {}, accountSchema), /** @@ -5475,13 +5475,13 @@ class PlApiClient { /** * Requires features{@link Features.antennas}. */ - getAntennaExcludeAccounts: async (antennaId: string) => + getAntennaExcludedAccounts: async (antennaId: string) => this.#paginatedGet(`/api/v1/antennas/${antennaId}/exclude_accounts`, {}, accountSchema), /** * Requires features{@link Features.antennas}. */ - addAntennaExcludeAccounts: async (antennaId: string, accountIds: Array) => { + addAntennaExcludedAccounts: async (antennaId: string, accountIds: Array) => { const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_accounts`, { method: 'POST', body: { account_ids: accountIds }, @@ -5493,7 +5493,7 @@ class PlApiClient { /** * Requires features{@link Features.antennas}. */ - removeAntennaExcludeAccounts: async (antennaId: string, accountIds: Array) => { + removeAntennaExcludedAccounts: async (antennaId: string, accountIds: Array) => { const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_accounts`, { method: 'DELETE', body: { account_ids: accountIds }, diff --git a/packages/pl-api/lib/params/index.ts b/packages/pl-api/lib/params/index.ts index 8ed232252..8516faf41 100644 --- a/packages/pl-api/lib/params/index.ts +++ b/packages/pl-api/lib/params/index.ts @@ -1,5 +1,6 @@ export * from './accounts'; export * from './admin'; +export * from './antennas'; export * from './apps'; export * from './chats'; export * from './circles'; diff --git a/packages/pl-fe/src/queries/accounts/use-antennas.ts b/packages/pl-fe/src/queries/accounts/use-antennas.ts new file mode 100644 index 000000000..638876a48 --- /dev/null +++ b/packages/pl-fe/src/queries/accounts/use-antennas.ts @@ -0,0 +1,134 @@ +import { type InfiniteData, useMutation, useQuery } from '@tanstack/react-query'; + +import { useClient } from 'pl-fe/hooks/use-client'; +import { useFeatures } from 'pl-fe/hooks/use-features'; + +import { queryClient } from '../client'; +import { filterById } from '../utils/filter-id'; +import { makePaginatedResponseQuery } from '../utils/make-paginated-response-query'; +import { minifyAccountList } from '../utils/minify-list'; + +import type { Antenna, PaginatedResponse, CreateAntennaParams, UpdateAntennaParams } from 'pl-api'; + +const useAntennas = ( + select?: ((data: Array) => T), +) => { + const client = useClient(); + const features = useFeatures(); + + return useQuery({ + queryKey: ['antennas'], + queryFn: () => client.antennas.fetchAntennas(), + enabled: features.antennas, + select, + }); +}; + +const useAntenna = (antennaId?: string) => useAntennas((data) => antennaId ? data.find(antenna => antenna.id === antennaId) : undefined); + +const useCreateAntenna = () => { + const client = useClient(); + + return useMutation({ + mutationKey: ['antennas', 'create'], + mutationFn: (params: CreateAntennaParams) => client.antennas.createAntenna(params), + onSettled: () => queryClient.invalidateQueries({ queryKey: ['antennas'] }), + }); +}; + +const useDeleteAntenna = () => { + const client = useClient(); + + return useMutation({ + mutationKey: ['antennas', 'delete'], + mutationFn: (antennaId: string) => client.antennas.deleteAntenna(antennaId), + onSuccess: (_, deletedAntennaId) => { + queryClient.setQueryData>( + ['antennas'], + (prevData) => prevData?.filter(({ id }) => id !== deletedAntennaId), + ); + }, + }); +}; + +const useUpdateAntenna = (antennaId: string) => { + const client = useClient(); + + return useMutation({ + mutationKey: ['antennas', 'update', antennaId], + mutationFn: (params: UpdateAntennaParams) => client.antennas.updateAntenna(antennaId, params), + onSettled: () => queryClient.invalidateQueries({ queryKey: ['antennas'] }), + }); +}; + +const useAntennaAccounts = makePaginatedResponseQuery( + (antennaId: string) => ['accountsLists', 'antennas', antennaId], + (client, [antennaId]) => client.antennas.getAntennaAccounts(antennaId).then(minifyAccountList), +); + +const useAddAccountsToAntenna = (antennaId: string) => { + const client = useClient(); + + return useMutation({ + mutationKey: ['accountsLists', 'antennas', antennaId, 'add'], + mutationFn: (accountIds: Array) => client.antennas.addAntennaAccounts(antennaId, accountIds), + onSettled: (_, __, accountIds) => { + queryClient.invalidateQueries({ queryKey: ['accountsLists', 'antennas', antennaId] }); + }, + }); +}; + +const useRemoveAccountsFromAntenna = (antennaId: string) => { + const client = useClient(); + + return useMutation({ + mutationKey: ['accountsLists', 'antennas', antennaId, 'remove'], + mutationFn: (accountIds: Array) => client.antennas.removeAntennaAccounts(antennaId, accountIds), + onSettled: (_, __, accountIds) => { + queryClient.setQueryData>>(['accountsLists', 'antennas', antennaId], filterById(accountIds)); + }, + }); +}; + +const useAntennaExcludedAccounts = makePaginatedResponseQuery( + (antennaId: string) => ['accountsLists', 'antennas', antennaId, 'excluded'], + (client, [antennaId]) => client.antennas.getAntennaExcludedAccounts(antennaId).then(minifyAccountList), +); + +const useAddExcludedAccountsToAntenna = (antennaId: string) => { + const client = useClient(); + + return useMutation({ + mutationKey: ['accountsLists', 'antennas', antennaId, 'addExcluded'], + mutationFn: (accountIds: Array) => client.antennas.addAntennaExcludedAccounts(antennaId, accountIds), + onSettled: (_, __, accountIds) => { + queryClient.invalidateQueries({ queryKey: ['accountsLists', 'antennas', antennaId] }); + }, + }); +}; + +const useRemoveExcludedAccountsFromAntenna = (antennaId: string) => { + const client = useClient(); + + return useMutation({ + mutationKey: ['accountsLists', 'antennas', antennaId, 'removeExcluded'], + mutationFn: (accountIds: Array) => client.antennas.removeAntennaExcludedAccounts(antennaId, accountIds), + onSettled: (_, __, accountIds) => { + queryClient.setQueryData>>(['accountsLists', 'antennas', antennaId], filterById(accountIds)); + }, + }); +}; + +export { + useAntennas, + useAntenna, + useCreateAntenna, + useDeleteAntenna, + useUpdateAntenna, + useAntennaAccounts, + useAddAccountsToAntenna, + useRemoveAccountsFromAntenna, + useAntennaExcludedAccounts, + useAddExcludedAccountsToAntenna, + useRemoveExcludedAccountsFromAntenna, +};