UNPKG

0xtrails

Version:

SDK for Trails

150 lines (136 loc) 3.87 kB
import { useCallback, useRef } from "react" import { getSessionId } from "../../analytics.js" import { logger } from "../../logger.js" export type CheckoutCallbacks = { onCheckoutStart?: (data: { sessionId: string }) => void onCheckoutQuote?: (data: { sessionId: string; quote: any }) => void onCheckoutComplete?: (data: { sessionId: string }) => void onCheckoutError?: (data: { sessionId: string; error: string }) => void onCheckoutStatusUpdate?: (data: { sessionId: string transactionStates: any[] }) => void } export type CheckoutOnHandlers = { triggerCheckoutStart: () => void triggerCheckoutQuote: (quote: any) => void triggerCheckoutComplete: () => void triggerCheckoutError: (error: string) => void triggerCheckoutStatusUpdate: (transactionStates: any[]) => void } export type UseCheckoutProps = CheckoutCallbacks export type UseCheckoutReturn = { sessionId: string startCheckout: () => void checkoutOnHandlers: CheckoutOnHandlers } /** * Hook to manage checkout session state and callback handlers * Tracks session ID and provides methods to trigger checkout callbacks */ export function useCheckout({ onCheckoutStart, onCheckoutQuote, onCheckoutComplete, onCheckoutError, onCheckoutStatusUpdate, }: UseCheckoutProps): UseCheckoutReturn { const sessionIdRef = useRef<string>(getSessionId()) const startCheckout = useCallback(() => { sessionIdRef.current = getSessionId() }, []) const triggerCheckoutStart = useCallback(() => { if (onCheckoutStart && sessionIdRef.current) { try { onCheckoutStart({ sessionId: sessionIdRef.current, }) } catch (error) { logger.console.error( "[trails-sdk] Error calling onCheckoutStart:", error, ) } } }, [onCheckoutStart]) const triggerCheckoutQuote = useCallback( (quote: any) => { if (onCheckoutQuote && sessionIdRef.current) { try { onCheckoutQuote({ sessionId: sessionIdRef.current, quote, }) } catch (error) { logger.console.error( "[trails-sdk] Error calling onCheckoutQuote:", error, ) } } }, [onCheckoutQuote], ) const triggerCheckoutComplete = useCallback(() => { if (onCheckoutComplete && sessionIdRef.current) { try { onCheckoutComplete({ sessionId: sessionIdRef.current, }) } catch (error) { logger.console.error( "[trails-sdk] Error calling onCheckoutComplete:", error, ) } } }, [onCheckoutComplete]) const triggerCheckoutError = useCallback( (error: string) => { if (onCheckoutError && sessionIdRef.current) { try { onCheckoutError({ sessionId: sessionIdRef.current, error, }) } catch (error) { logger.console.error( "[trails-sdk] Error calling onCheckoutError:", error, ) } } }, [onCheckoutError], ) const triggerCheckoutStatusUpdate = useCallback( (transactionStates: any[]) => { if (onCheckoutStatusUpdate && sessionIdRef.current) { try { onCheckoutStatusUpdate({ sessionId: sessionIdRef.current, transactionStates, }) } catch (error) { logger.console.error( "[trails-sdk] Error calling onCheckoutStatusUpdate:", error, ) } } }, [onCheckoutStatusUpdate], ) const result = { sessionId: sessionIdRef.current, startCheckout, checkoutOnHandlers: { triggerCheckoutStart, triggerCheckoutQuote, triggerCheckoutComplete, triggerCheckoutError, triggerCheckoutStatusUpdate, }, } return result }