remotion
Version:
Make videos programmatically
141 lines (140 loc) • 5.35 kB
JavaScript
;
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;