48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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);
 | 
						|
    },
 | 
						|
  );
 | 
						|
}
 |