mirror of
https://github.com/immich-app/immich.git
synced 2025-06-03 05:34:32 -04:00
* initial pagination impl * use limit + offset instead of take + skip * wip web pagination * working infinite scroll * update api * formatting * fix rebase * search refactor * re-add runtime config for vector search * fix rebase * fixes * useless omitBy * unnecessary handling * add sql decorator for `searchAssets` * fixed search builder * fixed sql * remove mock method * linting * fixed pagination * fixed unit tests * formatting * fix e2e tests * re-flatten search builder * refactor endpoints * clean up dto * refinements * don't break everything just yet * update openapi spec & sql * update api * linting * update sql * fixes * optimize web code * fix typing * add page limit * make limit based on asset count * increase limit * simpler import
83 lines
2.2 KiB
Svelte
83 lines
2.2 KiB
Svelte
<script lang="ts">
|
|
import { BucketPosition } from '$lib/stores/assets.store';
|
|
import { createEventDispatcher, onMount } from 'svelte';
|
|
|
|
export let once = false;
|
|
export let top = 0;
|
|
export let bottom = 0;
|
|
export let left = 0;
|
|
export let right = 0;
|
|
export let root: HTMLElement | null = null;
|
|
|
|
export let intersecting = false;
|
|
let container: HTMLDivElement;
|
|
const dispatch = createEventDispatcher<{
|
|
hidden: HTMLDivElement;
|
|
intersected: {
|
|
container: HTMLDivElement;
|
|
position: BucketPosition;
|
|
};
|
|
}>();
|
|
|
|
onMount(() => {
|
|
if (typeof IntersectionObserver !== 'undefined') {
|
|
const rootMargin = `${top}px ${right}px ${bottom}px ${left}px`;
|
|
const observer = new IntersectionObserver(
|
|
(entries) => {
|
|
intersecting = entries.some((entry) => entry.isIntersecting);
|
|
if (!intersecting) {
|
|
dispatch('hidden', container);
|
|
}
|
|
|
|
if (intersecting && once) {
|
|
observer.unobserve(container);
|
|
}
|
|
|
|
if (intersecting) {
|
|
let position: BucketPosition = BucketPosition.Visible;
|
|
if (entries[0].boundingClientRect.top + 50 > entries[0].intersectionRect.bottom) {
|
|
position = BucketPosition.Below;
|
|
} else if (entries[0].boundingClientRect.bottom < 0) {
|
|
position = BucketPosition.Above;
|
|
}
|
|
|
|
dispatch('intersected', {
|
|
container,
|
|
position,
|
|
});
|
|
}
|
|
},
|
|
{
|
|
rootMargin,
|
|
root,
|
|
},
|
|
);
|
|
|
|
observer.observe(container);
|
|
return () => observer.unobserve(container);
|
|
}
|
|
|
|
// The following is a fallback for older browsers
|
|
function handler() {
|
|
const bcr = container.getBoundingClientRect();
|
|
|
|
intersecting =
|
|
bcr.bottom + bottom > 0 &&
|
|
bcr.right + right > 0 &&
|
|
bcr.top - top < window.innerHeight &&
|
|
bcr.left - left < window.innerWidth;
|
|
|
|
if (intersecting && once) {
|
|
window.removeEventListener('scroll', handler);
|
|
}
|
|
}
|
|
|
|
window.addEventListener('scroll', handler);
|
|
return () => window.removeEventListener('scroll', handler);
|
|
});
|
|
</script>
|
|
|
|
<div bind:this={container}>
|
|
<slot {intersecting} />
|
|
</div>
|