"use client"; import { useMemo } from "react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { UserAvatar } from "@/components/ui/user-avatar"; import { useTranslation } from "@/lib/i18n/client"; import { MoreHorizontal, SearchIcon } from "lucide-react"; import { api } from "@karakeep/shared-react/trpc"; import { parseSearchQuery } from "@karakeep/shared/searchQueryParser"; import { ZBookmarkList } from "@karakeep/shared/types/lists"; import QueryExplainerTooltip from "../search/QueryExplainerTooltip"; import { ListOptions } from "./ListOptions"; export default function ListHeader({ initialData, }: { initialData: ZBookmarkList; }) { const { t } = useTranslation(); const router = useRouter(); const { data: list, error } = api.lists.get.useQuery( { listId: initialData.id, }, { initialData, }, ); const { data: collaboratorsData } = api.lists.getCollaborators.useQuery( { listId: initialData.id, }, { refetchOnWindowFocus: false, enabled: list.hasCollaborators, }, ); const parsedQuery = useMemo(() => { if (!list.query) { return null; } return parseSearchQuery(list.query); }, [list.query]); if (error) { // This is usually exercised during list deletions. if (error.data?.code == "NOT_FOUND") { router.push("/dashboard/lists"); } } return (
{list.icon} {list.name} {list.hasCollaborators && collaboratorsData && (
{collaboratorsData.owner && (

{collaboratorsData.owner.name}

)} {collaboratorsData.collaborators.map((collab) => (

{collab.user.name}

))}
)} {list.description && ( {`(${list.description})`} )}
{parsedQuery && ( {t("lists.smart_list")}
} parsedSearchQuery={parsedQuery} className="size-6 stroke-foreground" /> )}
); }