UNPKG

@pixi/react

Version:

Write PixiJS applications using React declarative style.

1 lines 9.04 kB
{"version":3,"file":"Application.mjs","sources":["../../src/components/Application.tsx"],"sourcesContent":["import {\n FiberProvider,\n useContextBridge,\n} from 'its-fine';\nimport {\n type Application as PixiApplication,\n extensions as PixiExtensions,\n TextStyle,\n} from 'pixi.js';\nimport {\n forwardRef,\n type RefObject,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport { createRoot } from '../core/createRoot';\nimport { roots } from '../core/roots';\nimport { processUnmountQueue } from '../helpers/processUnmountQueue';\nimport { queueForUnmount } from '../helpers/queueForUnmount';\nimport { unqueueForUnmount } from '../helpers/unqueueForUnmount';\nimport { useIsomorphicLayoutEffect } from '../hooks/useIsomorphicLayoutEffect';\nimport { type ApplicationProps } from '../typedefs/ApplicationProps';\nimport { type ApplicationRef } from '../typedefs/ApplicationRef';\n\nconst originalDefaultTextStyle = { ...TextStyle.defaultTextStyle };\n\nconst ApplicationImplementation = forwardRef<ApplicationRef, ApplicationProps>(function Application(\n props,\n forwardedRef,\n)\n{\n const {\n children,\n className,\n defaultTextStyle,\n extensions,\n onInit,\n resizeTo,\n ...applicationProps\n } = props;\n\n const Bridge = useContextBridge();\n\n const applicationRef: RefObject<PixiApplication | null> = useRef(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const extensionsRef = useRef<Set<any>>(new Set());\n\n useImperativeHandle(forwardedRef, () => ({\n getApplication()\n {\n return applicationRef.current;\n },\n getCanvas()\n {\n return canvasRef.current;\n },\n }));\n\n const updateResizeTo = useCallback(() =>\n {\n const application = applicationRef.current;\n\n if (application)\n {\n if (resizeTo)\n {\n if ('current' in resizeTo)\n {\n if (resizeTo.current instanceof HTMLElement)\n {\n application.resizeTo = resizeTo.current;\n }\n }\n else\n {\n application.resizeTo = resizeTo;\n }\n }\n else\n {\n // @ts-expect-error Actually `resizeTo` is optional, the types are just wrong. 🤷🏻‍♂️\n application.resizeTo = undefined;\n }\n }\n }, [resizeTo]);\n\n const handleInit = useCallback((application: PixiApplication) =>\n {\n processUnmountQueue();\n\n applicationRef.current = application;\n updateResizeTo();\n onInit?.(application);\n }, [onInit]);\n\n useIsomorphicLayoutEffect(() =>\n {\n if (extensions)\n {\n const extensionsToHandle = [...extensions];\n const extensionsState = extensionsRef.current;\n\n // Check for extensions that have been removed from the array\n for (const extension of extensionsState.values())\n {\n const extensionIndex = extensionsToHandle.indexOf(extension);\n\n // If the extension is no longer in the array, we'll remove it from Pixi.js\n if (extensionIndex === -1)\n {\n PixiExtensions.remove(extension);\n extensionsState.delete(extension);\n }\n\n // Since the extension already existed in the state, we can remove it to prevent any further handling\n extensionsToHandle.splice(extensionIndex, 1);\n }\n\n // Load any remaining extensions.\n for (const extension in extensionsToHandle)\n {\n PixiExtensions.add(extension);\n extensionsState.add(extension);\n }\n }\n }, [extensions]);\n\n useIsomorphicLayoutEffect(() =>\n {\n const canvasElement = canvasRef.current;\n\n if (canvasElement)\n {\n let root = roots.get(canvasElement);\n\n if (!root)\n {\n root = createRoot(canvasElement, { onInit: handleInit });\n }\n\n // @ts-expect-error The value of `children` is fine, but `PixiReactChildNode` doesn't strictly adhere to the `ReactNode` structure.\n root.render((<Bridge>{children}</Bridge>), applicationProps);\n }\n }, [\n applicationProps,\n children,\n handleInit,\n resizeTo,\n ]);\n\n useIsomorphicLayoutEffect(() =>\n {\n updateResizeTo();\n }, [resizeTo]);\n\n useIsomorphicLayoutEffect(() =>\n {\n if (defaultTextStyle)\n {\n Object.assign(TextStyle.defaultTextStyle, defaultTextStyle);\n }\n else\n {\n Object.assign(TextStyle.defaultTextStyle, originalDefaultTextStyle);\n }\n }, [defaultTextStyle]);\n\n // eslint-disable-next-line consistent-return\n useEffect(() =>\n {\n const canvasElement = canvasRef.current;\n\n if (canvasElement)\n {\n unqueueForUnmount(canvasElement);\n\n return () =>\n {\n queueForUnmount(canvasElement);\n };\n }\n }, []);\n\n return (\n <canvas\n ref={canvasRef}\n className={className} />\n );\n});\n\nexport const Application = forwardRef<ApplicationRef, ApplicationProps>(function ApplicationWrapper(props, ref)\n{\n return (\n <FiberProvider>\n <ApplicationImplementation\n ref={ref}\n {...props} />\n </FiberProvider>\n );\n});\n"],"names":["Application","extensions","PixiExtensions"],"mappings":"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"}