add scroller composable

This commit is contained in:
riqo 2020-11-21 11:48:03 -06:00
commit 56747f2b83
2 changed files with 52 additions and 45 deletions

View 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
@ -28,14 +28,11 @@
<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,
};
},
});

View file

@ -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
}
}