// Copyright 2026 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 /** * ProductSDKProvider component */ import React, { useEffect, useState, type ReactNode } from "react"; import { ProductSDKContext } from "./context.js"; import { createApp } from "../core/createApp.js"; import type { App, LogLevel } from "../core/types.js"; /** Props for ProductSDKProvider */ export interface ProductSDKProviderProps { /** Application name - used for storage namespacing and product account derivation */ name: string; /** Log level (default: 'info') */ logLevel?: LogLevel; /** Child components */ children: ReactNode; /** Fallback to show while loading */ fallback?: ReactNode; } /** * Provider component that initializes the Product SDK * * @example * ```tsx * import { ProductSDKProvider } from '@parity/product-sdk/react'; * * function App() { * return ( * }> * * * ); * } * ``` */ export function ProductSDKProvider({ name, logLevel = "info", children, fallback = null, }: ProductSDKProviderProps) { const [app, setApp] = useState(null); const [error, setError] = useState(null); useEffect(() => { let mounted = true; createApp({ name, logLevel }) .then((createdApp) => { if (mounted) { setApp(createdApp); } }) .catch((e) => { if (mounted) { setError(e instanceof Error ? e : new Error(String(e))); } }); return () => { mounted = false; }; }, [name, logLevel]); if (error) { throw error; } if (!app) { return <>{fallback}; } return {children}; }