mirror of
https://iceshrimp.dev/limepotato/jormungandr-bite.git
synced 2024-11-22 09:57:29 -07:00
[client] Smarter timeline fetching
This commit is contained in:
parent
c347eca737
commit
151e7499c3
2 changed files with 37 additions and 9 deletions
|
@ -34,7 +34,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref } from "vue";
|
import { onActivated, onDeactivated, onMounted, onUnmounted, ref } from "vue";
|
||||||
import type { Paging } from "@/components/MkPagination.vue";
|
import type { Paging } from "@/components/MkPagination.vue";
|
||||||
import XNote from "@/components/MkNote.vue";
|
import XNote from "@/components/MkNote.vue";
|
||||||
import XList from "@/components/MkDateSeparatedList.vue";
|
import XList from "@/components/MkDateSeparatedList.vue";
|
||||||
|
@ -52,10 +52,34 @@ const props = defineProps<{
|
||||||
|
|
||||||
const pagingComponent = ref<InstanceType<typeof MkPagination>>();
|
const pagingComponent = ref<InstanceType<typeof MkPagination>>();
|
||||||
|
|
||||||
|
const interval = ref<NodeJS.Timer>();
|
||||||
|
|
||||||
function scrollTop() {
|
function scrollTop() {
|
||||||
|
if (!tlEl.value) return;
|
||||||
scroll(tlEl.value, { top: 0, behavior: "smooth" });
|
scroll(tlEl.value, { top: 0, behavior: "smooth" });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setTimer() {
|
||||||
|
if ($store.state.enableInfiniteScroll && !interval.value) {
|
||||||
|
interval.value = setInterval(() => {
|
||||||
|
const viewport = document.documentElement.clientHeight;
|
||||||
|
const left = document.documentElement.scrollHeight - document.documentElement.scrollTop;
|
||||||
|
if (left <= viewport * 3) pagingComponent.value.prefetchMore();
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearTimer() {
|
||||||
|
if (!interval.value) return;
|
||||||
|
clearInterval(interval.value);
|
||||||
|
interval.value = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(setTimer);
|
||||||
|
onActivated(setTimer);
|
||||||
|
onUnmounted(clearTimer);
|
||||||
|
onDeactivated(clearTimer);
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
pagingComponent,
|
pagingComponent,
|
||||||
scrollTop,
|
scrollTop,
|
||||||
|
|
|
@ -41,13 +41,11 @@
|
||||||
key="_more_"
|
key="_more_"
|
||||||
class="cxiknjgy _gap"
|
class="cxiknjgy _gap"
|
||||||
>
|
>
|
||||||
|
<div
|
||||||
|
v-appear="$store.state.enableInfiniteScroll && !disableAutoLoad ? fetchMore : null"
|
||||||
|
/>
|
||||||
<MkButton
|
<MkButton
|
||||||
v-if="!moreFetching"
|
v-if="!moreFetching && !$store.state.enableInfiniteScroll && !disableAutoLoad"
|
||||||
v-appear="
|
|
||||||
$store.state.enableInfiniteScroll && !disableAutoLoad
|
|
||||||
? fetchMore
|
|
||||||
: null
|
|
||||||
"
|
|
||||||
class="button"
|
class="button"
|
||||||
:disabled="moreFetching"
|
:disabled="moreFetching"
|
||||||
:style="{ cursor: moreFetching ? 'wait' : 'pointer' }"
|
:style="{ cursor: moreFetching ? 'wait' : 'pointer' }"
|
||||||
|
@ -109,7 +107,7 @@ export type Paging<
|
||||||
offsetMode?: boolean;
|
offsetMode?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const SECOND_FETCH_LIMIT = 30;
|
const SECOND_FETCH_LIMIT = 15;
|
||||||
|
|
||||||
const props = withDefaults(
|
const props = withDefaults(
|
||||||
defineProps<{
|
defineProps<{
|
||||||
|
@ -118,7 +116,7 @@ const props = withDefaults(
|
||||||
displayLimit?: number;
|
displayLimit?: number;
|
||||||
}>(),
|
}>(),
|
||||||
{
|
{
|
||||||
displayLimit: 30,
|
displayLimit: 15,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -243,6 +241,11 @@ const refresh = async (): void => {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const prefetchMore = async (): Promise<void> => {
|
||||||
|
if (props.disableAutoLoad || !$store.state.enableInfiniteScroll) return;
|
||||||
|
await fetchMore();
|
||||||
|
}
|
||||||
|
|
||||||
const fetchMore = async (): Promise<void> => {
|
const fetchMore = async (): Promise<void> => {
|
||||||
if (
|
if (
|
||||||
!more.value ||
|
!more.value ||
|
||||||
|
@ -498,6 +501,7 @@ defineExpose({
|
||||||
append,
|
append,
|
||||||
removeItem,
|
removeItem,
|
||||||
updateItem,
|
updateItem,
|
||||||
|
prefetchMore,
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue