0xtrails
Version:
SDK for Trails
150 lines (136 loc) • 3.87 kB
text/typescript
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
}