UNPKG

@pixi/react

Version:

Write PixiJS applications using React declarative style.

1 lines 8.85 kB
{"version":3,"file":"applyProps.mjs","sources":["../../src/helpers/applyProps.ts"],"sourcesContent":["import {\n Container,\n Graphics,\n} from 'pixi.js';\nimport {\n type FederatedPointerEvent,\n type FederatedWheelEvent,\n} from 'pixi.js';\nimport {\n PixiToReactEventPropNames,\n ReactToPixiEventPropNames,\n} from '../constants/EventPropNames';\nimport { type DiffSet } from '../typedefs/DiffSet';\nimport { type HostConfig } from '../typedefs/HostConfig';\nimport { type InstanceState } from '../typedefs/InstanceState';\nimport {\n isNull,\n isUndefined,\n} from './compare';\nimport { diffProps } from './diffProps';\nimport { isDiffSet } from './isDiffSet';\nimport { isReadOnlyProperty } from './isReadOnlyProperty';\nimport { log } from './log';\n\nconst DEFAULT = '__default';\nconst DEFAULTS_CONTAINERS = new Map();\n\nconst PIXI_EVENT_PROP_NAME_ERROR_HAS_BEEN_SHOWN: Record<string, boolean> = {};\n\nexport type MaybeInstance = Partial<HostConfig['instance']>;\n\nfunction targetKeyReducer(accumulator: any, key: string)\n{\n if (accumulator)\n {\n const value = accumulator[key];\n\n if (!isUndefined(value) && !isNull(value))\n {\n return value;\n }\n }\n\n return accumulator;\n}\n\n/** Apply properties to Pixi.js instance. */\nexport function applyProps(\n instance: MaybeInstance,\n data: HostConfig['props'] | DiffSet,\n)\n{\n const {\n __pixireact: instanceState = {} as InstanceState,\n ...instanceProps\n } = instance;\n\n let typedData;\n\n if (isDiffSet(data))\n {\n typedData = data as DiffSet;\n }\n else\n {\n typedData = diffProps(data, instanceProps as HostConfig['props']);\n }\n\n const { changes } = typedData;\n\n let changeIndex = 0;\n\n while (changeIndex < changes.length)\n {\n const change = changes[changeIndex];\n let hasError = false;\n let key = change[0] as keyof HostConfig['instance'];\n let value = change[1];\n const isEvent = change[2];\n\n const keys = change[3];\n\n let currentInstance = instance;\n let targetProp = currentInstance[key];\n\n if ((key as string === 'draw') && (typeof value === 'function'))\n {\n if (instance instanceof Graphics)\n {\n value(instance);\n }\n else\n {\n hasError = true;\n log('warn', `The \\`draw\\` prop was used on a \\`${instanceState.type}\\` component, but it's only valid on \\`graphics\\` components.`);\n }\n }\n\n if (key in PixiToReactEventPropNames)\n {\n const typedKey = key as keyof typeof PixiToReactEventPropNames;\n\n hasError = true;\n\n if (!PIXI_EVENT_PROP_NAME_ERROR_HAS_BEEN_SHOWN[key])\n {\n PIXI_EVENT_PROP_NAME_ERROR_HAS_BEEN_SHOWN[key] = true;\n\n log('warn', `Event names must be pascal case; instead of \\`${key}\\`, you probably want \\`${PixiToReactEventPropNames[typedKey]}\\`.`);\n }\n }\n\n if (!hasError)\n {\n // Resolve dashed props\n if (keys.length)\n {\n targetProp = keys.reduce(targetKeyReducer, currentInstance);\n\n // If the target is atomic, it forces us to switch the root\n if (!(targetProp && (targetProp as unknown as Record<string, unknown>).set))\n {\n const [name, ...reverseEntries] = keys.reverse();\n\n currentInstance = reverseEntries.reverse().reduce(targetKeyReducer, currentInstance);\n\n key = name as keyof MaybeInstance;\n }\n }\n\n // https://github.com/mrdoob/three.js/issues/21209\n // HMR/fast-refresh relies on the ability to cancel out props, but pixi.js\n // has no means to do this. Hence we curate a small collection of value-classes\n // with their respective constructor/set arguments\n // For removed props, try to set default values, if possible\n if (value === `${DEFAULT}remove`)\n {\n if (currentInstance instanceof Container)\n {\n // create a blank slate of the instance and copy the particular parameter.\n let ctor = DEFAULTS_CONTAINERS.get(currentInstance.constructor);\n\n if (!ctor)\n {\n ctor = currentInstance.constructor;\n\n // eslint-disable-next-line new-cap\n ctor = new ctor();\n\n DEFAULTS_CONTAINERS.set(currentInstance.constructor, ctor);\n }\n\n value = ctor[key];\n }\n else\n {\n // instance does not have constructor, just set it to 0\n value = 0;\n }\n }\n\n // Deal with events ...\n if (isEvent && instanceState)\n {\n const typedKey = key as keyof typeof ReactToPixiEventPropNames;\n const pixiKey = ReactToPixiEventPropNames[typedKey];\n\n if (value)\n {\n currentInstance[pixiKey] = value as (event: FederatedPointerEvent | FederatedWheelEvent) => void;\n }\n else\n {\n delete currentInstance[pixiKey];\n }\n }\n else if (!isReadOnlyProperty(currentInstance as Record<string, unknown>, key))\n {\n // @ts-expect-error Typescript is grumpy because this could be setting a readonly key, but we're already handling that in the conditional above. 🤷🏻‍♂️\n currentInstance[key] = value;\n }\n }\n\n changeIndex += 1;\n }\n\n return instance;\n}\n"],"names":[],"mappings":"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"}