0b2d65a4e9
Mobile app detects SSO per server, supports OAuth sign-in, and preserves saved sessions when adding accounts. Tab screens get proper chrome layout and tab-bar clearance with scrollable page headers. Co-authored-by: Cursor <cursoragent@cursor.com>
56 lines
1.3 KiB
TypeScript
56 lines
1.3 KiB
TypeScript
import { expoClient } from "@better-auth/expo/client";
|
|
import { createAuthClient } from "better-auth/react";
|
|
import { genericOAuthClient } from "better-auth/client/plugins";
|
|
import * as SecureStore from "expo-secure-store";
|
|
import {
|
|
createContext,
|
|
useContext,
|
|
useMemo,
|
|
type ReactNode,
|
|
} from "react";
|
|
|
|
type AuthClient = ReturnType<typeof createAuthClient>;
|
|
|
|
function createAppAuthClient(apiUrl: string, storagePrefix: string): AuthClient {
|
|
return createAuthClient({
|
|
baseURL: apiUrl,
|
|
plugins: [
|
|
expoClient({
|
|
scheme: "beenvoice",
|
|
storagePrefix,
|
|
storage: SecureStore,
|
|
}),
|
|
genericOAuthClient(),
|
|
],
|
|
});
|
|
}
|
|
|
|
const AuthContext = createContext<AuthClient | null>(null);
|
|
|
|
export function AuthProvider({
|
|
apiUrl,
|
|
storagePrefix,
|
|
children,
|
|
}: {
|
|
apiUrl: string;
|
|
storagePrefix: string;
|
|
children: ReactNode;
|
|
}) {
|
|
const client = useMemo(
|
|
() => createAppAuthClient(apiUrl, storagePrefix),
|
|
[apiUrl, storagePrefix],
|
|
);
|
|
|
|
return <AuthContext.Provider value={client}>{children}</AuthContext.Provider>;
|
|
}
|
|
|
|
export function useAuthClient() {
|
|
const client = useContext(AuthContext);
|
|
if (!client) throw new Error("useAuthClient must be used within AuthProvider");
|
|
return client;
|
|
}
|
|
|
|
export function useSession() {
|
|
return useAuthClient().useSession();
|
|
}
|