55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import * as React from 'react';
|
|
|
|
import { User } from '../../../types/user';
|
|
import { authClient } from '../../../lib/auth/custom/client';
|
|
|
|
import type { UserContextValue } from '../types';
|
|
|
|
export const UserContext = React.createContext<UserContextValue | undefined>(undefined);
|
|
|
|
export interface UserProviderProps {
|
|
children: React.ReactNode;
|
|
}
|
|
|
|
export function UserProvider({ children }: UserProviderProps): React.JSX.Element {
|
|
const [state, setState] = React.useState<{ user: User | null; error: string | null; isLoading: boolean }>({
|
|
user: null,
|
|
error: null,
|
|
isLoading: true,
|
|
});
|
|
|
|
const checkSession = React.useCallback(async (): Promise<void> => {
|
|
try {
|
|
const { data, error } = await authClient.getUser();
|
|
|
|
if (error) {
|
|
// logger.error(error);
|
|
setState((prev) => ({ ...prev, user: null, error: 'Something went wrong', isLoading: false }));
|
|
return;
|
|
}
|
|
|
|
setState((prev) => ({ ...prev, user: data ?? null, error: null, isLoading: false }));
|
|
} catch (err) {
|
|
// logger.error(err);
|
|
setState((prev) => ({ ...prev, user: null, error: 'Something went wrong', isLoading: false }));
|
|
}
|
|
}, []);
|
|
|
|
React.useEffect(() => {
|
|
checkSession().catch((err) => {
|
|
// logger.error(err);
|
|
// noop
|
|
});
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps -- Expected
|
|
}, []);
|
|
|
|
return (
|
|
<UserContext.Provider value={{ ...state, checkSession }}>
|
|
{/* */}
|
|
{children}
|
|
</UserContext.Provider>
|
|
);
|
|
}
|
|
|
|
export const UserConsumer = UserContext.Consumer;
|