-
{project.name}
{(id) => ( <> {t("projects-edit")} > )}
{t("projects-loading-more")}
import { useInfiniteQuery, useMutation, useQueryClient } from "@tanstack/solid-query"; import { createFileRoute, Link } from "@tanstack/solid-router"; import { For, onCleanup, onMount, Show } from "solid-js"; import { FloatingActionButton } from "@/components/FloatingActionButton"; import Icon from "@/components/Icon"; import { Title } from "@/components/Title"; import { useI18n } from "../../i18n"; import { deleteProject, isProject, pagedQuery, type Id as ProjectId } from "../../project"; import { idQuery } from "../../user"; export const Route = createFileRoute("/_app/projects")({ component: Projects, async loader({ context: { queryClient } }) { const userId = await queryClient.ensureQueryData(idQuery); await queryClient.prefetchInfiniteQuery({ ...pagedQuery(userId), pages: 1 }); return { userId }; }, }); function Projects() { const routeData = Route.useLoaderData(); const userId = () => routeData().userId; const { t } = useI18n(); const projectsQuery = useInfiniteQuery(() => pagedQuery(userId())); const allProjects = () => projectsQuery.data?.pages.flat() ?? []; const queryClient = useQueryClient(); const deleteMutation = useMutation(() => { const currentUserId = userId(); const queryKey = pagedQuery(currentUserId).queryKey; return { mutationFn: deleteProject, async onSettled() { await queryClient.invalidateQueries({ queryKey }); }, }; }); const isDeleting = (id: ProjectId) => deleteMutation.isPending && deleteMutation.variables === id; const isLastProject = () => allProjects().length === 1; let sentinel!: HTMLDivElement; onMount(() => { const observer = new IntersectionObserver( ([entry]) => { if ( entry.isIntersecting && projectsQuery.hasNextPage && !projectsQuery.isFetchingNextPage ) { void projectsQuery.fetchNextPage(); } }, { rootMargin: "200px" }, ); observer.observe(sentinel); onCleanup(() => observer.disconnect()); }); return ( <>
{t("projects-loading-more")}