import { Record as ImmutableRecord } from 'immutable'; import { createSelector } from 'reselect'; import { accountDefaultValues } from 'flavours/glitch/models/account'; import type { Account, AccountShape } from 'flavours/glitch/models/account'; import type { Relationship } from 'flavours/glitch/models/relationship'; import type { RootState } from 'flavours/glitch/store'; const getAccountBase = (state: RootState, id: string) => state.accounts.get(id, null); const getAccountRelationship = (state: RootState, id: string) => state.relationships.get(id, null); const getAccountMoved = (state: RootState, id: string) => { const movedToId = state.accounts.get(id)?.moved; if (!movedToId) return undefined; return state.accounts.get(movedToId); }; interface FullAccountShape extends Omit { relationship: Relationship | null; moved: Account | null; } const FullAccountFactory = ImmutableRecord({ ...accountDefaultValues, moved: null, relationship: null, }); export function makeGetAccount() { return createSelector( [getAccountBase, getAccountRelationship, getAccountMoved], (base, relationship, moved) => { if (base === null) { return null; } return FullAccountFactory(base) .set('relationship', relationship) .set('moved', moved ?? null); }, ); }