import InfoTooltip from "@/components/ui/info-tooltip";
import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table";
import { useTranslation } from "@/lib/i18n/client";
import { TextAndMatcher } from "@hoarder/shared/searchQueryParser";
import { Matcher } from "@hoarder/shared/types/search";
export default function QueryExplainerTooltip({
parsedSearchQuery,
header,
className,
}: {
header?: React.ReactNode;
parsedSearchQuery: TextAndMatcher & { result: string };
className?: string;
}) {
const { t } = useTranslation();
if (parsedSearchQuery.result == "invalid") {
return null;
}
const MatcherComp = ({ matcher }: { matcher: Matcher }) => {
switch (matcher.type) {
case "tagName":
return (
{matcher.inverse
? t("search.does_not_have_tag")
: t("search.has_tag")}
{matcher.tagName}
);
case "listName":
return (
{matcher.inverse
? t("search.is_not_in_list")
: t("search.is_in_list")}
{matcher.listName}
);
case "dateAfter":
return (
{matcher.inverse
? t("search.not_created_on_or_after")
: t("search.created_on_or_after")}
{matcher.dateAfter.toDateString()}
);
case "dateBefore":
return (
{matcher.inverse
? t("search.not_created_on_or_before")
: t("search.created_on_or_before")}
{matcher.dateBefore.toDateString()}
);
case "favourited":
return (
{matcher.favourited
? t("search.is_favorited")
: t("search.is_not_favorited")}
);
case "archived":
return (
{matcher.archived
? t("search.is_archived")
: t("search.is_not_archived")}
);
case "tagged":
return (
{matcher.tagged
? t("search.has_any_tag")
: t("search.has_no_tags")}
);
case "inlist":
return (
{matcher.inList
? t("search.is_in_any_list")
: t("search.is_not_in_any_list")}
);
case "and":
case "or":
return (
{matcher.type === "and" ? t("search.and") : t("search.or")}
{matcher.matchers.map((m, i) => (
))}
);
case "url":
return (
{matcher.inverse
? t("search.url_does_not_contain")
: t("search.url_contains")}
{matcher.url}
);
default: {
const _exhaustiveCheck: never = matcher;
return null;
}
}
};
return (
{header}
{parsedSearchQuery.text && (
{t("search.full_text_search")}
{parsedSearchQuery.text}
)}
{parsedSearchQuery.matcher && (
)}
);
}