Skip to content

Commit aad4aed

Browse files
Implement account valid period dialog
1 parent bef278b commit aad4aed

File tree

4 files changed

+166
-0
lines changed

4 files changed

+166
-0
lines changed

portal/src/graphql/adminapi/UserDetailsAccountStatus.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import DefaultButton from "../../DefaultButton";
2727
import TextField from "../../TextField";
2828
import ErrorDialog from "../../error/ErrorDialog";
2929
import { useSetDisabledStatusMutation } from "./mutations/setDisabledStatusMutation";
30+
import { useSetAccountValidPeriodMutation } from "./mutations/setAccountValidPeriodMutation";
3031
import { useAnonymizeUserMutation } from "./mutations/anonymizeUserMutation";
3132
import { useScheduleAccountAnonymizationMutation } from "./mutations/scheduleAccountAnonymization";
3233
import { useUnscheduleAccountAnonymizationMutation } from "./mutations/unscheduleAccountAnonymization";
@@ -1186,6 +1187,11 @@ export function AccountStatusDialog(
11861187
loading: setDisabledStatusLoading,
11871188
error: setDisabledStatusError,
11881189
} = useSetDisabledStatusMutation();
1190+
const {
1191+
setAccountValidPeriod,
1192+
loading: setAccountValidPeriodLoading,
1193+
error: setAccountValidPeriodError,
1194+
} = useSetAccountValidPeriodMutation();
11891195
const {
11901196
anonymizeUser,
11911197
loading: anonymizeUserLoading,
@@ -1219,6 +1225,7 @@ export function AccountStatusDialog(
12191225

12201226
const loading =
12211227
setDisabledStatusLoading ||
1228+
setAccountValidPeriodLoading ||
12221229
anonymizeUserLoading ||
12231230
scheduleAccountAnonymizationLoading ||
12241231
unscheduleAccountAnonymizationLoading ||
@@ -1227,6 +1234,7 @@ export function AccountStatusDialog(
12271234
unscheduleAccountDeletionLoading;
12281235
const error =
12291236
setDisabledStatusError ||
1237+
setAccountValidPeriodError ||
12301238
anonymizeUserError ||
12311239
scheduleAccountAnonymizationError ||
12321240
unscheduleAccountAnonymizationError ||
@@ -1280,6 +1288,25 @@ export function AccountStatusDialog(
12801288
}).finally(() => onDismiss({ deletedUser: false }));
12811289
}, [accountStatus.id, isHidden, loading, onDismiss, setDisabledStatus]);
12821290

1291+
const onClickSetAccountValidPeriod = useCallback(() => {
1292+
if (loading || isHidden) {
1293+
return;
1294+
}
1295+
setAccountValidPeriod({
1296+
userID: accountStatus.id,
1297+
accountValidFrom: accountValidFrom,
1298+
accountValidUntil: accountValidUntil,
1299+
}).finally(() => onDismiss({ deletedUser: false }));
1300+
}, [
1301+
accountStatus.id,
1302+
accountValidFrom,
1303+
accountValidUntil,
1304+
isHidden,
1305+
loading,
1306+
onDismiss,
1307+
setAccountValidPeriod,
1308+
]);
1309+
12831310
const onClickAnonymize = useCallback(() => {
12841311
if (loading || isHidden) {
12851312
return;
@@ -1479,6 +1506,7 @@ export function AccountStatusDialog(
14791506
text={
14801507
<FormattedMessage id="AccountStatusDialog.account-valid-period.action.save" />
14811508
}
1509+
onClick={onClickSetAccountValidPeriod}
14821510
/>
14831511
);
14841512
break;
@@ -1500,6 +1528,7 @@ export function AccountStatusDialog(
15001528
text={
15011529
<FormattedMessage id="AccountStatusDialog.account-valid-period.action.edit" />
15021530
}
1531+
onClick={onClickSetAccountValidPeriod}
15031532
/>
15041533
);
15051534
break;
@@ -1645,6 +1674,7 @@ export function AccountStatusDialog(
16451674
onClickReenable,
16461675
onClickScheduleAnonymization,
16471676
onClickScheduleDeletion,
1677+
onClickSetAccountValidPeriod,
16481678
onClickUnscheduleAnonymization,
16491679
onClickUnscheduleDeletion,
16501680
themes.destructive,
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import * as Types from '../globalTypes.generated';
2+
3+
import { gql } from '@apollo/client';
4+
import * as Apollo from '@apollo/client';
5+
const defaultOptions = {} as const;
6+
export type SetAccountValidPeriodMutationMutationVariables = Types.Exact<{
7+
userID: Types.Scalars['ID']['input'];
8+
accountValidFrom?: Types.InputMaybe<Types.Scalars['DateTime']['input']>;
9+
accountValidUntil?: Types.InputMaybe<Types.Scalars['DateTime']['input']>;
10+
}>;
11+
12+
13+
export type SetAccountValidPeriodMutationMutation = { __typename?: 'Mutation', setAccountValidPeriod: { __typename?: 'SetAccountValidPeriodPayload', user: { __typename?: 'User', id: string, isDisabled: boolean, disableReason?: string | null, isDeactivated: boolean, deleteAt?: any | null, isAnonymized: boolean, anonymizeAt?: any | null, temporarilyDisabledFrom?: any | null, temporarilyDisabledUntil?: any | null, accountValidFrom?: any | null, accountValidUntil?: any | null } } };
14+
15+
16+
export const SetAccountValidPeriodMutationDocument = gql`
17+
mutation setAccountValidPeriodMutation($userID: ID!, $accountValidFrom: DateTime, $accountValidUntil: DateTime) {
18+
setAccountValidPeriod(
19+
input: {userID: $userID, accountValidFrom: $accountValidFrom, accountValidUntil: $accountValidUntil}
20+
) {
21+
user {
22+
id
23+
isDisabled
24+
disableReason
25+
isDeactivated
26+
deleteAt
27+
isAnonymized
28+
anonymizeAt
29+
temporarilyDisabledFrom
30+
temporarilyDisabledUntil
31+
accountValidFrom
32+
accountValidUntil
33+
}
34+
}
35+
}
36+
`;
37+
export type SetAccountValidPeriodMutationMutationFn = Apollo.MutationFunction<SetAccountValidPeriodMutationMutation, SetAccountValidPeriodMutationMutationVariables>;
38+
39+
/**
40+
* __useSetAccountValidPeriodMutationMutation__
41+
*
42+
* To run a mutation, you first call `useSetAccountValidPeriodMutationMutation` within a React component and pass it any options that fit your needs.
43+
* When your component renders, `useSetAccountValidPeriodMutationMutation` returns a tuple that includes:
44+
* - A mutate function that you can call at any time to execute the mutation
45+
* - An object with fields that represent the current status of the mutation's execution
46+
*
47+
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
48+
*
49+
* @example
50+
* const [setAccountValidPeriodMutationMutation, { data, loading, error }] = useSetAccountValidPeriodMutationMutation({
51+
* variables: {
52+
* userID: // value for 'userID'
53+
* accountValidFrom: // value for 'accountValidFrom'
54+
* accountValidUntil: // value for 'accountValidUntil'
55+
* },
56+
* });
57+
*/
58+
export function useSetAccountValidPeriodMutationMutation(baseOptions?: Apollo.MutationHookOptions<SetAccountValidPeriodMutationMutation, SetAccountValidPeriodMutationMutationVariables>) {
59+
const options = {...defaultOptions, ...baseOptions}
60+
return Apollo.useMutation<SetAccountValidPeriodMutationMutation, SetAccountValidPeriodMutationMutationVariables>(SetAccountValidPeriodMutationDocument, options);
61+
}
62+
export type SetAccountValidPeriodMutationMutationHookResult = ReturnType<typeof useSetAccountValidPeriodMutationMutation>;
63+
export type SetAccountValidPeriodMutationMutationResult = Apollo.MutationResult<SetAccountValidPeriodMutationMutation>;
64+
export type SetAccountValidPeriodMutationMutationOptions = Apollo.BaseMutationOptions<SetAccountValidPeriodMutationMutation, SetAccountValidPeriodMutationMutationVariables>;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
mutation setAccountValidPeriodMutation(
2+
$userID: ID!,
3+
$accountValidFrom: DateTime,
4+
$accountValidUntil: DateTime
5+
) {
6+
setAccountValidPeriod(input: {
7+
userID: $userID,
8+
accountValidFrom: $accountValidFrom,
9+
accountValidUntil: $accountValidUntil
10+
}) {
11+
user {
12+
id
13+
isDisabled
14+
disableReason
15+
isDeactivated
16+
deleteAt
17+
isAnonymized
18+
anonymizeAt
19+
temporarilyDisabledFrom
20+
temporarilyDisabledUntil
21+
accountValidFrom
22+
accountValidUntil
23+
}
24+
}
25+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { useCallback } from "react";
2+
import { useMutation } from "@apollo/client";
3+
import {
4+
SetAccountValidPeriodMutationMutation,
5+
SetAccountValidPeriodMutationDocument,
6+
} from "./setAccountValidPeriodMutation.generated";
7+
8+
export function useSetAccountValidPeriodMutation(): {
9+
setAccountValidPeriod: (opts: {
10+
userID: string;
11+
accountValidFrom: Date | null;
12+
accountValidUntil: Date | null;
13+
}) => Promise<boolean>;
14+
loading: boolean;
15+
error: unknown;
16+
} {
17+
const [mutationFunction, { loading, error }] =
18+
useMutation<SetAccountValidPeriodMutationMutation>(
19+
SetAccountValidPeriodMutationDocument,
20+
{
21+
// Setting account valid period could terminate all sessions.
22+
// So we have to refetch queries that fetch sessions.
23+
refetchQueries: ["UserQuery"],
24+
}
25+
);
26+
27+
const setAccountValidPeriod = useCallback(
28+
async (opts: {
29+
userID: string;
30+
accountValidFrom: Date | null;
31+
accountValidUntil: Date | null;
32+
}) => {
33+
const result = await mutationFunction({
34+
variables: {
35+
userID: opts.userID,
36+
accountValidFrom: opts.accountValidFrom,
37+
accountvalidUntil: opts.accountValidUntil,
38+
},
39+
});
40+
41+
return !!result.data;
42+
},
43+
[mutationFunction]
44+
);
45+
46+
return { setAccountValidPeriod, loading, error };
47+
}

0 commit comments

Comments
 (0)