UNPKG

remotion

Version:

Make videos programmatically

141 lines (140 loc) 5.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useMemoizedEffects = exports.getCodeValuesCtx = exports.getEffectCodeValuesCtx = exports.useMemoizedEffectDefinitions = void 0; const react_1 = require("react"); const sequence_node_path_js_1 = require("../sequence-node-path.js"); const SequenceManager_js_1 = require("../SequenceManager.js"); const SequenceManager_js_2 = require("../SequenceManager.js"); const mergeOverrides = ({ descriptor, codeOverrides, dragOverrides, }) => { if (!codeOverrides && !dragOverrides) { return { params: descriptor.params, effectKey: descriptor.effectKey }; } const merged = { ...descriptor.params, }; if (codeOverrides) { for (const [key, value] of Object.entries(codeOverrides)) { if (value !== undefined) { merged[key] = value; } } } if (dragOverrides) { for (const [key, value] of Object.entries(dragOverrides)) { merged[key] = value; } } return { params: merged, effectKey: descriptor.definition.calculateKey(merged), }; }; const extractCodeOverrides = (propStatus) => { if (!propStatus) { return null; } const out = {}; let hasAny = false; for (const [key, status] of Object.entries(propStatus)) { if (status.canUpdate) { out[key] = status.codeValue; 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 getEffectCodeValuesCtx = ({ codeValues, nodePath, effectIndex, }) => { const status = codeValues[(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.getEffectCodeValuesCtx = getEffectCodeValuesCtx; const getCodeValuesCtx = (codeValues, nodePath) => { const status = codeValues[(0, SequenceManager_js_1.makeSequencePropsSubscriptionKey)(nodePath)]; if (!status) { return undefined; } if (!status.canUpdate) { return undefined; } return status.props; }; exports.getCodeValuesCtx = getCodeValuesCtx; const useMemoizedEffects = ({ effects, overrideId, }) => { var _a; const previousRef = (0, react_1.useRef)(null); const { codeValues } = (0, react_1.useContext)(SequenceManager_js_2.VisualModeCodeValuesContext); const { getEffectDragOverrides } = (0, react_1.useContext)(SequenceManager_js_2.VisualModeDragOverridesContext); 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.getEffectCodeValuesCtx)({ codeValues, nodePath, effectIndex: index, }); const codeOverrides = effectStatus.type === 'can-update-effect' ? extractCodeOverrides(effectStatus.props) : null; const dragOverridesMap = getEffectDragOverrides(nodePath, index); const dragOverrides = Object.keys(dragOverridesMap).length === 0 ? null : dragOverridesMap; const { params, effectKey } = mergeOverrides({ descriptor, codeOverrides, dragOverrides, }); 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;