appear
v-on:before-appear="beforeEnter"
v-on:appear="enter"
- v-on:appear-cancelled="leave"
>
<MessageItem
:item="item"
</template>
<script lang="ts">
-import { defineComponent, ref, inject, onMounted, reactive } from "vue";
+import { defineComponent, ref, reactive } from "vue";
import MessageItem from './UIDetails/messageItem.vue';
import InputItem from "./UIDetails/inputItem.vue";
import Messages from "./UIDetails/messages";
import useUIindexAnims from "@/composables/anims/useUIindexAnims";
export default defineComponent({
name: 'UIindex',
- components: { MessageItem, InputItem },
+ components: { MessageItem },
setup() {
const renderArr: Message[] = reactive([])
const messages = Messages;
const count = ref(0);
- const { beforeEnter, enter, msgOffset } = useUIindexAnims();
+ const { beforeEnter, enter } = useUIindexAnims();
- // TODO implemeant Undo animation
- function leave() {
-
- }
const renderMessage = () => {
if (count.value < messages.length) {
renderArr.push(messages[count.value])
return {
renderMessage,
renderArr,
- msgOffset,
beforeEnter,
enter,
- leave
}
},
});
-import { inject, onMounted, ref } from "vue";
+import { inject, onMounted } from "vue";
+import AnimeFunc from "@/types/animejs/index";
+import { MessageAnimeFunc } from '@/types/message/index';
export default function useUIindexAnims() {
- const anime: any = inject("animejs");
+
+ // imports animejs safely
+ let anime: AnimeFunc;
+ const animeInject: AnimeFunc | undefined = inject("animejs");
+ if (animeInject) anime = animeInject;
+
const msgOffset = {
x: 0,
y: 0
onMounted(() => {
messenger = document.getElementById("messenger");
- if (messenger) {
- winW = messenger.clientWidth;
- }
+ if (messenger) winW = messenger.clientWidth;
});
- const getSVGElHeight = (el: SVGGElement) => el.getBBox().height;
-
- function calculateAllCardsHeight() {
- const cards = document.querySelectorAll(".test");
- if (cards.length) {
- renderList = cards;
- for (const card of cards) {
- const el = card as SVGGElement;
- const height = getSVGElHeight(el);
- totalHeight += height;
+ function calculateAllMessageHeight(): void {
+ const messages = document.querySelectorAll(".test");
+ if (messages.length) {
+ renderList = messages;
+ for (const message of messages) {
+ const el = message as SVGGElement;
+ totalHeight += el.getBBox().height;
}
scrollAnim = totalHeight > 500 ? true : false;
}
}
- async function beforeEnter(el: SVGGElement) {
+ function beforeEnter(el: SVGGElement): void {
modifier = el.className.baseVal.substring(0, 2);
- if (!scrollAnim) calculateAllCardsHeight();
+ if (!scrollAnim) calculateAllMessageHeight();
}
- function scrollOffset(l: NodeList, height: number) {
+ function scrollOffset(l: NodeList, height: number): void {
for (const card of l) {
const c = card.parentNode as HTMLElement;
anime({
transform: `translate(0 ${height})`,
easing: "easeInOutQuad",
duration: 500,
- })
+ });
}
}
- function scrollAnimate(el: SVGGElement) {
+ const scrollAnimate: MessageAnimeFunc = (el, transform) => {
anime({
- targets: el,
- transform: `translate(${msgOffset.x} ${msgOffset.y})`,
+ targets: el, transform: transform.initialTranslate,
easing: "easeInOutQuad",
duration: 500,
begin: function() {
complete: function() {
anime({
targets: el,
- transform: `translate(${msgOffset.x} ${msgOffset.y + 5})`,
+ transform: transform.finalTranslate,
offset: 1000
});
}
});
}
- function stackAnimate(el: SVGGElement) {
- const translateUp = `translate(${msgOffset.x} ${msgOffset.y})`;
- const translateDown = `translate(${msgOffset.x} ${msgOffset.y + 5})`;
+ const stackAnimate: MessageAnimeFunc = (el, transform) => {
anime({
targets: el,
- transform: translateUp,
+ transform: transform.initialTranslate,
easing: "easeInOutQuad",
duration: 1000,
complete: function() {
anime({
targets: el,
- transform: translateDown,
+ transform: transform.finalTranslate,
easing: "easeInOutQuad",
duration: 500,
offset: 1000
});
}
- function addMessage(el: SVGGElement) {
- scrollAnim ? scrollAnimate(el) : stackAnimate(el)
+ function addMessage(el: SVGGElement): void {
+ const transform = {
+ initialTranslate: `translate(${msgOffset.x} ${msgOffset.y})`,
+ finalTranslate: `translate(${msgOffset.x} ${msgOffset.y + 5})`
+ }
+ scrollAnim ? scrollAnimate(el, transform) : stackAnimate(el, transform)
}
- function setXoffset(messageWidth: number) {
+ function setXoffset(messageWidth: number): void {
const paddingLeft = 40;
switch (modifier) {
case "sf":
}
}
- function setYoffset(messageHeight: number) {
+ function setYoffset(messageHeight: number): void {
if (prevCardH === 0) {
msgOffset.y += messageHeight;
} else {
prevCardH = messageHeight;
}
- function calculateMessageOffsets(msg: any) {
+ function calculateMessageOffsets(msg: HTMLElement): void {
const msgRect = msg.getBoundingClientRect();
if (scrollAnim) {
// update scroll
setYoffset(msgRect.height)
}
-
- async function enter(el: SVGGElement) {
+ async function enter(el: SVGGElement): Promise<void> {
msg = await document.getElementById(el.id);
- calculateMessageOffsets(msg)
+ if (msg) calculateMessageOffsets(msg);
addMessage(el);
}