-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
signInStore.ts
87 lines (75 loc) · 2.16 KB
/
signInStore.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { CognitoAuthSignInDetails } from '../types';
import { ChallengeName } from '../../../foundation/factories/serviceClients/cognitoIdentityProvider/types';
// TODO: replace all of this implementation with state machines
interface SignInState {
username?: string;
challengeName?: ChallengeName;
signInSession?: string;
signInDetails?: CognitoAuthSignInDetails;
}
type SignInAction =
| { type: 'SET_INITIAL_STATE' }
| { type: 'SET_SIGN_IN_STATE'; value: SignInState }
| { type: 'SET_USERNAME'; value?: string }
| { type: 'SET_CHALLENGE_NAME'; value?: ChallengeName }
| { type: 'SET_SIGN_IN_SESSION'; value?: string };
type Store<State, Action> = (reducer: Reducer<State, Action>) => {
getState(): ReturnType<Reducer<State, Action>>;
dispatch(action: Action): void;
};
type Reducer<State, Action> = (state: State, action: Action) => State;
const signInReducer: Reducer<SignInState, SignInAction> = (state, action) => {
switch (action.type) {
case 'SET_SIGN_IN_SESSION':
return {
...state,
signInSession: action.value,
};
case 'SET_SIGN_IN_STATE':
return {
...action.value,
};
case 'SET_CHALLENGE_NAME':
return {
...state,
challengeName: action.value,
};
case 'SET_USERNAME':
return {
...state,
username: action.value,
};
case 'SET_INITIAL_STATE':
return defaultState();
default:
return state;
}
};
function defaultState(): SignInState {
return {
username: undefined,
challengeName: undefined,
signInSession: undefined,
};
}
const createStore: Store<SignInState, SignInAction> = reducer => {
let currentState = reducer(defaultState(), { type: 'SET_INITIAL_STATE' });
return {
getState: () => currentState,
dispatch: action => {
currentState = reducer(currentState, action);
},
};
};
export const signInStore = createStore(signInReducer);
export function setActiveSignInState(state: SignInState): void {
signInStore.dispatch({
type: 'SET_SIGN_IN_STATE',
value: state,
});
}
export function cleanActiveSignInState(): void {
signInStore.dispatch({ type: 'SET_INITIAL_STATE' });
}