{"version":3,"sources":["../src/integrations/use-integrations.ts","../src/integrations/integrations-connect.tsx","../src/lib/stack0-handler.ts"],"names":["React","options","connection","cva","React2","jsxs","cn","jsx","RefreshCw","AlertCircle","Loader2","Link2","Check","ChevronDown","Fragment","Unplug"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type {\n  ConnectorInfo,\n  ConnectionInfo,\n  IntegrationsConnectConfig,\n  IntegrationsConnectState,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api.stack0.dev/v1\";\n\ninterface UseIntegrationsOptions extends IntegrationsConnectConfig {}\n\ninterface UseIntegrationsReturn extends IntegrationsConnectState {\n  connect: (connectorSlug: string, options?: { name?: string }) => Promise<void>;\n  disconnect: (connectionId: string) => Promise<void>;\n  refresh: () => Promise<void>;\n}\n\nexport function useIntegrations(options: UseIntegrationsOptions): UseIntegrationsReturn {\n  const { apiKey, baseUrl = DEFAULT_BASE_URL, category, connectors: connectorFilter, onConnected, onConnectionError, onDisconnected } = options;\n\n  const [state, setState] = React.useState<IntegrationsConnectState>({\n    connectors: [],\n    connections: [],\n    isLoading: true,\n    error: null,\n  });\n\n  const fetchWithAuth = React.useCallback(\n    async (path: string, init?: RequestInit) => {\n      const response = await fetch(`${baseUrl}${path}`, {\n        ...init,\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${apiKey}`,\n          ...init?.headers,\n        },\n      });\n\n      if (!response.ok) {\n        const error = await response.json().catch(() => ({ message: response.statusText }));\n        throw new Error(error.message || `Request failed: ${response.status}`);\n      }\n\n      return response.json();\n    },\n    [apiKey, baseUrl],\n  );\n\n  const fetchData = React.useCallback(async () => {\n    setState((prev) => ({ ...prev, isLoading: true, error: null }));\n\n    try {\n      // Fetch connectors and connections in parallel\n      const [connectorsData, connectionsData] = await Promise.all([\n        fetchWithAuth(`/integrations/connectors${category ? `?category=${category}` : \"\"}`),\n        fetchWithAuth(\"/integrations/connections\"),\n      ]);\n\n      let filteredConnectors = connectorsData as ConnectorInfo[];\n\n      // Apply connector filter if provided\n      if (connectorFilter && connectorFilter.length > 0) {\n        filteredConnectors = filteredConnectors.filter((c) => connectorFilter.includes(c.slug));\n      }\n\n      setState({\n        connectors: filteredConnectors,\n        connections: (connectionsData as ConnectionInfo[]).map((conn) => ({\n          ...conn,\n          createdAt: new Date(conn.createdAt),\n        })),\n        isLoading: false,\n        error: null,\n      });\n    } catch (error) {\n      setState((prev) => ({\n        ...prev,\n        isLoading: false,\n        error: error instanceof Error ? error.message : \"Failed to fetch integrations\",\n      }));\n    }\n  }, [fetchWithAuth, category, connectorFilter]);\n\n  // Initial fetch\n  React.useEffect(() => {\n    fetchData();\n  }, [fetchData]);\n\n  const connect = React.useCallback(\n    async (connectorSlug: string, options?: { name?: string }) => {\n      try {\n        // Create connection - this returns an authorization URL\n        const result = await fetchWithAuth(\"/integrations/connections\", {\n          method: \"POST\",\n          body: JSON.stringify({\n            connectorSlug,\n            name: options?.name,\n          }),\n        });\n\n        // Open OAuth popup\n        const width = 500;\n        const height = 600;\n        const left = window.screenX + (window.outerWidth - width) / 2;\n        const top = window.screenY + (window.outerHeight - height) / 2;\n\n        const popup = window.open(\n          result.authorizationUrl,\n          \"Stack0 Connect\",\n          `width=${width},height=${height},left=${left},top=${top},popup=yes`,\n        );\n\n        if (!popup) {\n          throw new Error(\"Failed to open authorization window. Please allow popups for this site.\");\n        }\n\n        // Poll for popup close and check connection status\n        const checkConnection = async () => {\n          return new Promise<ConnectionInfo>((resolve, reject) => {\n            const interval = setInterval(async () => {\n              try {\n                if (popup.closed) {\n                  clearInterval(interval);\n\n                  // Check connection status\n                  const connection = await fetchWithAuth(`/integrations/connections/${result.connectionId}`);\n\n                  if (connection.status === \"connected\") {\n                    resolve({\n                      ...connection,\n                      createdAt: new Date(connection.createdAt),\n                    });\n                  } else if (connection.status === \"error\") {\n                    reject(new Error(\"Connection failed. Please try again.\"));\n                  } else {\n                    reject(new Error(\"Connection was not completed.\"));\n                  }\n                }\n              } catch (error) {\n                clearInterval(interval);\n                reject(error);\n              }\n            }, 500);\n\n            // Timeout after 5 minutes\n            setTimeout(() => {\n              clearInterval(interval);\n              popup.close();\n              reject(new Error(\"Connection timed out.\"));\n            }, 5 * 60 * 1000);\n          });\n        };\n\n        const connection = await checkConnection();\n\n        // Refresh data\n        await fetchData();\n\n        // Call onConnected callback\n        onConnected?.(connection);\n      } catch (error) {\n        const err = error instanceof Error ? error : new Error(\"Connection failed\");\n        onConnectionError?.(err, connectorSlug);\n        throw err;\n      }\n    },\n    [fetchWithAuth, fetchData, onConnected, onConnectionError],\n  );\n\n  const disconnect = React.useCallback(\n    async (connectionId: string) => {\n      try {\n        await fetchWithAuth(`/integrations/connections/${connectionId}`, {\n          method: \"DELETE\",\n        });\n\n        // Refresh data\n        await fetchData();\n\n        // Call onDisconnected callback\n        onDisconnected?.(connectionId);\n      } catch (error) {\n        throw error instanceof Error ? error : new Error(\"Failed to disconnect\");\n      }\n    },\n    [fetchWithAuth, fetchData, onDisconnected],\n  );\n\n  return {\n    ...state,\n    connect,\n    disconnect,\n    refresh: fetchData,\n  };\n}\n","\"use client\";\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { Check, ChevronDown, Link2, Loader2, Unplug, AlertCircle, RefreshCw } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { ConnectorInfo, ConnectionInfo, IntegrationsConnectConfig, ConnectorCategory } from \"./types\";\nimport { useIntegrations } from \"./use-integrations\";\n\nconst containerVariants = cva(\"rounded-lg border bg-card\", {\n  variants: {\n    variant: {\n      default: \"border-border\",\n      minimal: \"border-transparent shadow-sm\",\n    },\n    size: {\n      sm: \"p-3\",\n      default: \"p-4\",\n      lg: \"p-6\",\n    },\n  },\n  defaultVariants: {\n    variant: \"default\",\n    size: \"default\",\n  },\n});\n\nconst connectorItemVariants = cva(\n  \"flex items-center gap-3 p-3 rounded-lg border transition-colors cursor-pointer\",\n  {\n    variants: {\n      variant: {\n        default: \"border-border hover:border-primary/50 hover:bg-muted/50\",\n        connected: \"border-green-500/50 bg-green-50 dark:bg-green-950/20\",\n        error: \"border-destructive/50 bg-destructive/5\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  },\n);\n\nexport interface IntegrationsConnectProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\">,\n    VariantProps<typeof containerVariants>,\n    IntegrationsConnectConfig {\n  /**\n   * Title for the component\n   * @default \"Connect your apps\"\n   */\n  title?: string;\n  /**\n   * Description text\n   */\n  description?: string;\n  /**\n   * Show category filter tabs\n   * @default false\n   */\n  showCategoryFilter?: boolean;\n  /**\n   * Show connected integrations count\n   * @default true\n   */\n  showConnectionCount?: boolean;\n  /**\n   * Whether to group connectors by category\n   * @default false\n   */\n  groupByCategory?: boolean;\n  /**\n   * Custom empty state content\n   */\n  emptyState?: React.ReactNode;\n}\n\nconst CATEGORY_LABELS: Record<ConnectorCategory, string> = {\n  crm: \"CRM\",\n  storage: \"Storage\",\n  communication: \"Communication\",\n  productivity: \"Productivity\",\n};\n\nconst CATEGORY_ORDER: ConnectorCategory[] = [\"crm\", \"storage\", \"communication\", \"productivity\"];\n\nexport function IntegrationsConnect({\n  apiKey,\n  baseUrl,\n  category: initialCategory,\n  connectors: connectorFilter,\n  onConnected,\n  onConnectionError,\n  onDisconnected,\n  title = \"Connect your apps\",\n  description,\n  showCategoryFilter = false,\n  showConnectionCount = true,\n  groupByCategory = false,\n  emptyState,\n  className,\n  variant,\n  size,\n  ...props\n}: IntegrationsConnectProps) {\n  const [selectedCategory, setSelectedCategory] = React.useState<ConnectorCategory | undefined>(initialCategory);\n  const [connectingSlug, setConnectingSlug] = React.useState<string | null>(null);\n\n  const { connectors, connections, isLoading, error, connect, disconnect, refresh } = useIntegrations({\n    apiKey,\n    baseUrl,\n    category: selectedCategory || initialCategory,\n    connectors: connectorFilter,\n    onConnected,\n    onConnectionError,\n    onDisconnected,\n  });\n\n  const handleConnect = async (connector: ConnectorInfo) => {\n    setConnectingSlug(connector.slug);\n    try {\n      await connect(connector.slug);\n    } finally {\n      setConnectingSlug(null);\n    }\n  };\n\n  const handleDisconnect = async (connection: ConnectionInfo) => {\n    setConnectingSlug(connection.connectorSlug);\n    try {\n      await disconnect(connection.id);\n    } finally {\n      setConnectingSlug(null);\n    }\n  };\n\n  // Get connection for a connector\n  const getConnectionForConnector = (connectorSlug: string): ConnectionInfo | undefined => {\n    return connections.find((c) => c.connectorSlug === connectorSlug && c.status === \"connected\");\n  };\n\n  // Group connectors by category if needed\n  const groupedConnectors = React.useMemo(() => {\n    if (!groupByCategory) return { all: connectors };\n\n    const groups: Record<string, ConnectorInfo[]> = {};\n    for (const connector of connectors) {\n      const cat = connector.category;\n      if (!groups[cat]) groups[cat] = [];\n      groups[cat].push(connector);\n    }\n    return groups;\n  }, [connectors, groupByCategory]);\n\n  // Filter categories that have connectors\n  const availableCategories = React.useMemo(() => {\n    const categories = new Set(connectors.map((c) => c.category));\n    return CATEGORY_ORDER.filter((cat) => categories.has(cat));\n  }, [connectors]);\n\n  const connectedCount = connections.filter((c) => c.status === \"connected\").length;\n\n  return (\n    <div className={cn(containerVariants({ variant, size }), className)} {...props}>\n      {/* Header */}\n      <div className=\"flex items-start justify-between gap-4 mb-4\">\n        <div>\n          <h3 className=\"text-lg font-semibold\">{title}</h3>\n          {description && <p className=\"text-sm text-muted-foreground mt-1\">{description}</p>}\n          {showConnectionCount && connectedCount > 0 && (\n            <p className=\"text-sm text-muted-foreground mt-1\">\n              {connectedCount} integration{connectedCount !== 1 ? \"s\" : \"\"} connected\n            </p>\n          )}\n        </div>\n        <button\n          type=\"button\"\n          onClick={refresh}\n          disabled={isLoading}\n          className=\"h-8 w-8 flex items-center justify-center rounded-md hover:bg-muted transition-colors disabled:opacity-50\"\n          title=\"Refresh\"\n        >\n          <RefreshCw className={cn(\"h-4 w-4\", isLoading && \"animate-spin\")} />\n        </button>\n      </div>\n\n      {/* Category filter */}\n      {showCategoryFilter && availableCategories.length > 1 && (\n        <div className=\"flex gap-2 mb-4 flex-wrap\">\n          <button\n            type=\"button\"\n            onClick={() => setSelectedCategory(undefined)}\n            className={cn(\n              \"px-3 py-1.5 text-sm rounded-full transition-colors\",\n              !selectedCategory\n                ? \"bg-primary text-primary-foreground\"\n                : \"bg-muted hover:bg-muted/80 text-muted-foreground\",\n            )}\n          >\n            All\n          </button>\n          {availableCategories.map((cat) => (\n            <button\n              key={cat}\n              type=\"button\"\n              onClick={() => setSelectedCategory(cat)}\n              className={cn(\n                \"px-3 py-1.5 text-sm rounded-full transition-colors\",\n                selectedCategory === cat\n                  ? \"bg-primary text-primary-foreground\"\n                  : \"bg-muted hover:bg-muted/80 text-muted-foreground\",\n              )}\n            >\n              {CATEGORY_LABELS[cat]}\n            </button>\n          ))}\n        </div>\n      )}\n\n      {/* Error state */}\n      {error && (\n        <div className=\"flex items-center gap-2 p-3 rounded-lg bg-destructive/10 text-destructive mb-4\">\n          <AlertCircle className=\"h-4 w-4 flex-shrink-0\" />\n          <p className=\"text-sm\">{error}</p>\n        </div>\n      )}\n\n      {/* Loading state */}\n      {isLoading && connectors.length === 0 && (\n        <div className=\"flex items-center justify-center py-8\">\n          <Loader2 className=\"h-6 w-6 animate-spin text-muted-foreground\" />\n        </div>\n      )}\n\n      {/* Empty state */}\n      {!isLoading && connectors.length === 0 && (\n        emptyState || (\n          <div className=\"text-center py-8 text-muted-foreground\">\n            <Link2 className=\"h-10 w-10 mx-auto mb-3 opacity-50\" />\n            <p>No integrations available</p>\n          </div>\n        )\n      )}\n\n      {/* Connector list */}\n      {connectors.length > 0 && (\n        <div className=\"space-y-4\">\n          {groupByCategory ? (\n            // Grouped by category\n            Object.entries(groupedConnectors).map(([cat, catConnectors]) => (\n              <div key={cat}>\n                <h4 className=\"text-sm font-medium text-muted-foreground mb-2\">\n                  {CATEGORY_LABELS[cat as ConnectorCategory]}\n                </h4>\n                <div className=\"space-y-2\">\n                  {catConnectors.map((connector) => (\n                    <ConnectorItem\n                      key={connector.slug}\n                      connector={connector}\n                      connection={getConnectionForConnector(connector.slug)}\n                      isConnecting={connectingSlug === connector.slug}\n                      onConnect={() => handleConnect(connector)}\n                      onDisconnect={(conn) => handleDisconnect(conn)}\n                    />\n                  ))}\n                </div>\n              </div>\n            ))\n          ) : (\n            // Flat list\n            <div className=\"space-y-2\">\n              {connectors.map((connector) => (\n                <ConnectorItem\n                  key={connector.slug}\n                  connector={connector}\n                  connection={getConnectionForConnector(connector.slug)}\n                  isConnecting={connectingSlug === connector.slug}\n                  onConnect={() => handleConnect(connector)}\n                  onDisconnect={(conn) => handleDisconnect(conn)}\n                />\n              ))}\n            </div>\n          )}\n        </div>\n      )}\n    </div>\n  );\n}\n\ninterface ConnectorItemProps {\n  connector: ConnectorInfo;\n  connection?: ConnectionInfo;\n  isConnecting: boolean;\n  onConnect: () => void;\n  onDisconnect: (connection: ConnectionInfo) => void;\n}\n\nfunction ConnectorItem({ connector, connection, isConnecting, onConnect, onDisconnect }: ConnectorItemProps) {\n  const [showMenu, setShowMenu] = React.useState(false);\n  const isConnected = !!connection;\n\n  return (\n    <div\n      className={cn(\n        connectorItemVariants({\n          variant: isConnected ? \"connected\" : \"default\",\n        }),\n      )}\n    >\n      {/* Icon */}\n      <div className=\"h-10 w-10 rounded-lg bg-muted flex items-center justify-center flex-shrink-0 overflow-hidden\">\n        {connector.iconUrl ? (\n          <img src={connector.iconUrl} alt={connector.name} className=\"h-6 w-6 object-contain\" />\n        ) : (\n          <Link2 className=\"h-5 w-5 text-muted-foreground\" />\n        )}\n      </div>\n\n      {/* Info */}\n      <div className=\"flex-1 min-w-0\">\n        <div className=\"flex items-center gap-2\">\n          <span className=\"font-medium\">{connector.name}</span>\n          {isConnected && <Check className=\"h-4 w-4 text-green-500\" />}\n        </div>\n        {connector.description && (\n          <p className=\"text-sm text-muted-foreground truncate\">{connector.description}</p>\n        )}\n        {isConnected && connection?.externalAccountName && (\n          <p className=\"text-xs text-muted-foreground\">Connected as {connection.externalAccountName}</p>\n        )}\n      </div>\n\n      {/* Action */}\n      <div className=\"flex-shrink-0 relative\">\n        {isConnecting ? (\n          <Loader2 className=\"h-5 w-5 animate-spin text-muted-foreground\" />\n        ) : isConnected ? (\n          <div className=\"relative\">\n            <button\n              type=\"button\"\n              onClick={() => setShowMenu(!showMenu)}\n              className=\"flex items-center gap-1 px-3 py-1.5 text-sm rounded-md bg-muted hover:bg-muted/80 transition-colors\"\n            >\n              Connected\n              <ChevronDown className=\"h-4 w-4\" />\n            </button>\n            {showMenu && (\n              <>\n                <div className=\"fixed inset-0 z-10\" onClick={() => setShowMenu(false)} />\n                <div className=\"absolute right-0 top-full mt-1 z-20 bg-popover border rounded-md shadow-lg py-1 min-w-[140px]\">\n                  <button\n                    type=\"button\"\n                    onClick={() => {\n                      setShowMenu(false);\n                      if (connection) onDisconnect(connection);\n                    }}\n                    className=\"flex items-center gap-2 w-full px-3 py-2 text-sm text-left hover:bg-muted transition-colors text-destructive\"\n                  >\n                    <Unplug className=\"h-4 w-4\" />\n                    Disconnect\n                  </button>\n                </div>\n              </>\n            )}\n          </div>\n        ) : (\n          <button\n            type=\"button\"\n            onClick={onConnect}\n            className=\"px-4 py-1.5 text-sm rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n          >\n            Connect\n          </button>\n        )}\n      </div>\n    </div>\n  );\n}\n\nIntegrationsConnect.displayName = \"IntegrationsConnect\";\n","import type { Stack0HandlerOptions, UploadHandler } from \"./types\";\n\n/**\n * Creates an upload handler that calls your API endpoint\n *\n * Your server endpoint should use the Stack0 SDK to create presigned URLs.\n * The client uploads directly to S3 using the presigned URL.\n *\n * @example\n * ```tsx\n * // Client-side usage\n * import { FileUpload, createStack0Handler } from \"@stack0/elements\";\n *\n * const handler = createStack0Handler({\n *   endpoint: \"/api/upload\",\n * });\n *\n * <FileUpload handler={handler} />\n * ```\n *\n * @example\n * ```ts\n * // Server-side API route (Next.js App Router)\n * // app/api/upload/route.ts\n * import { stack0 } from \"@stack0/sdk\";\n *\n * export async function POST(request: Request) {\n *   const { filename, mimeType, size, folder } = await request.json();\n *\n *   const result = await stack0.cdn.createUpload({\n *     filename,\n *     mimeType,\n *     size,\n *     folder,\n *     public: true, // Creates a public presigned URL\n *   });\n *\n *   return Response.json({\n *     uploadUrl: result.uploadUrl,\n *     assetId: result.assetId,\n *   });\n * }\n * ```\n */\nexport function createStack0Handler(\n  options: Stack0HandlerOptions\n): UploadHandler {\n  const { endpoint, confirmEndpoint, headers = {}, folder } = options;\n\n  return {\n    getUploadUrl: async (file: File) => {\n      const response = await fetch(endpoint, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          ...headers,\n        },\n        body: JSON.stringify({\n          filename: file.name,\n          mimeType: file.type || \"application/octet-stream\",\n          size: file.size,\n          folder: folder || undefined,\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.json().catch(() => ({}));\n        throw new Error(error.message || \"Failed to get upload URL\");\n      }\n\n      const data = await response.json();\n      return {\n        uploadUrl: data.uploadUrl,\n        assetId: data.assetId,\n      };\n    },\n\n    onUploadComplete: async (assetId: string) => {\n      const confirmUrl = confirmEndpoint || `${endpoint}/confirm`;\n\n      const response = await fetch(confirmUrl, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          ...headers,\n        },\n        body: JSON.stringify({ assetId }),\n      });\n\n      if (!response.ok) {\n        // Non-critical - upload succeeded, just couldn't confirm\n        console.warn(\"[Stack0] Could not confirm upload:\", assetId);\n        return {};\n      }\n\n      const data = await response.json();\n      return {\n        url: data.url,\n      };\n    },\n\n    onError: (error: Error, file: File) => {\n      console.error(`[Stack0] Upload failed for ${file.name}:`, error.message);\n    },\n  };\n}\n"]}