"use client" import { useState, useEffect } from "react" import { useQueryState } from "nuqs" import { cn } from "@lib/utils" import { dmSansClassName } from "@/lib/fonts" import { Button } from "@ui/components/button" import { MCPDetailView } from "@/components/mcp-modal/mcp-detail-view" import { XBookmarksDetailView } from "@/components/onboarding/x-bookmarks-detail-view" import { ChromeDetail } from "@/components/integrations/chrome-detail" import { ShortcutsDetail } from "@/components/integrations/shortcuts-detail" import { RaycastDetail } from "@/components/integrations/raycast-detail" import { ConnectionsDetail } from "@/components/integrations/connections-detail" import { PluginsDetail } from "@/components/integrations/plugins-detail" import { ChromeIcon, AppleShortcutsIcon, RaycastIcon, } from "@/components/integration-icons" import { GoogleDrive, Notion, OneDrive } from "@ui/assets/icons" import { ArrowLeft, Sun } from "lucide-react" import { integrationParam, pluginsPanelParam, type IntegrationParamValue, } from "@/lib/search-params" import Image from "next/image" type CardId = | "mcp" | "chrome" | "connections" | "shortcuts" | "raycast" | "import" | "plugins" interface IntegrationCardDef { id: CardId title: string description: string icon: React.ReactNode pro?: boolean } const cards: IntegrationCardDef[] = [ { id: "plugins", title: "Plugins", description: "Hermes on every plan; Claude Code, OpenCode, OpenClaw, and more with Pro", icon: (
Claude Code OpenCode OpenClaw Hermes
), }, { id: "connections", title: "Connections", description: "Link Notion, Google Drive, or OneDrive to import your docs", pro: true, icon: (
), }, { id: "mcp", title: "Connect to AI", description: "Set up MCP to use your memory in Cursor, Claude, and more", icon: ( MCP ), }, { id: "chrome", title: "Chrome Extension", description: "Save any webpage, import bookmarks, sync ChatGPT memories", icon: , }, { id: "shortcuts", title: "Apple Shortcuts", description: "Add memories directly from iPhone, iPad or Mac", icon: , }, { id: "raycast", title: "Raycast", description: "Add and search memories from Raycast on Mac", icon: , }, { id: "import", title: "Import Bookmarks", description: "Bring in X/Twitter bookmarks and turn them into memories", icon: X, }, ] function DetailWrapper({ onBack, children, }: { onBack: () => void children: React.ReactNode }) { return (
{children}
) } const INTEGRATION_TO_CARD: Record = { import: "import", chrome: "chrome", connections: "connections", } export function IntegrationsView() { const [integration, setIntegration] = useQueryState( "integration", integrationParam, ) const [pluginsPanel, setPluginsPanel] = useQueryState( "plugins", pluginsPanelParam, ) const [selectedCard, setSelectedCard] = useState(null) useEffect(() => { if (pluginsPanel === true) { setSelectedCard("plugins") return } if (integration && INTEGRATION_TO_CARD[integration]) { setSelectedCard(INTEGRATION_TO_CARD[integration]) } }, [integration, pluginsPanel]) const handleBack = () => { setSelectedCard(null) setIntegration(null) void setPluginsPanel(null) } switch (selectedCard) { case "mcp": return case "import": return case "chrome": return ( ) case "shortcuts": return ( ) case "raycast": return ( ) case "connections": return ( ) case "plugins": return ( ) } return (

Integrations

Connect supermemory to your tools and workflows

{cards.map((card) => ( ))}
) }