"use client"; import { useMemo, useState } from "react"; import { Badge, Card, Center, Group, Stack, Text, Tooltip, UnstyledButton } from "@mantine/core"; import { IconPuzzle } from "@tabler/icons-react"; import type { IntegrationKind } from "@homarr/definitions"; import { useI18n } from "@homarr/translation/client"; import { IntegrationAvatar } from "../components/integration-avatar"; import { SelectGridLayout, selectGridCardHeight } from "../select-grid-layout"; import { buildSortedIntegrations, categoryTranslationKeys, filterIntegrations } from "./integration-grid-shared"; import classes from "./integration-select-grid.module.css"; export interface IntegrationSelectGridProps { onSelect: (kind: IntegrationKind) => void; enableMockIntegration?: boolean; allowedKinds?: readonly IntegrationKind[]; } export const IntegrationSelectGrid = ({ onSelect, enableMockIntegration = false, allowedKinds, }: IntegrationSelectGridProps) => { const [search, setSearch] = useState(""); const t = useI18n(); const integrations = useMemo( () => buildSortedIntegrations({ enableMockIntegration, allowedKinds }), [allowedKinds, enableMockIntegration], ); const filtered = useMemo(() => filterIntegrations(integrations, search), [integrations, search]); return ( {filtered.map((integration) => ( onSelect(integration.kind)} aria-label={integration.name} > {integration.name} ))} {filtered.length === 0 && (
{t("common.noResults")}
)}
); }; const IntegrationGridMeta = ({ integration }: { integration: ReturnType[number] }) => { const t = useI18n(); return ( {integration.categories.slice(0, 2).map((category) => ( {categoryTranslationKeys[category] ? t(categoryTranslationKeys[category] as never) : category} ))} {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")} )} ); };