UNPKG

create-expo-cljs-app

Version:

Create a react native application with Expo and Shadow-CLJS!

104 lines (95 loc) 2.82 kB
import { defineAnimation } from './util'; import { Animation, NextAnimation, Timestamp, HigherOrderAnimation, AnimatableValue, } from './commonTypes'; export interface DelayAnimation extends Animation<DelayAnimation>, HigherOrderAnimation { startTime: Timestamp; started: boolean; previousAnimation: DelayAnimation | null; current: AnimatableValue; } export function withDelay( delayMs: number, _nextAnimation: NextAnimation<DelayAnimation> ): Animation<DelayAnimation> { 'worklet'; return defineAnimation<DelayAnimation>(_nextAnimation, () => { 'worklet'; const nextAnimation = typeof _nextAnimation === 'function' ? _nextAnimation() : _nextAnimation; function delay(animation: DelayAnimation, now: Timestamp): boolean { const { startTime, started, previousAnimation } = animation; if (now - startTime > delayMs) { if (!started) { nextAnimation.onStart( nextAnimation, animation.current, now, previousAnimation as DelayAnimation ); animation.previousAnimation = null; animation.started = true; } const finished = nextAnimation.onFrame(nextAnimation, now); animation.current = nextAnimation.current; return finished; } else if (previousAnimation) { const finished = previousAnimation.finished || previousAnimation.onFrame(previousAnimation, now); animation.current = previousAnimation.current; if (finished) { animation.previousAnimation = null; } } return false; } function onStart( animation: DelayAnimation, value: AnimatableValue, now: Timestamp, previousAnimation: DelayAnimation ): void { animation.startTime = now; animation.started = false; animation.current = value; if (previousAnimation === animation) { animation.previousAnimation = previousAnimation.previousAnimation; } else { animation.previousAnimation = previousAnimation; } } const callback = (finished?: boolean): void => { if (nextAnimation.callback) { nextAnimation.callback(finished); } }; return { isHigherOrder: true, onFrame: delay, onStart, current: nextAnimation.current, callback, previousAnimation: null, startTime: 0, started: false, }; }); } /** * @deprecated Kept for backward compatibility. Will be removed soon. */ export function delay( delayMs: number, _nextAnimation: NextAnimation<DelayAnimation> ): Animation<DelayAnimation> { 'worklet'; console.warn('Method `delay` is deprecated. Please use `withDelay` instead'); return withDelay(delayMs, _nextAnimation); }