Skip to content

Commit

Permalink
feat: initial viewport prefetching
Browse files Browse the repository at this point in the history
Signed-off-by: Logan McAnsh <logan@mcan.sh>
  • Loading branch information
mcansh committed May 19, 2023
1 parent 3e093e5 commit c695b26
Showing 1 changed file with 30 additions and 3 deletions.
33 changes: 30 additions & 3 deletions packages/remix-react/components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ export function RemixRouteError({ id }: { id: string }) {
* - "render": Fetched when the link is rendered
* - "none": Never fetched
*/
type PrefetchBehavior = "intent" | "render" | "none";
type PrefetchBehavior = "intent" | "render" | "none" | "viewport";

export interface RemixLinkProps extends LinkProps {
prefetch?: PrefetchBehavior;
Expand Down Expand Up @@ -324,21 +324,48 @@ let Link = React.forwardRef<HTMLAnchorElement, RemixLinkProps>(
({ to, prefetch = "none", ...props }, forwardedRef) => {
let isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX.test(to);

let fallbackRef = React.useRef<HTMLAnchorElement>(null);

let href = useHref(to);
let [shouldPrefetch, prefetchHandlers] = usePrefetchBehavior(
prefetch,
props
);

let [shouldActuallyPrefetch, setShouldActuallyPrefetch] =
React.useState(shouldPrefetch);

React.useEffect(() => {
if (prefetch === "viewport") {
let callback: IntersectionObserverCallback = (entries, observer) => {
console.log("entries", entries);
entries.forEach((entry) => {
if (entry.isIntersecting) {
setShouldActuallyPrefetch(true);
}
});
};
let observer = new IntersectionObserver(callback, { threshold: 0.5 });
observer.observe(fallbackRef.current!);

return () => {
observer.disconnect();
};
}
}, [forwardedRef, prefetch]);

return (
<>
<RouterLink
ref={forwardedRef}
ref={(el) => {
forwardedRef = el;
fallbackRef.current = el;
}}
to={to}
{...props}
{...prefetchHandlers}
/>
{shouldPrefetch && !isAbsolute ? (
{shouldActuallyPrefetch && !isAbsolute ? (
<PrefetchPageLinks page={href} />
) : null}
</>
Expand Down

0 comments on commit c695b26

Please sign in to comment.