FrontEnd: Playing with store (solidjs)
This commit is contained in:
@@ -1,22 +1,68 @@
|
||||
import { useLocation, useNavigate } from "@solidjs/router";
|
||||
import { createContext } from "solid-js";
|
||||
import { createContext, onMount, Show, useContext } from "solid-js";
|
||||
import { createStore } from "solid-js/store";
|
||||
import { UserType } from "supertokens-web-js/recipe/emailpassword";
|
||||
import AuthLoader from "../components/AuthLoader";
|
||||
import { currentUser } from "../services/auth.service";
|
||||
|
||||
const AuthStateContext = createContext();
|
||||
const AuthDispatchContext = createContext();
|
||||
const AuthDispatchContext = createContext<any>();
|
||||
|
||||
const initialState = {
|
||||
interface InitState {
|
||||
isLoading: boolean;
|
||||
isAuthenticated: boolean;
|
||||
currentUser: UserType | null;
|
||||
}
|
||||
|
||||
const initialState: InitState = {
|
||||
isLoading: false,
|
||||
isAuthenticated: false,
|
||||
isLoading: true,
|
||||
currentUser: null,
|
||||
currentAccount: null,
|
||||
};
|
||||
|
||||
const AuthProvider = (props: any) => {
|
||||
|
||||
const [store, setStore] = createStore(initialState);
|
||||
const navigate = useNavigate();
|
||||
const location = useLocation();
|
||||
|
||||
const loadCurrentUser = async () => {
|
||||
const user = await currentUser();
|
||||
if (user) {
|
||||
setStore("isAuthenticated", true);
|
||||
setStore("currentUser", user);
|
||||
}
|
||||
};
|
||||
|
||||
onMount(async () => {
|
||||
await loadCurrentUser();
|
||||
});
|
||||
|
||||
const setCurrentUser = (user: UserType) => {
|
||||
setStore("isAuthenticated", true);
|
||||
setStore("currentUser", user);
|
||||
setStore("isLoading", false);
|
||||
};
|
||||
const removeCurrentUser = () => {
|
||||
setStore("isAuthenticated", false);
|
||||
setStore("currentUser", null);
|
||||
};
|
||||
|
||||
return (
|
||||
<AuthStateContext.Provider value={store}>
|
||||
<AuthDispatchContext.Provider
|
||||
value={{
|
||||
setCurrentUser,
|
||||
removeCurrentUser,
|
||||
}}
|
||||
>
|
||||
<Show when={!store.isLoading} fallback={<AuthLoader />}>
|
||||
{props.children}
|
||||
</Show>
|
||||
</AuthDispatchContext.Provider>
|
||||
</AuthStateContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
export default AuthProvider;
|
||||
export const useAuthState = () => useContext(AuthStateContext);
|
||||
export const useAuthDispatch = () => useContext(AuthDispatchContext);
|
||||
|
||||
Reference in New Issue
Block a user