diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 1f09eec75..47b40adbf 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -28,6 +28,7 @@ import { asyncRefreshSchema, authorizationServerMetadataSchema, backupSchema, + blockedAccountSchema, bookmarkFolderSchema, chatMessageSchema, chatSchema, @@ -2126,7 +2127,7 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/blocks/#get} */ getBlocks: async (params?: GetBlocksParams) => - this.#paginatedGet('/api/v1/blocks', { params }, accountSchema), + this.#paginatedGet('/api/v1/blocks', { params }, blockedAccountSchema), /** * Get domain blocks diff --git a/packages/pl-api/lib/entities/account.ts b/packages/pl-api/lib/entities/account.ts index 3680c77dc..3be5bc522 100644 --- a/packages/pl-api/lib/entities/account.ts +++ b/packages/pl-api/lib/entities/account.ts @@ -265,6 +265,21 @@ type CredentialAccount = v.InferOutput & */ const credentialAccountSchema: v.BaseSchema> = untypedCredentialAccountSchema as any; +const untypedBlockedAccountSchema = v.pipe(v.any(), preprocessAccount, v.object({ + ...accountWithMovedAccountSchema.entries, + block_expires_at: v.fallback(v.nullable(datetimeSchema), null), +})); + +/** + * @category Entity types + */ +type BlockedAccount = v.InferOutput & WithMoved; + +/** + * @category Schemas + */ +const blockedAccountSchema: v.BaseSchema> = untypedBlockedAccountSchema as any; + const untypedMutedAccountSchema = v.pipe(v.any(), preprocessAccount, v.object({ ...accountWithMovedAccountSchema.entries, mute_expires_at: v.fallback(v.nullable(datetimeSchema), null), @@ -283,8 +298,10 @@ const mutedAccountSchema: v.BaseSchema> export { accountSchema, credentialAccountSchema, + blockedAccountSchema, mutedAccountSchema, type Account, type CredentialAccount, + type BlockedAccount, type MutedAccount, }; diff --git a/packages/pl-fe/src/components/account.tsx b/packages/pl-fe/src/components/account.tsx index 767f6e749..542e4d43f 100644 --- a/packages/pl-fe/src/components/account.tsx +++ b/packages/pl-fe/src/components/account.tsx @@ -110,6 +110,7 @@ interface IAccount { items?: React.ReactNode; disabled?: boolean; muteExpiresAt?: string | null; + blockExpiresAt?: string | null; } const Account = ({ @@ -138,6 +139,7 @@ const Account = ({ items, disabled, muteExpiresAt, + blockExpiresAt, }: IAccount) => { const overflowRef = useRef(null); const actionRef = useRef(null); @@ -376,6 +378,14 @@ const Account = ({ )} + {actionType === 'blocking' && blockExpiresAt ? ( + <> + + + + + ) : null} + {actionType === 'muting' && muteExpiresAt ? ( <> diff --git a/packages/pl-fe/src/pages/settings/blocks.tsx b/packages/pl-fe/src/pages/settings/blocks.tsx index 0b300ca6b..06f24dd79 100644 --- a/packages/pl-fe/src/pages/settings/blocks.tsx +++ b/packages/pl-fe/src/pages/settings/blocks.tsx @@ -43,8 +43,8 @@ const BlocksPage: React.FC = () => { itemClassName={clsx('pb-4', { 'last:pb-0': !hasNextPage })} isLoading={isFetching} > - {data.map((accountId) => ( - + {data.map(([accountId, blockExpiresAt]) => ( + ))} diff --git a/packages/pl-fe/src/queries/account-lists/use-blocks.ts b/packages/pl-fe/src/queries/account-lists/use-blocks.ts index 59387ade9..123e61009 100644 --- a/packages/pl-fe/src/queries/account-lists/use-blocks.ts +++ b/packages/pl-fe/src/queries/account-lists/use-blocks.ts @@ -1,9 +1,9 @@ import { makePaginatedResponseQuery } from '../utils/make-paginated-response-query'; -import { minifyAccountList, minifyMutedAccountList } from '../utils/minify-list'; +import { minifyBlockedAccountList, minifyMutedAccountList } from '../utils/minify-list'; const useBlocks = makePaginatedResponseQuery( ['accountsLists', 'blocked'], - (client) => client.filtering.getBlocks({ with_relationships: true }).then(minifyAccountList), + (client) => client.filtering.getBlocks({ with_relationships: true }).then(minifyBlockedAccountList), ); const useMutes = makePaginatedResponseQuery( diff --git a/packages/pl-fe/src/queries/utils/minify-list.ts b/packages/pl-fe/src/queries/utils/minify-list.ts index dc3a075c4..a30d76630 100644 --- a/packages/pl-fe/src/queries/utils/minify-list.ts +++ b/packages/pl-fe/src/queries/utils/minify-list.ts @@ -3,7 +3,7 @@ import { store } from 'pl-fe/store'; import { queryClient } from '../client'; -import type { Account, AdminAccount, AdminReport, MutedAccount, PaginatedResponse, Status } from 'pl-api'; +import type { Account, AdminAccount, AdminReport, BlockedAccount, MutedAccount, PaginatedResponse, Status } from 'pl-api'; const minifyList = ({ previous, next, items, ...response }: PaginatedResponse, minifier: (value: T1) => T2, importer?: (items: Array) => void): PaginatedResponse => { importer?.(items); @@ -26,6 +26,11 @@ const minifyAccountList = (response: PaginatedResponse): PaginatedRespo store.dispatch(importEntities({ accounts }) as any); }); +const minifyBlockedAccountList = (response: PaginatedResponse): PaginatedResponse<[string, string | null]> => + minifyList(response, (account) => [account.id, account.block_expires_at], (accounts) => { + store.dispatch(importEntities({ accounts }) as any); + }); + const minifyMutedAccountList = (response: PaginatedResponse): PaginatedResponse<[string, string | null]> => minifyList(response, (account) => [account.id, account.mute_expires_at], (accounts) => { store.dispatch(importEntities({ accounts }) as any); @@ -75,4 +80,4 @@ const minifyAdminReportList = (response: PaginatedResponse) => } }); -export { minifyList, minifyAccountList, minifyMutedAccountList, minifyStatusList, minifyAdminAccount, minifyAdminAccountList, minifyAdminReport, minifyAdminReportList }; +export { minifyList, minifyAccountList, minifyBlockedAccountList, minifyMutedAccountList, minifyStatusList, minifyAdminAccount, minifyAdminAccountList, minifyAdminReport, minifyAdminReportList };