1111 :event-type =" event.type"
1212 :event-id =" event.id"
1313 :tags =" normalizedTags"
14- :is-open =" !isCollapsed"
14+ :is-open =" !isCollapsed && !isOptimised "
1515 :is-visible-controls =" isVisibleControls"
1616 @toggle-view =" toggle"
1717 @delete =" deleteEvent"
1818 @copy =" copyCode"
1919 @download =" downloadImage"
2020 />
2121
22- <div v-if =" !isCollapsed" ref =" event_body" class =" preview-card__body" >
22+ <div
23+ v-if =" !isCollapsed && !isOptimised"
24+ ref =" event_body"
25+ class =" preview-card__body"
26+ >
2327 <slot />
2428 </div >
2529
2630 <PreviewCardFooter
27- v-if =" !isCollapsed && (normalizedOrigin || event.serverName)"
31+ v-if ="
32+ !isCollapsed && !isOptimised && (normalizedOrigin || event.serverName)
33+ "
2834 class =" preview-card__footer"
2935 :server-name =" event.serverName"
3036 :origin-config =" normalizedOrigin"
3440
3541<script lang="ts">
3642import { defineComponent , PropType } from " vue" ;
37- import { toPng , toBlob } from " html-to-image" ;
43+ import { toBlob , toPng } from " html-to-image" ;
3844import download from " downloadjs" ;
45+ import debounce from " lodash.debounce" ;
3946import PreviewCardFooter from " ~/components/PreviewCardFooter/PreviewCardFooter.vue" ;
4047import PreviewCardHeader from " ~/components/PreviewCardHeader/PreviewCardHeader.vue" ;
4148import { NormalizedEvent } from " ~/config/types" ;
@@ -50,7 +57,7 @@ export default defineComponent({
5057 },
5158 props: {
5259 event: {
53- type: Object as PropType <NormalizedEvent < unknown > >,
60+ type: Object as PropType <NormalizedEvent >,
5461 required: true ,
5562 },
5663 },
@@ -70,6 +77,7 @@ export default defineComponent({
7077 data() {
7178 return {
7279 isCollapsed: false ,
80+ isOptimised: false ,
7381 isVisibleControls: true ,
7482 };
7583 },
@@ -93,6 +101,12 @@ export default defineComponent({
93101 return ` ${this .event .type }-${this .event .id }.png ` ;
94102 },
95103 },
104+ mounted() {
105+ window .addEventListener (" scroll" , this .optimiseRenderHidden ());
106+ },
107+ beforeUnmount() {
108+ window .removeEventListener (" scroll" , this .optimiseRenderHidden ());
109+ },
96110 methods: {
97111 toggle(): void {
98112 this .isCollapsed = ! this .isCollapsed ;
@@ -131,6 +145,23 @@ export default defineComponent({
131145 });
132146 }
133147 },
148+ optimiseRenderHidden() {
149+ return debounce (() => {
150+ const { top, height } = this .$refs .event .getBoundingClientRect ();
151+ const extraDelta = height ;
152+ const isVisible =
153+ top - extraDelta <= window .innerHeight &&
154+ top + height + extraDelta * 2 >= 0 ;
155+
156+ if (! isVisible && ! this .isOptimised ) {
157+ this .isOptimised = true ;
158+ this .$refs .event .style .height = ` ${this .$refs .event .clientHeight }px ` ;
159+ } else if (isVisible && this .isOptimised ) {
160+ this .isOptimised = false ;
161+ this .$refs .event .style .height = " auto" ;
162+ }
163+ }, 50 );
164+ },
134165 },
135166});
136167 </script >
0 commit comments