1+ import * as React from "react" ;
2+ import { createContext , useReducer , useContext , Dispatch } from "react" ;
3+ import { IInputs } from "./generated/ManifestTypes" ;
4+ import { rootReducer , IRootState } from "./store" ;
5+ import { UserlistActions } from "./store/userlist/actions" ;
6+ import { AuthActions , AuthActionTypes } from "./store/auth/actions" ;
7+ import { AuthProvider , IIdentity } from "./AuthProvider" ;
8+ import { IAppProps } from "./App" ;
9+
10+ const initialState : IRootState = {
11+ auth : {
12+ authenticated : false
13+ } ,
14+ userlist : {
15+ users : [ ]
16+ }
17+ } ;
18+
19+ export interface IAppContext {
20+ authProvider : AuthProvider ,
21+ componentContext : ComponentFramework . Context < IInputs > ,
22+ state : IRootState ,
23+ dispatch : Dispatch < UserlistActions | AuthActions >
24+ }
25+
26+ export const AppContext = createContext < IAppContext > ( { } as IAppContext ) ;
27+
28+ export const AppProvider : React . FC < IAppProps > = ( props ) => {
29+ const [ state , dispatch ] = useReducer ( rootReducer , initialState ) ;
30+ const { authProvider, componentContext } = props ;
31+ return (
32+ < AppContext . Provider value = { { authProvider, componentContext, state, dispatch } } >
33+ { props . children }
34+ </ AppContext . Provider >
35+ ) ;
36+ } ;
37+
38+ export const useAppContext = ( ) => useContext ( AppContext ) ;
39+
40+ export const useAuthContext = ( ) => {
41+ const { authProvider, state, dispatch } = useAppContext ( ) ;
42+ const { auth } = state ;
43+
44+ const login = ( ) => {
45+ authProvider . login ( ) . then ( ( ) => {
46+ dispatch ( {
47+ type : AuthActionTypes . LOGIN_SUCCESS
48+ } ) ;
49+ } , ( err ) => {
50+ dispatch ( {
51+ type : AuthActionTypes . LOGIN_FAILURE ,
52+ payload : err
53+ } ) ;
54+ } ) ;
55+ } ;
56+
57+ const logout = ( ) => {
58+ authProvider . logout ( ) ;
59+ dispatch ( {
60+ type : AuthActionTypes . LOGOUT
61+ } ) ;
62+ } ;
63+
64+ const getAccessToken = async ( ) : Promise < string > => {
65+ return authProvider . getAccessToken ( ) ;
66+ } ;
67+
68+ const handleAuthentication = async ( ) => {
69+ const account = authProvider . getAccount ( ) ;
70+ if ( authProvider . getAccount ( ) ) {
71+ await authProvider . getIdentity ( ) . then ( ( identity ?: IIdentity ) => {
72+ if ( identity ) {
73+ dispatch ( {
74+ type : AuthActionTypes . SET_IDENTITY ,
75+ payload : identity
76+ } ) ;
77+ }
78+ } , ( err ) => {
79+ dispatch ( {
80+ type : AuthActionTypes . AUTH_FAILURE ,
81+ payload : err
82+ } ) ;
83+ } ) ;
84+ }
85+ return account ;
86+ } ;
87+
88+ return {
89+ authenticated : auth . authenticated ,
90+ identity : auth . identity ,
91+ login,
92+ logout,
93+ getAccessToken,
94+ handleAuthentication
95+ } ;
96+ }
0 commit comments