UNPKG

remotion

Version:

Make videos programmatically

163 lines (162 loc) • 6.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useMemoizedEffects = exports.getPropStatusesCtx = exports.getEffectPropStatusesCtx = exports.useMemoizedEffectDefinitions = void 0; const react_1 = require("react"); const get_effective_visual_mode_value_js_1 = require("../get-effective-visual-mode-value.js"); const interpolate_keyframed_status_js_1 = require("../interpolate-keyframed-status.js"); const sequence_node_path_js_1 = require("../sequence-node-path.js"); const SequenceManager_js_1 = require("../SequenceManager.js"); const use_current_frame_js_1 = require("../use-current-frame.js"); const mergeOverrides = ({ descriptor, propStatusOverrides, dragOverrides, frame, }) => { if (!propStatusOverrides && !dragOverrides) { return { params: descriptor.params, effectKey: descriptor.effectKey }; } const merged = { ...descriptor.params, }; if (propStatusOverrides) { for (const [key, value] of Object.entries(propStatusOverrides)) { if (value !== undefined) { merged[key] = value; } } } if (dragOverrides) { for (const [key, value] of Object.entries(dragOverrides)) { const resolved = (0, get_effective_visual_mode_value_js_1.resolveDragOverrideValue)({ dragOverrideValue: value, frame, }); if (resolved.type === 'resolved') { merged[key] = resolved.value; } } } return { params: merged, effectKey: descriptor.definition.calculateKey(merged), }; }; const resolvePropStatusOverrides = (propStatus, frame) => { if (!propStatus) { return null; } const out = {}; let hasAny = false; for (const [key, status] of Object.entries(propStatus)) { if (status.status === 'static') { out[key] = status.codeValue; hasAny = true; continue; } if (status.status === 'keyframed') { const value = (0, interpolate_keyframed_status_js_1.interpolateKeyframedStatus)({ forceSpringAllowTail: null, frame, status, }); if (value !== null) { out[key] = value; hasAny = true; } } } return hasAny ? out : null; }; const useMemoizedEffectDefinitions = (effects) => { const previousRef = (0, react_1.useRef)(null); const definitions = effects.map((descriptor) => descriptor.definition); const previous = previousRef.current; const isSame = previous !== null && previous.length === definitions.length && previous.every((def, i) => def === definitions[i]); if (isSame) { return previous; } previousRef.current = definitions; return definitions; }; exports.useMemoizedEffectDefinitions = useMemoizedEffectDefinitions; const getEffectPropStatusesCtx = ({ propStatuses, nodePath, effectIndex, }) => { const status = propStatuses[(0, SequenceManager_js_1.makeSequencePropsSubscriptionKey)(nodePath)]; if (!status) { return { type: 'cannot-update-sequence', reason: 'not-found' }; } if (!status.canUpdate) { return { type: 'cannot-update-sequence', reason: status.reason }; } const effect = status.effects.find((e) => e.effectIndex === effectIndex); if (!effect) { return { type: 'cannot-update-effect', reason: 'not-found' }; } if (!effect.canUpdate) { return { type: 'cannot-update-effect', reason: effect.reason }; } return { type: 'can-update-effect', props: effect.props }; }; exports.getEffectPropStatusesCtx = getEffectPropStatusesCtx; const getPropStatusesCtx = (propStatuses, nodePath) => { const status = propStatuses[(0, SequenceManager_js_1.makeSequencePropsSubscriptionKey)(nodePath)]; if (!status) { return undefined; } if (!status.canUpdate) { return undefined; } return status.props; }; exports.getPropStatusesCtx = getPropStatusesCtx; const useMemoizedEffects = ({ effects, overrideId, }) => { var _a; const previousRef = (0, react_1.useRef)(null); const { propStatuses } = (0, react_1.useContext)(SequenceManager_js_1.VisualModePropStatusesContext); const { getEffectDragOverrides } = (0, react_1.useContext)(SequenceManager_js_1.VisualModeDragOverridesContext); const frame = (0, use_current_frame_js_1.useCurrentFrame)(); const { overrideIdToNodePathMappings } = (0, react_1.useContext)(sequence_node_path_js_1.OverrideIdsToNodePathsGettersContext); const previous = previousRef.current; const nodePath = overrideId ? ((_a = overrideIdToNodePathMappings[overrideId]) !== null && _a !== void 0 ? _a : null) : null; const resolved = effects.map((descriptor, index) => { if (nodePath === null) { return { descriptor, params: descriptor.params, effectKey: descriptor.effectKey, }; } const effectStatus = (0, exports.getEffectPropStatusesCtx)({ propStatuses, nodePath, effectIndex: index, }); const propStatusOverrides = effectStatus.type === 'can-update-effect' ? resolvePropStatusOverrides(effectStatus.props, frame) : null; const dragOverridesMap = getEffectDragOverrides(nodePath, index); const dragOverrides = Object.keys(dragOverridesMap).length === 0 ? null : dragOverridesMap; const { params, effectKey } = mergeOverrides({ descriptor, propStatusOverrides, dragOverrides, frame, }); return { descriptor, params, effectKey }; }); const isSame = previous !== null && previous.length === resolved.length && previous.every((p, i) => p.definition === resolved[i].descriptor.definition && p.effectKey === resolved[i].effectKey); if (isSame) { return previous; } const next = resolved.map(({ descriptor, params, effectKey }) => ({ definition: descriptor.definition, effectKey, params, memoized: true, })); previousRef.current = next; return next; }; exports.useMemoizedEffects = useMemoizedEffects;