"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")}
)}
);
};