diff --git a/app/soapbox/components/status-action-bar.tsx b/app/soapbox/components/status-action-bar.tsx index bc8f7026c..0d7382d91 100644 --- a/app/soapbox/components/status-action-bar.tsx +++ b/app/soapbox/components/status-action-bar.tsx @@ -460,18 +460,24 @@ const StatusActionBar: React.FC = ({ }); } - if (status.group && - groupRelationship?.role && - [GroupRoles.OWNER].includes(groupRelationship.role) && - !ownAccount - ) { - menu.push(null); - menu.push({ - text: intl.formatMessage(messages.groupModDelete), - action: handleDeleteFromGroup, - icon: require('@tabler/icons/trash.svg'), - destructive: true, - }); + const isGroupStatus = typeof status.group === 'object'; + if (isGroupStatus && !!status.group) { + const group = status.group as Group; + const account = status.account as Account; + const isGroupOwner = groupRelationship?.role === GroupRoles.OWNER; + const isGroupAdmin = groupRelationship?.role === GroupRoles.ADMIN; + const isStatusFromOwner = group.owner.id === account.id; + const canDeleteStatus = !ownAccount && (isGroupOwner || (isGroupAdmin && !isStatusFromOwner)); + + if (canDeleteStatus) { + menu.push(null); + menu.push({ + text: intl.formatMessage(messages.groupModDelete), + action: handleDeleteFromGroup, + icon: require('@tabler/icons/trash.svg'), + destructive: true, + }); + } } if (isStaff) { diff --git a/app/soapbox/normalizers/group.ts b/app/soapbox/normalizers/group.ts index 152a6c3c4..c5f34aafb 100644 --- a/app/soapbox/normalizers/group.ts +++ b/app/soapbox/normalizers/group.ts @@ -32,6 +32,9 @@ export const GroupRecord = ImmutableRecord({ locked: false, membership_required: false, members_count: 0, + owner: { + id: '', + }, note: '', statuses_visibility: 'public', slug: '', diff --git a/app/soapbox/schemas/group.ts b/app/soapbox/schemas/group.ts index d5ee7f2ee..be9238308 100644 --- a/app/soapbox/schemas/group.ts +++ b/app/soapbox/schemas/group.ts @@ -27,6 +27,7 @@ const groupSchema = z.object({ locked: z.boolean().catch(false), membership_required: z.boolean().catch(false), members_count: z.number().catch(0), + owner: z.object({ id: z.string() }), note: z.string().transform(note => note === '

' ? '' : note).catch(''), relationship: groupRelationshipSchema.nullable().catch(null), // Dummy field to be overwritten later slug: z.string().catch(''), // TruthSocial