import React, { useMemo } from "react"; import { json } from "@remix-run/node"; import { useLoaderData } from "@remix-run/react"; import { type LoaderFunctionArgs } from "@remix-run/server-runtime"; import { requireUserId, requireWorkpace } from "~/services/session.server"; import { getIntegrationDefinitions } from "~/services/integrationDefinition.server"; import { getIntegrationAccounts } from "~/services/integrationAccount.server"; import { IntegrationGrid } from "~/components/integrations/integration-grid"; import { PageHeader } from "~/components/common/page-header"; import { Plus } from "lucide-react"; import { FIXED_INTEGRATIONS } from "~/components/integrations/utils"; export async function loader({ request }: LoaderFunctionArgs) { const userId = await requireUserId(request); const workspace = await requireWorkpace(request); const [integrationDefinitions, integrationAccounts] = await Promise.all([ getIntegrationDefinitions(workspace.id), getIntegrationAccounts(userId), ]); // Combine fixed integrations with dynamic ones const allIntegrations = [...FIXED_INTEGRATIONS, ...integrationDefinitions]; return json({ integrationDefinitions: allIntegrations, integrationAccounts, userId, }); } export default function Integrations() { const { integrationDefinitions, integrationAccounts } = useLoaderData(); const activeAccountIds = useMemo( () => new Set( integrationAccounts .filter((acc) => acc.isActive) .map((acc) => acc.integrationDefinitionId), ), [integrationAccounts], ); return (
, onClick: () => window.open( "https://github.com/redplanethq/core/issues/new", "_blank", ), variant: "secondary", }, ]} />
); }