import React, { createContext, Dispatch, SetStateAction, useState, useEffect, useCallback, ReactNode } from 'react' import axios from 'axios' export enum ModeType { Server = 'server', Desktop = 'desktop' } export enum RunTimeType { SAS = 'sas', JS = 'js', PY = 'py', R = 'r' } interface AppContextProps { checkingSession: boolean loggedIn: boolean setLoggedIn?: Dispatch> needsToUpdatePassword: boolean setNeedsToUpdatePassword?: Dispatch> userId?: string setUserId?: Dispatch> username: string setUsername?: Dispatch> displayName: string setDisplayName?: Dispatch> isAdmin: boolean setIsAdmin?: Dispatch> mode: ModeType runTimes: RunTimeType[] logout?: () => void } export const AppContext = createContext({ checkingSession: false, loggedIn: false, needsToUpdatePassword: false, userId: '', username: '', displayName: '', isAdmin: false, mode: ModeType.Server, runTimes: [] }) const AppContextProvider = (props: { children: ReactNode }) => { const { children } = props const [checkingSession, setCheckingSession] = useState(false) const [loggedIn, setLoggedIn] = useState(false) const [needsToUpdatePassword, setNeedsToUpdatePassword] = useState(false) const [userId, setUserId] = useState() const [username, setUsername] = useState('') const [displayName, setDisplayName] = useState('') const [isAdmin, setIsAdmin] = useState(false) const [mode, setMode] = useState(ModeType.Server) const [runTimes, setRunTimes] = useState([]) useEffect(() => { setCheckingSession(true) axios .get('/SASjsApi/session') .then((res) => res.data) .then((data: any) => { setCheckingSession(false) setUserId(data.id) setUsername(data.username) setDisplayName(data.displayName) setIsAdmin(data.isAdmin) setLoggedIn(true) setNeedsToUpdatePassword(data.needsToUpdatePassword) }) .catch(() => { setLoggedIn(false) // get CSRF TOKEN and set cookie axios .get('/') .then((res) => res.data) .then((data: string) => { const result = /