diff --git a/app/javascript/mastodon/features/ui/components/visibility_modal.tsx b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx index 8b48cad5401..e8570dcb93f 100644 --- a/app/javascript/mastodon/features/ui/components/visibility_modal.tsx +++ b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx @@ -89,6 +89,24 @@ const selectStatusPolicy = createAppSelector( }, ); +const selectDisablePublicVisibilities = createAppSelector( + [ + (state) => state.statuses, + (_state, statusId?: string) => !!statusId, + (state) => state.compose.get('quoted_status_id') as string | null, + ], + (statuses, isEditing, statusId) => { + if (isEditing || !statusId) return false; + + const status = statuses.get(statusId); + if (!status) { + return false; + } + + return status.get('visibility') === 'private'; + }, +); + export const VisibilityModal: FC = forwardRef( // eslint-disable-next-line @typescript-eslint/no-unused-vars ({ onClose, onChange, statusId }, _ref) => { @@ -110,24 +128,12 @@ export const VisibilityModal: FC = forwardRef( const disableVisibility = !!statusId; const disableQuotePolicy = visibility === 'private' || visibility === 'direct'; + const disablePublicVisibilities: boolean = useAppSelector( + selectDisablePublicVisibilities, + ); - const visibilityItems = useMemo[]>( - () => [ - { - value: 'public', - text: intl.formatMessage(privacyMessages.public_short), - meta: intl.formatMessage(privacyMessages.public_long), - icon: 'globe', - iconComponent: PublicIcon, - }, - { - value: 'unlisted', - text: intl.formatMessage(privacyMessages.unlisted_short), - meta: intl.formatMessage(privacyMessages.unlisted_long), - extra: intl.formatMessage(privacyMessages.unlisted_extra), - icon: 'unlock', - iconComponent: QuietTimeIcon, - }, + const visibilityItems = useMemo[]>(() => { + const items: SelectItem[] = [ { value: 'private', text: intl.formatMessage(privacyMessages.private_short), @@ -142,9 +148,30 @@ export const VisibilityModal: FC = forwardRef( icon: 'at', iconComponent: AlternateEmailIcon, }, - ], - [intl], - ); + ]; + + if (!disablePublicVisibilities) { + items.unshift( + { + value: 'public', + text: intl.formatMessage(privacyMessages.public_short), + meta: intl.formatMessage(privacyMessages.public_long), + icon: 'globe', + iconComponent: PublicIcon, + }, + { + value: 'unlisted', + text: intl.formatMessage(privacyMessages.unlisted_short), + meta: intl.formatMessage(privacyMessages.unlisted_long), + extra: intl.formatMessage(privacyMessages.unlisted_extra), + icon: 'unlock', + iconComponent: QuietTimeIcon, + }, + ); + } + + return items; + }, [intl, disablePublicVisibilities]); const quoteItems = useMemo[]>( () => [ { value: 'public', text: intl.formatMessage(messages.quotePublic) }, @@ -236,6 +263,14 @@ export const VisibilityModal: FC = forwardRef( />

)} + {!statusId && disablePublicVisibilities && ( +

+ +

+ )}