{"version":3,"sources":["../src/index.ts","../src/provider.tsx","../src/context.tsx","../src/hooks.ts","../src/utils.ts"],"sourcesContent":["export { TapsilatProvider } from './provider';\nexport type { TapsilatProviderProps } from './provider';\n\nexport { useTapsilat, useTapsilatClient, useTapsilatOrder, useTapsilatWebhook, useTapsilatHealth } from './hooks';\nexport type {\n  UseTapsilatOrderResult,\n  UseTapsilatWebhookResult,\n  UseTapsilatHealthResult,\n  WebhookVerificationInput,\n} from './hooks';\n\nexport type { TapsilatContextValue } from './context';\n","import { PropsWithChildren, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { TapsilatSDK, type TapsilatConfig } from '@tapsilat/tapsilat-js';\n\nimport { TapsilatContext, type TapsilatContextValue } from './context';\n\nexport type TapsilatProviderProps = PropsWithChildren<{\n  /**\n   * Configuration used to bootstrap the SDK instance. Provide a memoized object\n   * or a factory function to avoid unnecessary re-instantiations when the\n   * provider re-renders.\n   */\n  config: TapsilatConfig | (() => TapsilatConfig);\n  /**\n   * Handler that receives SDK related errors (for logging/alerting).\n   */\n  onError?: (error: Error) => void;\n}>;\n\ninterface ProviderState {\n  client: TapsilatSDK | null;\n  config: TapsilatConfig | null;\n  lastError?: Error;\n}\n\nconst stableHash = (config: TapsilatConfig | null): string => {\n  if (!config) {\n    return '';\n  }\n\n  return Object.keys(config)\n    .sort()\n    .map((key) => `${key}:${JSON.stringify(config[key as keyof TapsilatConfig])}`)\n    .join('|');\n};\n\nconst resolveConfig = (config: TapsilatProviderProps['config']): TapsilatConfig => {\n  const value = typeof config === 'function' ? config() : config;\n\n  if (!value || typeof value !== 'object') {\n    throw new Error('TapsilatProvider config must be an object or factory function.');\n  }\n\n  if (!value.bearerToken) {\n    throw new Error('TapsilatProvider config must include a bearerToken.');\n  }\n\n  return { ...value };\n};\n\nconst instantiateClient = (config: TapsilatConfig): TapsilatSDK => new TapsilatSDK(config);\n\nexport const TapsilatProvider = ({ config, onError, children }: TapsilatProviderProps) => {\n  const [state, setState] = useState<ProviderState>(() => {\n    try {\n      const resolved = resolveConfig(config);\n      return {\n        client: instantiateClient(resolved),\n        config: resolved,\n      };\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error('Failed to resolve Tapsilat config.');\n      onError?.(err);\n      throw err;\n    }\n  });\n  const configHashRef = useRef(stableHash(state.config));\n  const configRef = useRef<TapsilatConfig | null>(state.config);\n\n  useEffect(() => {\n    try {\n      const nextConfig = resolveConfig(config);\n      const nextHash = stableHash(nextConfig);\n\n      if (nextHash !== configHashRef.current) {\n        configHashRef.current = nextHash;\n        configRef.current = nextConfig;\n        setState({\n          client: instantiateClient(nextConfig),\n          config: nextConfig,\n          lastError: undefined,\n        });\n      }\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error('Failed to refresh Tapsilat config.');\n      setState((prev) => ({ ...prev, lastError: err }));\n      onError?.(err);\n    }\n  }, [config, onError]);\n\n  const refreshClient = useCallback<Required<TapsilatContextValue>['refreshClient']>(\n    async (override) => {\n      try {\n        const baseConfig = configRef.current ?? resolveConfig(config);\n        const nextConfig = {\n          ...baseConfig,\n          ...override,\n        } as TapsilatConfig;\n        const nextClient = instantiateClient(nextConfig);\n        configHashRef.current = stableHash(nextConfig);\n        configRef.current = nextConfig;\n        setState({ client: nextClient, config: nextConfig, lastError: undefined });\n        return nextClient;\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error('Failed to refresh Tapsilat client.');\n        setState((prev) => ({ ...prev, lastError: err }));\n        onError?.(err);\n        throw err;\n      }\n    },\n    [config, onError]\n  );\n\n  const contextValue = useMemo<TapsilatContextValue>(() => {\n    if (!state.client || !state.config) {\n      throw new Error('TapsilatProvider failed to initialize the SDK client.');\n    }\n\n    return {\n      client: state.client,\n      config: state.config,\n      isReady: Boolean(state.client),\n      lastError: state.lastError,\n      refreshClient,\n    };\n  }, [state.client, state.config, state.lastError, refreshClient]);\n\n  return <TapsilatContext.Provider value={contextValue}>{children}</TapsilatContext.Provider>;\n};\n","import { createContext } from 'react';\nimport type { TapsilatConfig, TapsilatSDK } from '@tapsilat/tapsilat-js';\n\nexport interface TapsilatContextValue {\n  client: TapsilatSDK;\n  config: TapsilatConfig;\n  isReady: boolean;\n  lastError?: Error;\n  refreshClient: (override?: Partial<TapsilatConfig>) => Promise<TapsilatSDK>;\n}\n\nexport const TapsilatContext = createContext<TapsilatContextValue | undefined>(undefined);\n","import { useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport type { OrderCreateRequest, OrderCreateResponse, OrderStatusResponse, TapsilatSDK } from '@tapsilat/tapsilat-js';\n\nimport { TapsilatContext, type TapsilatContextValue } from './context';\nimport { toError } from './utils';\n\nexport const useTapsilat = (): TapsilatContextValue => {\n  const context = useContext(TapsilatContext);\n\n  if (!context) {\n    throw new Error('useTapsilat must be used inside a <TapsilatProvider>.');\n  }\n\n  return context;\n};\n\nexport const useTapsilatClient = () => useTapsilat().client;\n\ninterface AsyncResult<T> {\n  data?: T;\n  loading: boolean;\n  error?: Error;\n}\n\nexport interface UseTapsilatOrderResult {\n  order: AsyncResult<OrderCreateResponse>;\n  status: AsyncResult<OrderStatusResponse>;\n  createOrder: (payload: OrderCreateRequest) => Promise<OrderCreateResponse>;\n  fetchOrderStatus: (referenceId: string) => Promise<OrderStatusResponse>;\n}\n\nexport const useTapsilatOrder = (): UseTapsilatOrderResult => {\n  const { client } = useTapsilat();\n  const mountedRef = useRef(true);\n\n  useEffect(() => {\n    mountedRef.current = true;\n    return () => {\n      mountedRef.current = false;\n    };\n  }, []);\n\n  const [orderResult, setOrderResult] = useState<AsyncResult<OrderCreateResponse>>({ loading: false });\n  const [statusResult, setStatusResult] = useState<AsyncResult<OrderStatusResponse>>({ loading: false });\n\n  const createOrder = useCallback<UseTapsilatOrderResult['createOrder']>(\n    async (payload) => {\n      setOrderResult({ loading: true });\n      try {\n        const response = await client.createOrder(payload);\n        if (mountedRef.current) {\n          setOrderResult({ loading: false, data: response });\n        }\n        return response;\n      } catch (error) {\n        const err = toError(error, 'Failed to create Tapsilat order.');\n        if (mountedRef.current) {\n          setOrderResult({ loading: false, error: err });\n        }\n        throw err;\n      }\n    },\n    [client]\n  );\n\n  const fetchOrderStatus = useCallback<UseTapsilatOrderResult['fetchOrderStatus']>(\n    async (referenceId) => {\n      setStatusResult({ loading: true });\n      try {\n        const response = await client.getOrderStatus(referenceId);\n        if (mountedRef.current) {\n          setStatusResult({ loading: false, data: response });\n        }\n        return response;\n      } catch (error) {\n        const err = toError(error, 'Failed to fetch Tapsilat order status.');\n        if (mountedRef.current) {\n          setStatusResult({ loading: false, error: err });\n        }\n        throw err;\n      }\n    },\n    [client]\n  );\n\n  return {\n    order: orderResult,\n    status: statusResult,\n    createOrder,\n    fetchOrderStatus,\n  };\n};\n\nexport interface WebhookVerificationInput {\n  payload: string;\n  signature: string;\n  secret: string;\n}\n\nexport interface UseTapsilatWebhookResult {\n  verifyWebhook: (input: WebhookVerificationInput) => Promise<boolean>;\n  lastVerification?: {\n    isValid: boolean;\n    payload: WebhookVerificationInput;\n  };\n  error?: Error;\n}\n\nexport const useTapsilatWebhook = (): UseTapsilatWebhookResult => {\n  const { client } = useTapsilat();\n  const [verification, setVerification] = useState<UseTapsilatWebhookResult['lastVerification']>();\n  const [error, setError] = useState<Error>();\n\n  const verifyWebhook = useCallback<UseTapsilatWebhookResult['verifyWebhook']>(\n    async (input) => {\n      try {\n        if (typeof client.verifyWebhook !== 'function') {\n          throw new Error('verifyWebhook is unavailable in the installed @tapsilat/tapsilat-js version.');\n        }\n\n        const isValid = await client.verifyWebhook(input.payload, input.signature, input.secret);\n        setVerification({ isValid: Boolean(isValid), payload: input });\n        setError(undefined);\n        return Boolean(isValid);\n      } catch (err) {\n        const errorObject = toError(err, 'Failed to verify Tapsilat webhook payload.');\n        setError(errorObject);\n        throw errorObject;\n      }\n    },\n    [client]\n  );\n\n  return { verifyWebhook, lastVerification: verification, error };\n};\n\ntype HealthCheckResult = Awaited<ReturnType<TapsilatSDK['healthCheck']>>;\n\nexport interface UseTapsilatHealthResult {\n  checkHealth: () => Promise<HealthCheckResult>;\n  result?: HealthCheckResult;\n  loading: boolean;\n  error?: Error;\n}\n\nexport const useTapsilatHealth = (): UseTapsilatHealthResult => {\n  const { client } = useTapsilat();\n  const [result, setResult] = useState<UseTapsilatHealthResult['result']>();\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error>();\n  const mountedRef = useRef(true);\n\n  useEffect(() => {\n    mountedRef.current = true;\n    return () => {\n      mountedRef.current = false;\n    };\n  }, []);\n\n  const checkHealth = useCallback(async () => {\n    if (mountedRef.current) {\n      setLoading(true);\n    }\n    try {\n      if (typeof client.healthCheck !== 'function') {\n        throw new Error('healthCheck is unavailable in the installed @tapsilat/tapsilat-js version.');\n      }\n\n      const response = await client.healthCheck();\n      if (mountedRef.current) {\n        setResult(response);\n        setError(undefined);\n      }\n      return response;\n    } catch (err) {\n      const errorObject = toError(err, 'Failed to call Tapsilat health check.');\n      if (mountedRef.current) {\n        setError(errorObject);\n      }\n      throw errorObject;\n    } finally {\n      if (mountedRef.current) {\n        setLoading(false);\n      }\n    }\n  }, [client]);\n\n  return { checkHealth, result, loading, error };\n};","export const toError = (error: unknown, fallbackMessage: string): Error =>\n  error instanceof Error ? error : new Error(fallbackMessage);\n"],"mappings":"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","names":["import_react","import_react"]}