Skip to content

Commit 4df50b9

Browse files
authored
Visibility Modal fixes (mastodon#35865)
1 parent a1c7b85 commit 4df50b9

5 files changed

Lines changed: 64 additions & 35 deletions

File tree

app/javascript/mastodon/components/dropdown_selector.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ export const DropdownSelector: React.FC<Props> = ({
9898
break;
9999
case 'Tab':
100100
if (e.shiftKey) {
101-
element =
102-
nodeRef.current?.children[index + 1] ??
103-
nodeRef.current?.firstElementChild;
104-
} else {
105101
element =
106102
nodeRef.current?.children[index - 1] ??
107103
nodeRef.current?.lastElementChild;
104+
} else {
105+
element =
106+
nodeRef.current?.children[index + 1] ??
107+
nodeRef.current?.firstElementChild;
108108
}
109109
break;
110110
case 'Home':

app/javascript/mastodon/features/ui/components/visibility_modal.tsx

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import {
2-
forwardRef,
3-
useCallback,
4-
useId,
5-
useImperativeHandle,
6-
useMemo,
7-
useState,
8-
} from 'react';
1+
import { forwardRef, useCallback, useId, useMemo, useState } from 'react';
92
import type { FC } from 'react';
103

114
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
@@ -16,6 +9,7 @@ import type { ApiQuotePolicy } from '@/mastodon/api_types/quotes';
169
import { isQuotePolicy } from '@/mastodon/api_types/quotes';
1710
import { isStatusVisibility } from '@/mastodon/api_types/statuses';
1811
import type { StatusVisibility } from '@/mastodon/api_types/statuses';
12+
import { Button } from '@/mastodon/components/button';
1913
import { Dropdown } from '@/mastodon/components/dropdown';
2014
import type { SelectItem } from '@/mastodon/components/dropdown_selector';
2115
import { IconButton } from '@/mastodon/components/icon_button';
@@ -96,7 +90,8 @@ const selectStatusPolicy = createAppSelector(
9690
);
9791

9892
export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
99-
({ onClose, onChange, statusId }, ref) => {
93+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
94+
({ onClose, onChange, statusId }, _ref) => {
10095
const intl = useIntl();
10196
const currentVisibility = useAppSelector((state) =>
10297
statusId
@@ -172,18 +167,10 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
172167
setQuotePolicy(value);
173168
}
174169
}, []);
175-
176-
// Save on close
177-
useImperativeHandle(
178-
ref,
179-
() => ({
180-
getCloseConfirmationMessage() {
181-
onChange(visibility, quotePolicy);
182-
return null;
183-
},
184-
}),
185-
[onChange, quotePolicy, visibility],
186-
);
170+
const handleSave = useCallback(() => {
171+
onChange(visibility, quotePolicy);
172+
onClose();
173+
}, [onChange, onClose, visibility, quotePolicy]);
187174

188175
const privacyDropdownId = useId();
189176
const quoteDropdownId = useId();
@@ -274,6 +261,20 @@ export const VisibilityModal: FC<VisibilityModalProps> = forwardRef(
274261
<QuotePolicyHelper policy={quotePolicy} visibility={visibility} />
275262
</label>
276263
</div>
264+
<div className='dialog-modal__content__actions'>
265+
<Button onClick={onClose} secondary>
266+
<FormattedMessage
267+
id='confirmation_modal.cancel'
268+
defaultMessage='Cancel'
269+
/>
270+
</Button>
271+
<Button onClick={handleSave}>
272+
<FormattedMessage
273+
id='visibility_modal.save'
274+
defaultMessage='Save'
275+
/>
276+
</Button>
277+
</div>
277278
</div>
278279
</div>
279280
);

app/javascript/mastodon/locales/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,5 +987,6 @@
987987
"visibility_modal.quote_followers": "Followers only",
988988
"visibility_modal.quote_label": "Change who can quote",
989989
"visibility_modal.quote_nobody": "No one",
990-
"visibility_modal.quote_public": "Anyone"
990+
"visibility_modal.quote_public": "Anyone",
991+
"visibility_modal.save": "Save"
991992
}

app/javascript/styles/mastodon-light/diff.scss

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -384,21 +384,23 @@
384384

385385
.compose-form__actions .icon-button.active,
386386
.dropdown-button.active,
387-
.privacy-dropdown__option.active,
388-
.privacy-dropdown__option:focus,
389387
.language-dropdown__dropdown__results__item:focus,
390388
.language-dropdown__dropdown__results__item.active,
391-
.privacy-dropdown__option:focus .privacy-dropdown__option__content,
392-
.privacy-dropdown__option:focus .privacy-dropdown__option__content strong,
393-
.privacy-dropdown__option.active .privacy-dropdown__option__content,
394-
.privacy-dropdown__option.active .privacy-dropdown__option__content strong,
395389
.language-dropdown__dropdown__results__item:focus
396390
.language-dropdown__dropdown__results__item__common-name,
397391
.language-dropdown__dropdown__results__item.active
398392
.language-dropdown__dropdown__results__item__common-name {
399393
color: $white;
400394
}
401395

396+
.privacy-dropdown__option,
397+
.visibility-dropdown__option {
398+
&:focus,
399+
&.active {
400+
--dropdown-text-color: #{$white};
401+
}
402+
}
403+
402404
.compose-form .spoiler-input__input {
403405
color: lighten($ui-highlight-color, 8%);
404406
}

app/javascript/styles/mastodon/components.scss

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5496,6 +5496,8 @@ a.status-card {
54965496

54975497
.privacy-dropdown__option,
54985498
.visibility-dropdown__option {
5499+
--dropdown-text-color: $primary-text-color;
5500+
54995501
font-size: 14px;
55005502
line-height: 20px;
55015503
letter-spacing: 0.25px;
@@ -5505,7 +5507,22 @@ a.status-card {
55055507
align-items: center;
55065508
gap: 12px;
55075509
border-radius: 4px;
5508-
color: $primary-text-color;
5510+
color: var(--dropdown-text-color);
5511+
5512+
// Make sure adjacent hover/active states don't have a meeting radius.
5513+
&:hover + &:is(:focus, .active),
5514+
&:is(:focus, .active) + &:hover,
5515+
&:is(:focus, .active) + &:is(:focus, .active) {
5516+
border-top-left-radius: 0;
5517+
border-top-right-radius: 0;
5518+
}
5519+
5520+
&:hover:has(+ :focus, .active),
5521+
&:is(:focus, .active):has(+ :hover),
5522+
&:is(:focus, .active):has(+ :is(:focus, .active)) {
5523+
border-bottom-left-radius: 0;
5524+
border-bottom-right-radius: 0;
5525+
}
55095526

55105527
&:hover,
55115528
&:active {
@@ -5515,7 +5532,7 @@ a.status-card {
55155532
&:focus,
55165533
&.active {
55175534
background: $ui-highlight-color;
5518-
color: $primary-text-color;
5535+
color: var(--dropdown-text-color);
55195536
outline: 0;
55205537

55215538
.privacy-dropdown__option__content,
@@ -5524,7 +5541,7 @@ a.status-card {
55245541
.visibility-dropdown__option__content,
55255542
.visibility-dropdown__option__content strong,
55265543
.visibility-dropdown__option__additional {
5527-
color: $primary-text-color;
5544+
color: var(--dropdown-text-color);
55285545
}
55295546
}
55305547

@@ -6532,6 +6549,14 @@ a.status-card {
65326549
max-height: 45vh;
65336550
}
65346551
}
6552+
6553+
&__actions {
6554+
display: flex;
6555+
align-items: center;
6556+
gap: 8px;
6557+
justify-content: flex-end;
6558+
padding: 0 24px 24px;
6559+
}
65356560
}
65366561

65376562
&__popout {

0 commit comments

Comments
 (0)