[Glitch] Use Immutable Record for accounts in Redux state

Port 3bf2a7296e to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
Renaud Chaput
2023-11-03 16:00:03 +01:00
committed by Claire
parent 3b7caa00e2
commit 7fe5623a27
66 changed files with 771 additions and 667 deletions

View File

@@ -0,0 +1,47 @@
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<AccountShape, 'moved'> {
relationship: Relationship | null;
moved: Account | null;
}
const FullAccountFactory = ImmutableRecord<FullAccountShape>({
...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);
},
);
}

View File

@@ -5,23 +5,7 @@ import { toServerSideType } from 'flavours/glitch/utils/filters';
import { me } from '../initial_state';
const getAccountBase = (state, id) => state.getIn(['accounts', id], null);
const getAccountCounters = (state, id) => state.getIn(['accounts_counters', id], null);
const getAccountRelationship = (state, id) => state.getIn(['relationships', id], null);
const getAccountMoved = (state, id) => state.getIn(['accounts', state.getIn(['accounts', id, 'moved'])]);
export const makeGetAccount = () => {
return createSelector([getAccountBase, getAccountCounters, getAccountRelationship, getAccountMoved], (base, counters, relationship, moved) => {
if (base === null) {
return null;
}
return base.merge(counters).withMutations(map => {
map.set('relationship', relationship);
map.set('moved', moved);
});
});
};
export { makeGetAccount } from "./accounts";
const getFilters = (state, { contextType }) => {
if (!contextType) return null;