Skip to content

Commit

Permalink
Merge pull request #9215 from neinteractiveliterature/signup-requests…
Browse files Browse the repository at this point in the history
…-count-like-signups

Signup requests should count like signups
  • Loading branch information
nbudin authored Jul 24, 2024
2 parents ad231c5 + 4a32fe0 commit b334dab
Show file tree
Hide file tree
Showing 21 changed files with 239 additions and 146 deletions.
2 changes: 1 addition & 1 deletion app/graphql/graphql_operations_generated.json

Large diffs are not rendered by default.

95 changes: 46 additions & 49 deletions app/javascript/EventsApp/EventPage/EventPageRunCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ import {
useWithdrawMySignupMutation,
useWithdrawSignupRequestMutation,
} from './mutations.generated';
import { SignupMode, SignupRankedChoiceState } from '../../graphqlTypes.generated';
import { SignupAutomationMode, SignupMode, SignupRankedChoiceState } from '../../graphqlTypes.generated';
import SignupCountData from '../SignupCountData';
import { parseSignupRounds } from '../../SignupRoundUtils';
import { DateTime } from 'luxon';

// eslint-disable-next-line @typescript-eslint/no-explicit-any
type TI = any;
Expand Down Expand Up @@ -81,7 +83,7 @@ function EventPageRunCard({
addToQueue,
}: EventPageRunCardProps): JSX.Element {
const { t } = useTranslation();
const { signupMode } = useContext(AppRootContext);
const { signupMode, signupAutomationMode } = useContext(AppRootContext);
const myPendingRankedChoices = useMemo(
() => run.my_signup_ranked_choices.filter((choice) => choice.state === SignupRankedChoiceState.Pending),
[run.my_signup_ranked_choices],
Expand Down Expand Up @@ -110,6 +112,12 @@ function EventPageRunCard({
const [createSignupRankedChoiceMutate] = useCreateSignupRankedChoiceMutation();
const apolloClient = useApolloClient();

const currentRound = useMemo(() => {
const parsedRounds = parseSignupRounds(signupRounds);
const now = DateTime.local();
return parsedRounds.find((round) => round.timespan.includesTime(now));
}, [signupRounds]);

const selfServiceSignup = useCallback(
async (signupOption: SignupOption) => {
if (signupOption.action === 'ADD_TO_QUEUE') {
Expand Down Expand Up @@ -143,39 +151,42 @@ function EventPageRunCard({
[apolloClient, createMySignupMutate, createSignupRankedChoiceMutate, event, run],
);

const selfServiceWithdraw = useCallback(
() =>
confirm({
prompt: t('events.withdrawPrompt.selfServiceSignup', { eventTitle: event.title }),
action: async () => {
await withdrawMySignupMutate({ variables: { runId: run.id } });
await apolloClient.resetStore();
},
renderError: (error) => <ErrorDisplay graphQLError={error} />,
}),
[apolloClient, confirm, event.title, run.id, withdrawMySignupMutate, t],
);
const withdrawPrompt = useMemo(() => {
if (mySignup && !mySignup.counted) {
return t('events.withdrawPrompt.notCounted', { eventTitle: event.title });
} else if (
signupAutomationMode === SignupAutomationMode.RankedChoice &&
typeof currentRound?.maximum_event_signups === 'number'
) {
return t('events.withdrawPrompt.duringLimitedRankedChoiceSignupRoundCounted', { eventTitle: event.title });
} else if (signupMode === 'moderated') {
return (
<Trans i18nKey="events.withdrawPrompt.moderatedSignup" values={{ eventTitle: event.title }}>
<p>
<strong>
If you’re thinking of signing up for a different event instead, please go to that event’s page and request
to sign up for it.
</strong>{' '}
If the request is accepted, you’ll automatically be withdrawn from this event.
</p>
<p className="mb-0">Are you sure you want to withdraw from {{ eventTitle: event.title } as TI}?</p>
</Trans>
);
} else {
return t('events.withdrawPrompt.selfServiceSignup', { eventTitle: event.title });
}
}, [event.title, mySignup, signupMode, signupAutomationMode, t, currentRound?.maximum_event_signups]);

const moderatedWithdraw = useCallback(
() =>
confirm({
prompt: (
<Trans i18nKey="events.withdrawPrompt.moderatedSignup">
<p>
<strong>
If you’re thinking of signing up for a different event instead, please go to that event’s page and
request to sign up for it.
</strong>{' '}
If the request is accepted, you’ll automatically be withdrawn from this event.
</p>
<p className="mb-0">Are you sure you want to withdraw from {{ eventTitle: event.title } as TI}?</p>
</Trans>
),
action: () => withdrawMySignupMutate({ variables: { runId: run.id } }),
renderError: (error) => <ErrorDisplay graphQLError={error} />,
}),
[confirm, event.title, run.id, withdrawMySignupMutate],
);
const withdraw = useCallback(async () => {
confirm({
prompt: withdrawPrompt,
action: async () => {
await withdrawMySignupMutate({ variables: { runId: run.id } });
await apolloClient.resetStore();
},
renderError: (error) => <ErrorDisplay graphQLError={error} />,
});
}, [apolloClient, confirm, withdrawPrompt, run.id, withdrawMySignupMutate]);

const createSignup = (signupOption: SignupOption) => {
if (signupMode === SignupMode.SelfService || signupOption.action === 'ADD_TO_QUEUE' || signupOption.teamMember) {
Expand All @@ -190,20 +201,6 @@ function EventPageRunCard({
return Promise.reject(new Error(`Invalid signup mode: ${signupMode}`));
};

const withdrawSignup = () => {
if (signupMode === 'self_service') {
selfServiceWithdraw();
return Promise.resolve();
}

if (signupMode === 'moderated') {
moderatedWithdraw();
return Promise.resolve();
}

return Promise.reject(new Error(`Invalid signup mode: ${signupMode}`));
};

const withdrawPendingSignupRequest = () => {
if (!myPendingSignupRequest) {
return Promise.reject(new Error('No pending signup request to withdraw'));
Expand All @@ -230,7 +227,7 @@ function EventPageRunCard({
signupOptions={signupOptions}
showViewSignups
createSignup={createSignup}
withdrawSignup={withdrawSignup}
withdrawSignup={withdraw}
withdrawPendingSignupRequest={withdrawPendingSignupRequest}
/>

Expand Down
2 changes: 1 addition & 1 deletion app/javascript/EventsApp/EventPage/RunCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export type RunCardProps = {
showViewSignups?: boolean;
createSignup: (
signupOption: SignupOption,
) => Promise<undefined | null | Pick<Signup, '__typename' | 'id' | 'state' | 'expires_at'>>;
) => Promise<undefined | null | Pick<Signup, '__typename' | 'id' | 'state' | 'expires_at' | 'counted'>>;
withdrawSignup: () => Promise<unknown>;
withdrawPendingSignupRequest: () => Promise<unknown>;
};
Expand Down
4 changes: 2 additions & 2 deletions app/javascript/EventsApp/EventPage/mutations.generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ export type CreateMySignupMutationVariables = Types.Exact<{
}>;


export type CreateMySignupMutationData = { __typename: 'Mutation', createMySignup: { __typename: 'CreateMySignupPayload', signup: { __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, expires_at?: string | null, run: { __typename: 'Run', id: string, title_suffix?: string | null, starts_at: string, current_ability_can_signup_summary_run: boolean, grouped_signup_counts: Array<{ __typename: 'GroupedSignupCount', bucket_key?: string | null, count: number, counted: boolean, state: Types.SignupState, team_member: boolean }>, rooms: Array<{ __typename: 'Room', id: string, name?: string | null }>, my_signups: Array<{ __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, expires_at?: string | null }>, my_signup_requests: Array<{ __typename: 'SignupRequest', id: string, state: Types.SignupRequestState, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string }, replace_signup?: { __typename: 'Signup', id: string } | null }>, my_signup_ranked_choices: Array<{ __typename: 'SignupRankedChoice', id: string, state: Types.SignupRankedChoiceState, priority: number, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string } }> } } } };
export type CreateMySignupMutationData = { __typename: 'Mutation', createMySignup: { __typename: 'CreateMySignupPayload', signup: { __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, counted: boolean, expires_at?: string | null, run: { __typename: 'Run', id: string, title_suffix?: string | null, starts_at: string, current_ability_can_signup_summary_run: boolean, grouped_signup_counts: Array<{ __typename: 'GroupedSignupCount', bucket_key?: string | null, count: number, counted: boolean, state: Types.SignupState, team_member: boolean }>, rooms: Array<{ __typename: 'Room', id: string, name?: string | null }>, my_signups: Array<{ __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, counted: boolean, expires_at?: string | null }>, my_signup_requests: Array<{ __typename: 'SignupRequest', id: string, state: Types.SignupRequestState, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string }, replace_signup?: { __typename: 'Signup', id: string } | null }>, my_signup_ranked_choices: Array<{ __typename: 'SignupRankedChoice', id: string, state: Types.SignupRankedChoiceState, priority: number, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string } }> } } } };

export type WithdrawMySignupMutationVariables = Types.Exact<{
runId: Types.Scalars['ID']['input'];
}>;


export type WithdrawMySignupMutationData = { __typename: 'Mutation', withdrawMySignup: { __typename: 'WithdrawMySignupPayload', signup: { __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, expires_at?: string | null, run: { __typename: 'Run', id: string, title_suffix?: string | null, starts_at: string, current_ability_can_signup_summary_run: boolean, grouped_signup_counts: Array<{ __typename: 'GroupedSignupCount', bucket_key?: string | null, count: number, counted: boolean, state: Types.SignupState, team_member: boolean }>, rooms: Array<{ __typename: 'Room', id: string, name?: string | null }>, my_signups: Array<{ __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, expires_at?: string | null }>, my_signup_requests: Array<{ __typename: 'SignupRequest', id: string, state: Types.SignupRequestState, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string }, replace_signup?: { __typename: 'Signup', id: string } | null }>, my_signup_ranked_choices: Array<{ __typename: 'SignupRankedChoice', id: string, state: Types.SignupRankedChoiceState, priority: number, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string } }> } } } };
export type WithdrawMySignupMutationData = { __typename: 'Mutation', withdrawMySignup: { __typename: 'WithdrawMySignupPayload', signup: { __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, counted: boolean, expires_at?: string | null, run: { __typename: 'Run', id: string, title_suffix?: string | null, starts_at: string, current_ability_can_signup_summary_run: boolean, grouped_signup_counts: Array<{ __typename: 'GroupedSignupCount', bucket_key?: string | null, count: number, counted: boolean, state: Types.SignupState, team_member: boolean }>, rooms: Array<{ __typename: 'Room', id: string, name?: string | null }>, my_signups: Array<{ __typename: 'Signup', id: string, state: Types.SignupState, waitlist_position?: number | null, counted: boolean, expires_at?: string | null }>, my_signup_requests: Array<{ __typename: 'SignupRequest', id: string, state: Types.SignupRequestState, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string }, replace_signup?: { __typename: 'Signup', id: string } | null }>, my_signup_ranked_choices: Array<{ __typename: 'SignupRankedChoice', id: string, state: Types.SignupRankedChoiceState, priority: number, requested_bucket_key?: string | null, target_run: { __typename: 'Run', id: string } }> } } } };

export type CreateSignupRequestMutationVariables = Types.Exact<{
targetRunId: Types.Scalars['ID']['input'];
Expand Down
Loading

0 comments on commit b334dab

Please sign in to comment.