feat: 기능 추가 과정중
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
import {
|
||||
createContext,
|
||||
useContext,
|
||||
useMemo,
|
||||
useSyncExternalStore,
|
||||
type ReactNode,
|
||||
} from "react";
|
||||
|
||||
import type {
|
||||
ApplicationApi,
|
||||
SessionState,
|
||||
} from "../../application/ports/in/application-api.ts";
|
||||
import { useApplication } from "./application-provider.tsx";
|
||||
|
||||
export type SessionContextValue = Readonly<{
|
||||
sessionState: SessionState;
|
||||
beginSignIn: ApplicationApi["session"]["beginSignIn"];
|
||||
signOut: ApplicationApi["session"]["signOut"];
|
||||
recover: ApplicationApi["session"]["recover"];
|
||||
}>;
|
||||
|
||||
const SessionContext = createContext<SessionContextValue | null>(null);
|
||||
|
||||
export function SessionProvider({
|
||||
children,
|
||||
}: Readonly<{ children: ReactNode }>) {
|
||||
const { session } = useApplication();
|
||||
const sessionState = useSyncExternalStore(
|
||||
session.subscribe,
|
||||
session.getSnapshot,
|
||||
session.getSnapshot,
|
||||
);
|
||||
const value = useMemo<SessionContextValue>(
|
||||
() =>
|
||||
Object.freeze({
|
||||
sessionState,
|
||||
beginSignIn: session.beginSignIn,
|
||||
signOut: session.signOut,
|
||||
recover: session.recover,
|
||||
}),
|
||||
[session, sessionState],
|
||||
);
|
||||
|
||||
return (
|
||||
<SessionContext.Provider value={value}>{children}</SessionContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
export function useSession(): SessionContextValue {
|
||||
const session = useContext(SessionContext);
|
||||
if (!session) {
|
||||
throw new Error("SessionProvider is required");
|
||||
}
|
||||
return session;
|
||||
}
|
||||
Reference in New Issue
Block a user