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 */}