Skip to content

Commit

Permalink
add timeline events start and end
Browse files Browse the repository at this point in the history
  • Loading branch information
soerenmeier committed Dec 8, 2023
1 parent 91d693b commit 22ed9a0
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 6 deletions.
9 changes: 8 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"typescript": "^5.1.6"
},
"dependencies": {
"bezier-easing": "^2.1.0"
"bezier-easing": "^2.1.0",
"fire": "npm:[email protected]"
}
}
20 changes: 19 additions & 1 deletion src/timeline/public.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { takeProp } from '../utils/internal.js';
import Timeline from './timeline.js';
import { STATE_AFTER } from '../timing/timing.js';
import { STATE_BEFORE, STATE_AFTER } from '../timing/timing.js';
import { callStagger } from '../stagger/stagger.js';
import Events from '../utils/events.js';

const STATE_PAUSED = 0;
const STATE_RENDER_ONCE = 1;
Expand All @@ -12,6 +13,9 @@ export default class PublicTimeline {
this._defaults = takeProp(props, 'defaults', {});
this._inner = new Timeline(props);

// 'start', 'end'
this._events = new Events;

this._state = STATE_PAUSED;
this._runningTicker = null;
}
Expand Down Expand Up @@ -94,15 +98,29 @@ export default class PublicTimeline {
this._inner.timing.reverse();
}

// start, update, end -> () => // remove Event
on(event, fn) {
return this._events.add(event, fn);
}

onPromise(event) {
return this._events.wait(event);
}

_startTicker() {
if (this._runningTicker)
return;

this._inner.init();

this._runningTicker = this._inner.ticker.add(change => {
if (this._inner.timing.state === STATE_BEFORE) {
this._events.trigger('start');
}

if (this._inner.timing.state === STATE_AFTER) {
this._stopTicker();
this._events.trigger('end');
return;
}

Expand Down
4 changes: 1 addition & 3 deletions src/timeline/timeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,6 @@ export default class Timeline {

// { type: label|animation, value: {}, offset, start: x, end: y, render }
this.entries = [];
// this.animationsStartOrder = [];
// this.animationsEndOrder = [];

this._initialized = false;
this._renderQueue = null;
Expand Down Expand Up @@ -153,7 +151,7 @@ export default class Timeline {
entry.value.init();
}

this.timing.seek(0);
this.timing.seek(-1);
this.timing.reversed = reversed;
startOrdered.forEach(e => {
e.value.seek(-1);
Expand Down
35 changes: 35 additions & 0 deletions src/utils/events.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import Listeners from 'fire/util/listeners.js';

export default class Events {
constructor() {
this.listeners = new Map;
}

add(event, fn) {
let list = this.listeners.get(event);
if (!list) {
list = new Listeners;
this.listeners.set(event, list);
}

return list.add(fn);
}

wait(event) {
return new Promise(resolve => {
let rm = () => {};
const call = a => {
rm();
resolve(a);
};
rm = this.add(event, call);
});
}

trigger(event, ...args) {
let list = this.listeners.get(event);
if (!list)
return;
list.trigger(...args);
}
}

0 comments on commit 22ed9a0

Please sign in to comment.