import { useEffect, useState, useCallback } from "react"; import { FacebookLoginResponse, FacebookLoginError, FacebookUser, FacebookSDKInitOptions, } from "@/types/facebook-login"; export interface UseFacebookLoginOptions extends FacebookSDKInitOptions {} export const useFacebookLogin = (options: UseFacebookLoginOptions) => { const [isLoaded, setIsLoaded] = useState(false); const [isLoggedIn, setIsLoggedIn] = useState(false); const [user, setUser] = useState(null); const { appId, version = "v18.0", cookie = true, xfbml = true, autoLogAppEvents = true, } = options; // Initialize Facebook SDK useEffect(() => { if (typeof window === "undefined") return; // Load Facebook SDK if not already loaded if (!window.FB) { const script = document.createElement("script"); script.src = `https://connect.facebook.net/en_US/sdk.js`; script.async = true; script.defer = true; script.crossOrigin = "anonymous"; window.fbAsyncInit = () => { window.FB.init({ appId, cookie, xfbml, version, autoLogAppEvents, }); setIsLoaded(true); // Check login status window.FB.getLoginStatus((response: any) => { if (response.status === "connected") { setIsLoggedIn(true); getUserInfo(response.authResponse.accessToken); } }); }; document.head.appendChild(script); } else { setIsLoaded(true); } return () => { // Cleanup if needed }; }, [appId, cookie, xfbml, version, autoLogAppEvents]); const getUserInfo = useCallback((accessToken: string) => { window.FB.api( "/me", { fields: "name,email,picture" }, (response: FacebookUser) => { if (response && !response.error) { setUser(response); } } ); }, []); const login = useCallback( (permissions: string[] = ["public_profile", "email"]) => { return new Promise((resolve, reject) => { if (!window.FB) { reject(new Error("Facebook SDK not loaded")); return; } window.FB.login( (response: any) => { if (response.status === "connected") { setIsLoggedIn(true); getUserInfo(response.authResponse.accessToken); resolve(response.authResponse); } else if (response.status === "not_authorized") { reject({ error: "not_authorized", errorDescription: "User denied permissions", }); } else { reject({ error: "unknown", errorDescription: "Login failed" }); } }, { scope: permissions.join(",") } ); }); }, [getUserInfo] ); const logout = useCallback(() => { return new Promise((resolve, reject) => { if (!window.FB) { reject(new Error("Facebook SDK not loaded")); return; } window.FB.logout((response: any) => { setIsLoggedIn(false); setUser(null); resolve(); }); }); }, []); const getLoginStatus = useCallback(() => { return new Promise((resolve, reject) => { if (!window.FB) { reject(new Error("Facebook SDK not loaded")); return; } window.FB.getLoginStatus((response: any) => { resolve(response); }); }); }, []); return { isLoaded, isLoggedIn, user, login, logout, getLoginStatus, }; };