Files
lettersoup-online/002_source/ionic_mobile/src/contexts/auth/custom/user-context.tsx
2025-05-14 15:17:04 +08:00

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;