Join state optimistic responses

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
environments/review-events-5jp5it/deployments/1372
marcin mikołajczak 2 years ago
parent 3f4f820de7
commit b97518d600

@ -158,25 +158,22 @@ const uploadEventBanner = (file: File, intl: IntlShape) =>
const uploadEventBannerRequest = () => ({ const uploadEventBannerRequest = () => ({
type: EVENT_BANNER_UPLOAD_REQUEST, type: EVENT_BANNER_UPLOAD_REQUEST,
skipLoading: true,
}); });
const uploadEventBannerProgress = (loaded: number) => ({ const uploadEventBannerProgress = (loaded: number) => ({
type: EVENT_BANNER_UPLOAD_PROGRESS, type: EVENT_BANNER_UPLOAD_PROGRESS,
loaded: loaded, loaded,
}); });
const uploadEventBannerSuccess = (media: APIEntity, file: File) => ({ const uploadEventBannerSuccess = (media: APIEntity, file: File) => ({
type: EVENT_BANNER_UPLOAD_SUCCESS, type: EVENT_BANNER_UPLOAD_SUCCESS,
media: media, media,
file, file,
skipLoading: true,
}); });
const uploadEventBannerFail = (error: AxiosError | true) => ({ const uploadEventBannerFail = (error: AxiosError | true) => ({
type: EVENT_BANNER_UPLOAD_FAIL, type: EVENT_BANNER_UPLOAD_FAIL,
error: error, error,
skipLoading: true,
}); });
const undoUploadEventBanner = () => ({ const undoUploadEventBanner = () => ({
@ -228,12 +225,12 @@ const submitEventRequest = () => ({
const submitEventSuccess = (status: APIEntity) => ({ const submitEventSuccess = (status: APIEntity) => ({
type: EVENT_SUBMIT_SUCCESS, type: EVENT_SUBMIT_SUCCESS,
status: status, status,
}); });
const submitEventFail = (error: AxiosError) => ({ const submitEventFail = (error: AxiosError) => ({
type: EVENT_SUBMIT_FAIL, type: EVENT_SUBMIT_FAIL,
error: error, error,
}); });
const joinEvent = (id: string, participationMessage?: string) => const joinEvent = (id: string, participationMessage?: string) =>
@ -253,7 +250,7 @@ const joinEvent = (id: string, participationMessage?: string) =>
`/@${data.account.acct}/events/${data.id}`, `/@${data.account.acct}/events/${data.id}`,
)); ));
}).catch(function(error) { }).catch(function(error) {
dispatch(joinEventFail(error)); dispatch(joinEventFail(error, status?.event?.join_state || null));
}); });
}; };
@ -263,12 +260,13 @@ const joinEventRequest = () => ({
const joinEventSuccess = (status: APIEntity) => ({ const joinEventSuccess = (status: APIEntity) => ({
type: EVENT_JOIN_SUCCESS, type: EVENT_JOIN_SUCCESS,
status: status, status,
}); });
const joinEventFail = (error: AxiosError) => ({ const joinEventFail = (error: AxiosError, previousState: string | null) => ({
type: EVENT_JOIN_FAIL, type: EVENT_JOIN_FAIL,
error: error, error,
previousState,
}); });
const leaveEvent = (id: string) => const leaveEvent = (id: string) =>
@ -293,12 +291,12 @@ const leaveEventRequest = () => ({
const leaveEventSuccess = (status: APIEntity) => ({ const leaveEventSuccess = (status: APIEntity) => ({
type: EVENT_LEAVE_SUCCESS, type: EVENT_LEAVE_SUCCESS,
status: status, status,
}); });
const leaveEventFail = (error: AxiosError) => ({ const leaveEventFail = (error: AxiosError) => ({
type: EVENT_LEAVE_FAIL, type: EVENT_LEAVE_FAIL,
error: error, error,
}); });
export { export {

@ -7,10 +7,13 @@ import { simulateEmojiReact, simulateUnEmojiReact } from 'soapbox/utils/emoji_re
import { stripCompatibilityFeatures, unescapeHTML } from 'soapbox/utils/html'; import { stripCompatibilityFeatures, unescapeHTML } from 'soapbox/utils/html';
import { makeEmojiMap, normalizeId } from 'soapbox/utils/normalizers'; import { makeEmojiMap, normalizeId } from 'soapbox/utils/normalizers';
import { EMOJI_REACT_REQUEST, UNEMOJI_REACT_REQUEST } from '../actions/emoji_reacts';
import { import {
EMOJI_REACT_REQUEST, EVENT_JOIN_REQUEST,
UNEMOJI_REACT_REQUEST, EVENT_JOIN_FAIL,
} from '../actions/emoji_reacts'; EVENT_LEAVE_REQUEST,
EVENT_LEAVE_FAIL,
} from '../actions/events';
import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer'; import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer';
import { import {
REBLOG_REQUEST, REBLOG_REQUEST,
@ -257,6 +260,13 @@ export default function statuses(state = initialState, action: AnyAction): State
return incrementReplyCount(state, action.params); return incrementReplyCount(state, action.params);
case TIMELINE_DELETE: case TIMELINE_DELETE:
return deleteStatus(state, action.id, action.references); return deleteStatus(state, action.id, action.references);
case EVENT_JOIN_REQUEST:
return state.setIn([action.status.get('id'), 'event', 'join_state'], 'pending');
case EVENT_JOIN_FAIL:
case EVENT_LEAVE_REQUEST:
return state.setIn([action.status.get('id'), 'event', 'join_state'], null);
case EVENT_LEAVE_FAIL:
return state.setIn([action.status.get('id'), 'event', 'join_state'], action.previousState);
default: default:
return state; return state;
} }

@ -72,6 +72,17 @@ const ReactionListRecord = ImmutableRecord({
isLoading: false, isLoading: false,
}); });
export const ParticipationRequestRecord = ImmutableRecord({
account: '',
participation_message: null as string | null,
});
const ParticipationRequestListRecord = ImmutableRecord({
next: null as string | null,
items: ImmutableOrderedSet<ParticipationRequest>(),
isLoading: false,
});
export const ReducerRecord = ImmutableRecord({ export const ReducerRecord = ImmutableRecord({
followers: ImmutableMap<string, List>(), followers: ImmutableMap<string, List>(),
following: ImmutableMap<string, List>(), following: ImmutableMap<string, List>(),
@ -87,14 +98,18 @@ export const ReducerRecord = ImmutableRecord({
pinned: ImmutableMap<string, List>(), pinned: ImmutableMap<string, List>(),
birthday_reminders: ImmutableMap<string, List>(), birthday_reminders: ImmutableMap<string, List>(),
familiar_followers: ImmutableMap<string, List>(), familiar_followers: ImmutableMap<string, List>(),
event_participations: ImmutableMap<string, List>(),
event_participation_requests: ImmutableMap<string, ParticipationRequestList>(),
}); });
type State = ReturnType<typeof ReducerRecord>; 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 ParticipationRequest = ReturnType<typeof ParticipationRequestRecord>;
type ParticipationRequestList = ReturnType<typeof ParticipationRequestListRecord>;
type Items = ImmutableOrderedSet<string>; type Items = ImmutableOrderedSet<string>;
type NestedListPath = ['followers' | 'following' | 'reblogged_by' | 'favourited_by' | 'reactions' | 'groups' | 'groups_removed_accounts' | 'pinned' | 'birthday_reminders' | 'familiar_followers', string]; type NestedListPath = ['followers' | 'following' | 'reblogged_by' | 'favourited_by' | 'reactions' | 'groups' | 'groups_removed_accounts' | 'pinned' | 'birthday_reminders' | 'familiar_followers' | 'event_participations' | 'event_participation_requests', 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) => {

Loading…
Cancel
Save