39 lines
1.3 KiB
JavaScript
39 lines
1.3 KiB
JavaScript
|
import { isAnimationControls } from '../../../animation/utils/is-animation-controls.mjs';
|
||
|
import { createAnimationState } from '../../../render/utils/animation-state.mjs';
|
||
|
import { Feature } from '../Feature.mjs';
|
||
|
|
||
|
class AnimationFeature extends Feature {
|
||
|
/**
|
||
|
* We dynamically generate the AnimationState manager as it contains a reference
|
||
|
* to the underlying animation library. We only want to load that if we load this,
|
||
|
* so people can optionally code split it out using the `m` component.
|
||
|
*/
|
||
|
constructor(node) {
|
||
|
super(node);
|
||
|
node.animationState || (node.animationState = createAnimationState(node));
|
||
|
}
|
||
|
updateAnimationControlsSubscription() {
|
||
|
const { animate } = this.node.getProps();
|
||
|
this.unmount();
|
||
|
if (isAnimationControls(animate)) {
|
||
|
this.unmount = animate.subscribe(this.node);
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* Subscribe any provided AnimationControls to the component's VisualElement
|
||
|
*/
|
||
|
mount() {
|
||
|
this.updateAnimationControlsSubscription();
|
||
|
}
|
||
|
update() {
|
||
|
const { animate } = this.node.getProps();
|
||
|
const { animate: prevAnimate } = this.node.prevProps || {};
|
||
|
if (animate !== prevAnimate) {
|
||
|
this.updateAnimationControlsSubscription();
|
||
|
}
|
||
|
}
|
||
|
unmount() { }
|
||
|
}
|
||
|
|
||
|
export { AnimationFeature };
|