feat(reducers): create ZapRecord in userLists()

- create ZapListRecord
- create Zap & ZapList types
- add zapped_by in NestedListPath
- handle ZAPS_FETCH_SUCCESS action
This commit is contained in:
P. Reis 2024-06-12 23:19:48 -03:00
parent a9930bc1f1
commit dbcef52463
1 changed files with 23 additions and 1 deletions

View File

@ -64,6 +64,7 @@ import {
FAVOURITES_EXPAND_SUCCESS, FAVOURITES_EXPAND_SUCCESS,
DISLIKES_FETCH_SUCCESS, DISLIKES_FETCH_SUCCESS,
REACTIONS_FETCH_SUCCESS, REACTIONS_FETCH_SUCCESS,
ZAPS_FETCH_SUCCESS,
} from 'soapbox/actions/interactions'; } from 'soapbox/actions/interactions';
import { import {
NOTIFICATIONS_UPDATE, NOTIFICATIONS_UPDATE,
@ -90,6 +91,17 @@ const ReactionListRecord = ImmutableRecord({
isLoading: false, isLoading: false,
}); });
export const ZapRecord = ImmutableRecord({
account: '',
zap_comment: '',
zap_amount: 0, // in millisats
});
const ZapListRecord = ImmutableRecord({
items: ImmutableOrderedSet<Zap>(),
isLoading: false,
});
export const ParticipationRequestRecord = ImmutableRecord({ export const ParticipationRequestRecord = ImmutableRecord({
account: '', account: '',
participation_message: null as string | null, participation_message: null as string | null,
@ -108,6 +120,7 @@ export const ReducerRecord = ImmutableRecord({
favourited_by: ImmutableMap<string, List>(), favourited_by: ImmutableMap<string, List>(),
disliked_by: ImmutableMap<string, List>(), disliked_by: ImmutableMap<string, List>(),
reactions: ImmutableMap<string, ReactionList>(), reactions: ImmutableMap<string, ReactionList>(),
zapped_by: ImmutableMap<string, ZapList>(),
follow_requests: ListRecord(), follow_requests: ListRecord(),
blocks: ListRecord(), blocks: ListRecord(),
mutes: ListRecord(), mutes: ListRecord(),
@ -125,10 +138,12 @@ type State = ReturnType<typeof ReducerRecord>;
export type List = ReturnType<typeof ListRecord>; export type List = ReturnType<typeof ListRecord>;
type Reaction = ReturnType<typeof ReactionRecord>; type Reaction = ReturnType<typeof ReactionRecord>;
type ReactionList = ReturnType<typeof ReactionListRecord>; type ReactionList = ReturnType<typeof ReactionListRecord>;
type Zap = ReturnType<typeof ZapRecord>;
type ZapList = ReturnType<typeof ZapListRecord>;
type ParticipationRequest = ReturnType<typeof ParticipationRequestRecord>; type ParticipationRequest = ReturnType<typeof ParticipationRequestRecord>;
type ParticipationRequestList = ReturnType<typeof ParticipationRequestListRecord>; type ParticipationRequestList = ReturnType<typeof ParticipationRequestListRecord>;
type Items = ImmutableOrderedSet<string>; type Items = ImmutableOrderedSet<string>;
type NestedListPath = ['followers' | 'following' | 'reblogged_by' | 'favourited_by' | 'disliked_by' | 'reactions' | 'pinned' | 'birthday_reminders' | 'familiar_followers' | 'event_participations' | 'event_participation_requests' | 'membership_requests' | 'group_blocks', string]; type NestedListPath = ['followers' | 'following' | 'reblogged_by' | 'favourited_by' | 'disliked_by' | 'reactions' | 'pinned' | 'birthday_reminders' | 'familiar_followers' | 'event_participations' | 'event_participation_requests' | 'membership_requests' | 'group_blocks' | 'zapped_by', string];
type ListPath = ['follow_requests' | 'blocks' | 'mutes' | 'directory']; type ListPath = ['follow_requests' | 'blocks' | 'mutes' | 'directory'];
const normalizeList = (state: State, path: NestedListPath | ListPath, accounts: APIEntity[], next?: string | null) => { const normalizeList = (state: State, path: NestedListPath | ListPath, accounts: APIEntity[], next?: string | null) => {
@ -186,6 +201,13 @@ export default function userLists(state = ReducerRecord(), action: AnyAction) {
accounts: ImmutableOrderedSet(accounts.map((account: APIEntity) => account.id)), accounts: ImmutableOrderedSet(accounts.map((account: APIEntity) => account.id)),
}))), }))),
})); }));
case ZAPS_FETCH_SUCCESS:
return state.setIn(['zapped_by', action.id], ZapListRecord({
items: ImmutableOrderedSet<Zap>(action.zaps.map(({ account, ...zap }: APIEntity) => ZapRecord({
...zap,
account: account.id,
}))),
}));
case NOTIFICATIONS_UPDATE: case NOTIFICATIONS_UPDATE:
return action.notification.type === 'follow_request' ? normalizeFollowRequest(state, action.notification) : state; return action.notification.type === 'follow_request' ? normalizeFollowRequest(state, action.notification) : state;
case FOLLOW_REQUESTS_FETCH_SUCCESS: case FOLLOW_REQUESTS_FETCH_SUCCESS: