Visibility Modal fixes (#35865)

This commit is contained in:
Echo 2025-08-22 14:34:37 +02:00 committed by GitHub
parent a1c7b853ec
commit 4df50b9c7e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 64 additions and 35 deletions

View File

@ -98,13 +98,13 @@ export const DropdownSelector: React.FC<Props> = ({
break; break;
case 'Tab': case 'Tab':
if (e.shiftKey) { if (e.shiftKey) {
element =
nodeRef.current?.children[index + 1] ??
nodeRef.current?.firstElementChild;
} else {
element = element =
nodeRef.current?.children[index - 1] ?? nodeRef.current?.children[index - 1] ??
nodeRef.current?.lastElementChild; nodeRef.current?.lastElementChild;
} else {
element =
nodeRef.current?.children[index + 1] ??
nodeRef.current?.firstElementChild;
} }
break; break;
case 'Home': case 'Home':

View File

@ -1,11 +1,4 @@
import { import { forwardRef, useCallback, useId, useMemo, useState } from 'react';
forwardRef,
useCallback,
useId,
useImperativeHandle,
useMemo,
useState,
} from 'react';
import type { FC } from 'react'; import type { FC } from 'react';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
@ -16,6 +9,7 @@ import type { ApiQuotePolicy } from '@/mastodon/api_types/quotes';
import { isQuotePolicy } from '@/mastodon/api_types/quotes'; import { isQuotePolicy } from '@/mastodon/api_types/quotes';
import { isStatusVisibility } from '@/mastodon/api_types/statuses'; import { isStatusVisibility } from '@/mastodon/api_types/statuses';
import type { StatusVisibility } from '@/mastodon/api_types/statuses'; import type { StatusVisibility } from '@/mastodon/api_types/statuses';
import { Button } from '@/mastodon/components/button';
import { Dropdown } from '@/mastodon/components/dropdown'; import { Dropdown } from '@/mastodon/components/dropdown';
import type { SelectItem } from '@/mastodon/components/dropdown_selector'; import type { SelectItem } from '@/mastodon/components/dropdown_selector';
import { IconButton } from '@/mastodon/components/icon_button'; import { IconButton } from '@/mastodon/components/icon_button';
@ -96,7 +90,8 @@ const selectStatusPolicy = createAppSelector(
); );
export const VisibilityModal: FC<VisibilityModalProps> = forwardRef( export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
({ onClose, onChange, statusId }, ref) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars
({ onClose, onChange, statusId }, _ref) => {
const intl = useIntl(); const intl = useIntl();
const currentVisibility = useAppSelector((state) => const currentVisibility = useAppSelector((state) =>
statusId statusId
@ -172,18 +167,10 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
setQuotePolicy(value); setQuotePolicy(value);
} }
}, []); }, []);
const handleSave = useCallback(() => {
// Save on close
useImperativeHandle(
ref,
() => ({
getCloseConfirmationMessage() {
onChange(visibility, quotePolicy); onChange(visibility, quotePolicy);
return null; onClose();
}, }, [onChange, onClose, visibility, quotePolicy]);
}),
[onChange, quotePolicy, visibility],
);
const privacyDropdownId = useId(); const privacyDropdownId = useId();
const quoteDropdownId = useId(); const quoteDropdownId = useId();
@ -274,6 +261,20 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
<QuotePolicyHelper policy={quotePolicy} visibility={visibility} /> <QuotePolicyHelper policy={quotePolicy} visibility={visibility} />
</label> </label>
</div> </div>
<div className='dialog-modal__content__actions'>
<Button onClick={onClose} secondary>
<FormattedMessage
id='confirmation_modal.cancel'
defaultMessage='Cancel'
/>
</Button>
<Button onClick={handleSave}>
<FormattedMessage
id='visibility_modal.save'
defaultMessage='Save'
/>
</Button>
</div>
</div> </div>
</div> </div>
); );

View File

@ -987,5 +987,6 @@
"visibility_modal.quote_followers": "Followers only", "visibility_modal.quote_followers": "Followers only",
"visibility_modal.quote_label": "Change who can quote", "visibility_modal.quote_label": "Change who can quote",
"visibility_modal.quote_nobody": "No one", "visibility_modal.quote_nobody": "No one",
"visibility_modal.quote_public": "Anyone" "visibility_modal.quote_public": "Anyone",
"visibility_modal.save": "Save"
} }

View File

@ -384,14 +384,8 @@
.compose-form__actions .icon-button.active, .compose-form__actions .icon-button.active,
.dropdown-button.active, .dropdown-button.active,
.privacy-dropdown__option.active,
.privacy-dropdown__option:focus,
.language-dropdown__dropdown__results__item:focus, .language-dropdown__dropdown__results__item:focus,
.language-dropdown__dropdown__results__item.active, .language-dropdown__dropdown__results__item.active,
.privacy-dropdown__option:focus .privacy-dropdown__option__content,
.privacy-dropdown__option:focus .privacy-dropdown__option__content strong,
.privacy-dropdown__option.active .privacy-dropdown__option__content,
.privacy-dropdown__option.active .privacy-dropdown__option__content strong,
.language-dropdown__dropdown__results__item:focus .language-dropdown__dropdown__results__item:focus
.language-dropdown__dropdown__results__item__common-name, .language-dropdown__dropdown__results__item__common-name,
.language-dropdown__dropdown__results__item.active .language-dropdown__dropdown__results__item.active
@ -399,6 +393,14 @@
color: $white; color: $white;
} }
.privacy-dropdown__option,
.visibility-dropdown__option {
&:focus,
&.active {
--dropdown-text-color: #{$white};
}
}
.compose-form .spoiler-input__input { .compose-form .spoiler-input__input {
color: lighten($ui-highlight-color, 8%); color: lighten($ui-highlight-color, 8%);
} }

View File

@ -5496,6 +5496,8 @@ a.status-card {
.privacy-dropdown__option, .privacy-dropdown__option,
.visibility-dropdown__option { .visibility-dropdown__option {
--dropdown-text-color: $primary-text-color;
font-size: 14px; font-size: 14px;
line-height: 20px; line-height: 20px;
letter-spacing: 0.25px; letter-spacing: 0.25px;
@ -5505,7 +5507,22 @@ a.status-card {
align-items: center; align-items: center;
gap: 12px; gap: 12px;
border-radius: 4px; border-radius: 4px;
color: $primary-text-color; color: var(--dropdown-text-color);
// Make sure adjacent hover/active states don't have a meeting radius.
&:hover + &:is(:focus, .active),
&:is(:focus, .active) + &:hover,
&:is(:focus, .active) + &:is(:focus, .active) {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
&:hover:has(+ :focus, .active),
&:is(:focus, .active):has(+ :hover),
&:is(:focus, .active):has(+ :is(:focus, .active)) {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
&:hover, &:hover,
&:active { &:active {
@ -5515,7 +5532,7 @@ a.status-card {
&:focus, &:focus,
&.active { &.active {
background: $ui-highlight-color; background: $ui-highlight-color;
color: $primary-text-color; color: var(--dropdown-text-color);
outline: 0; outline: 0;
.privacy-dropdown__option__content, .privacy-dropdown__option__content,
@ -5524,7 +5541,7 @@ a.status-card {
.visibility-dropdown__option__content, .visibility-dropdown__option__content,
.visibility-dropdown__option__content strong, .visibility-dropdown__option__content strong,
.visibility-dropdown__option__additional { .visibility-dropdown__option__additional {
color: $primary-text-color; color: var(--dropdown-text-color);
} }
} }
@ -6532,6 +6549,14 @@ a.status-card {
max-height: 45vh; max-height: 45vh;
} }
} }
&__actions {
display: flex;
align-items: center;
gap: 8px;
justify-content: flex-end;
padding: 0 24px 24px;
}
} }
&__popout { &__popout {