From 56747f2b83ca961681f980fd06b55cd6c36c7421 Mon Sep 17 00:00:00 2001 From: riqo Date: Sat, 21 Nov 2020 11:48:03 -0600 Subject: [PATCH] add scroller composable --- .../UI/UIDetails/messageRenderer.vue | 49 ++----------------- src/composables/scroller/useScroller.ts | 48 ++++++++++++++++++ 2 files changed, 52 insertions(+), 45 deletions(-) create mode 100644 src/composables/scroller/useScroller.ts diff --git a/src/components/UI/UIDetails/messageRenderer.vue b/src/components/UI/UIDetails/messageRenderer.vue index cd3a512..aeac5cc 100644 --- a/src/components/UI/UIDetails/messageRenderer.vue +++ b/src/components/UI/UIDetails/messageRenderer.vue @@ -3,7 +3,7 @@ version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" - :viewBox="testBox" + :viewBox="scrollView" > import useMessageRenderer from "@/composables/messageRenderer/useMessageRenderer"; +import useScroller from "@/composables/scroller/useScroller"; import { defineComponent, reactive, - ref, inject, - computed, - onMounted, - render, } from "vue"; import MessageItem from "./messageItem.vue"; import { Message } from "@/types/message/index"; @@ -45,45 +42,6 @@ export default defineComponent({ components: { MessageItem }, setup() { const renderArr: Message[] = reactive([]); - const scroll = ref(0); - let renderer: any; - const rendererHeight = ref(0); - let topBound: number; - - const clampedScroll = computed(() => { - const test = rendererHeight.value; - if (test === 0) { return 0; } - topBound = -test + 440; - return Math.max(topBound, Math.min(scroll.value, 0)) as number; - }) - - const testBox = computed(() => { - if (clampedScroll.value === 0) { - scroll.value = 0; - } else if (clampedScroll.value === topBound) { - scroll.value = topBound; - } - return `0 ${clampedScroll.value} 350 500`; - }); - - onMounted(() => { - renderer = document.getElementById("messageRenderer"); - }); - - window.addEventListener( - "wheel", - (e) => { - if (renderer) { - // get renderer height - rendererHeight.value = renderer.getBoundingClientRect().height; - // only scroll if renderer height is greater than main window - if (rendererHeight.value > 500) { - scroll.value += e.deltaY * 0.25; - } - } - }, - { passive: true } - ); // imports mitt Emitter safely let emitter: Mitt; @@ -96,13 +54,14 @@ export default defineComponent({ } const { beforeEnter, enter, afterEnter } = useMessageRenderer(); + const {scrollView} = useScroller({ targetId: "messageRenderer"}); return { renderArr, beforeEnter, enter, afterEnter, - testBox, + scrollView, }; }, }); diff --git a/src/composables/scroller/useScroller.ts b/src/composables/scroller/useScroller.ts new file mode 100644 index 0000000..302ff60 --- /dev/null +++ b/src/composables/scroller/useScroller.ts @@ -0,0 +1,48 @@ +import {ref, computed, onMounted} from "vue"; +export default function useScroller({ targetId }: {targetId: string}) { + + const scroll = ref(0); + let scrollTarget: HTMLElement | SVGElement | null; + const targetHeight = ref(0); + let topBound: number; + + const clampedScroll = computed(() => { + const test = targetHeight.value; + if (test === 0) { return 0; } + topBound = -test + 440; + return Math.max(topBound, Math.min(scroll.value, 0)) as number; + }) + + const scrollView = computed(() => { + if (clampedScroll.value === 0) { + scroll.value = 0; + } else if (clampedScroll.value === topBound) { + scroll.value = topBound; + } + return `0 ${clampedScroll.value} 350 500`; + }); + + onMounted(() => { + scrollTarget = document.getElementById(targetId); + }); + + window.addEventListener( + "wheel", + (e) => { + if (scrollTarget) { + // get renderer height + targetHeight.value = scrollTarget.getBoundingClientRect().height; + // only scroll if renderer height is greater than main window + if (targetHeight.value > 500) { + scroll.value += e.deltaY * 0.25; + } + } + }, + { passive: true } + ); + + return { + scrollView + } + +} \ No newline at end of file -- 2.43.0