diff --git a/Gemfile.lock b/Gemfile.lock index fc8e2338d8..597ff03407 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -353,7 +353,7 @@ GEM azure-blob (~> 0.5.2) hashie (~> 5.0) jmespath (1.6.2) - json (2.19.8) + json (2.19.9) json-canonicalization (1.0.0) json-jwt (1.17.1) activesupport (>= 4.2) @@ -931,7 +931,7 @@ GEM crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) webrick (1.9.2) - websocket-driver (0.8.1) + websocket-driver (0.8.2) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) diff --git a/app/controllers/admin/invites_controller.rb b/app/controllers/admin/invites_controller.rb index ac4ee35271..196b8c5711 100644 --- a/app/controllers/admin/invites_controller.rb +++ b/app/controllers/admin/invites_controller.rb @@ -40,7 +40,7 @@ module Admin def resource_params params - .expect(invite: [:max_uses, :expires_in]) + .expect(invite: [:max_uses, :expires_in, :autofollow]) end def filtered_invites diff --git a/app/javascript/mastodon/features/account_timeline/styles.module.scss b/app/javascript/mastodon/features/account_timeline/styles.module.scss index 9773861d22..bb90dbbb82 100644 --- a/app/javascript/mastodon/features/account_timeline/styles.module.scss +++ b/app/javascript/mastodon/features/account_timeline/styles.module.scss @@ -99,7 +99,7 @@ margin: 12px 16px; padding: 8px; transition: border-color 0.2s ease-in-out; - width: calc(100% - 48px); + width: calc(100% - 32px); &:hover, &:focus { diff --git a/app/javascript/mastodon/features/direct_timeline/index.jsx b/app/javascript/mastodon/features/direct_timeline/index.jsx index 36b5efc088..ebe0440939 100644 --- a/app/javascript/mastodon/features/direct_timeline/index.jsx +++ b/app/javascript/mastodon/features/direct_timeline/index.jsx @@ -72,7 +72,7 @@ const DirectTimeline = ({ columnId, multiColumn }) => { scrollKey={`direct_timeline-${columnId}`} emptyMessage={} bindToDocument={!multiColumn} - prepend={
} + prepend={
} alwaysPrepend /> diff --git a/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx b/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx index 8d5665b1c4..31e4a2a99c 100644 --- a/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx +++ b/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx @@ -15,16 +15,21 @@ import { IconButton } from 'mastodon/components/icon_button'; import { injectIntl } from '@/mastodon/components/intl'; import Option from 'mastodon/features/report/components/option'; import { languages as preloadedLanguages } from 'mastodon/initial_state'; +import { selectTimelinesByAccount } from '@/mastodon/selectors/timelines'; const messages = defineMessages({ close: { id: 'lightbox.close', defaultMessage: 'Close' }, }); -const getAccountLanguages = createSelector([ - (state, accountId) => state.getIn(['timelines', `account:${accountId}`, 'items'], ImmutableList()), - state => state.get('statuses'), -], (statusIds, statuses) => - ImmutableSet(statusIds.map(statusId => statuses.get(statusId)).filter(status => !status.get('reblog')).map(status => status.get('language')))); +const getAccountLanguages = createSelector( + [selectTimelinesByAccount, (state) => state.get('statuses')], + (timelines, statuses) => ImmutableSet( + timelines + .reduce((statusIds, timeline) => statusIds.concat(timeline.get('items')), ImmutableList()) + .map(statusId => statuses.get(statusId)) + .filter(status => !status.get('reblog')) + .map(status => status.get('language')) + )); const mapStateToProps = (state, { accountId }) => ({ acct: state.getIn(['accounts', accountId, 'acct']), @@ -37,7 +42,6 @@ const mapDispatchToProps = (dispatch, { accountId }) => ({ onSubmit (languages) { dispatch(followAccount(accountId, { languages })); }, - }); class SubscribedLanguagesModal extends ImmutablePureComponent { diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx index 3dfd3124d1..790698a382 100644 --- a/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx +++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/confirmation_modal.tsx @@ -52,13 +52,18 @@ export const ConfirmationModal: React.FC< noCloseOnConfirm = false, noFocusButton = false, }) => { - const handleClick = useCallback(() => { - if (!noCloseOnConfirm) { - onClose(); - } + const handleSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); - void onConfirm(); - }, [onClose, onConfirm, noCloseOnConfirm]); + if (!noCloseOnConfirm) { + onClose(); + } + + void onConfirm(); + }, + [onClose, onConfirm, noCloseOnConfirm], + ); const handleSecondary = useCallback(() => { onClose(); @@ -66,7 +71,7 @@ export const ConfirmationModal: React.FC< }, [onClose, onSecondary]); return ( - + {noFocusButton ? ( @@ -107,7 +112,6 @@ export const ConfirmationModal: React.FC< {/* eslint-disable jsx-a11y/no-autofocus -- we are in a modal and thus autofocusing is justified */}