metis-desk/modules/resources/src/web/global-applications/shared/ui/global-application-coincidences.tsx

56 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-10-24 23:19:17 +00:00
import { BrowserLink } from "@metis/core/client";
import { useQuery } from "@tanstack/react-query";
import { useTranslation } from "react-i18next";
import { useGlobalSoftwareCatalog } from "../global-software-catalog-context";
2026-10-24 23:19:17 +00:00
import { GlobalApplicationFeedback } from "./global-application-feedback";
export function GlobalApplicationCoincidences({ name }: { name: string }) {
const {
api: globalApplicationsApi,
keys: globalApplicationKeys,
text,
} = useGlobalSoftwareCatalog();
2026-10-24 23:19:17 +00:00
const { t } = useTranslation("resources");
const queryData = { search: name.trim(), sort: "name", direction: "asc", pageSize: 10 } as const;
const query = useQuery({
queryKey: globalApplicationKeys.list(queryData),
queryFn: () => globalApplicationsApi.list(queryData),
enabled: queryData.search.length > 0,
retry: false,
});
return (
<div className="space-y-2 text-sm">
<GlobalApplicationFeedback error={query.error} />
{query.isFetching && <p role="status">{t(`${text}.duplicateLoading`)}</p>}
2026-10-24 23:19:17 +00:00
{query.data && query.data.items.length > 0 && (
<>
<p>{t(`${text}.duplicates`)}</p>
2026-10-24 23:19:17 +00:00
<ul className="list-inside list-disc">
{query.data.items.map((item) => (
<li key={item.id}>
<BrowserLink
href={`/catalogs/global-applications/${item.id}`}
rel="noopener noreferrer"
target="_blank"
>
{item.name} · {item.provider ?? "—"}
</BrowserLink>
</li>
))}
</ul>
</>
)}
<BrowserLink
href={`/catalogs/global-applications?q=${encodeURIComponent(queryData.search)}`}
rel="noopener noreferrer"
target="_blank"
>
{t(`${text}.reviewCatalog`)}
2026-10-24 23:19:17 +00:00
</BrowserLink>
</div>
);
}