a8533185ba623d7270523e2b3fbdf8dcd6e90ae4
[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     INITIAL,
10     HAS_SESSION_DATA,
11     LINKING,
12     ERROR
13 }
14
15 export enum LinkAccountPanelError {
16     NONE,
17     INACTIVE,
18     NON_ADMIN,
19     SAME_USER
20 }
21
22 export enum OriginatingUser {
23     NONE,
24     TARGET_USER,
25     USER_TO_LINK
26 }
27
28 export interface LinkAccountPanelState {
29     originatingUser: OriginatingUser | undefined;
30     targetUser: UserResource | undefined;
31     targetUserToken: string | undefined;
32     userToLink: UserResource | undefined;
33     userToLinkToken: string | undefined;
34     status: LinkAccountPanelStatus;
35     error: LinkAccountPanelError;
36 }
37
38 const initialState = {
39     originatingUser: undefined,
40     targetUser: undefined,
41     targetUserToken: undefined,
42     userToLink: undefined,
43     userToLinkToken: undefined,
44     status: LinkAccountPanelStatus.INITIAL,
45     error: LinkAccountPanelError.NONE
46 };
47
48 export const linkAccountPanelReducer = (state: LinkAccountPanelState = initialState, action: LinkAccountPanelAction) =>
49     linkAccountPanelActions.match(action, {
50         default: () => state,
51         LINK_INIT: ({ targetUser }) => ({
52             ...state, targetUser, status: LinkAccountPanelStatus.INITIAL, error: LinkAccountPanelError.NONE, originatingUser: OriginatingUser.NONE
53         }),
54         LINK_LOAD: ({ originatingUser, userToLink, targetUser, targetUserToken, userToLinkToken}) => ({
55             ...state, originatingUser, targetUser, targetUserToken, userToLink, userToLinkToken, status: LinkAccountPanelStatus.LINKING, error: LinkAccountPanelError.NONE
56         }),
57         LINK_INVALID: ({originatingUser, targetUser, userToLink, error}) => ({
58             ...state, originatingUser, targetUser, userToLink, error, status: LinkAccountPanelStatus.ERROR
59         }),
60         HAS_SESSION_DATA: () => ({
61             ...state, status: LinkAccountPanelStatus.HAS_SESSION_DATA
62         })
63     });