UNPKG

@fine-dev/fine-js

Version:

Javascript client for Fine BaaS

92 lines (75 loc) 3.35 kB
import { type FormEventHandler, useCallback, useEffect, useState } from "react" export type ClientInfo = { clientName?: string clientUri?: string policyUri?: string tosUri?: string contacts?: string[] redirectUris?: string[] } type AuthorizationData = { client: ClientInfo | null state: Record<string, any> } export function createOAuthApprovalHook(baseURL: string) { /** * Custom hook that encapsulates the OAuth approval logic */ return function useOAuthApproval() { const [data, setData] = useState<AuthorizationData | null>(null) const [status, setStatus] = useState<"loading" | "submitting" | null>(null) const [error, setError] = useState<string | null>(null) useEffect(() => { const fetchAuthorizationData = async () => { try { setStatus("loading") const url = `${baseURL}/authorize${window.location.search}` const response = await fetch(url, { credentials: "include" }) if (!response.ok) throw new Error(`Failed to fetch authorization data: ${response.statusText}`) const authData = (await response.json()) as AuthorizationData | { redirectUrl: string } if ("redirectUrl" in authData) return (window.location.href = authData.redirectUrl) // Add default values to the client object const client = (authData.client ||= {}) client.clientUri ||= "" client.policyUri ||= "" client.tosUri ||= "" client.redirectUris ||= [] client.contacts ||= [] client.clientName ||= "Unknown MCP Client" setData(authData) } catch (err) { setError(err instanceof Error ? err.message : "Unknown error occurred") console.error("Error fetching authorization data:", err) } finally { setStatus(null) } } fetchAuthorizationData() }, []) const handleSubmit = useCallback<FormEventHandler>( async (e) => { e.preventDefault() if (!data) return try { setStatus("submitting") const formData = new FormData() formData.append("state", btoa(JSON.stringify(data.state))) const response = await fetch(`${baseURL}/authorize`, { method: "POST", body: formData, credentials: "include" }) if (!response.ok) throw new Error(`Authorization failed: ${response.statusText}`) const { redirectUrl } = await response.json() window.location.href = redirectUrl } catch (err) { setError(err instanceof Error ? err.message : "Unknown error occurred") console.error("Error during authorization:", err) setStatus(null) } }, [data] ) return { status, error, handleSubmit, ...data?.client } } }