Ramble-FE / hooks / useOAuth / appleLogin.ts
appleLogin.ts
Raw
import { APPLE_CLIENT_ID, OAUTH_CONFIGS } from "@/config";
import { OAuthService } from "@/services/oauth";
import { OAuthProvider } from "@/types";
import { useAuthRequest } from "expo-auth-session";
import { useCallback, useEffect } from "react";
import { UseAppleLoginProps } from "./types";

export function useAppleLogin({
    onSuccess,
    onError,
    isLoading,
    setIsLoading,
    redirectUri,
}: UseAppleLoginProps) {
    // Apple OAuth 설정 (expo-auth-session)
    const [requestApple, responseApple, promptAsyncApple] = useAuthRequest(
        {
            clientId: APPLE_CLIENT_ID,
            scopes: OAUTH_CONFIGS[OAuthProvider.APPLE].scopes,
            redirectUri,
            extraParams: {
                access_type: "offline",
                prompt: "consent",
            },
        },
        OAUTH_CONFIGS[OAuthProvider.APPLE].discovery,
    );

    useEffect(() => {
        if (!responseApple) return;

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

    const startAppleLogin = useCallback(async () => {
        if (isLoading) return;

        setIsLoading(true);

        const result = await OAuthService.startAuthPrompt(
            promptAsyncApple,
            OAuthProvider.APPLE,
        );

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

    return { startAppleLogin };
}