15088: Adds federated account linking
[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     selectedCluster: string | undefined;
31     originatingUser: OriginatingUser | undefined;
32     targetUser: UserResource | undefined;
33     targetUserToken: string | undefined;
34     userToLink: UserResource | undefined;
35     userToLinkToken: string | undefined;
36     status: LinkAccountPanelStatus;
37     error: LinkAccountPanelError;
38 }
39
40 const initialState = {
41     selectedCluster: undefined,
42     originatingUser: OriginatingUser.NONE,
43     targetUser: undefined,
44     targetUserToken: undefined,
45     userToLink: undefined,
46     userToLinkToken: undefined,
47     status: LinkAccountPanelStatus.NONE,
48     error: LinkAccountPanelError.NONE
49 };
50
51 export const linkAccountPanelReducer = (state: LinkAccountPanelState = initialState, action: LinkAccountPanelAction) =>
52     linkAccountPanelActions.match(action, {
53         default: () => state,
54         LINK_INIT: ({ targetUser }) => ({
55             ...state,
56             targetUser, targetUserToken: undefined,
57             userToLink: undefined, userToLinkToken: undefined,
58             status: LinkAccountPanelStatus.INITIAL, error: LinkAccountPanelError.NONE, originatingUser: OriginatingUser.NONE
59         }),
60         LINK_LOAD: ({ originatingUser, userToLink, targetUser, targetUserToken, userToLinkToken}) => ({
61             ...state,
62             originatingUser,
63             targetUser, targetUserToken,
64             userToLink, userToLinkToken,
65             status: LinkAccountPanelStatus.LINKING, error: LinkAccountPanelError.NONE
66         }),
67         LINK_INVALID: ({ originatingUser, targetUser, userToLink, error }) => ({
68             ...state,
69             originatingUser,
70             targetUser, targetUserToken: undefined,
71             userToLink, userToLinkToken: undefined,
72             error, status: LinkAccountPanelStatus.ERROR
73         }),
74         SET_SELECTED_CLUSTER: ({ selectedCluster }) => ({
75             ...state, selectedCluster
76         }),
77         HAS_SESSION_DATA: () => ({
78             ...state, status: LinkAccountPanelStatus.HAS_SESSION_DATA
79         })
80     });