I am currently storing user information within a context object within my React app.
export const SessionContext = createContext(null);
export const SessionContextProvider = ({ children }) => {
console.debug("RTS Break SessionContextProvider");
const [user, setUser] = useState(null);
const [userAuthorized, setUserAuthorized] = useState(false);
const [userAuthToken, setUserAuthToken] = useState(null);
const [sessionCustomer, setSessionCustomer] = useState(null);
const [prevSessionCustomer, setPrevSessionCustomer] = useState(null);
const [appMode, setAppMode] = useState(null);
const apiRoot = process.env.REACT_APP_API_URL;
const userLogOut = () => {
setUserAuthToken("");
setUser(null);
setUserAuthorized(false);
setSessionCustomer(null);
setPrevSessionCustomer(null);
}
const value = {
user,
setUser,
userAuthorized,
setUserAuthorized,
userAuthToken,
setUserAuthToken,
sessionCustomer,
setSessionCustomer,
prevSessionCustomer,
setPrevSessionCustomer,
appMode,
setAppMode,
apiRoot,
userLogOut
};
return(
<SessionContext.Provider value={value}> {children} </SessionContext.Provider>
);
};
export const useSessionContext = () => React.useContext(SessionContext);
As you can see I am storing a number of different things including child objects within this Context object. In order for all objects to have access to this data I have wrapped my main window within the provider within App.js.
export default function App(props) {
return (
<ThemeProvider theme={theme}>
<SessionContextProvider>
<BrowserRouter>
<Box id="appBox">
<Main />
</Box>
</BrowserRouter>
</SessionContextProvider>
</ThemeProvider>
);
Some of the attributes on my context object are set when the user logs in and some are set as they use the product. Here is some of the code in my login control that saves the data to my context object after a user is successfully authenticated:
if (res.status === 200 && res.data.token) {
try{
setUserAuthToken({'token': res.data.token});
}
catch(err){
console.log("Token Error");
console.log(err);
}
try{
setUser(res.data.user);
}
catch(err){
console.log("User Data Error");
console.log(err);
}
try{
setUserAuthorized(true);
}
catch(err){
console.log("Authorization Error");
console.log(err);
}
I am still somewhat of a noob to React so I have a couple of questions.
// Building and saving your sessionObject
const sessionObject = { user: user, userAuthorized: userAuthorized, ... };
sessionStorage.setItem("session", JSON.stringify(sessionObject));
/// Retrieving your whole sessionObject
const storedSession = sessionStorage.getItem("session");
if (storedSession) {
const { user, userAuthorized, ... } = JSON.parse(storedSession);
} else {
// No session stored
}
SessionContextProvider
and use useState
to set the initial state of each context value like this:export const SessionContextProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [userAuthorized, setUserAuthorized] = useState(false);
const [userAuthToken, setUserAuthToken] = useState(null);
const [sessionCustomer, setSessionCustomer] = useState(null);
const [prevSessionCustomer, setPrevSessionCustomer] = useState(null);
const [appMode, setAppMode] = useState(null);
const apiRoot = process.env.REACT_APP_API_URL;
useEffect(() => {
const storedSession = sessionStorage.getItem("session");
if (storedSession) {
const session = JSON.parse(storedSession);
setUser(session.user);
setUserAuthorized(session.userAuthorized);
setUserAuthToken(session.userAuthToken);
setSessionCustomer(session.sessionCustomer);
setPrevSessionCustomer(session.prevSessionCustomer);
setAppMode(session.appMode);
}
}, []);
const userLogOut = () => {
setUserAuthToken("");
setUser(null);
setUserAuthorized(false);
setSessionCustomer(null);
setPrevSessionCustomer(null);
}
const value = {
user,
setUser,
userAuthorized,
setUserAuthorized,
userAuthToken,
setUserAuthToken,
sessionCustomer,
setSessionCustomer,
prevSessionCustomer,
setPrevSessionCustomer,
appMode,
setAppMode,
apiRoot,
userLogOut
};
return (
<SessionContext.Provider value={value}>
{children}
</SessionContext.Provider>
);
};