('APP_LAYOUT_CHANGE');
diff --git a/app/javascript/flavours/glitch/actions/blocks.js b/app/javascript/flavours/glitch/actions/blocks.js
index 192aa3ce40..e293657ad3 100644
--- a/app/javascript/flavours/glitch/actions/blocks.js
+++ b/app/javascript/flavours/glitch/actions/blocks.js
@@ -1,4 +1,5 @@
import api, { getLinks } from '../api';
+
import { fetchRelationships } from './accounts';
import { importFetchedAccounts } from './importer';
import { openModal } from './modal';
@@ -94,6 +95,6 @@ export function initBlockModal(account) {
account,
});
- dispatch(openModal('BLOCK'));
+ dispatch(openModal({ modalType: 'BLOCK' }));
};
}
diff --git a/app/javascript/flavours/glitch/actions/bookmarks.js b/app/javascript/flavours/glitch/actions/bookmarks.js
index 3c8eec5468..0b16f61e63 100644
--- a/app/javascript/flavours/glitch/actions/bookmarks.js
+++ b/app/javascript/flavours/glitch/actions/bookmarks.js
@@ -1,4 +1,5 @@
import api, { getLinks } from '../api';
+
import { importFetchedStatuses } from './importer';
export const BOOKMARKED_STATUSES_FETCH_REQUEST = 'BOOKMARKED_STATUSES_FETCH_REQUEST';
diff --git a/app/javascript/flavours/glitch/actions/boosts.js b/app/javascript/flavours/glitch/actions/boosts.js
index c0f0f3acc5..1fc2e391e2 100644
--- a/app/javascript/flavours/glitch/actions/boosts.js
+++ b/app/javascript/flavours/glitch/actions/boosts.js
@@ -14,7 +14,10 @@ export function initBoostModal(props) {
privacy,
});
- dispatch(openModal('BOOST', props));
+ dispatch(openModal({
+ modalType: 'BOOST',
+ modalProps: props,
+ }));
};
}
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 26edd4155d..e43516de6a 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -1,11 +1,14 @@
+import { defineMessages } from 'react-intl';
+
import axios from 'axios';
import { throttle } from 'lodash';
-import { defineMessages } from 'react-intl';
+
import api from 'flavours/glitch/api';
import { search as emojiSearch } from 'flavours/glitch/features/emoji/emoji_mart_search_light';
import { tagHistory } from 'flavours/glitch/settings';
import { recoverHashtags } from 'flavours/glitch/utils/hashtag';
import resizeImage from 'flavours/glitch/utils/resize_image';
+
import { showAlert, showAlertForError } from './alerts';
import { useEmoji } from './emojis';
import { importFetchedAccounts, importFetchedStatus } from './importer';
@@ -436,7 +439,10 @@ export function initMediaEditModal(id) {
id,
});
- dispatch(openModal('FOCAL_POINT', { id }));
+ dispatch(openModal({
+ modalType: 'FOCAL_POINT',
+ modalProps: { id },
+ }));
};
}
diff --git a/app/javascript/flavours/glitch/actions/conversations.js b/app/javascript/flavours/glitch/actions/conversations.js
index 4ef654b1f9..8c4c4529fb 100644
--- a/app/javascript/flavours/glitch/actions/conversations.js
+++ b/app/javascript/flavours/glitch/actions/conversations.js
@@ -1,4 +1,5 @@
import api, { getLinks } from '../api';
+
import {
importFetchedAccounts,
importFetchedStatuses,
diff --git a/app/javascript/flavours/glitch/actions/directory.js b/app/javascript/flavours/glitch/actions/directory.js
index 4b2b6dd56d..cda63f2b5a 100644
--- a/app/javascript/flavours/glitch/actions/directory.js
+++ b/app/javascript/flavours/glitch/actions/directory.js
@@ -1,6 +1,7 @@
import api from '../api';
-import { importFetchedAccounts } from './importer';
+
import { fetchRelationships } from './accounts';
+import { importFetchedAccounts } from './importer';
export const DIRECTORY_FETCH_REQUEST = 'DIRECTORY_FETCH_REQUEST';
export const DIRECTORY_FETCH_SUCCESS = 'DIRECTORY_FETCH_SUCCESS';
diff --git a/app/javascript/flavours/glitch/actions/favourites.js b/app/javascript/flavours/glitch/actions/favourites.js
index 7388e0c580..2d4d4e6206 100644
--- a/app/javascript/flavours/glitch/actions/favourites.js
+++ b/app/javascript/flavours/glitch/actions/favourites.js
@@ -1,4 +1,5 @@
import api, { getLinks } from '../api';
+
import { importFetchedStatuses } from './importer';
export const FAVOURITED_STATUSES_FETCH_REQUEST = 'FAVOURITED_STATUSES_FETCH_REQUEST';
diff --git a/app/javascript/flavours/glitch/actions/filters.js b/app/javascript/flavours/glitch/actions/filters.js
index e9c609fc87..a11956ac56 100644
--- a/app/javascript/flavours/glitch/actions/filters.js
+++ b/app/javascript/flavours/glitch/actions/filters.js
@@ -1,4 +1,5 @@
import api from '../api';
+
import { openModal } from './modal';
export const FILTERS_FETCH_REQUEST = 'FILTERS_FETCH_REQUEST';
@@ -14,9 +15,12 @@ export const FILTERS_CREATE_SUCCESS = 'FILTERS_CREATE_SUCCESS';
export const FILTERS_CREATE_FAIL = 'FILTERS_CREATE_FAIL';
export const initAddFilter = (status, { contextType }) => dispatch =>
- dispatch(openModal('FILTER', {
- statusId: status?.get('id'),
- contextType: contextType,
+ dispatch(openModal({
+ modalType: 'FILTER',
+ modalProps: {
+ statusId: status?.get('id'),
+ contextType: contextType,
+ },
}));
export const fetchFilters = () => (dispatch, getState) => {
diff --git a/app/javascript/flavours/glitch/actions/history.js b/app/javascript/flavours/glitch/actions/history.js
index c142aaf617..52401b7dce 100644
--- a/app/javascript/flavours/glitch/actions/history.js
+++ b/app/javascript/flavours/glitch/actions/history.js
@@ -1,4 +1,5 @@
import api from '../api';
+
import { importFetchedAccounts } from './importer';
export const HISTORY_FETCH_REQUEST = 'HISTORY_FETCH_REQUEST';
diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js
index 567db7eeb4..f9bf49f611 100644
--- a/app/javascript/flavours/glitch/actions/importer/normalizer.js
+++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js
@@ -1,11 +1,12 @@
import escapeTextContentForBrowser from 'escape-html';
+
import emojify from 'flavours/glitch/features/emoji/emoji';
-import { unescapeHTML } from 'flavours/glitch/utils/html';
import { autoHideCW } from 'flavours/glitch/utils/content_warning';
+import { unescapeHTML } from 'flavours/glitch/utils/html';
const domParser = new DOMParser();
-const makeEmojiMap = record => record.emojis.reduce((obj, emoji) => {
+const makeEmojiMap = emojis => emojis.reduce((obj, emoji) => {
obj[`:${emoji.shortcode}:`] = emoji;
return obj;
}, {});
@@ -19,7 +20,7 @@ export function searchTextFromRawStatus (status) {
export function normalizeAccount(account) {
account = { ...account };
- const emojiMap = makeEmojiMap(account);
+ const emojiMap = makeEmojiMap(account.emojis);
const displayName = account.display_name.trim().length === 0 ? account.username : account.display_name;
account.display_name_html = emojify(escapeTextContentForBrowser(displayName), emojiMap);
@@ -79,7 +80,7 @@ export function normalizeStatus(status, normalOldStatus, settings) {
} else {
const spoilerText = normalStatus.spoiler_text || '';
const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/
/g, '\n').replace(/<\/p>/g, '\n\n');
- const emojiMap = makeEmojiMap(normalStatus);
+ const emojiMap = makeEmojiMap(normalStatus.emojis);
normalStatus.search_index = domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
normalStatus.contentHtml = emojify(normalStatus.content, emojiMap);
@@ -119,22 +120,48 @@ export function normalizeStatus(status, normalOldStatus, settings) {
return normalStatus;
}
+export function normalizeStatusTranslation(translation, status) {
+ const emojiMap = makeEmojiMap(status.get('emojis').toJS());
+
+ const normalTranslation = {
+ detected_source_language: translation.detected_source_language,
+ language: translation.language,
+ provider: translation.provider,
+ contentHtml: emojify(translation.content, emojiMap),
+ spoilerHtml: emojify(escapeTextContentForBrowser(translation.spoiler_text), emojiMap),
+ spoiler_text: translation.spoiler_text,
+ };
+
+ return normalTranslation;
+}
+
export function normalizePoll(poll) {
const normalPoll = { ...poll };
- const emojiMap = makeEmojiMap(normalPoll);
+ const emojiMap = makeEmojiMap(poll.emojis);
normalPoll.options = poll.options.map((option, index) => ({
...option,
voted: poll.own_votes && poll.own_votes.includes(index),
- title_emojified: emojify(escapeTextContentForBrowser(option.title), emojiMap),
+ titleHtml: emojify(escapeTextContentForBrowser(option.title), emojiMap),
}));
return normalPoll;
}
+export function normalizePollOptionTranslation(translation, poll) {
+ const emojiMap = makeEmojiMap(poll.get('emojis').toJS());
+
+ const normalTranslation = {
+ ...translation,
+ titleHtml: emojify(escapeTextContentForBrowser(translation.title), emojiMap),
+ };
+
+ return normalTranslation;
+}
+
export function normalizeAnnouncement(announcement) {
const normalAnnouncement = { ...announcement };
- const emojiMap = makeEmojiMap(normalAnnouncement);
+ const emojiMap = makeEmojiMap(normalAnnouncement.emojis);
normalAnnouncement.contentHtml = emojify(normalAnnouncement.content, emojiMap);
diff --git a/app/javascript/flavours/glitch/actions/interactions.js b/app/javascript/flavours/glitch/actions/interactions.js
index c7b552a656..6b8864a039 100644
--- a/app/javascript/flavours/glitch/actions/interactions.js
+++ b/app/javascript/flavours/glitch/actions/interactions.js
@@ -1,4 +1,5 @@
import api from '../api';
+
import { importFetchedAccounts, importFetchedStatus } from './importer';
export const REBLOG_REQUEST = 'REBLOG_REQUEST';
diff --git a/app/javascript/flavours/glitch/actions/lists.js b/app/javascript/flavours/glitch/actions/lists.js
index 5ab9224363..b0789cd426 100644
--- a/app/javascript/flavours/glitch/actions/lists.js
+++ b/app/javascript/flavours/glitch/actions/lists.js
@@ -1,6 +1,7 @@
import api from '../api';
-import { importFetchedAccounts } from './importer';
+
import { showAlertForError } from './alerts';
+import { importFetchedAccounts } from './importer';
export const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST';
export const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS';
@@ -150,10 +151,10 @@ export const createListFail = error => ({
error,
});
-export const updateList = (id, title, shouldReset, replies_policy) => (dispatch, getState) => {
+export const updateList = (id, title, shouldReset, isExclusive, replies_policy) => (dispatch, getState) => {
dispatch(updateListRequest(id));
- api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy }).then(({ data }) => {
+ api(getState).put(`/api/v1/lists/${id}`, { title, replies_policy, exclusive: typeof isExclusive === 'undefined' ? undefined : !!isExclusive }).then(({ data }) => {
dispatch(updateListSuccess(data));
if (shouldReset) {
diff --git a/app/javascript/flavours/glitch/actions/local_settings.js b/app/javascript/flavours/glitch/actions/local_settings.js
index adf7fd2abc..f2878daa50 100644
--- a/app/javascript/flavours/glitch/actions/local_settings.js
+++ b/app/javascript/flavours/glitch/actions/local_settings.js
@@ -1,4 +1,5 @@
import { expandSpoilers, disableSwiping } from 'flavours/glitch/initial_state';
+
import { openModal } from './modal';
export const LOCAL_SETTING_CHANGE = 'LOCAL_SETTING_CHANGE';
@@ -27,9 +28,12 @@ export function checkDeprecatedLocalSettings() {
}
if (changed_settings.length > 0) {
- dispatch(openModal('DEPRECATED_SETTINGS', {
- settings: changed_settings,
- onConfirm: () => dispatch(clearDeprecatedLocalSettings()),
+ dispatch(openModal({
+ modalType: 'DEPRECATED_SETTINGS',
+ modalProps: {
+ settings: changed_settings,
+ onConfirm: () => dispatch(clearDeprecatedLocalSettings()),
+ },
}));
}
};
diff --git a/app/javascript/flavours/glitch/actions/markers.js b/app/javascript/flavours/glitch/actions/markers.js
index 8fd9da405e..ccb1b23d6f 100644
--- a/app/javascript/flavours/glitch/actions/markers.js
+++ b/app/javascript/flavours/glitch/actions/markers.js
@@ -1,8 +1,10 @@
-import api from '../api';
-import { debounce } from 'lodash';
-import { compareId } from '../compare_id';
import { List as ImmutableList } from 'immutable';
+import { debounce } from 'lodash';
+
+import api from '../api';
+import { compareId } from '../compare_id';
+
export const MARKERS_FETCH_REQUEST = 'MARKERS_FETCH_REQUEST';
export const MARKERS_FETCH_SUCCESS = 'MARKERS_FETCH_SUCCESS';
export const MARKERS_FETCH_FAIL = 'MARKERS_FETCH_FAIL';
diff --git a/app/javascript/flavours/glitch/actions/modal.js b/app/javascript/flavours/glitch/actions/modal.js
deleted file mode 100644
index ef2ae0e4c7..0000000000
--- a/app/javascript/flavours/glitch/actions/modal.js
+++ /dev/null
@@ -1,18 +0,0 @@
-export const MODAL_OPEN = 'MODAL_OPEN';
-export const MODAL_CLOSE = 'MODAL_CLOSE';
-
-export function openModal(type, props) {
- return {
- type: MODAL_OPEN,
- modalType: type,
- modalProps: props,
- };
-}
-
-export function closeModal(type, options = { ignoreFocus: false }) {
- return {
- type: MODAL_CLOSE,
- modalType: type,
- ignoreFocus: options.ignoreFocus,
- };
-}
diff --git a/app/javascript/flavours/glitch/actions/modal.ts b/app/javascript/flavours/glitch/actions/modal.ts
new file mode 100644
index 0000000000..af34f5d6af
--- /dev/null
+++ b/app/javascript/flavours/glitch/actions/modal.ts
@@ -0,0 +1,17 @@
+import { createAction } from '@reduxjs/toolkit';
+
+import type { MODAL_COMPONENTS } from '../features/ui/components/modal_root';
+
+export type ModalType = keyof typeof MODAL_COMPONENTS;
+
+interface OpenModalPayload {
+ modalType: ModalType;
+ modalProps: unknown;
+}
+export const openModal = createAction('MODAL_OPEN');
+
+interface CloseModalPayload {
+ modalType: ModalType | undefined;
+ ignoreFocus: boolean;
+}
+export const closeModal = createAction('MODAL_CLOSE');
diff --git a/app/javascript/flavours/glitch/actions/mutes.js b/app/javascript/flavours/glitch/actions/mutes.js
index aa47d14642..4af927d932 100644
--- a/app/javascript/flavours/glitch/actions/mutes.js
+++ b/app/javascript/flavours/glitch/actions/mutes.js
@@ -1,7 +1,9 @@
+import { openModal } from 'flavours/glitch/actions/modal';
+
import api, { getLinks } from '../api';
+
import { fetchRelationships } from './accounts';
import { importFetchedAccounts } from './importer';
-import { openModal } from 'flavours/glitch/actions/modal';
export const MUTES_FETCH_REQUEST = 'MUTES_FETCH_REQUEST';
export const MUTES_FETCH_SUCCESS = 'MUTES_FETCH_SUCCESS';
@@ -96,7 +98,7 @@ export function initMuteModal(account) {
account,
});
- dispatch(openModal('MUTE'));
+ dispatch(openModal({ modalType: 'MUTE' }));
};
}
diff --git a/app/javascript/flavours/glitch/actions/notifications.js b/app/javascript/flavours/glitch/actions/notifications.js
index c044ea927f..a80746b756 100644
--- a/app/javascript/flavours/glitch/actions/notifications.js
+++ b/app/javascript/flavours/glitch/actions/notifications.js
@@ -1,5 +1,15 @@
+import { IntlMessageFormat } from 'intl-messageformat';
+import { defineMessages } from 'react-intl';
+
+import { List as ImmutableList } from 'immutable';
+
+import { compareId } from 'flavours/glitch/compare_id';
+import { usePendingItems as preferPendingItems } from 'flavours/glitch/initial_state';
+import { unescapeHTML } from 'flavours/glitch/utils/html';
+import { requestNotificationPermission } from 'flavours/glitch/utils/notifications';
+
import api, { getLinks } from '../api';
-import IntlMessageFormat from 'intl-messageformat';
+
import { fetchFollowRequests, fetchRelationships } from './accounts';
import {
importFetchedAccount,
@@ -9,12 +19,9 @@ import {
} from './importer';
import { submitMarkers } from './markers';
import { saveSettings } from './settings';
-import { defineMessages } from 'react-intl';
-import { List as ImmutableList } from 'immutable';
-import { unescapeHTML } from 'flavours/glitch/utils/html';
-import { usePendingItems as preferPendingItems } from 'flavours/glitch/initial_state';
-import { compareId } from 'flavours/glitch/compare_id';
-import { requestNotificationPermission } from 'flavours/glitch/utils/notifications';
+
+
+
export const NOTIFICATIONS_UPDATE = 'NOTIFICATIONS_UPDATE';
export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';
diff --git a/app/javascript/flavours/glitch/actions/onboarding.js b/app/javascript/flavours/glitch/actions/onboarding.js
index 5038b7eb67..a4a525c427 100644
--- a/app/javascript/flavours/glitch/actions/onboarding.js
+++ b/app/javascript/flavours/glitch/actions/onboarding.js
@@ -6,7 +6,9 @@ export function showOnboardingOnce() {
const alreadySeen = getState().getIn(['settings', 'onboarded']);
if (!alreadySeen) {
- dispatch(openModal('ONBOARDING'));
+ dispatch(openModal({
+ modalType: 'ONBOARDING',
+ }));
dispatch(changeSetting(['onboarded'], true));
dispatch(saveSettings());
}
diff --git a/app/javascript/flavours/glitch/actions/pin_statuses.js b/app/javascript/flavours/glitch/actions/pin_statuses.js
index d8c0a13737..8aca199e97 100644
--- a/app/javascript/flavours/glitch/actions/pin_statuses.js
+++ b/app/javascript/flavours/glitch/actions/pin_statuses.js
@@ -1,12 +1,14 @@
+import { me } from 'flavours/glitch/initial_state';
+
import api from '../api';
+
import { importFetchedStatuses } from './importer';
+
export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST';
export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS';
export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL';
-import { me } from 'flavours/glitch/initial_state';
-
export function fetchPinnedStatuses() {
return (dispatch, getState) => {
dispatch(fetchPinnedStatusesRequest());
diff --git a/app/javascript/flavours/glitch/actions/polls.js b/app/javascript/flavours/glitch/actions/polls.js
index 8e8b82df5d..a37410dc90 100644
--- a/app/javascript/flavours/glitch/actions/polls.js
+++ b/app/javascript/flavours/glitch/actions/polls.js
@@ -1,4 +1,5 @@
import api from '../api';
+
import { importFetchedPoll } from './importer';
export const POLL_VOTE_REQUEST = 'POLL_VOTE_REQUEST';
diff --git a/app/javascript/flavours/glitch/actions/push_notifications/index.js b/app/javascript/flavours/glitch/actions/push_notifications/index.js
index 9dcc4bd4bb..46b63867f1 100644
--- a/app/javascript/flavours/glitch/actions/push_notifications/index.js
+++ b/app/javascript/flavours/glitch/actions/push_notifications/index.js
@@ -1,5 +1,5 @@
-import { setAlerts } from './setter';
import { saveSettings } from './registerer';
+import { setAlerts } from './setter';
export function changeAlerts(path, value) {
return dispatch => {
diff --git a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js
index bc5634233f..336bbc6869 100644
--- a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js
+++ b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js
@@ -1,5 +1,6 @@
import api from '../../api';
import { pushNotificationsSetting } from '../../settings';
+
import { setBrowserSupport, setSubscription, clearSubscription } from './setter';
// Taken from https://www.npmjs.com/package/web-push
diff --git a/app/javascript/flavours/glitch/actions/reports.js b/app/javascript/flavours/glitch/actions/reports.js
index fbe5b3791b..756b8cd05e 100644
--- a/app/javascript/flavours/glitch/actions/reports.js
+++ b/app/javascript/flavours/glitch/actions/reports.js
@@ -1,4 +1,5 @@
import api from '../api';
+
import { openModal } from './modal';
export const REPORT_SUBMIT_REQUEST = 'REPORT_SUBMIT_REQUEST';
@@ -6,9 +7,12 @@ export const REPORT_SUBMIT_SUCCESS = 'REPORT_SUBMIT_SUCCESS';
export const REPORT_SUBMIT_FAIL = 'REPORT_SUBMIT_FAIL';
export const initReport = (account, status) => dispatch =>
- dispatch(openModal('REPORT', {
- accountId: account.get('id'),
- statusId: status?.get('id'),
+ dispatch(openModal({
+ modalType: 'REPORT',
+ modalProps: {
+ accountId: account.get('id'),
+ statusId: status?.get('id'),
+ },
}));
export const submitReport = (params, onSuccess, onFail) => (dispatch, getState) => {
diff --git a/app/javascript/flavours/glitch/actions/search.js b/app/javascript/flavours/glitch/actions/search.js
index 0012808e5b..d5154c6a84 100644
--- a/app/javascript/flavours/glitch/actions/search.js
+++ b/app/javascript/flavours/glitch/actions/search.js
@@ -1,4 +1,5 @@
import api from '../api';
+
import { fetchRelationships } from './accounts';
import { importFetchedAccounts, importFetchedStatuses } from './importer';
diff --git a/app/javascript/flavours/glitch/actions/server.js b/app/javascript/flavours/glitch/actions/server.js
index 091af0f0fe..65f3efc3a7 100644
--- a/app/javascript/flavours/glitch/actions/server.js
+++ b/app/javascript/flavours/glitch/actions/server.js
@@ -1,4 +1,5 @@
import api from '../api';
+
import { importFetchedAccount } from './importer';
export const SERVER_FETCH_REQUEST = 'Server_FETCH_REQUEST';
@@ -18,6 +19,10 @@ export const SERVER_DOMAIN_BLOCKS_FETCH_SUCCESS = 'SERVER_DOMAIN_BLOCKS_FETCH_SU
export const SERVER_DOMAIN_BLOCKS_FETCH_FAIL = 'SERVER_DOMAIN_BLOCKS_FETCH_FAIL';
export const fetchServer = () => (dispatch, getState) => {
+ if (getState().getIn(['server', 'server', 'isLoading'])) {
+ return;
+ }
+
dispatch(fetchServerRequest());
api(getState)
@@ -65,6 +70,10 @@ const fetchServerTranslationLanguagesFail = error => ({
});
export const fetchExtendedDescription = () => (dispatch, getState) => {
+ if (getState().getIn(['server', 'extendedDescription', 'isLoading'])) {
+ return;
+ }
+
dispatch(fetchExtendedDescriptionRequest());
api(getState)
@@ -88,6 +97,10 @@ const fetchExtendedDescriptionFail = error => ({
});
export const fetchDomainBlocks = () => (dispatch, getState) => {
+ if (getState().getIn(['server', 'domainBlocks', 'isLoading'])) {
+ return;
+ }
+
dispatch(fetchDomainBlocksRequest());
api(getState)
diff --git a/app/javascript/flavours/glitch/actions/settings.js b/app/javascript/flavours/glitch/actions/settings.js
index 60f0abf950..120ae133ed 100644
--- a/app/javascript/flavours/glitch/actions/settings.js
+++ b/app/javascript/flavours/glitch/actions/settings.js
@@ -1,5 +1,7 @@
-import api from '../api';
import { debounce } from 'lodash';
+
+import api from '../api';
+
import { showAlertForError } from './alerts';
export const SETTING_CHANGE = 'SETTING_CHANGE';
diff --git a/app/javascript/flavours/glitch/actions/statuses.js b/app/javascript/flavours/glitch/actions/statuses.js
index 487cd69884..5bdd31c343 100644
--- a/app/javascript/flavours/glitch/actions/statuses.js
+++ b/app/javascript/flavours/glitch/actions/statuses.js
@@ -1,8 +1,8 @@
import api from '../api';
-import { deleteFromTimelines } from './timelines';
-import { importFetchedStatus, importFetchedStatuses } from './importer';
import { ensureComposeIsVisible, setComposeToStatus } from './compose';
+import { importFetchedStatus, importFetchedStatuses } from './importer';
+import { deleteFromTimelines } from './timelines';
export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
export const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
@@ -344,7 +344,8 @@ export const translateStatusFail = (id, error) => ({
error,
});
-export const undoStatusTranslation = id => ({
+export const undoStatusTranslation = (id, pollId) => ({
type: STATUS_TRANSLATE_UNDO,
id,
+ pollId,
});
diff --git a/app/javascript/flavours/glitch/actions/store.js b/app/javascript/flavours/glitch/actions/store.js
index 137b68e222..e57b37a122 100644
--- a/app/javascript/flavours/glitch/actions/store.js
+++ b/app/javascript/flavours/glitch/actions/store.js
@@ -1,4 +1,5 @@
import { Iterable, fromJS } from 'immutable';
+
import { hydrateCompose } from './compose';
import { importFetchedAccounts } from './importer';
import { saveSettings } from './settings';
diff --git a/app/javascript/flavours/glitch/actions/streaming.js b/app/javascript/flavours/glitch/actions/streaming.js
index b4eb60ad4e..f1c44d2e29 100644
--- a/app/javascript/flavours/glitch/actions/streaming.js
+++ b/app/javascript/flavours/glitch/actions/streaming.js
@@ -1,6 +1,18 @@
// @ts-check
+import { getLocale } from 'flavours/glitch/locales';
+
import { connectStream } from '../stream';
+
+import {
+ fetchAnnouncements,
+ updateAnnouncements,
+ updateReaction as updateAnnouncementsReaction,
+ deleteAnnouncement,
+} from './announcements';
+import { updateConversations } from './conversations';
+import { updateNotifications, expandNotifications } from './notifications';
+import { updateStatus } from './statuses';
import {
updateTimeline,
deleteFromTimelines,
@@ -12,18 +24,6 @@ import {
fillCommunityTimelineGaps,
fillListTimelineGaps,
} from './timelines';
-import { updateNotifications, expandNotifications } from './notifications';
-import { updateConversations } from './conversations';
-import { updateStatus } from './statuses';
-import {
- fetchAnnouncements,
- updateAnnouncements,
- updateReaction as updateAnnouncementsReaction,
- deleteAnnouncement,
-} from './announcements';
-import { getLocale } from 'mastodon/locales';
-
-const { messages } = getLocale();
/**
* @param {number} max
@@ -42,8 +42,10 @@ const randomUpTo = max =>
* @param {function(object): boolean} [options.accept]
* @returns {function(): void}
*/
-export const connectTimelineStream = (timelineId, channelName, params = {}, options = {}) =>
- connectStream(channelName, params, (dispatch, getState) => {
+export const connectTimelineStream = (timelineId, channelName, params = {}, options = {}) => {
+ const { messages } = getLocale();
+
+ return connectStream(channelName, params, (dispatch, getState) => {
const locale = getState().getIn(['meta', 'locale']);
// @ts-expect-error
@@ -120,6 +122,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
},
};
});
+};
/**
* @param {Function} dispatch
diff --git a/app/javascript/flavours/glitch/actions/suggestions.js b/app/javascript/flavours/glitch/actions/suggestions.js
index 9e8cd1ea40..870a311024 100644
--- a/app/javascript/flavours/glitch/actions/suggestions.js
+++ b/app/javascript/flavours/glitch/actions/suggestions.js
@@ -1,6 +1,7 @@
import api from '../api';
-import { importFetchedAccounts } from './importer';
+
import { fetchRelationships } from './accounts';
+import { importFetchedAccounts } from './importer';
export const SUGGESTIONS_FETCH_REQUEST = 'SUGGESTIONS_FETCH_REQUEST';
export const SUGGESTIONS_FETCH_SUCCESS = 'SUGGESTIONS_FETCH_SUCCESS';
diff --git a/app/javascript/flavours/glitch/actions/timelines.js b/app/javascript/flavours/glitch/actions/timelines.js
index 603759760b..7d4d56a784 100644
--- a/app/javascript/flavours/glitch/actions/timelines.js
+++ b/app/javascript/flavours/glitch/actions/timelines.js
@@ -1,11 +1,13 @@
-import { importFetchedStatus, importFetchedStatuses } from './importer';
-import { submitMarkers } from './markers';
-import api, { getLinks } from 'flavours/glitch/api';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
+
+import api, { getLinks } from 'flavours/glitch/api';
import { compareId } from 'flavours/glitch/compare_id';
import { usePendingItems as preferPendingItems } from 'flavours/glitch/initial_state';
import { toServerSideType } from 'flavours/glitch/utils/filters';
+import { importFetchedStatus, importFetchedStatuses } from './importer';
+import { submitMarkers } from './markers';
+
export const TIMELINE_UPDATE = 'TIMELINE_UPDATE';
export const TIMELINE_DELETE = 'TIMELINE_DELETE';
export const TIMELINE_CLEAR = 'TIMELINE_CLEAR';
diff --git a/app/javascript/flavours/glitch/actions/trends.js b/app/javascript/flavours/glitch/actions/trends.js
index edda0b5b5d..d314423884 100644
--- a/app/javascript/flavours/glitch/actions/trends.js
+++ b/app/javascript/flavours/glitch/actions/trends.js
@@ -1,4 +1,5 @@
import api, { getLinks } from '../api';
+
import { importFetchedStatuses } from './importer';
export const TRENDS_TAGS_FETCH_REQUEST = 'TRENDS_TAGS_FETCH_REQUEST';
diff --git a/app/javascript/flavours/glitch/api.js b/app/javascript/flavours/glitch/api.js
index 42b64d6cc5..948ffbc95c 100644
--- a/app/javascript/flavours/glitch/api.js
+++ b/app/javascript/flavours/glitch/api.js
@@ -2,8 +2,8 @@
import axios from 'axios';
import LinkHeader from 'http-link-header';
-import ready from './ready';
+import ready from './ready';
/**
* @param {import('axios').AxiosResponse} response
* @returns {LinkHeader}
diff --git a/app/javascript/flavours/glitch/components/account.jsx b/app/javascript/flavours/glitch/components/account.jsx
index e9f04fcda7..518464b040 100644
--- a/app/javascript/flavours/glitch/components/account.jsx
+++ b/app/javascript/flavours/glitch/components/account.jsx
@@ -1,20 +1,24 @@
-import React, { Fragment } from 'react';
-import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import { Avatar } from './avatar';
-import DisplayName from './display_name';
-import Permalink from './permalink';
-import { IconButton } from './icon_button';
+
import { defineMessages, injectIntl } from 'react-intl';
+
+import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
+
+import { Skeleton } from 'flavours/glitch/components/skeleton';
import { me } from 'flavours/glitch/initial_state';
+
+import { Avatar } from './avatar';
+import { DisplayName } from './display_name';
+import { IconButton } from './icon_button';
+import Permalink from './permalink';
import { RelativeTimestamp } from './relative_timestamp';
-import Skeleton from 'flavours/glitch/components/skeleton';
+
const messages = defineMessages({
follow: { id: 'account.follow', defaultMessage: 'Follow' },
unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
- requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },
+ requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },
mute_notifications: { id: 'account.mute_notifications', defaultMessage: 'Mute notifications from @{name}' },
@@ -97,10 +101,10 @@ class Account extends ImmutablePureComponent {
if (hidden) {
return (
-
+ <>
{account.get('display_name')}
{account.get('username')}
-
+ >
);
}
@@ -128,10 +132,10 @@ class Account extends ImmutablePureComponent {
hidingNotificationsButton = ;
}
buttons = (
-
+ <>
{hidingNotificationsButton}
-
+ >
);
} else if (defaultAction === 'mute') {
buttons = ;
diff --git a/app/javascript/flavours/glitch/components/admin/Counter.jsx b/app/javascript/flavours/glitch/components/admin/Counter.jsx
index 5b6a19f8da..9bb792fc9d 100644
--- a/app/javascript/flavours/glitch/components/admin/Counter.jsx
+++ b/app/javascript/flavours/glitch/components/admin/Counter.jsx
@@ -1,10 +1,14 @@
-import React from 'react';
import PropTypes from 'prop-types';
-import api from 'flavours/glitch/api';
+import { PureComponent } from 'react';
+
import { FormattedNumber } from 'react-intl';
-import { Sparklines, SparklinesCurve } from 'react-sparklines';
+
import classNames from 'classnames';
-import Skeleton from 'flavours/glitch/components/skeleton';
+
+import { Sparklines, SparklinesCurve } from 'react-sparklines';
+
+import api from 'flavours/glitch/api';
+import { Skeleton } from 'flavours/glitch/components/skeleton';
const percIncrease = (a, b) => {
let percent;
@@ -24,7 +28,7 @@ const percIncrease = (a, b) => {
return percent;
};
-export default class Counter extends React.PureComponent {
+export default class Counter extends PureComponent {
static propTypes = {
measure: PropTypes.string.isRequired,
@@ -62,25 +66,25 @@ export default class Counter extends React.PureComponent {
if (loading) {
content = (
-
+ <>
-
+ >
);
} else {
const measure = data[0];
const percentChange = measure.previous_total && percIncrease(measure.previous_total * 1, measure.total * 1);
content = (
-
+ <>
{measure.human_value || }
{measure.previous_total && ( 0, negative: percentChange < 0 })}>{percentChange > 0 && '+'})}
-
+ >
);
}
const inner = (
-
+ <>
{content}
@@ -96,7 +100,7 @@ export default class Counter extends React.PureComponent {
)}
-
+ >
);
if (href) {
diff --git a/app/javascript/flavours/glitch/components/admin/Dimension.jsx b/app/javascript/flavours/glitch/components/admin/Dimension.jsx
index 3dac8c6c24..793fe2dd76 100644
--- a/app/javascript/flavours/glitch/components/admin/Dimension.jsx
+++ b/app/javascript/flavours/glitch/components/admin/Dimension.jsx
@@ -1,11 +1,13 @@
-import React from 'react';
import PropTypes from 'prop-types';
-import api from 'flavours/glitch/api';
-import { FormattedNumber } from 'react-intl';
-import { roundTo10 } from 'flavours/glitch/utils/numbers';
-import Skeleton from 'flavours/glitch/components/skeleton';
+import { PureComponent } from 'react';
-export default class Dimension extends React.PureComponent {
+import { FormattedNumber } from 'react-intl';
+
+import api from 'flavours/glitch/api';
+import { Skeleton } from 'flavours/glitch/components/skeleton';
+import { roundTo10 } from 'flavours/glitch/utils/numbers';
+
+export default class Dimension extends PureComponent {
static propTypes = {
dimension: PropTypes.string.isRequired,
diff --git a/app/javascript/flavours/glitch/components/admin/ImpactReport.jsx b/app/javascript/flavours/glitch/components/admin/ImpactReport.jsx
new file mode 100644
index 0000000000..9ec1460fcf
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/admin/ImpactReport.jsx
@@ -0,0 +1,91 @@
+import PropTypes from 'prop-types';
+import { PureComponent } from 'react';
+
+import { FormattedNumber, FormattedMessage } from 'react-intl';
+
+import classNames from 'classnames';
+
+import api from 'flavours/glitch/api';
+import { Skeleton } from 'flavours/glitch/components/skeleton';
+
+export default class ImpactReport extends PureComponent {
+
+ static propTypes = {
+ domain: PropTypes.string.isRequired,
+ };
+
+ state = {
+ loading: true,
+ data: null,
+ };
+
+ componentDidMount () {
+ const { domain } = this.props;
+
+ const params = {
+ domain: domain,
+ include_subdomains: true,
+ };
+
+ api().post('/api/v1/admin/measures', {
+ keys: ['instance_accounts', 'instance_follows', 'instance_followers'],
+ start_at: null,
+ end_at: null,
+ instance_accounts: params,
+ instance_follows: params,
+ instance_followers: params,
+ }).then(res => {
+ this.setState({
+ loading: false,
+ data: res.data,
+ });
+ }).catch(err => {
+ console.error(err);
+ });
+ }
+
+ render () {
+ const { loading, data } = this.state;
+
+ return (
+
+
+
+
+
+
+
+
+ |
+
+
+ {loading ? : }
+ |
+
+
+ 0 })}>
+
+
+ |
+
+
+ {loading ? : }
+ |
+
+
+ 0 })}>
+
+
+ |
+
+
+ {loading ? : }
+ |
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx
index ecefe7a840..d72465e4ad 100644
--- a/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx
+++ b/app/javascript/flavours/glitch/components/admin/ReportReasonSelector.jsx
@@ -1,16 +1,19 @@
-import React from 'react';
import PropTypes from 'prop-types';
-import api from 'flavours/glitch/api';
+import { PureComponent } from 'react';
+
import { injectIntl, defineMessages } from 'react-intl';
+
import classNames from 'classnames';
+import api from 'flavours/glitch/api';
+
const messages = defineMessages({
other: { id: 'report.categories.other', defaultMessage: 'Other' },
spam: { id: 'report.categories.spam', defaultMessage: 'Spam' },
violation: { id: 'report.categories.violation', defaultMessage: 'Content violates one or more server rules' },
});
-class Category extends React.PureComponent {
+class Category extends PureComponent {
static propTypes = {
id: PropTypes.string.isRequired,
@@ -52,7 +55,7 @@ class Category extends React.PureComponent {
}
-class Rule extends React.PureComponent {
+class Rule extends PureComponent {
static propTypes = {
id: PropTypes.string.isRequired,
@@ -84,7 +87,7 @@ class Rule extends React.PureComponent {
}
-class ReportReasonSelector extends React.PureComponent {
+class ReportReasonSelector extends PureComponent {
static propTypes = {
id: PropTypes.string.isRequired,
diff --git a/app/javascript/flavours/glitch/components/admin/Retention.jsx b/app/javascript/flavours/glitch/components/admin/Retention.jsx
index e1ba3f6c9d..2cfc30b6fb 100644
--- a/app/javascript/flavours/glitch/components/admin/Retention.jsx
+++ b/app/javascript/flavours/glitch/components/admin/Retention.jsx
@@ -1,8 +1,11 @@
-import React from 'react';
import PropTypes from 'prop-types';
-import api from 'flavours/glitch/api';
+import { PureComponent } from 'react';
+
import { FormattedMessage, FormattedNumber, FormattedDate } from 'react-intl';
+
import classNames from 'classnames';
+
+import api from 'flavours/glitch/api';
import { roundTo10 } from 'flavours/glitch/utils/numbers';
const dateForCohort = cohort => {
@@ -14,7 +17,7 @@ const dateForCohort = cohort => {
}
};
-export default class Retention extends React.PureComponent {
+export default class Retention extends PureComponent {
static propTypes = {
start_at: PropTypes.string,
diff --git a/app/javascript/flavours/glitch/components/admin/Trends.jsx b/app/javascript/flavours/glitch/components/admin/Trends.jsx
index 774bf36e6e..975ea6e0f2 100644
--- a/app/javascript/flavours/glitch/components/admin/Trends.jsx
+++ b/app/javascript/flavours/glitch/components/admin/Trends.jsx
@@ -1,11 +1,14 @@
-import React from 'react';
import PropTypes from 'prop-types';
-import api from 'flavours/glitch/api';
+import { PureComponent } from 'react';
+
import { FormattedMessage } from 'react-intl';
+
import classNames from 'classnames';
+
+import api from 'flavours/glitch/api';
import Hashtag from 'flavours/glitch/components/hashtag';
-export default class Trends extends React.PureComponent {
+export default class Trends extends PureComponent {
static propTypes = {
limit: PropTypes.number.isRequired,
diff --git a/app/javascript/flavours/glitch/components/animated_number.tsx b/app/javascript/flavours/glitch/components/animated_number.tsx
index f6c77d35ff..81e0af395b 100644
--- a/app/javascript/flavours/glitch/components/animated_number.tsx
+++ b/app/javascript/flavours/glitch/components/animated_number.tsx
@@ -1,8 +1,12 @@
-import React, { useCallback, useState } from 'react';
-import ShortNumber from './short_number';
+import { useCallback, useState } from 'react';
+import * as React from 'react';
+
import { TransitionMotion, spring } from 'react-motion';
+
import { reduceMotion } from '../initial_state';
+import ShortNumber from './short_number';
+
const obfuscatedCount = (count: number) => {
if (count < 0) {
return 0;
@@ -13,10 +17,10 @@ const obfuscatedCount = (count: number) => {
}
};
-type Props = {
+interface Props {
value: number;
obfuscate?: boolean;
-};
+}
export const AnimatedNumber: React.FC = ({ value, obfuscate }) => {
const [previousValue, setPreviousValue] = useState(value);
const [direction, setDirection] = useState<1 | -1>(1);
@@ -64,7 +68,11 @@ export const AnimatedNumber: React.FC = ({ value, obfuscate }) => {
transform: `translateY(${style.y * 100}%)`,
}}
>
- {obfuscate ? obfuscatedCount(data) : }
+ {obfuscate ? (
+ obfuscatedCount(data as number)
+ ) : (
+
+ )}
))}
diff --git a/app/javascript/flavours/glitch/components/attachment_list.jsx b/app/javascript/flavours/glitch/components/attachment_list.jsx
index 92ba98126a..173157b0d5 100644
--- a/app/javascript/flavours/glitch/components/attachment_list.jsx
+++ b/app/javascript/flavours/glitch/components/attachment_list.jsx
@@ -1,9 +1,12 @@
-import React from 'react';
-import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import ImmutablePureComponent from 'react-immutable-pure-component';
+
import { FormattedMessage } from 'react-intl';
+
import classNames from 'classnames';
+
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+
import { Icon } from 'flavours/glitch/components/icon';
const filename = url => url.split('/').pop().split('#')[0].split('?')[0];
diff --git a/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx b/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx
index 83fafbd10d..32a996fd7c 100644
--- a/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx
+++ b/app/javascript/flavours/glitch/components/autosuggest_emoji.jsx
@@ -1,10 +1,10 @@
-import React from 'react';
import PropTypes from 'prop-types';
-import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
+import { PureComponent } from 'react';
+import unicodeMapping from 'flavours/glitch/features/emoji/emoji_unicode_mapping_light';
import { assetHost } from 'flavours/glitch/utils/config';
-export default class AutosuggestEmoji extends React.PureComponent {
+export default class AutosuggestEmoji extends PureComponent {
static propTypes = {
emoji: PropTypes.object.isRequired,
diff --git a/app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx b/app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx
deleted file mode 100644
index d787ed07ad..0000000000
--- a/app/javascript/flavours/glitch/components/autosuggest_hashtag.jsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-import ShortNumber from 'flavours/glitch/components/short_number';
-import { FormattedMessage } from 'react-intl';
-
-export default class AutosuggestHashtag extends React.PureComponent {
-
- static propTypes = {
- tag: PropTypes.shape({
- name: PropTypes.string.isRequired,
- url: PropTypes.string,
- history: PropTypes.array,
- }).isRequired,
- };
-
- render() {
- const { tag } = this.props;
- const weeklyUses = tag.history && (
- total + day.uses * 1, 0)}
- />
- );
-
- return (
-
-
- #{tag.name}
-
- {tag.history !== undefined && (
-
-
-
- )}
-
- );
- }
-
-}
diff --git a/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx b/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx
new file mode 100644
index 0000000000..932370884a
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/autosuggest_hashtag.tsx
@@ -0,0 +1,42 @@
+import { FormattedMessage } from 'react-intl';
+
+import ShortNumber from 'flavours/glitch/components/short_number';
+
+interface Props {
+ tag: {
+ name: string;
+ url?: string;
+ history?: Array<{
+ uses: number;
+ accounts: string;
+ day: string;
+ }>;
+ following?: boolean;
+ type: 'hashtag';
+ };
+}
+
+export const AutosuggestHashtag: React.FC = ({ tag }) => {
+ const weeklyUses = tag.history && (
+ total + day.uses * 1, 0)}
+ />
+ );
+
+ return (
+
+
+ #{tag.name}
+
+ {tag.history !== undefined && (
+
+
+
+ )}
+
+ );
+};
diff --git a/app/javascript/flavours/glitch/components/autosuggest_input.jsx b/app/javascript/flavours/glitch/components/autosuggest_input.jsx
index ea9fd0828a..f0833c8c6b 100644
--- a/app/javascript/flavours/glitch/components/autosuggest_input.jsx
+++ b/app/javascript/flavours/glitch/components/autosuggest_input.jsx
@@ -1,12 +1,15 @@
-import React from 'react';
-import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';
-import AutosuggestEmoji from './autosuggest_emoji';
-import AutosuggestHashtag from './autosuggest_hashtag';
-import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import ImmutablePureComponent from 'react-immutable-pure-component';
+
import classNames from 'classnames';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+
+import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';
+
+import AutosuggestEmoji from './autosuggest_emoji';
+import { AutosuggestHashtag } from './autosuggest_hashtag';
+
const textAtCursorMatchesToken = (str, caretPosition, searchTokens) => {
let word;
@@ -154,7 +157,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
this.input.focus();
};
- componentWillReceiveProps (nextProps) {
+ UNSAFE_componentWillReceiveProps (nextProps) {
if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
this.setState({ suggestionsHidden: false });
}
diff --git a/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx b/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx
index a016e44b72..25ca3fefa5 100644
--- a/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx
+++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.jsx
@@ -1,13 +1,17 @@
-import React from 'react';
-import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';
-import AutosuggestEmoji from './autosuggest_emoji';
-import AutosuggestHashtag from './autosuggest_hashtag';
-import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-import Textarea from 'react-textarea-autosize';
+
import classNames from 'classnames';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+
+import Textarea from 'react-textarea-autosize';
+
+import AutosuggestAccountContainer from 'flavours/glitch/features/compose/containers/autosuggest_account_container';
+
+import AutosuggestEmoji from './autosuggest_emoji';
+import { AutosuggestHashtag } from './autosuggest_hashtag';
+
const textAtCursorMatchesToken = (str, caretPosition) => {
let word;
@@ -153,7 +157,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
this.textarea.focus();
};
- componentWillReceiveProps (nextProps) {
+ UNSAFE_componentWillReceiveProps (nextProps) {
if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
this.setState({ suggestionsHidden: false });
}
diff --git a/app/javascript/flavours/glitch/components/avatar.tsx b/app/javascript/flavours/glitch/components/avatar.tsx
index 1bd7739f5f..11253a8e94 100644
--- a/app/javascript/flavours/glitch/components/avatar.tsx
+++ b/app/javascript/flavours/glitch/components/avatar.tsx
@@ -1,16 +1,18 @@
import * as React from 'react';
+
import classNames from 'classnames';
-import { autoPlayGif } from 'flavours/glitch/initial_state';
+
import { useHovering } from 'flavours/glitch/hooks/useHovering';
+import { autoPlayGif } from 'flavours/glitch/initial_state';
import type { Account } from 'flavours/glitch/types/resources';
-type Props = {
+interface Props {
account: Account | undefined;
className?: string;
size: number;
style?: React.CSSProperties;
inline?: boolean;
-};
+}
export const Avatar: React.FC = ({
account,
diff --git a/app/javascript/flavours/glitch/components/avatar_composite.jsx b/app/javascript/flavours/glitch/components/avatar_composite.jsx
index 1c23a8b36e..5503abf4a9 100644
--- a/app/javascript/flavours/glitch/components/avatar_composite.jsx
+++ b/app/javascript/flavours/glitch/components/avatar_composite.jsx
@@ -1,9 +1,11 @@
-import React from 'react';
import PropTypes from 'prop-types';
+import { PureComponent } from 'react';
+
import ImmutablePropTypes from 'react-immutable-proptypes';
+
import { autoPlayGif } from 'flavours/glitch/initial_state';
-export default class AvatarComposite extends React.PureComponent {
+export default class AvatarComposite extends PureComponent {
static propTypes = {
accounts: ImmutablePropTypes.list.isRequired,
diff --git a/app/javascript/flavours/glitch/components/avatar_overlay.jsx b/app/javascript/flavours/glitch/components/avatar_overlay.jsx
index 01dec587a5..d8215a4785 100644
--- a/app/javascript/flavours/glitch/components/avatar_overlay.jsx
+++ b/app/javascript/flavours/glitch/components/avatar_overlay.jsx
@@ -1,9 +1,11 @@
-import React from 'react';
import PropTypes from 'prop-types';
+import { PureComponent } from 'react';
+
import ImmutablePropTypes from 'react-immutable-proptypes';
+
import { autoPlayGif } from 'flavours/glitch/initial_state';
-export default class AvatarOverlay extends React.PureComponent {
+export default class AvatarOverlay extends PureComponent {
static propTypes = {
account: ImmutablePropTypes.map.isRequired,
diff --git a/app/javascript/flavours/glitch/components/blurhash.tsx b/app/javascript/flavours/glitch/components/blurhash.tsx
index 7005136765..d98e7d35db 100644
--- a/app/javascript/flavours/glitch/components/blurhash.tsx
+++ b/app/javascript/flavours/glitch/components/blurhash.tsx
@@ -1,14 +1,15 @@
-import { decode } from 'blurhash';
-import React, { useRef, useEffect } from 'react';
+import { useRef, useEffect } from 'react';
+import * as React from 'react';
-type Props = {
+import { decode } from 'blurhash';
+
+interface Props extends React.HTMLAttributes {
hash: string;
width?: number;
height?: number;
dummy?: boolean; // Whether dummy mode is enabled. If enabled, nothing is rendered and canvas left untouched
children?: never;
- [key: string]: any;
-};
+}
const Blurhash: React.FC = ({
hash,
width = 32,
@@ -21,6 +22,7 @@ const Blurhash: React.FC = ({
useEffect(() => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const canvas = canvasRef.current!;
+
// eslint-disable-next-line no-self-assign
canvas.width = canvas.width; // resets canvas
diff --git a/app/javascript/flavours/glitch/components/button.jsx b/app/javascript/flavours/glitch/components/button.jsx
index 40b8f5a159..bdeeeac999 100644
--- a/app/javascript/flavours/glitch/components/button.jsx
+++ b/app/javascript/flavours/glitch/components/button.jsx
@@ -1,8 +1,9 @@
-import React from 'react';
import PropTypes from 'prop-types';
+import { PureComponent } from 'react';
+
import classNames from 'classnames';
-export default class Button extends React.PureComponent {
+export default class Button extends PureComponent {
static propTypes = {
text: PropTypes.node,
diff --git a/app/javascript/flavours/glitch/components/check.jsx b/app/javascript/flavours/glitch/components/check.jsx
index ee2ef1595a..d818480b7b 100644
--- a/app/javascript/flavours/glitch/components/check.jsx
+++ b/app/javascript/flavours/glitch/components/check.jsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
const Check = () => (