From 65dff4e6a112319974f9395e31ef2e960fe8fbab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= Date: Sat, 4 Jun 2022 09:22:36 +0200 Subject: [PATCH 1/2] Reducers: TypeScript MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: marcin mikołajczak --- app/soapbox/actions/domain_blocks.js | 2 +- app/soapbox/components/profile-hover-card.tsx | 2 +- .../components/status-reply-mentions.tsx | 6 +- app/soapbox/components/status_action_bar.tsx | 2 +- app/soapbox/containers/account_container.js | 6 +- .../containers/dropdown_menu_container.ts | 6 +- .../features/account/components/header.js | 24 +++---- .../containers/header_container.js | 14 ++-- .../admin/components/report_status.tsx | 2 +- .../features/aliases/components/search.tsx | 2 +- app/soapbox/features/aliases/index.tsx | 6 +- .../directory/components/account_card.tsx | 2 +- app/soapbox/features/domain_blocks/index.tsx | 4 +- .../features/status/components/action-bar.tsx | 16 ++--- .../components/status-interaction-bar.tsx | 2 +- app/soapbox/features/status/index.tsx | 2 +- .../features/ui/components/action-button.tsx | 22 +++---- .../modals/report-modal/report-modal.tsx | 10 +-- .../ui/components/subscription_button.js | 10 +-- app/soapbox/features/ui/index.tsx | 2 +- app/soapbox/normalizers/account.ts | 4 +- app/soapbox/normalizers/index.ts | 1 + app/soapbox/normalizers/relationship.ts | 35 ++++++++++ .../reducers/__tests__/domain_lists-test.js | 13 ---- .../reducers/__tests__/domain_lists.test.ts | 12 ++++ ...own_menu-test.js => dropdown_menu.test.ts} | 6 +- ...ionships-test.js => relationships.test.ts} | 12 ++-- .../reducers/__tests__/suggestions-test.js | 40 ------------ .../reducers/__tests__/suggestions.test.ts | 41 ++++++++++++ .../{timelines-test.js => timelines.test.ts} | 20 +++--- app/soapbox/reducers/accounts.ts | 9 ++- app/soapbox/reducers/accounts_counters.js | 54 ---------------- app/soapbox/reducers/accounts_counters.ts | 64 +++++++++++++++++++ app/soapbox/reducers/accounts_meta.js | 33 ---------- app/soapbox/reducers/accounts_meta.ts | 41 ++++++++++++ .../reducers/{admin_log.js => admin_log.ts} | 16 +++-- .../reducers/{aliases.js => aliases.ts} | 24 ++++--- app/soapbox/reducers/domain_lists.js | 26 -------- app/soapbox/reducers/domain_lists.ts | 33 ++++++++++ app/soapbox/reducers/dropdown_menu.js | 19 ------ app/soapbox/reducers/dropdown_menu.ts | 27 ++++++++ .../{relationships.js => relationships.ts} | 34 +++++----- app/soapbox/reducers/statuses.ts | 4 +- .../{suggestions.js => suggestions.ts} | 44 ++++++++----- app/soapbox/selectors/index.ts | 12 ++-- app/soapbox/types/entities.ts | 3 + ...ji_reacts-test.js => emoji_reacts.test.ts} | 38 +++++------ .../{timelines-test.js => timelines.test.ts} | 24 +++---- app/soapbox/utils/emoji_reacts.ts | 6 +- app/soapbox/utils/timelines.ts | 6 +- 50 files changed, 473 insertions(+), 370 deletions(-) create mode 100644 app/soapbox/normalizers/relationship.ts delete mode 100644 app/soapbox/reducers/__tests__/domain_lists-test.js create mode 100644 app/soapbox/reducers/__tests__/domain_lists.test.ts rename app/soapbox/reducers/__tests__/{dropdown_menu-test.js => dropdown_menu.test.ts} (63%) rename app/soapbox/reducers/__tests__/{relationships-test.js => relationships.test.ts} (75%) delete mode 100644 app/soapbox/reducers/__tests__/suggestions-test.js create mode 100644 app/soapbox/reducers/__tests__/suggestions.test.ts rename app/soapbox/reducers/__tests__/{timelines-test.js => timelines.test.ts} (92%) delete mode 100644 app/soapbox/reducers/accounts_counters.js create mode 100644 app/soapbox/reducers/accounts_counters.ts delete mode 100644 app/soapbox/reducers/accounts_meta.js create mode 100644 app/soapbox/reducers/accounts_meta.ts rename app/soapbox/reducers/{admin_log.js => admin_log.ts} (70%) rename app/soapbox/reducers/{aliases.js => aliases.ts} (65%) delete mode 100644 app/soapbox/reducers/domain_lists.js create mode 100644 app/soapbox/reducers/domain_lists.ts delete mode 100644 app/soapbox/reducers/dropdown_menu.js create mode 100644 app/soapbox/reducers/dropdown_menu.ts rename app/soapbox/reducers/{relationships.js => relationships.ts} (71%) rename app/soapbox/reducers/{suggestions.js => suggestions.ts} (54%) rename app/soapbox/utils/__tests__/{emoji_reacts-test.js => emoji_reacts.test.ts} (89%) rename app/soapbox/utils/__tests__/{timelines-test.js => timelines.test.ts} (71%) diff --git a/app/soapbox/actions/domain_blocks.js b/app/soapbox/actions/domain_blocks.js index 92824a55c..4597f1afa 100644 --- a/app/soapbox/actions/domain_blocks.js +++ b/app/soapbox/actions/domain_blocks.js @@ -142,7 +142,7 @@ export function expandDomainBlocks() { return (dispatch, getState) => { if (!isLoggedIn(getState)) return; - const url = getState().getIn(['domain_lists', 'blocks', 'next']); + const url = getState().domain_lists.blocks.next; if (!url) { return; diff --git a/app/soapbox/components/profile-hover-card.tsx b/app/soapbox/components/profile-hover-card.tsx index 9c9f2e79a..8e5e281bd 100644 --- a/app/soapbox/components/profile-hover-card.tsx +++ b/app/soapbox/components/profile-hover-card.tsx @@ -92,7 +92,7 @@ export const ProfileHoverCard: React.FC = ({ visible = true } if (!account) return null; const accountBio = { __html: account.note_emojified }; - const followedBy = me !== account.id && account.relationship.get('followed_by') === true; + const followedBy = me !== account.id && account.relationship?.followed_by === true; return (
= ({ status }) => { dispatch(openModal('MENTIONS', { username: status.getIn(['account', 'acct']), - statusId: status.get('id'), + statusId: status.id, })); }; - if (!status.get('in_reply_to_id')) { + if (!status.in_reply_to_id) { return null; } - const to = status.get('mentions', ImmutableList()); + const to = status.mentions || ImmutableList(); // The post is a reply, but it has no mentions. // Rare, but it can happen. diff --git a/app/soapbox/components/status_action_bar.tsx b/app/soapbox/components/status_action_bar.tsx index ec282eed2..f50852698 100644 --- a/app/soapbox/components/status_action_bar.tsx +++ b/app/soapbox/components/status_action_bar.tsx @@ -581,7 +581,7 @@ class StatusActionBar extends ImmutablePureComponent, + (status.pleroma.get('emoji_reactions') || ImmutableList()) as ImmutableList, favouriteCount, status.favourited, allowedEmoji, diff --git a/app/soapbox/containers/account_container.js b/app/soapbox/containers/account_container.js index 78abcdea8..9b65f3b10 100644 --- a/app/soapbox/containers/account_container.js +++ b/app/soapbox/containers/account_container.js @@ -35,7 +35,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ onFollow(account) { dispatch((_, getState) => { const unfollowModal = getSettings(getState()).get('unfollowModal'); - if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { + if (account.relationship?.following || account.relationship?.requested) { if (unfollowModal) { dispatch(openModal('CONFIRM', { icon: require('@tabler/icons/icons/minus.svg'), @@ -54,7 +54,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onBlock(account) { - if (account.getIn(['relationship', 'blocking'])) { + if (account.relationship?.blocking) { dispatch(unblockAccount(account.get('id'))); } else { dispatch(blockAccount(account.get('id'))); @@ -62,7 +62,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onMute(account) { - if (account.getIn(['relationship', 'muting'])) { + if (account.relationship?.muting) { dispatch(unmuteAccount(account.get('id'))); } else { dispatch(initMuteModal(account)); diff --git a/app/soapbox/containers/dropdown_menu_container.ts b/app/soapbox/containers/dropdown_menu_container.ts index fa149d0f4..d3e7149e4 100644 --- a/app/soapbox/containers/dropdown_menu_container.ts +++ b/app/soapbox/containers/dropdown_menu_container.ts @@ -11,9 +11,9 @@ import type { RootState } from 'soapbox/store'; const mapStateToProps = (state: RootState) => ({ isModalOpen: Boolean(state.modals.size && state.modals.last().modalType === 'ACTIONS'), - dropdownPlacement: state.dropdown_menu.get('placement'), - openDropdownId: state.dropdown_menu.get('openId'), - openedViaKeyboard: state.dropdown_menu.get('keyboard'), + dropdownPlacement: state.dropdown_menu.placement, + openDropdownId: state.dropdown_menu.openId, + openedViaKeyboard: state.dropdown_menu.keyboard, }); const mapDispatchToProps = (dispatch: Dispatch, { status, items }: Partial) => ({ diff --git a/app/soapbox/features/account/components/header.js b/app/soapbox/features/account/components/header.js index b6fe013a7..b76a156a5 100644 --- a/app/soapbox/features/account/components/header.js +++ b/app/soapbox/features/account/components/header.js @@ -235,8 +235,8 @@ class Header extends ImmutablePureComponent { // }); // } - if (account.getIn(['relationship', 'following'])) { - if (account.getIn(['relationship', 'showing_reblogs'])) { + if (account.relationship?.following) { + if (account.relationship?.showing_reblogs) { menu.push({ text: intl.formatMessage(messages.hideReblogs, { name: account.get('username') }), action: this.props.onReblogToggle, @@ -251,7 +251,7 @@ class Header extends ImmutablePureComponent { } if (features.accountSubscriptions) { - if (account.getIn(['relationship', 'subscribing'])) { + if (account.relationship?.subscribing) { menu.push({ text: intl.formatMessage(messages.unsubscribe, { name: account.get('username') }), action: this.props.onSubscriptionToggle, @@ -274,7 +274,7 @@ class Header extends ImmutablePureComponent { }); } - // menu.push({ text: intl.formatMessage(account.getIn(['relationship', 'endorsed']) ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle }); + // menu.push({ text: intl.formatMessage(account.relationship?.endorsed ? messages.unendorse : messages.endorse), action: this.props.onEndorseToggle }); menu.push(null); } else if (features.lists && features.unrestrictedLists) { menu.push({ @@ -284,7 +284,7 @@ class Header extends ImmutablePureComponent { }); } - if (features.removeFromFollowers && account.getIn(['relationship', 'followed_by'])) { + if (features.removeFromFollowers && account.relationship?.followed_by) { menu.push({ text: intl.formatMessage(messages.removeFromFollowers), action: this.props.onRemoveFromFollowers, @@ -292,7 +292,7 @@ class Header extends ImmutablePureComponent { }); } - if (account.getIn(['relationship', 'muting'])) { + if (account.relationship?.muting) { menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.props.onMute, @@ -306,7 +306,7 @@ class Header extends ImmutablePureComponent { }); } - if (account.getIn(['relationship', 'blocking'])) { + if (account.relationship?.blocking) { menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.props.onBlock, @@ -332,7 +332,7 @@ class Header extends ImmutablePureComponent { menu.push(null); - if (account.getIn(['relationship', 'domain_blocking'])) { + if (account.relationship?.domain_blocking) { menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.props.onUnblockDomain, @@ -463,7 +463,7 @@ class Header extends ImmutablePureComponent { if (!account || !me) return info; - if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) { + if (me !== account.get('id') && account.relationship?.followed_by) { info.push( } />, ); - } else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) { + } else if (me !== account.get('id') && account.relationship?.blocking) { info.push( } />, ); - } else if (me !== account.get('id') && account.getIn(['relationship', 'domain_blocking'])) { + } else if (me !== account.get('id') && account.relationship?.domain_blocking) { info.push( ({ onFollow(account) { dispatch((_, getState) => { const unfollowModal = getSettings(getState()).get('unfollowModal'); - if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { + if (account.relationship?.following || account.relationship?.requested) { if (unfollowModal) { dispatch(openModal('CONFIRM', { message: @{account.get('acct')} }} />, @@ -92,7 +92,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onBlock(account) { - if (account.getIn(['relationship', 'blocking'])) { + if (account.relationship?.blocking) { dispatch(unblockAccount(account.get('id'))); } else { dispatch(openModal('CONFIRM', { @@ -119,7 +119,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onReblogToggle(account) { - if (account.getIn(['relationship', 'showing_reblogs'])) { + if (account.relationship?.showing_reblogs) { dispatch(followAccount(account.get('id'), { reblogs: false })); } else { dispatch(followAccount(account.get('id'), { reblogs: true })); @@ -127,7 +127,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onSubscriptionToggle(account) { - if (account.getIn(['relationship', 'subscribing'])) { + if (account.relationship?.subscribing) { dispatch(unsubscribeAccount(account.get('id'))); } else { dispatch(subscribeAccount(account.get('id'))); @@ -135,7 +135,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onNotifyToggle(account) { - if (account.getIn(['relationship', 'notifying'])) { + if (account.relationship?.notifying) { dispatch(followAccount(account.get('id'), { notify: false })); } else { dispatch(followAccount(account.get('id'), { notify: true })); @@ -143,7 +143,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onEndorseToggle(account) { - if (account.getIn(['relationship', 'endorsed'])) { + if (account.relationship?.endorsed) { dispatch(unpinAccount(account.get('id'))); } else { dispatch(pinAccount(account.get('id'))); @@ -155,7 +155,7 @@ const mapDispatchToProps = (dispatch, { intl }) => ({ }, onMute(account) { - if (account.getIn(['relationship', 'muting'])) { + if (account.relationship?.muting) { dispatch(unmuteAccount(account.get('id'))); } else { dispatch(initMuteModal(account)); diff --git a/app/soapbox/features/admin/components/report_status.tsx b/app/soapbox/features/admin/components/report_status.tsx index c882f0f5a..7503675e4 100644 --- a/app/soapbox/features/admin/components/report_status.tsx +++ b/app/soapbox/features/admin/components/report_status.tsx @@ -39,7 +39,7 @@ const ReportStatus: React.FC = ({ status }) => { return [{ text: intl.formatMessage(messages.viewStatus, { acct: `@${acct}` }), - to: `/@${acct}/posts/${status.get('id')}`, + to: `/@${acct}/posts/${status.id}`, icon: require('@tabler/icons/icons/pencil.svg'), }, { text: intl.formatMessage(messages.deleteStatus, { acct: `@${acct}` }), diff --git a/app/soapbox/features/aliases/components/search.tsx b/app/soapbox/features/aliases/components/search.tsx index 8e601ccb0..3720a6930 100644 --- a/app/soapbox/features/aliases/components/search.tsx +++ b/app/soapbox/features/aliases/components/search.tsx @@ -17,7 +17,7 @@ const Search: React.FC = () => { const dispatch = useDispatch(); const intl = useIntl(); - const value = useAppSelector(state => state.aliases.getIn(['suggestions', 'value'])) as string; + const value = useAppSelector(state => state.aliases.suggestions.value); const handleChange = (e: React.ChangeEvent) => { dispatch(changeAliasesSuggestions(e.target.value)); diff --git a/app/soapbox/features/aliases/index.tsx b/app/soapbox/features/aliases/index.tsx index 1e1484c83..20ced8951 100644 --- a/app/soapbox/features/aliases/index.tsx +++ b/app/soapbox/features/aliases/index.tsx @@ -35,11 +35,11 @@ const Aliases = () => { const instance = state.instance; const features = getFeatures(instance); - if (features.accountMoving) return state.aliases.getIn(['aliases', 'items'], ImmutableList()); + if (features.accountMoving) return state.aliases.aliases.items; return account!.pleroma.get('also_known_as'); }) as ImmutableList; - const searchAccountIds = useAppSelector((state) => state.aliases.getIn(['suggestions', 'items'])) as ImmutableList; - const loaded = useAppSelector((state) => state.aliases.getIn(['suggestions', 'loaded'])); + const searchAccountIds = useAppSelector((state) => state.aliases.suggestions.items); + const loaded = useAppSelector((state) => state.aliases.suggestions.loaded); useEffect(() => { dispatch(fetchAliases); diff --git a/app/soapbox/features/directory/components/account_card.tsx b/app/soapbox/features/directory/components/account_card.tsx index 0b5a74b8b..991461f41 100644 --- a/app/soapbox/features/directory/components/account_card.tsx +++ b/app/soapbox/features/directory/components/account_card.tsx @@ -26,7 +26,7 @@ const AccountCard: React.FC = ({ id }) => { if (!account) return null; - const followedBy = me !== account.id && account.relationship.get('followed_by'); + const followedBy = me !== account.id && account.relationship?.followed_by; return (
diff --git a/app/soapbox/features/domain_blocks/index.tsx b/app/soapbox/features/domain_blocks/index.tsx index 712a6671f..88ddc1a12 100644 --- a/app/soapbox/features/domain_blocks/index.tsx +++ b/app/soapbox/features/domain_blocks/index.tsx @@ -24,8 +24,8 @@ const DomainBlocks: React.FC = () => { const dispatch = useDispatch(); const intl = useIntl(); - const domains = useAppSelector((state) => state.domain_lists.getIn(['blocks', 'items'])) as string[]; - const hasMore = useAppSelector((state) => !!state.domain_lists.getIn(['blocks', 'next'])); + const domains = useAppSelector((state) => state.domain_lists.blocks.items); + const hasMore = useAppSelector((state) => !!state.domain_lists.blocks.next); React.useEffect(() => { dispatch(fetchDomainBlocks()); diff --git a/app/soapbox/features/status/components/action-bar.tsx b/app/soapbox/features/status/components/action-bar.tsx index 35cbaf79e..9db8e3925 100644 --- a/app/soapbox/features/status/components/action-bar.tsx +++ b/app/soapbox/features/status/components/action-bar.tsx @@ -387,9 +387,9 @@ class ActionBar extends React.PureComponent { if (me) { if (features.bookmarks) { menu.push({ - text: intl.formatMessage(status.get('bookmarked') ? messages.unbookmark : messages.bookmark), + text: intl.formatMessage(status.bookmarked ? messages.unbookmark : messages.bookmark), action: this.handleBookmarkClick, - icon: require(status.get('bookmarked') ? '@tabler/icons/icons/bookmark-off.svg' : '@tabler/icons/icons/bookmark.svg'), + icon: require(status.bookmarked ? '@tabler/icons/icons/bookmark-off.svg' : '@tabler/icons/icons/bookmark.svg'), }); } @@ -406,7 +406,7 @@ class ActionBar extends React.PureComponent { menu.push(null); } else if (status.visibility === 'private') { menu.push({ - text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog_private : messages.reblog_private), + text: intl.formatMessage(status.reblogged ? messages.cancel_reblog_private : messages.reblog_private), action: this.handleReblogClick, icon: require('@tabler/icons/icons/repeat.svg'), }); @@ -496,7 +496,7 @@ class ActionBar extends React.PureComponent { } menu.push({ - text: intl.formatMessage(status.get('sensitive') === false ? messages.markStatusSensitive : messages.markStatusNotSensitive), + text: intl.formatMessage(status.sensitive === false ? messages.markStatusSensitive : messages.markStatusNotSensitive), action: this.handleToggleStatusSensitivity, icon: require('@tabler/icons/icons/alert-triangle.svg'), }); @@ -523,18 +523,18 @@ class ActionBar extends React.PureComponent { } } - const canShare = ('share' in navigator) && status.get('visibility') === 'public'; + const canShare = ('share' in navigator) && status.visibility === 'public'; let reblogIcon = require('@tabler/icons/icons/repeat.svg'); - if (status.get('visibility') === 'direct') { + if (status.visibility === 'direct') { reblogIcon = require('@tabler/icons/icons/mail.svg'); - } else if (status.get('visibility') === 'private') { + } else if (status.visibility === 'private') { reblogIcon = require('@tabler/icons/icons/lock.svg'); } - const reblog_disabled = (status.get('visibility') === 'direct' || status.get('visibility') === 'private'); + const reblog_disabled = (status.visibility === 'direct' || status.visibility === 'private'); const reblogMenu: Menu = [{ text: intl.formatMessage(status.reblogged ? messages.cancel_reblog_private : messages.reblog), diff --git a/app/soapbox/features/status/components/status-interaction-bar.tsx b/app/soapbox/features/status/components/status-interaction-bar.tsx index 13ecf6c60..6f121780b 100644 --- a/app/soapbox/features/status/components/status-interaction-bar.tsx +++ b/app/soapbox/features/status/components/status-interaction-bar.tsx @@ -53,7 +53,7 @@ const StatusInteractionBar: React.FC = ({ status }): JSX. const getNormalizedReacts = () => { return reduceEmoji( - ImmutableList(status.getIn(['pleroma', 'emoji_reactions']) as any), + ImmutableList(status.pleroma.get('emoji_reactions') as any), status.favourites_count, status.favourited, allowedEmoji, diff --git a/app/soapbox/features/status/index.tsx b/app/soapbox/features/status/index.tsx index 9f0e3dbf6..a87e6d1cb 100644 --- a/app/soapbox/features/status/index.tsx +++ b/app/soapbox/features/status/index.tsx @@ -332,7 +332,7 @@ class Status extends ImmutablePureComponent { handleEditClick = (status: StatusEntity) => { const { dispatch } = this.props; - dispatch(editStatus(status.get('id'))); + dispatch(editStatus(status.id)); } handleDirectClick = (account: AccountEntity, router: History) => { diff --git a/app/soapbox/features/ui/components/action-button.tsx b/app/soapbox/features/ui/components/action-button.tsx index 51348ee1d..2092639fb 100644 --- a/app/soapbox/features/ui/components/action-button.tsx +++ b/app/soapbox/features/ui/components/action-button.tsx @@ -52,7 +52,7 @@ const ActionButton: React.FC = ({ account, actionType, small }) = const me = useAppSelector((state) => state.me); const handleFollow = () => { - if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) { + if (account.relationship?.following || account.relationship?.requested) { dispatch(unfollowAccount(account.id)); } else { dispatch(followAccount(account.id)); @@ -60,7 +60,7 @@ const ActionButton: React.FC = ({ account, actionType, small }) = }; const handleBlock = () => { - if (account.getIn(['relationship', 'blocking'])) { + if (account.relationship?.blocking) { dispatch(unblockAccount(account.id)); } else { dispatch(blockAccount(account.id)); @@ -68,7 +68,7 @@ const ActionButton: React.FC = ({ account, actionType, small }) = }; const handleMute = () => { - if (account.getIn(['relationship', 'muting'])) { + if (account.relationship?.muting) { dispatch(unmuteAccount(account.id)); } else { dispatch(muteAccount(account.id)); @@ -85,7 +85,7 @@ const ActionButton: React.FC = ({ account, actionType, small }) = /** Handles actionType='muting' */ const mutingAction = () => { - const isMuted = account.getIn(['relationship', 'muting']); + const isMuted = account.relationship?.muting; const messageKey = isMuted ? messages.unmute : messages.mute; const text = intl.formatMessage(messageKey, { name: account.username }); @@ -101,7 +101,7 @@ const ActionButton: React.FC = ({ account, actionType, small }) = /** Handles actionType='blocking' */ const blockingAction = () => { - const isBlocked = account.getIn(['relationship', 'blocking']); + const isBlocked = account.relationship?.blocking; const messageKey = isBlocked ? messages.unblock : messages.block; const text = intl.formatMessage(messageKey, { name: account.username }); @@ -154,8 +154,8 @@ const ActionButton: React.FC = ({ account, actionType, small }) = } if (me !== account.id) { - const isFollowing = account.getIn(['relationship', 'following']); - const blockedBy = account.getIn(['relationship', 'blocked_by']) as boolean; + const isFollowing = account.relationship?.following; + const blockedBy = account.relationship?.blocked_by as boolean; if (actionType) { if (actionType === 'muting') { @@ -165,10 +165,10 @@ const ActionButton: React.FC = ({ account, actionType, small }) = } } - if (account.relationship.isEmpty()) { + if (!account.relationship) { // Wait until the relationship is loaded return null; - } else if (account.getIn(['relationship', 'requested'])) { + } else if (account.relationship?.requested) { // Awaiting acceptance return ( ); - } else if (account.getIn(['relationship', 'blocking'])) { + } else if (account.relationship?.blocking) { // Unblock return (