]> Repos - mime-chat/commitdiff
add scroller composable
authorriqo <hernandeze2@xavier.edu>
Sat, 21 Nov 2020 17:48:03 +0000 (11:48 -0600)
committerriqo <hernandeze2@xavier.edu>
Sat, 21 Nov 2020 17:48:03 +0000 (11:48 -0600)
src/components/UI/UIDetails/messageRenderer.vue
src/composables/scroller/useScroller.ts [new file with mode: 0644]

index cd3a5124266ffe0c92d856ab7c46f4c306192c40..aeac5cceae691cee1b0f934d491bc985545b85e5 100644 (file)
@@ -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"
   >
     <g id="messageRenderer">
       <g
 
 <script lang="ts">
 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 (file)
index 0000000..302ff60
--- /dev/null
@@ -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