From 4258d4b27fc840c63bc3e9e111a10559bdd58f57 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 20 Jun 2023 15:24:35 -0500 Subject: [PATCH] Fix reducer and selector, import accounts into entity store --- app/soapbox/actions/importer/index.ts | 26 +++++++++++++++++++++----- app/soapbox/reducers/index.ts | 13 ++++++++----- app/soapbox/selectors/index.ts | 17 ++++------------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/app/soapbox/actions/importer/index.ts b/app/soapbox/actions/importer/index.ts index fc9ad63bd..5afb880c0 100644 --- a/app/soapbox/actions/importer/index.ts +++ b/app/soapbox/actions/importer/index.ts @@ -1,6 +1,6 @@ import { importEntities } from 'soapbox/entity-store/actions'; import { Entities } from 'soapbox/entity-store/entities'; -import { Group, groupSchema } from 'soapbox/schemas'; +import { Group, accountSchema, groupSchema } from 'soapbox/schemas'; import { filteredArray } from 'soapbox/schemas/utils'; import { getSettings } from '../settings'; @@ -17,11 +17,27 @@ const STATUSES_IMPORT = 'STATUSES_IMPORT'; const POLLS_IMPORT = 'POLLS_IMPORT'; const ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP = 'ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP'; -const importAccount = (account: APIEntity) => - ({ type: ACCOUNT_IMPORT, account }); +const importAccount = (data: APIEntity) => + (dispatch: AppDispatch, _getState: () => RootState) => { + dispatch({ type: ACCOUNT_IMPORT, account: data }); + try { + const account = accountSchema.parse(data); + dispatch(importEntities([account], Entities.ACCOUNTS)); + } catch (e) { + // + } + }; -const importAccounts = (accounts: APIEntity[]) => - ({ type: ACCOUNTS_IMPORT, accounts }); +const importAccounts = (data: APIEntity[]) => + (dispatch: AppDispatch, _getState: () => RootState) => { + dispatch({ type: ACCOUNTS_IMPORT, accounts: data }); + try { + const accounts = filteredArray(accountSchema).parse(data); + dispatch(importEntities(accounts, Entities.ACCOUNTS)); + } catch (e) { + // + } + }; const importGroup = (group: Group) => importEntities([group], Entities.GROUPS); diff --git a/app/soapbox/reducers/index.ts b/app/soapbox/reducers/index.ts index 4caaca3ba..2f331a944 100644 --- a/app/soapbox/reducers/index.ts +++ b/app/soapbox/reducers/index.ts @@ -183,12 +183,15 @@ const accountsSelector = createSelector( (accounts) => immutableizeStore>(accounts), ); -const extendedRootReducer = (state: InferState, action: AnyAction) => { +const extendedRootReducer = ( + state: InferState, + action: AnyAction, +): ReturnType & { accounts: ReturnType } => { const extendedState = rootReducer(state, action); - return { - ...extendedState, - accounts: accountsSelector(extendedState), - }; + // @ts-ignore + extendedState.accounts = accountsSelector(extendedState); + // @ts-ignore + return extendedState; }; export default extendedRootReducer as Reducer>; diff --git a/app/soapbox/selectors/index.ts b/app/soapbox/selectors/index.ts index 45aa5ef66..190c18834 100644 --- a/app/soapbox/selectors/index.ts +++ b/app/soapbox/selectors/index.ts @@ -15,7 +15,6 @@ import { getFeatures } from 'soapbox/utils/features'; import { shouldFilter } from 'soapbox/utils/timelines'; import type { ContextType } from 'soapbox/normalizers/filter'; -import type { ReducerAccount } from 'soapbox/reducers/accounts'; import type { ReducerChat } from 'soapbox/reducers/chats'; import type { RootState } from 'soapbox/store'; import type { Filter as FilterEntity, Notification, Status, Group } from 'soapbox/types/entities'; @@ -168,8 +167,6 @@ export const makeGetStatus = () => { [ (state: RootState, { id }: APIStatus) => state.statuses.get(id) as Status | undefined, (state: RootState, { id }: APIStatus) => state.statuses.get(state.statuses.get(id)?.reblog || '') as Status | undefined, - (state: RootState, { id }: APIStatus) => state.accounts.get(state.statuses.get(id)?.account || '') as ReducerAccount | undefined, - (state: RootState, { id }: APIStatus) => state.accounts.get(state.statuses.get(state.statuses.get(id)?.reblog || '')?.account || '') as ReducerAccount | undefined, (state: RootState, { id }: APIStatus) => state.entities[Entities.GROUPS]?.store[state.statuses.get(id)?.group || ''] as Group | undefined, (_state: RootState, { username }: APIStatus) => username, getFilters, @@ -177,8 +174,9 @@ export const makeGetStatus = () => { (state: RootState) => getFeatures(state.instance), ], - (statusBase, statusReblog, accountBase, accountReblog, group, username, filters, me, features) => { - if (!statusBase || !accountBase) return null; + (statusBase, statusReblog, group, username, filters, me, features) => { + if (!statusBase) return null; + const accountBase = statusBase.account; const accountUsername = accountBase.acct; //Must be owner of status if username exists @@ -186,13 +184,6 @@ export const makeGetStatus = () => { return null; } - if (statusReblog && accountReblog) { - // @ts-ignore AAHHHHH - statusReblog = statusReblog.set('account', accountReblog); - } else { - statusReblog = undefined; - } - return statusBase.withMutations((map: Status) => { map.set('reblog', statusReblog || null); // @ts-ignore :( @@ -200,7 +191,7 @@ export const makeGetStatus = () => { // @ts-ignore map.set('group', group || null); - if ((features.filters) && (accountReblog || accountBase).id !== me) { + if ((features.filters) && accountBase.id !== me) { const filtered = checkFiltered(statusReblog?.search_index || statusBase.search_index, filters); map.set('filtered', filtered);