remotion
Version:
Make videos programmatically
163 lines (162 loc) • 6.38 kB
JavaScript
;
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;