"use client";
import Link from "next/link";
import { useCallback, useEffect, useRef, useState } from "react";
import { PetHabitat } from "@/components/pet/pet-habitat";
import {
defaultAvatarCustomization,
getAvatarCustomization,
type AvatarCustomization,
} from "@/lib/avatar-customization-storage";
import { getGuestLandingPetCustomization } from "@/lib/landing-random-pet";
import { routes } from "@/lib/routes";
import { createClient } from "@/lib/supabase/client";
import { cn } from "@/lib/utils";
function LandingPetPreviewSkeleton() {
return (
);
}
function computeLandingPetScale(lcdWidth: number): number {
return Math.min(7, Math.max(4, Math.round(lcdWidth / 36)));
}
export function LandingPetPreview() {
const resizeObserverRef = useRef(null);
const [isLoading, setIsLoading] = useState(true);
const [isSignedIn, setIsSignedIn] = useState(false);
const [petScale, setPetScale] = useState(7);
const [customization, setCustomization] = useState(
defaultAvatarCustomization,
);
const lcdRef = useCallback((node: HTMLDivElement | null) => {
resizeObserverRef.current?.disconnect();
resizeObserverRef.current = null;
if (!node) {
return;
}
const updateScale = (width: number) => {
setPetScale(computeLandingPetScale(width));
};
updateScale(node.getBoundingClientRect().width);
const observer = new ResizeObserver((entries) => {
const entry = entries[0];
if (entry) {
updateScale(entry.contentRect.width);
}
});
observer.observe(node);
resizeObserverRef.current = observer;
}, []);
const loadPreview = useCallback(async () => {
setIsLoading(true);
const supabase = createClient();
const {
data: { user },
} = await supabase.auth.getUser();
if (!user) {
setIsSignedIn(false);
setCustomization(getGuestLandingPetCustomization());
setIsLoading(false);
return;
}
setIsSignedIn(true);
try {
setCustomization(await getAvatarCustomization());
} catch {
setCustomization(defaultAvatarCustomization);
} finally {
setIsLoading(false);
}
}, []);
useEffect(() => {
void loadPreview();
}, [loadPreview]);
useEffect(() => {
return () => {
resizeObserverRef.current?.disconnect();
};
}, []);
if (isLoading) {
return ;
}
const preview = (
);
if (isSignedIn) {
return (
{preview}
);
}
return preview;
}