Ramble-FE / hooks / useOAuth / index.ts
index.ts
Raw
import { OAUTH_CONFIGS } from "@/config";
import { OAuthService, getGoogleClientId } from "@/services/oauth";
import { OAuthProvider } from "@/types";
import { makeRedirectUri, useAuthRequest } from "expo-auth-session";
import Constants from "expo-constants";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useAppleLogin } from "./appleLogin";
import { UseOAuthProps } from "./types";

export const APP_SCHEME = (Constants.expoConfig?.scheme as string) || "ramble";

export function useOAuth({ onSuccess, onError }: UseOAuthProps) {
    const [isLoading, setIsLoading] = useState(false);
    const redirectUri = useMemo(() => makeRedirectUri({ scheme: APP_SCHEME }), []);

    // Google OAuth 설정
    const [requestGoogle, responseGoogle, promptAsyncGoogle] = useAuthRequest(
        {
            clientId: getGoogleClientId(),
            scopes: OAUTH_CONFIGS[OAuthProvider.GOOGLE].scopes,
            redirectUri,
            extraParams: {
                access_type: "offline",
                prompt: "consent",
            },
        },
        OAUTH_CONFIGS[OAuthProvider.GOOGLE].discovery,
    );

    // Google OAuth 응답 처리
    useEffect(() => {
        if (!responseGoogle) return;

        OAuthService.processAuthResponse(
            responseGoogle,
            requestGoogle,
            OAuthProvider.GOOGLE,
        )
            .then((result) => {
                if (result.success) onSuccess?.(result.success);
                else if (result.error) onError?.(result.error);
            })
            .finally(() => setIsLoading(false));
    }, [responseGoogle, requestGoogle, onSuccess, onError, setIsLoading]);

    // Google 로그인 시작 함수
    const startGoogleLogin = useCallback(async () => {
        if (isLoading) return;

        setIsLoading(true);

        const result = await OAuthService.startAuthPrompt(
            promptAsyncGoogle,
            OAuthProvider.GOOGLE,
        );

        if (!result.success && result.error) {
            onError?.(result.error);
            setIsLoading(false);
        }
    }, [isLoading, setIsLoading, onError, promptAsyncGoogle]);

    // Apple — 플랫폼별 구현에 위임
    const { startAppleLogin } = useAppleLogin({
        onSuccess,
        onError,
        isLoading,
        setIsLoading,
        redirectUri,
    });

    return {
        isLoading,
        startGoogleLogin,
        startAppleLogin,
    };
}