"use client"; import { useCallback, useMemo, useState } from "react"; import { Badge, Card, Center, Group, Input, ScrollArea, SimpleGrid, Stack, Text, Tooltip } from "@mantine/core"; import { IconCheck, IconPuzzle, IconSearch } from "@tabler/icons-react"; import type { IntegrationKind } from "@homarr/definitions"; import { useI18n } from "@homarr/translation/client"; import { IntegrationAvatar } from "@homarr/ui"; import { buildSortedIntegrations, CARD_HEIGHT, categoryTranslationKeys, filterIntegrations, } from "./integration-grid-shared"; interface IntegrationMultiSelectGridProps { selectedKinds: IntegrationKind[]; onSelectionChange: (kinds: IntegrationKind[]) => void; enableMockIntegration?: boolean; onboarding?: boolean; } export const IntegrationMultiSelectGrid = ({ selectedKinds: selectedKindsArray, onSelectionChange, enableMockIntegration = false, onboarding = false, }: IntegrationMultiSelectGridProps) => { const [search, setSearch] = useState(""); const selectedKinds = useMemo(() => new Set(selectedKindsArray), [selectedKindsArray]); const t = useI18n(); const toggleKind = useCallback( (kind: IntegrationKind) => { const current = new Set(selectedKindsArray); if (current.has(kind)) { current.delete(kind); } else { current.add(kind); } onSelectionChange(Array.from(current)); }, [selectedKindsArray, onSelectionChange], ); const integrations = useMemo( () => buildSortedIntegrations({ enableMockIntegration, onboarding }), [enableMockIntegration, onboarding], ); const filtered = useMemo(() => filterIntegrations(integrations, search), [integrations, search]); return ( setSearch(event.currentTarget.value)} leftSection={} placeholder={`${t("integration.page.list.search")}...`} data-autofocus /> {filtered.map((integration) => { const isSelected = selectedKinds.has(integration.kind); return ( toggleKind(integration.kind)} withBorder > {integration.name} {isSelected && }
{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")}
)} ); };