"use client"; import { useMemo, useState } from "react"; import { Badge, Card, Center, Group, Stack, Text, Tooltip } from "@mantine/core"; import { IconPuzzle } from "@tabler/icons-react"; import type { IntegrationKind } from "@homarr/definitions"; import { useI18n } from "@homarr/translation/client"; import { IntegrationAvatar, SelectGridLayout, selectGridCardHeight } from "@homarr/ui"; import { buildSortedIntegrations, categoryTranslationKeys, filterIntegrations } from "./integration-grid-shared"; interface IntegrationSelectGridProps { onSelect: (kind: IntegrationKind) => void; enableMockIntegration?: boolean; } export const IntegrationSelectGrid = ({ onSelect, enableMockIntegration = false }: IntegrationSelectGridProps) => { const [search, setSearch] = useState(""); const t = useI18n(); const integrations = useMemo(() => buildSortedIntegrations({ enableMockIntegration }), [enableMockIntegration]); const filtered = useMemo(() => filterIntegrations(integrations, search), [integrations, search]); return ( {filtered.map((integration) => ( onSelect(integration.kind)} withBorder > {integration.name} {integration.categories.slice(0, 2).map((cat) => ( {categoryTranslationKeys[cat] ? t(categoryTranslationKeys[cat] as never) : cat} ))} {integration.widgets.length > 0 ? ( {integration.widgets.map((widgetKind) => ( {t(`widget.${widgetKind}.name`)} ))} } > }> {t("integration.grid.widgetCount", { count: String(integration.widgets.length) })} ) : ( {t("integration.grid.noWidgets")} )} ))} {filtered.length === 0 && (
{t("common.noResults")}
)}
); };