// This file enables `@shopify/react-native-skia` web support // It's a Snack-specific version of: // https://github.com/Shopify/react-native-skia/blob/main/package/src/web/WithSkiaWeb.tsx import React, { Suspense } from 'react'; import { loadCanvasKit } from './CanvasKit'; interface WithSkiaProps { /** * The component fetcher, should be a lazy-loaded component. * It should be returned as `{ default: }`, use default exports. * E.g. `getComponent={() => import('./components/LazyComponent')} */ getComponent: () => Promise<{ default: React.ComponentType }>; /** The content to render when CanvasKit is still loading (default: `null`) */ fallback?: React.ComponentProps['fallback']; /** * The options to use when initializing CavasKit on web. * In Snack, this defaults to the right default options. * You can change these options if you know what you are doing. */ opts?: Parameters[0]; } /** * Wrap a lazy-loaded component inside CanvasKit for web. * In Snack, using this will enable Skia to run natively and on web, without code changes. * The component works by wrapping the lazy-loaded component in Suspense. * * @see https://shopify.github.io/react-native-skia/docs/getting-started/web/ */ export function WithSkiaWeb({ fallback, getComponent, opts: options }: WithSkiaProps) { const Inner = React.useMemo( () => React.lazy(async () => { await loadCanvasKit(options); return getComponent(); }), [getComponent, options], ); return ( ); } /** * Load CanvasKit on web by initializing the WASM file. * In Snack, this defaults to the right default options. * You can change these options if you know what you are doing. * * @see https://shopify.github.io/react-native-skia/docs/getting-started/web/ */ export const LoadSkiaWeb = loadCanvasKit;