| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import { useContext } from 'react';
- import { isAnimationControls } from '../../animation/utils/is-animation-controls.mjs';
- import { MotionContext } from '../../context/MotionContext/index.mjs';
- import { PresenceContext } from '../../context/PresenceContext.mjs';
- import { isControllingVariants, isVariantNode } from '../../render/utils/is-controlling-variants.mjs';
- import { resolveVariantFromProps } from '../../render/utils/resolve-variants.mjs';
- import { useConstant } from '../../utils/use-constant.mjs';
- import { resolveMotionValue } from '../../value/utils/resolve-motion-value.mjs';
- function makeState({ scrapeMotionValuesFromProps, createRenderState, onUpdate, }, props, context, presenceContext) {
- const state = {
- latestValues: makeLatestValues(props, context, presenceContext, scrapeMotionValuesFromProps),
- renderState: createRenderState(),
- };
- if (onUpdate) {
- /**
- * onMount works without the VisualElement because it could be
- * called before the VisualElement payload has been hydrated.
- * (e.g. if someone is using m components <m.circle />)
- */
- state.onMount = (instance) => onUpdate({ props, current: instance, ...state });
- state.onUpdate = (visualElement) => onUpdate(visualElement);
- }
- return state;
- }
- const makeUseVisualState = (config) => (props, isStatic) => {
- const context = useContext(MotionContext);
- const presenceContext = useContext(PresenceContext);
- const make = () => makeState(config, props, context, presenceContext);
- return isStatic ? make() : useConstant(make);
- };
- function makeLatestValues(props, context, presenceContext, scrapeMotionValues) {
- const values = {};
- const motionValues = scrapeMotionValues(props, {});
- for (const key in motionValues) {
- values[key] = resolveMotionValue(motionValues[key]);
- }
- let { initial, animate } = props;
- const isControllingVariants$1 = isControllingVariants(props);
- const isVariantNode$1 = isVariantNode(props);
- if (context &&
- isVariantNode$1 &&
- !isControllingVariants$1 &&
- props.inherit !== false) {
- if (initial === undefined)
- initial = context.initial;
- if (animate === undefined)
- animate = context.animate;
- }
- let isInitialAnimationBlocked = presenceContext
- ? presenceContext.initial === false
- : false;
- isInitialAnimationBlocked = isInitialAnimationBlocked || initial === false;
- const variantToSet = isInitialAnimationBlocked ? animate : initial;
- if (variantToSet &&
- typeof variantToSet !== "boolean" &&
- !isAnimationControls(variantToSet)) {
- const list = Array.isArray(variantToSet) ? variantToSet : [variantToSet];
- for (let i = 0; i < list.length; i++) {
- const resolved = resolveVariantFromProps(props, list[i]);
- if (resolved) {
- const { transitionEnd, transition, ...target } = resolved;
- for (const key in target) {
- let valueTarget = target[key];
- if (Array.isArray(valueTarget)) {
- /**
- * Take final keyframe if the initial animation is blocked because
- * we want to initialise at the end of that blocked animation.
- */
- const index = isInitialAnimationBlocked
- ? valueTarget.length - 1
- : 0;
- valueTarget = valueTarget[index];
- }
- if (valueTarget !== null) {
- values[key] = valueTarget;
- }
- }
- for (const key in transitionEnd) {
- values[key] = transitionEnd[key];
- }
- }
- }
- }
- return values;
- }
- export { makeUseVisualState };
|