Files
pihkaal-me/app/stores/contact.ts

133 lines
2.5 KiB
TypeScript

import gsap from "gsap";
export const useContactStore = defineStore("contact", {
state: () => ({
intro: {
stage1Opacity: 0,
stage2Opacity: 0,
stage3Opacity: 0,
titleY: SCREEN_HEIGHT,
barOffsetY: 20,
},
outro: {
stage1Opacity: 1,
stage2Opacity: 1,
stage3Opacity: 1,
},
isIntro: true,
isOutro: false,
notifications: [] as string[],
notificationsYOffset: 0,
}),
actions: {
animateIntro() {
this.isIntro = true;
gsap
.timeline()
.fromTo(
this.intro,
{
stage1Opacity: 0,
titleY: SCREEN_HEIGHT,
},
{
stage1Opacity: 1,
titleY: SCREEN_HEIGHT - 23,
duration: 0.1,
ease: "none",
},
2,
)
.fromTo(
this.intro,
{ stage2Opacity: 0 },
{
stage2Opacity: 1,
duration: 0.1,
ease: "none",
},
2.15,
)
.fromTo(
this.intro,
{
stage3Opacity: 0,
barOffsetY: 20,
},
{
stage3Opacity: 1,
barOffsetY: 0,
duration: 0.1,
ease: "none",
},
2.3,
)
.call(() => {
this.isIntro = false;
});
},
pushNotification(content: string) {
this.notifications.push(content);
gsap.fromTo(
this,
{ notificationsYOffset: 20 },
{ notificationsYOffset: 0, duration: 0.075 },
);
},
animateOutro() {
this.isOutro = true;
const timeline = gsap.timeline({
onComplete: () => {
setTimeout(() => {
const router = useRouter();
router.push({ query: {} });
}, 2000);
},
});
timeline
.fromTo(
this.outro,
{ stage1Opacity: 1 },
{
stage1Opacity: 0,
duration: 0.2,
ease: "none",
},
0,
)
.fromTo(
this.outro,
{ stage2Opacity: 1 },
{
stage2Opacity: 0,
duration: 0.25,
ease: "none",
},
0.25,
)
.fromTo(
this.outro,
{ stage3Opacity: 1 },
{
stage3Opacity: 0,
duration: 0.3,
ease: "none",
},
0.5,
);
},
},
});