Skip to content

Commit 5085f8e

Browse files
committed
[#17] add events visibility optimisation
1 parent 84a9395 commit 5085f8e

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

components/PreviewCard/PreviewCard.vue

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,26 @@
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"
@@ -34,8 +40,9 @@
3440

3541
<script lang="ts">
3642
import { defineComponent, PropType } from "vue";
37-
import { toPng, toBlob } from "html-to-image";
43+
import { toBlob, toPng } from "html-to-image";
3844
import download from "downloadjs";
45+
import debounce from "lodash.debounce";
3946
import PreviewCardFooter from "~/components/PreviewCardFooter/PreviewCardFooter.vue";
4047
import PreviewCardHeader from "~/components/PreviewCardHeader/PreviewCardHeader.vue";
4148
import { 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>

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
"flame-chart-js": "^2.3.1",
7171
"highlight.js": "^11.7.0",
7272
"html-to-image": "^1.11.4",
73+
"lodash.debounce": "^4.0.8",
7374
"moment": "^2.29.4",
7475
"nuxt": "3.3.3",
7576
"pinia": "^2.0.30",

0 commit comments

Comments
 (0)