Use Immutable Record
for accounts in Redux state (#26559)
This commit is contained in:
parent
9d799d40ba
commit
3bf2a7296e
65 changed files with 765 additions and 662 deletions
47
app/javascript/mastodon/selectors/accounts.ts
Normal file
47
app/javascript/mastodon/selectors/accounts.ts
Normal file
|
@ -0,0 +1,47 @@
|
|||
import { Record as ImmutableRecord } from 'immutable';
|
||||
import { createSelector } from 'reselect';
|
||||
|
||||
import { accountDefaultValues } from 'mastodon/models/account';
|
||||
import type { Account, AccountShape } from 'mastodon/models/account';
|
||||
import type { Relationship } from 'mastodon/models/relationship';
|
||||
import type { RootState } from 'mastodon/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);
|
||||
},
|
||||
);
|
||||
}
|
|
@ -5,23 +5,7 @@ import { toServerSideType } from 'mastodon/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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue