0e61abdd2f55bf094cfe96716cd223fdafd92a65
[arvados-workbench2.git] / src / store / link-account-panel / link-account-panel-reducer.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { linkAccountPanelActions, LinkAccountPanelAction } from "~/store/link-account-panel/link-account-panel-actions";
6 import { UserResource } from "~/models/user";
7
8 export enum LinkAccountPanelStatus {
9     NONE,
10     INITIAL,
11     HAS_SESSION_DATA,
12     LINKING,
13     ERROR
14 }
15
16 export enum LinkAccountPanelError {
17     NONE,
18     INACTIVE,
19     NON_ADMIN,
20     SAME_USER
21 }
22
23 export enum OriginatingUser {
24     NONE,
25     TARGET_USER,
26     USER_TO_LINK
27 }
28
29 export interface LinkAccountPanelState {
30     originatingUser: OriginatingUser | undefined;
31     targetUser: UserResource | undefined;
32     targetUserToken: string | undefined;
33     userToLink: UserResource | undefined;
34     userToLinkToken: string | undefined;
35     status: LinkAccountPanelStatus;
36     error: LinkAccountPanelError;
37 }
38
39 const initialState = {
40     originatingUser: OriginatingUser.NONE,
41     targetUser: undefined,
42     targetUserToken: undefined,
43     userToLink: undefined,
44     userToLinkToken: undefined,
45     status: LinkAccountPanelStatus.NONE,
46     error: LinkAccountPanelError.NONE
47 };
48
49 export const linkAccountPanelReducer = (state: LinkAccountPanelState = initialState, action: LinkAccountPanelAction) =>
50     linkAccountPanelActions.match(action, {
51         default: () => state,
52         LINK_INIT: ({ targetUser }) => ({
53             targetUser, targetUserToken: undefined,
54             userToLink: undefined, userToLinkToken: undefined,
55             status: LinkAccountPanelStatus.INITIAL, error: LinkAccountPanelError.NONE, originatingUser: OriginatingUser.NONE
56         }),
57         LINK_LOAD: ({ originatingUser, userToLink, targetUser, targetUserToken, userToLinkToken}) => ({
58             originatingUser,
59             targetUser, targetUserToken,
60             userToLink, userToLinkToken,
61             status: LinkAccountPanelStatus.LINKING, error: LinkAccountPanelError.NONE
62         }),
63         LINK_INVALID: ({originatingUser, targetUser, userToLink, error}) => ({
64             originatingUser,
65             targetUser, targetUserToken: undefined,
66             userToLink, userToLinkToken: undefined,
67             error, status: LinkAccountPanelStatus.ERROR
68         }),
69         HAS_SESSION_DATA: () => ({
70             ...state, status: LinkAccountPanelStatus.HAS_SESSION_DATA
71         })
72     });