From 20ccd26a6eff804e9304bbac761578f75b7bc34c Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Wed, 15 Mar 2023 14:51:25 -0400 Subject: [PATCH 1/5] Update Entity Store with bug fixes --- app/soapbox/entity-store/hooks/useEntities.ts | 7 ++++++- app/soapbox/entity-store/hooks/useEntity.ts | 2 +- app/soapbox/entity-store/hooks/useEntityActions.ts | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/soapbox/entity-store/hooks/useEntities.ts b/app/soapbox/entity-store/hooks/useEntities.ts index 3d3fddb48..6945ccd8d 100644 --- a/app/soapbox/entity-store/hooks/useEntities.ts +++ b/app/soapbox/entity-store/hooks/useEntities.ts @@ -131,7 +131,12 @@ function useEntities( const selectCache = (state: RootState, path: EntityPath) => state.entities[path[0]]; /** Get list at path from Redux. */ -const selectList = (state: RootState, path: EntityPath) => selectCache(state, path)?.lists[path[1]]; +const selectList = (state: RootState, path: EntityPath) => { + const [, ...listKeys] = path; + const listKey = listKeys.join(':'); + + return selectCache(state, path)?.lists[listKey]; +}; /** Select a particular item from a list state. */ function selectListState(state: RootState, path: EntityPath, key: K) { diff --git a/app/soapbox/entity-store/hooks/useEntity.ts b/app/soapbox/entity-store/hooks/useEntity.ts index 1dad1ff1e..3c4b9cce7 100644 --- a/app/soapbox/entity-store/hooks/useEntity.ts +++ b/app/soapbox/entity-store/hooks/useEntity.ts @@ -39,7 +39,7 @@ function useEntity( const fetchEntity = () => { setIsFetching(true); api.get(endpoint).then(({ data }) => { - const entity = schema.parse(data); + const entity = schema.parse(Array.isArray(data) ? data[0] : data); dispatch(importEntities([entity], entityType)); setIsFetching(false); }).catch(() => { diff --git a/app/soapbox/entity-store/hooks/useEntityActions.ts b/app/soapbox/entity-store/hooks/useEntityActions.ts index c1e40f37e..58b6b0101 100644 --- a/app/soapbox/entity-store/hooks/useEntityActions.ts +++ b/app/soapbox/entity-store/hooks/useEntityActions.ts @@ -65,7 +65,7 @@ function useEntityActions( } return { - createEntity: endpoints.post ? createEntity : undefined, + createEntity: createEntity, deleteEntity: endpoints.delete ? deleteEntity : undefined, }; } From 9dde71716f2bc28785e64aaa0a60e790edd2924c Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Wed, 15 Mar 2023 14:51:49 -0400 Subject: [PATCH 2/5] Improve DropdownMenu API --- app/soapbox/components/dropdown-menu/dropdown-menu.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/soapbox/components/dropdown-menu/dropdown-menu.tsx b/app/soapbox/components/dropdown-menu/dropdown-menu.tsx index f4d885b7f..a5714ff68 100644 --- a/app/soapbox/components/dropdown-menu/dropdown-menu.tsx +++ b/app/soapbox/components/dropdown-menu/dropdown-menu.tsx @@ -271,6 +271,10 @@ const DropdownMenu = (props: IDropdownMenu) => { }; }, [refs.floating.current]); + if (items.length === 0) { + return null; + } + return ( <> {children ? ( From a99a7b2af52de24240cfdfbdd63bdaf045623c81 Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Wed, 15 Mar 2023 14:52:06 -0400 Subject: [PATCH 3/5] Improve focus design for Danger buttons --- app/soapbox/components/ui/button/useButtonStyles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/soapbox/components/ui/button/useButtonStyles.ts b/app/soapbox/components/ui/button/useButtonStyles.ts index 2cc06f6e7..a5423855a 100644 --- a/app/soapbox/components/ui/button/useButtonStyles.ts +++ b/app/soapbox/components/ui/button/useButtonStyles.ts @@ -8,7 +8,7 @@ const themes = { tertiary: 'bg-transparent border-gray-400 dark:border-gray-800 hover:border-primary-300 dark:hover:border-primary-700 focus:border-primary-500 text-gray-900 dark:text-gray-100 focus:ring-primary-500', accent: 'border-transparent bg-secondary-500 hover:bg-secondary-400 focus:bg-secondary-500 text-gray-100 focus:ring-secondary-300', - danger: 'border-transparent bg-danger-100 dark:bg-danger-900 text-danger-600 dark:text-danger-200 hover:bg-danger-600 hover:text-gray-100 dark:hover:text-gray-100 dark:hover:bg-danger-500 focus:bg-danger-800 focus:text-gray-200 dark:focus:bg-danger-600 dark:focus:text-gray-100', + danger: 'border-transparent bg-danger-100 dark:bg-danger-900 text-danger-600 dark:text-danger-200 hover:bg-danger-600 hover:text-gray-100 dark:hover:text-gray-100 dark:hover:bg-danger-500 focus:ring-danger-500', transparent: 'border-transparent text-gray-800 backdrop-blur-sm bg-white/75 hover:bg-white/80', outline: 'border-gray-100 border-2 bg-transparent text-gray-100 hover:bg-white/10', muted: 'border border-solid bg-transparent border-gray-400 dark:border-gray-800 hover:border-primary-300 dark:hover:border-primary-700 focus:border-primary-500 text-gray-900 dark:text-gray-100 focus:ring-primary-500', From 6b30671875eec559b631dab44b96723b7d9dbe9f Mon Sep 17 00:00:00 2001 From: Chewbacca Date: Wed, 15 Mar 2023 14:53:17 -0400 Subject: [PATCH 4/5] Add Account entity and improve Block/Ban support for Groups --- app/soapbox/components/account.tsx | 5 +- .../dropdown-menu/dropdown-menu-item.tsx | 2 +- .../group/components/group-action-button.tsx | 5 + .../components/group-member-list-item.tsx | 78 ++++------- app/soapbox/features/group/group-members.tsx | 2 +- .../features/ui/components/action-button.tsx | 3 +- .../hooks/api/groups/useBlockGroupMember.ts | 15 +++ app/soapbox/hooks/useGroups.ts | 2 +- app/soapbox/locales/en.json | 6 +- app/soapbox/pages/group-page.tsx | 52 ++++++-- app/soapbox/schemas/account.ts | 124 ++++++++++++++++++ app/soapbox/schemas/group-member.ts | 4 +- app/soapbox/schemas/group-relationship.ts | 2 + app/soapbox/schemas/index.ts | 4 + app/soapbox/schemas/relationship.ts | 22 ++++ app/soapbox/utils/accounts.ts | 15 ++- app/soapbox/utils/features.ts | 5 + 17 files changed, 267 insertions(+), 79 deletions(-) create mode 100644 app/soapbox/hooks/api/groups/useBlockGroupMember.ts create mode 100644 app/soapbox/schemas/account.ts create mode 100644 app/soapbox/schemas/relationship.ts diff --git a/app/soapbox/components/account.tsx b/app/soapbox/components/account.tsx index 0a435f48f..f79366895 100644 --- a/app/soapbox/components/account.tsx +++ b/app/soapbox/components/account.tsx @@ -14,10 +14,11 @@ import RelativeTimestamp from './relative-timestamp'; import { Avatar, Emoji, HStack, Icon, IconButton, Stack, Text } from './ui'; import type { StatusApprovalStatus } from 'soapbox/normalizers/status'; +import type { Account as AccountSchema } from 'soapbox/schemas'; import type { Account as AccountEntity } from 'soapbox/types/entities'; interface IInstanceFavicon { - account: AccountEntity + account: AccountEntity | AccountSchema disabled?: boolean } @@ -67,7 +68,7 @@ const ProfilePopper: React.FC = ({ condition, wrapper, children }; export interface IAccount { - account: AccountEntity + account: AccountEntity | AccountSchema action?: React.ReactElement actionAlignment?: 'center' | 'top' actionIcon?: string diff --git a/app/soapbox/components/dropdown-menu/dropdown-menu-item.tsx b/app/soapbox/components/dropdown-menu/dropdown-menu-item.tsx index 3de906dc8..f34240d8a 100644 --- a/app/soapbox/components/dropdown-menu/dropdown-menu-item.tsx +++ b/app/soapbox/components/dropdown-menu/dropdown-menu-item.tsx @@ -73,7 +73,7 @@ const DropdownMenuItem = ({ index, item, onClick }: IDropdownMenuItem) => { } return ( -
  • +
  • { const isRequested = group.relationship?.requested; const isNonMember = !group.relationship?.member && !isRequested; const isAdmin = group.relationship?.role === 'admin'; + const isBlocked = group.relationship?.blocked_by; const onJoinGroup = () => joinGroup.mutate(group); @@ -41,6 +42,10 @@ const GroupActionButton = ({ group }: IGroupActionButton) => { const onCancelRequest = () => cancelRequest.mutate(group); + if (isBlocked) { + return null; + } + if (isNonMember) { return (