Reverted default event loader to previous version

This commit is contained in:
Ivymaster
2026-09-09 13:58:43 +02:00
parent 5d0c6c1b4e
commit 76fe4f567c
+49 -76
View File
@@ -1,28 +1,15 @@
// TODO(chris): load events that are longer than the interval without doubling it
export function useEventLoader(
rangeInterval,
getPromiseFunc,
isLoaderVisible = true,
isLoaderInitiallyVisible = true,
) {
let hasFirstLoadOccurred = false;
export function useEventLoader(rangeInterval, getPromiseFunc) {
let loading_id = 0;
let tempEventsHolder = [];
let rangeIntervalHolder = null;
const events = Vue.ref([]);
const loadingEvents = Vue.ref([]);
const allEvents = Vue.computed(() =>
events.value.concat(loadingEvents.value),
);
const allEvents = Vue.computed(() => events.value.concat(loadingEvents.value));
const lv = Vue.ref(null);
const eventsLoaded = [];
const mergePromiseArr = (n, o) => {
if (Array.isArray(n)) return o.concat(n);
return (o.push(n), o);
if (Array.isArray(n))
return o.concat(n);
return o.push(n), o;
};
const markEventsLoaded = (start, end) => {
@@ -31,10 +18,10 @@ export function useEventLoader(
// empty: add new chunk
eventsLoaded.push(start.ts, end.ts);
} else {
if (eventsLoaded[eventsLoaded.length - 1] + 1 == start.ts) {
if (eventsLoaded[eventsLoaded.length-1] + 1 == start.ts) {
// add to the end of last chunk
eventsLoaded[eventsLoaded.length - 1] = end.ts;
} else if (eventsLoaded[eventsLoaded.length - 1] < start.ts) {
eventsLoaded[eventsLoaded.length-1] = end.ts;
} else if (eventsLoaded[eventsLoaded.length-1] < start.ts) {
// add new chunk after the last chunk
eventsLoaded.push(start.ts, end.ts);
} else if (eventsLoaded[0] == end.ts + 1) {
@@ -43,13 +30,14 @@ export function useEventLoader(
} else if (eventsLoaded[0] > end.ts) {
eventsLoaded.unshift(start.ts, end.ts);
} else {
let index = eventsLoaded.findIndex((e) => e >= start.ts);
let index = eventsLoaded.findIndex(e => e >= start.ts);
if (index % 2) {
// starts inside an existing chunk
if (eventsLoaded[index] >= end.ts) return []; // Already loaded
if (eventsLoaded[index] >= end.ts)
return []; // Already loaded
let indexIsLast = index == eventsLoaded.length - 1;
let indexIsLast = (index == eventsLoaded.length - 1);
if (indexIsLast || eventsLoaded[index + 1] > end.ts) {
// extend an existing chunk
@@ -58,16 +46,14 @@ export function useEventLoader(
start = start.plus(nStart - start.ts);
if (!indexIsLast && eventsLoaded[index + 1] == end.ts + 1)
eventsLoaded.splice(index, 2);
else eventsLoaded[index] = end.ts;
else
eventsLoaded[index] = end.ts;
} else {
// merge exising chunks
// and load the rest if necessary
if (eventsLoaded[index + 2] < end.ts) {
let rStart = eventsLoaded[index + 2] + 1;
result = mergePromiseArr(
markEventsLoaded(start.plus(rStart - start.ts), end),
result,
);
result = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);
}
let nStart = eventsLoaded[index] + 1;
@@ -83,32 +69,24 @@ export function useEventLoader(
// and load the rest if necessary
if (eventsLoaded[1] < end.ts) {
let rStart = eventsLoaded[1] + 1;
result = mergePromiseArr(
markEventsLoaded(start.plus(rStart - start.ts), end),
result,
);
result = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);
}
let nEnd = eventsLoaded[0] - 1;
end = end.plus(nEnd - end.ts);
eventsLoaded[0] = start.ts;
} else if (eventsLoaded[index] == start.ts) {
// starts at the same position as an existing chunk
if (eventsLoaded[index + 1] >= end.ts) return []; // Already loaded
if (eventsLoaded[index + 1] >= end.ts)
return []; // Already loaded
// load the rest
let rStart = eventsLoaded[index + 1] + 1;
result = mergePromiseArr(
markEventsLoaded(start.plus(rStart - start.ts), end),
result,
);
result = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);
} else {
// extend an existing chunk
// and load the rest if necessary
if (eventsLoaded[index + 1] < end.ts) {
let rStart = eventsLoaded[index + 1] + 1;
result = mergePromiseArr(
markEventsLoaded(start.plus(rStart - start.ts), end),
result,
);
result = mergePromiseArr(markEventsLoaded(start.plus(rStart - start.ts), end), result);
}
let nEnd = eventsLoaded[index] - 1;
end = end.plus(nEnd - end.ts);
@@ -118,57 +96,52 @@ export function useEventLoader(
}
}
if (start.ts >= end.ts) return result;
if (start.ts >= end.ts)
return result;
if (isLoaderVisible && !hasFirstLoadOccurred && isLoaderInitiallyVisible) {
loadingEvents.value.push({
loading_id: loading_id++,
type: 'loading',
isostart: start.toISODate() + 'T' + start.toISOTime(),
isoend: end.toISODate() + 'T' + end.toISOTime(),
});
}
loadingEvents.value.push({
loading_id: loading_id++,
type: "loading",
isostart: start.toISODate() + 'T' + start.toISOTime(),
isoend: end.toISODate() + 'T' + end.toISOTime()
});
return mergePromiseArr(getPromiseFunc(start, end), result);
};
const reload = () => {
const range = Vue.toValue(rangeInterval);
if (!(range instanceof luxon.Interval)) return;
if (!rangeIntervalHolder || !range.equals(rangeIntervalHolder)) {
hasFirstLoadOccurred = false;
rangeIntervalHolder = range;
}
if (!(range instanceof luxon.Interval))
return;
const promises = markEventsLoaded(range.start, range.end);
Promise
.allSettled(promises)
.then(results => {
results.forEach(res => {
if (
res.status === 'fulfilled'
&& res.value.meta.status === "success"
) {
if (res.value.meta.lv)
lv.value = res.value.meta.lv;
Promise.allSettled(promises).then((results) => {
results.forEach((res) => {
if (res.status === 'fulfilled' && res.value.meta.status === 'success') {
if (res.value.meta.lv) lv.value = res.value.meta.lv;
tempEventsHolder = tempEventsHolder.concat(res.value.data);
loadingEvents.value = [];
}
events.value = events.value.concat(res.value.data);
loadingEvents.value = [];
}
})
});
events.value = tempEventsHolder;
});
hasFirstLoadOccurred = true;
};
Vue.watchEffect(reload);
const reset = () => {
loading_id = 0;
tempEventsHolder = [];
//loadingEvents.value = [];
events.value = [];
loadingEvents.value = [];
eventsLoaded.splice(0, eventsLoaded.length);
reload();
};
}
return { events: allEvents, lv, reset };
}
return { events: allEvents, lv, reset }
}