aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/trails/SlideEffect.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/trails/SlideEffect.tsx')
-rw-r--r--src/client/views/nodes/trails/SlideEffect.tsx86
1 files changed, 58 insertions, 28 deletions
diff --git a/src/client/views/nodes/trails/SlideEffect.tsx b/src/client/views/nodes/trails/SlideEffect.tsx
index bd667b925..251649d6a 100644
--- a/src/client/views/nodes/trails/SlideEffect.tsx
+++ b/src/client/views/nodes/trails/SlideEffect.tsx
@@ -7,20 +7,26 @@ import { NumCast } from '../../../../fields/Types';
interface Props {
// pass in doc to extract width, height, bg
- doc: Doc;
- // wait for the transition movement to end before starting effect
- delay: number;
+ doc?: Doc;
dir: PresEffectDirection;
presEffect: PresEffect;
friction: number;
tension: number;
mass: number;
children: React.ReactNode;
+ infinite?: boolean;
}
+const DEFAULT_WIDTH = 40;
+const PREVIEW_OFFSET = 60;
+const ACTUAL_OFFSET = 200;
+const infiniteOptions = {
+ loop: true,
+ delay: 500,
+};
+
// TODO: add visibility detector when the slide comes into view
-export default function SpringAnimation({ doc, delay, dir, friction, tension, mass, presEffect, children }: Props) {
- console.log('delay:', delay);
+export default function SpringAnimation({ doc, dir, friction, tension, mass, presEffect, children, infinite }: Props) {
const [springs, api] = useSpring(
() => ({
from: {
@@ -34,12 +40,8 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
friction: friction,
mass: mass,
},
- onStart: () => {
- console.log('started');
- },
- onRest: () => {
- console.log('resting');
- },
+ onStart: () => {},
+ onRest: () => {},
}),
[tension, friction, mass]
);
@@ -110,7 +112,7 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
return {
from: {
opacity: 0,
- x: -200,
+ x: infinite ? -PREVIEW_OFFSET : -ACTUAL_OFFSET,
y: 0,
},
};
@@ -118,7 +120,7 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
return {
from: {
opacity: 0,
- x: 200,
+ x: infinite ? PREVIEW_OFFSET : ACTUAL_OFFSET,
y: 0,
},
};
@@ -127,7 +129,7 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
from: {
opacity: 0,
x: 0,
- y: -200,
+ y: infinite ? -PREVIEW_OFFSET : -ACTUAL_OFFSET,
},
};
case PresEffectDirection.Bottom:
@@ -135,7 +137,7 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
from: {
opacity: 0,
x: 0,
- y: 200,
+ y: infinite ? PREVIEW_OFFSET : ACTUAL_OFFSET,
},
};
default:
@@ -164,6 +166,7 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
},
},
],
+ loop: true,
};
const flipConfig = {
@@ -196,7 +199,7 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
from: {
opacity: 0,
x: 100,
- y: -120,
+ y: 120,
},
};
case PresEffectDirection.Top:
@@ -246,35 +249,41 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
opacity: 0,
},
to: [],
- loop: true,
};
// Switch animation depending on slide effect
const startAnimation = () => {
+ let config: any = zoomConfig;
switch (presEffect) {
case PresEffect.Bounce:
- api.start(bounceConfig);
+ config = bounceConfig;
break;
case PresEffect.Zoom:
- api.start(zoomConfig);
+ config = zoomConfig;
break;
case PresEffect.Rotate:
- api.start(rotateConfig);
+ config = rotateConfig;
break;
case PresEffect.Fade:
- api.start(fadeConfig);
+ config = fadeConfig;
break;
case PresEffect.Flip:
- api.start(flipConfig);
+ config = flipConfig;
break;
case PresEffect.Roll:
- api.start(rollConfig);
+ config = rollConfig;
break;
case PresEffect.Lightspeed:
break;
default:
break;
}
+
+ if (infinite) {
+ config = { ...config, ...infiniteOptions };
+ }
+
+ api.start(config);
};
// const flipRender = () => {
@@ -308,15 +317,30 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
<div className="flip-container" ref={ref}>
{dir === PresEffectDirection.Bottom || dir === PresEffectDirection.Top ? (
<>
- <animated.div className={'flip-side flip-back'} style={{ transform: to(springs.x, val => `perspective(600px) rotateX(${val}deg)`), width: NumCast(doc.width), height: NumCast(doc.height) }} />
- <animated.div className={'flip-side flip-front'} style={{ transform: to(springs.x, val => `perspective(600px) rotateX(${val}deg)`), rotateX: '180deg', width: NumCast(doc.width), height: NumCast(doc.height) }}>
+ <animated.div
+ className={'flip-side flip-back'}
+ style={{
+ transform: to(springs.x, val => `perspective(600px) rotateX(${val}deg)`),
+ width: doc ? NumCast(doc.width) : DEFAULT_WIDTH,
+ height: doc ? NumCast(doc.height) : DEFAULT_WIDTH,
+ backgroundColor: infinite ? '#a825ff' : 'rgb(223, 223, 223);',
+ }}
+ />
+ <animated.div
+ className={'flip-side flip-front'}
+ style={{ transform: to(springs.x, val => `perspective(600px) rotateX(${val}deg)`), rotateX: '180deg', width: doc ? NumCast(doc.width) : DEFAULT_WIDTH, height: doc ? NumCast(doc.height) : DEFAULT_WIDTH }}>
{children}
</animated.div>
</>
) : (
<>
- <animated.div className={'flip-side flip-back'} style={{ transform: to(springs.x, val => `perspective(600px) rotateY(${val}deg)`), width: NumCast(doc.width), height: NumCast(doc.height) }} />
- <animated.div className={'flip-side flip-front'} style={{ transform: to(springs.x, val => `perspective(600px) rotateY(${val}deg)`), rotateY: '180deg', width: NumCast(doc.width), height: NumCast(doc.height) }}>
+ <animated.div
+ className={'flip-side flip-back'}
+ style={{ transform: to(springs.x, val => `perspective(600px) rotateY(${val}deg)`), width: doc ? NumCast(doc.width) : DEFAULT_WIDTH, height: doc ? NumCast(doc.height) : DEFAULT_WIDTH }}
+ />
+ <animated.div
+ className={'flip-side flip-front'}
+ style={{ transform: to(springs.x, val => `perspective(600px) rotateY(${val}deg)`), rotateY: '180deg', width: doc ? NumCast(doc.width) : DEFAULT_WIDTH, height: doc ? NumCast(doc.height) : DEFAULT_WIDTH }}>
{children}
</animated.div>
</>
@@ -350,7 +374,7 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
// }, []);
useEffect(() => {
- if (!inView) return;
+ if (infinite || !inView) return;
console.log('in view');
// TODO: Control start with slide visibility instead
setTimeout(() => {
@@ -358,5 +382,11 @@ export default function SpringAnimation({ doc, delay, dir, friction, tension, ma
}, 100);
}, [inView]);
+ useEffect(() => {
+ if (infinite) {
+ startAnimation();
+ }
+ }, []);
+
return <div>{getRenderDoc()}</div>;
}