@open-mercato/core 0.6.8-develop.6917.1.af45bc96e2 → 0.6.8-develop.6918.1.7b3f32b0c8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -122,14 +122,19 @@ function IntegrationsMarketplacePage() {
122
122
  const load = React.useCallback(async () => {
123
123
  setIsLoading(true);
124
124
  const fallback = { items: [], bundles: [], total: 0, page: 1, pageSize: 100, totalPages: 1 };
125
- const call = await apiCall(`/api/integrations${listQuery}`, void 0, { fallback });
126
- if (!call.ok) {
125
+ try {
126
+ const call = await apiCall(`/api/integrations${listQuery}`, void 0, { fallback });
127
+ if (!call.ok) {
128
+ flash(t("integrations.marketplace.loadError"), "error");
129
+ setIsLoading(false);
130
+ return;
131
+ }
132
+ setData(call.result ?? fallback);
133
+ setIsLoading(false);
134
+ } catch {
127
135
  flash(t("integrations.marketplace.loadError"), "error");
128
136
  setIsLoading(false);
129
- return;
130
137
  }
131
- setData(call.result ?? fallback);
132
- setIsLoading(false);
133
138
  }, [listQuery, t]);
134
139
  React.useEffect(() => {
135
140
  void load();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/integrations/backend/integrations/page.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Card, CardHeader, CardTitle, CardContent } from '@open-mercato/ui/primitives/card'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { FilterBar, type FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { Bell, Cog, CreditCard, HardDrive, LayoutGrid, MessageSquare, RefreshCw, Search, Truck, Webhook } from 'lucide-react'\nimport {\n buildIntegrationMarketplaceFilterDefs,\n getIntegrationMarketplaceCategory,\n getListQueryFromFilterValues,\n INTEGRATION_MARKETPLACE_CATEGORIES,\n normalizeIntegrationMarketplaceFilterValues,\n} from './filters'\n\ntype IntegrationAnalytics = {\n lastActivityAt: string | null\n totalCount: number\n errorCount: number\n errorRate: number\n dailyCounts: number[]\n}\n\ntype IntegrationItem = {\n id: string\n title: string\n description?: string\n category?: string\n tags?: string[]\n bundleId?: string\n author?: string\n company?: string\n version?: string\n isEnabled: boolean\n hasCredentials: boolean\n healthStatus: 'healthy' | 'degraded' | 'unhealthy' | 'unconfigured'\n analytics: IntegrationAnalytics\n stateUpdatedAt?: string | null\n}\n\ntype BundleItem = {\n id: string\n title: string\n description?: string\n icon?: string\n integrationCount: number\n enabledCount: number\n}\n\ntype ListResponse = {\n items: IntegrationItem[]\n bundles: BundleItem[]\n total: number\n page: number\n pageSize: number\n totalPages: number\n}\n\nconst CATEGORY_ICONS: Record<string, React.ElementType> = {\n all: LayoutGrid,\n payment: CreditCard,\n shipping: Truck,\n data_sync: RefreshCw,\n communication: MessageSquare,\n notification: Bell,\n storage: HardDrive,\n webhook: Webhook,\n}\n\nconst HEALTH_BADGE_CLASS: Record<string, string> = {\n healthy: 'bg-emerald-500/15 text-emerald-800 dark:text-emerald-300',\n degraded: 'bg-amber-500/15 text-amber-900 dark:text-amber-300',\n unhealthy: 'bg-destructive/15 text-destructive',\n unconfigured: 'bg-muted text-muted-foreground',\n}\n\nfunction buildListQueryString(input: {\n q?: string\n category?: string\n bundleId?: string\n isEnabled?: boolean\n healthStatus?: string\n sort?: string\n order?: string\n page?: number\n pageSize?: number\n}): string {\n const params = new URLSearchParams()\n if (input.q) params.set('q', input.q)\n if (input.category) params.set('category', input.category)\n if (input.bundleId) params.set('bundleId', input.bundleId)\n if (input.isEnabled !== undefined) params.set('isEnabled', String(input.isEnabled))\n if (input.healthStatus) params.set('healthStatus', input.healthStatus)\n if (input.sort) params.set('sort', input.sort)\n if (input.order) params.set('order', input.order)\n if (input.page != null && input.page > 1) params.set('page', String(input.page))\n if (input.pageSize != null && input.pageSize !== 100) params.set('pageSize', String(input.pageSize))\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\nfunction LogSparkline({ counts, className }: { counts: number[]; className?: string }) {\n const max = Math.max(1, ...counts)\n const w = 72\n const h = 22\n const step = counts.length > 1 ? w / (counts.length - 1) : w\n const points = counts.map((count, index) => {\n const x = index * step\n const y = h - (count / max) * (h - 3) - 1.5\n return `${x},${y}`\n }).join(' ')\n return (\n <svg width={w} height={h} className={className} aria-hidden>\n <polyline\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n points={points}\n className=\"text-muted-foreground/80\"\n />\n </svg>\n )\n}\n\nexport default function IntegrationsMarketplacePage() {\n const [data, setData] = React.useState<ListResponse | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [searchInput, setSearchInput] = React.useState('')\n const [debouncedSearch, setDebouncedSearch] = React.useState('')\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [sortField, setSortField] = React.useState<'title' | 'category' | 'enabledAt' | 'healthStatus'>('title')\n const [sortOrder, setSortOrder] = React.useState<'asc' | 'desc'>('asc')\n const [page, setPage] = React.useState(1)\n const [togglingIds, setTogglingIds] = React.useState<Set<string>>(new Set())\n const scopeVersion = useOrganizationScopeVersion()\n const t = useT()\n const { runMutation, retryLastMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'integrations.marketplace',\n })\n\n React.useEffect(() => {\n const timer = setTimeout(() => setDebouncedSearch(searchInput.trim()), 300)\n return () => clearTimeout(timer)\n }, [searchInput])\n\n const selectedCategory = React.useMemo(() => getIntegrationMarketplaceCategory(filterValues), [filterValues])\n\n const listQuery = React.useMemo(() => {\n const fromFilters = getListQueryFromFilterValues(filterValues)\n const category = selectedCategory !== 'all' ? selectedCategory : fromFilters.category\n return buildListQueryString({\n q: debouncedSearch || undefined,\n ...(category ? { category } : {}),\n ...(fromFilters.bundleId ? { bundleId: fromFilters.bundleId } : {}),\n ...(fromFilters.isEnabled !== undefined ? { isEnabled: fromFilters.isEnabled } : {}),\n ...(fromFilters.healthStatus ? { healthStatus: fromFilters.healthStatus } : {}),\n sort: sortField,\n order: sortOrder,\n page,\n pageSize: 100,\n })\n }, [debouncedSearch, filterValues, page, selectedCategory, sortField, sortOrder])\n\n const bundleFilterOptions = React.useMemo(\n () => (data?.bundles ?? []).map((bundle) => ({ id: bundle.id, title: bundle.title })),\n [data?.bundles],\n )\n\n const categoryFilters = React.useMemo(\n () => buildIntegrationMarketplaceFilterDefs(t, bundleFilterOptions),\n [bundleFilterOptions, t],\n )\n\n const load = React.useCallback(async () => {\n setIsLoading(true)\n const fallback: ListResponse = { items: [], bundles: [], total: 0, page: 1, pageSize: 100, totalPages: 1 }\n const call = await apiCall<ListResponse>(`/api/integrations${listQuery}`, undefined, { fallback })\n if (!call.ok) {\n flash(t('integrations.marketplace.loadError'), 'error')\n setIsLoading(false)\n return\n }\n setData(call.result ?? fallback)\n setIsLoading(false)\n }, [listQuery, t])\n\n React.useEffect(() => {\n void load()\n }, [load, scopeVersion])\n\n React.useEffect(() => {\n setPage(1)\n }, [debouncedSearch, filterValues, selectedCategory, sortField, sortOrder])\n\n const handleToggle = React.useCallback(async (integrationId: string, enabled: boolean, updatedAt?: string | null) => {\n setTogglingIds((prev) => new Set(prev).add(integrationId))\n try {\n const call = await runMutation({\n mutationPayload: { integrationId, isEnabled: enabled },\n context: {\n formId: 'integrations.marketplace',\n operation: 'update',\n actionId: 'toggle-state',\n resourceKind: 'integrations.integration',\n resourceId: integrationId,\n integrationId,\n retryLastMutation,\n },\n operation: () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader(updatedAt),\n () => apiCall<{ updatedAt?: string | null }>(`/api/integrations/${encodeURIComponent(integrationId)}/state`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ isEnabled: enabled }),\n }, { fallback: null }),\n ),\n })\n\n if (!call.ok) {\n flash(t('integrations.detail.stateError'), 'error')\n } else {\n const nextUpdatedAt = call.result?.updatedAt ?? null\n setData((prev) => {\n if (!prev) return prev\n return {\n ...prev,\n items: prev.items.map((item) =>\n item.id === integrationId\n ? { ...item, isEnabled: enabled, stateUpdatedAt: nextUpdatedAt ?? item.stateUpdatedAt }\n : item,\n ),\n }\n })\n }\n } catch {\n flash(t('integrations.detail.stateError'), 'error')\n } finally {\n setTogglingIds((prev) => { const next = new Set(prev); next.delete(integrationId); return next })\n }\n }, [retryLastMutation, runMutation, t])\n\n const grouped = React.useMemo(() => {\n if (!data) return { bundles: [] as Array<BundleItem & { integrations: IntegrationItem[] }>, standalone: [] as IntegrationItem[] }\n\n const bundled = new Map<string, IntegrationItem[]>()\n const standalone: IntegrationItem[] = []\n for (const item of data.items) {\n if (item.bundleId) {\n const list = bundled.get(item.bundleId) ?? []\n list.push(item)\n bundled.set(item.bundleId, list)\n } else {\n standalone.push(item)\n }\n }\n\n const bundles = (data.bundles ?? [])\n .filter((b) => bundled.has(b.id))\n .map((b) => ({ ...b, integrations: bundled.get(b.id) ?? [] }))\n\n return { bundles, standalone }\n }, [data])\n\n const renderCategoryIcon = React.useCallback((category: string | undefined, className: string) => {\n if (!category) return null\n const Icon = CATEGORY_ICONS[category]\n if (!Icon) return null\n return <Icon className={className} />\n }, [])\n\n const renderHealthBadge = React.useCallback((status: IntegrationItem['healthStatus']) => {\n return (\n <span\n className={`inline-flex shrink-0 items-center rounded-full px-2 py-0.5 text-xs font-semibold uppercase tracking-wide ${HEALTH_BADGE_CLASS[status] ?? HEALTH_BADGE_CLASS.unconfigured}`}\n >\n {t(`integrations.marketplace.health.${status}`, status)}\n </span>\n )\n }, [t])\n\n if (isLoading && !data) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex items-center justify-center py-16\">\n <Spinner />\n </div>\n </PageBody>\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody className=\"space-y-6\">\n <section className=\"space-y-6 rounded-lg border bg-background p-6\">\n <header className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"space-y-0.5\">\n <h2 className=\"text-lg font-semibold\">{t('integrations.marketplace.title')}</h2>\n <p className=\"text-sm text-muted-foreground\">\n {t('integrations.marketplace.description')}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative w-full min-w-[200px] max-w-xs lg:w-64\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 size-4 text-muted-foreground pointer-events-none\" />\n <Input\n placeholder={t('integrations.marketplace.search')}\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"pl-8\"\n />\n </div>\n <label className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span className=\"sr-only\">{t('integrations.marketplace.sort.label', 'Sort by')}</span>\n <select\n className=\"h-9 rounded-md border border-input bg-background px-2 text-sm\"\n value={sortField}\n onChange={(e) => setSortField(e.target.value as typeof sortField)}\n >\n <option value=\"title\">{t('integrations.marketplace.sort.title', 'Title')}</option>\n <option value=\"category\">{t('integrations.marketplace.sort.category', 'Category')}</option>\n <option value=\"enabledAt\">{t('integrations.marketplace.sort.enabledAt', 'Enabled date')}</option>\n <option value=\"healthStatus\">{t('integrations.marketplace.sort.health', 'Health')}</option>\n </select>\n </label>\n <select\n className=\"h-9 rounded-md border border-input bg-background px-2 text-sm\"\n value={sortOrder}\n onChange={(e) => setSortOrder(e.target.value as typeof sortOrder)}\n aria-label={t('integrations.marketplace.sort.order', 'Sort order')}\n >\n <option value=\"asc\">{t('integrations.marketplace.sort.asc', 'Ascending')}</option>\n <option value=\"desc\">{t('integrations.marketplace.sort.desc', 'Descending')}</option>\n </select>\n </div>\n </header>\n\n <div className=\"lg:hidden\">\n <FilterBar\n searchValue={searchInput}\n onSearchChange={setSearchInput}\n searchPlaceholder={t('integrations.marketplace.search')}\n searchAlign=\"left\"\n filters={categoryFilters}\n values={filterValues}\n onApply={(values) => setFilterValues(normalizeIntegrationMarketplaceFilterValues(values))}\n onClear={() => setFilterValues({})}\n />\n </div>\n\n <div className=\"hidden lg:flex flex-wrap gap-1.5\">\n {INTEGRATION_MARKETPLACE_CATEGORIES.map((category) => {\n const Icon = CATEGORY_ICONS[category]\n return (\n <Button\n key={category}\n type=\"button\"\n variant={selectedCategory === category ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterValues(normalizeIntegrationMarketplaceFilterValues({ category }))}\n >\n {Icon ? <Icon className=\"mr-1.5 h-3.5 w-3.5\" /> : null}\n {t(`integrations.marketplace.categories.${category}`)}\n </Button>\n )\n })}\n </div>\n\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Spinner />\n </div>\n ) : null}\n\n {data && data.totalPages > 1 ? (\n <div className=\"flex flex-wrap items-center justify-between gap-2 text-sm text-muted-foreground\">\n <span>\n {data.total === 0\n ? t('integrations.marketplace.pagination.empty', 'No results')\n : t('integrations.marketplace.pagination.summary', {\n from: (data.page - 1) * data.pageSize + 1,\n to: Math.min(data.page * data.pageSize, data.total),\n total: data.total,\n })}\n </span>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={data.page <= 1}\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n >\n {t('integrations.marketplace.pagination.prev', 'Previous')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={data.page >= data.totalPages}\n onClick={() => setPage((p) => p + 1)}\n >\n {t('integrations.marketplace.pagination.next', 'Next')}\n </Button>\n </div>\n </div>\n ) : null}\n\n {grouped.bundles.map((bundle) => (\n <Card key={bundle.id}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <CardTitle>{bundle.title}</CardTitle>\n {bundle.description && (\n <p className=\"text-muted-foreground text-sm mt-1\">{bundle.description}</p>\n )}\n <p className=\"text-muted-foreground text-xs mt-1\">\n {t('integrations.marketplace.integrations', { count: bundle.integrations.length })}\n </p>\n </div>\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link href={`/backend/integrations/bundle/${encodeURIComponent(bundle.id)}`}>\n <Cog className=\"mr-1.5 h-4 w-4\" />\n {t('integrations.marketplace.configure')}\n </Link>\n </Button>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3\">\n {bundle.integrations.map((item) => (\n <div\n key={item.id}\n className=\"flex flex-col gap-2 rounded-lg border p-3\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {renderCategoryIcon(item.category, 'h-4 w-4 text-muted-foreground shrink-0')}\n <Link\n href={`/backend/integrations/${encodeURIComponent(item.id)}`}\n className=\"truncate text-sm font-medium hover:underline\"\n >\n {item.title}\n </Link>\n {renderHealthBadge(item.healthStatus)}\n </div>\n {(item.company || item.author || item.version) ? (\n <p className=\"text-xs text-muted-foreground\">\n {[item.company || item.author, item.version ? `v${item.version}` : null].filter(Boolean).join(' \u00B7 ')}\n </p>\n ) : null}\n </div>\n <Switch\n checked={item.isEnabled}\n disabled={togglingIds.has(item.id)}\n onCheckedChange={(checked) => void handleToggle(item.id, checked, item.stateUpdatedAt)}\n className=\"shrink-0\"\n />\n </div>\n <div className=\"flex items-end justify-between gap-2 border-t pt-2\">\n <div className=\"text-xs text-muted-foreground space-y-0.5\">\n <div>\n {t('integrations.marketplace.analytics.events', { count: item.analytics.totalCount })}\n </div>\n <div>\n {t('integrations.marketplace.analytics.errorRate', {\n rate: `${Math.round(item.analytics.errorRate * 1000) / 10}%`,\n })}\n </div>\n </div>\n <LogSparkline counts={item.analytics.dailyCounts} />\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n ))}\n\n {grouped.standalone.length > 0 && (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {grouped.standalone.map((item) => (\n <Card key={item.id} className=\"flex flex-col\">\n <CardHeader>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n {renderCategoryIcon(item.category, 'h-4 w-4 text-muted-foreground shrink-0')}\n <CardTitle className=\"text-base\">{item.title}</CardTitle>\n {renderHealthBadge(item.healthStatus)}\n </div>\n <Switch\n checked={item.isEnabled}\n disabled={togglingIds.has(item.id)}\n onCheckedChange={(checked) => void handleToggle(item.id, checked, item.stateUpdatedAt)}\n className=\"shrink-0\"\n />\n </div>\n </CardHeader>\n <CardContent className=\"flex-1 space-y-2\">\n {item.description && (\n <p className=\"text-muted-foreground text-sm\">{item.description}</p>\n )}\n {(item.company || item.author || item.version) && (\n <p className=\"text-muted-foreground text-xs\">\n {[item.company || item.author, item.version ? `v${item.version}` : null].filter(Boolean).join(' \u00B7 ')}\n </p>\n )}\n <div className=\"flex items-end justify-between gap-2 border-t pt-3\">\n <div className=\"text-xs text-muted-foreground space-y-0.5\">\n <div>\n {t('integrations.marketplace.analytics.events', { count: item.analytics.totalCount })}\n </div>\n <div>\n {t('integrations.marketplace.analytics.errorRate', {\n rate: `${Math.round(item.analytics.errorRate * 1000) / 10}%`,\n })}\n </div>\n </div>\n <LogSparkline counts={item.analytics.dailyCounts} />\n </div>\n </CardContent>\n <div className=\"px-6 pb-4\">\n <Button asChild variant=\"outline\" size=\"sm\" className=\"w-full\">\n <Link href={`/backend/integrations/${encodeURIComponent(item.id)}`}>\n <Cog className=\"mr-1.5 h-4 w-4\" />\n {t('integrations.marketplace.configure')}\n </Link>\n </Button>\n </div>\n </Card>\n ))}\n </div>\n )}\n\n {grouped.bundles.length === 0 && grouped.standalone.length === 0 && !isLoading && (\n <div className=\"text-center py-12 text-muted-foreground\">\n {t('integrations.marketplace.noResults')}\n </div>\n )}\n </section>\n </PageBody>\n </Page>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Card, CardHeader, CardTitle, CardContent } from '@open-mercato/ui/primitives/card'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { apiCall, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { FilterBar, type FilterValues } from '@open-mercato/ui/backend/FilterBar'\nimport { Bell, Cog, CreditCard, HardDrive, LayoutGrid, MessageSquare, RefreshCw, Search, Truck, Webhook } from 'lucide-react'\nimport {\n buildIntegrationMarketplaceFilterDefs,\n getIntegrationMarketplaceCategory,\n getListQueryFromFilterValues,\n INTEGRATION_MARKETPLACE_CATEGORIES,\n normalizeIntegrationMarketplaceFilterValues,\n} from './filters'\n\ntype IntegrationAnalytics = {\n lastActivityAt: string | null\n totalCount: number\n errorCount: number\n errorRate: number\n dailyCounts: number[]\n}\n\ntype IntegrationItem = {\n id: string\n title: string\n description?: string\n category?: string\n tags?: string[]\n bundleId?: string\n author?: string\n company?: string\n version?: string\n isEnabled: boolean\n hasCredentials: boolean\n healthStatus: 'healthy' | 'degraded' | 'unhealthy' | 'unconfigured'\n analytics: IntegrationAnalytics\n stateUpdatedAt?: string | null\n}\n\ntype BundleItem = {\n id: string\n title: string\n description?: string\n icon?: string\n integrationCount: number\n enabledCount: number\n}\n\ntype ListResponse = {\n items: IntegrationItem[]\n bundles: BundleItem[]\n total: number\n page: number\n pageSize: number\n totalPages: number\n}\n\nconst CATEGORY_ICONS: Record<string, React.ElementType> = {\n all: LayoutGrid,\n payment: CreditCard,\n shipping: Truck,\n data_sync: RefreshCw,\n communication: MessageSquare,\n notification: Bell,\n storage: HardDrive,\n webhook: Webhook,\n}\n\nconst HEALTH_BADGE_CLASS: Record<string, string> = {\n healthy: 'bg-emerald-500/15 text-emerald-800 dark:text-emerald-300',\n degraded: 'bg-amber-500/15 text-amber-900 dark:text-amber-300',\n unhealthy: 'bg-destructive/15 text-destructive',\n unconfigured: 'bg-muted text-muted-foreground',\n}\n\nfunction buildListQueryString(input: {\n q?: string\n category?: string\n bundleId?: string\n isEnabled?: boolean\n healthStatus?: string\n sort?: string\n order?: string\n page?: number\n pageSize?: number\n}): string {\n const params = new URLSearchParams()\n if (input.q) params.set('q', input.q)\n if (input.category) params.set('category', input.category)\n if (input.bundleId) params.set('bundleId', input.bundleId)\n if (input.isEnabled !== undefined) params.set('isEnabled', String(input.isEnabled))\n if (input.healthStatus) params.set('healthStatus', input.healthStatus)\n if (input.sort) params.set('sort', input.sort)\n if (input.order) params.set('order', input.order)\n if (input.page != null && input.page > 1) params.set('page', String(input.page))\n if (input.pageSize != null && input.pageSize !== 100) params.set('pageSize', String(input.pageSize))\n const qs = params.toString()\n return qs ? `?${qs}` : ''\n}\n\nfunction LogSparkline({ counts, className }: { counts: number[]; className?: string }) {\n const max = Math.max(1, ...counts)\n const w = 72\n const h = 22\n const step = counts.length > 1 ? w / (counts.length - 1) : w\n const points = counts.map((count, index) => {\n const x = index * step\n const y = h - (count / max) * (h - 3) - 1.5\n return `${x},${y}`\n }).join(' ')\n return (\n <svg width={w} height={h} className={className} aria-hidden>\n <polyline\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n points={points}\n className=\"text-muted-foreground/80\"\n />\n </svg>\n )\n}\n\nexport default function IntegrationsMarketplacePage() {\n const [data, setData] = React.useState<ListResponse | null>(null)\n const [isLoading, setIsLoading] = React.useState(true)\n const [searchInput, setSearchInput] = React.useState('')\n const [debouncedSearch, setDebouncedSearch] = React.useState('')\n const [filterValues, setFilterValues] = React.useState<FilterValues>({})\n const [sortField, setSortField] = React.useState<'title' | 'category' | 'enabledAt' | 'healthStatus'>('title')\n const [sortOrder, setSortOrder] = React.useState<'asc' | 'desc'>('asc')\n const [page, setPage] = React.useState(1)\n const [togglingIds, setTogglingIds] = React.useState<Set<string>>(new Set())\n const scopeVersion = useOrganizationScopeVersion()\n const t = useT()\n const { runMutation, retryLastMutation } = useGuardedMutation<Record<string, unknown>>({\n contextId: 'integrations.marketplace',\n })\n\n React.useEffect(() => {\n const timer = setTimeout(() => setDebouncedSearch(searchInput.trim()), 300)\n return () => clearTimeout(timer)\n }, [searchInput])\n\n const selectedCategory = React.useMemo(() => getIntegrationMarketplaceCategory(filterValues), [filterValues])\n\n const listQuery = React.useMemo(() => {\n const fromFilters = getListQueryFromFilterValues(filterValues)\n const category = selectedCategory !== 'all' ? selectedCategory : fromFilters.category\n return buildListQueryString({\n q: debouncedSearch || undefined,\n ...(category ? { category } : {}),\n ...(fromFilters.bundleId ? { bundleId: fromFilters.bundleId } : {}),\n ...(fromFilters.isEnabled !== undefined ? { isEnabled: fromFilters.isEnabled } : {}),\n ...(fromFilters.healthStatus ? { healthStatus: fromFilters.healthStatus } : {}),\n sort: sortField,\n order: sortOrder,\n page,\n pageSize: 100,\n })\n }, [debouncedSearch, filterValues, page, selectedCategory, sortField, sortOrder])\n\n const bundleFilterOptions = React.useMemo(\n () => (data?.bundles ?? []).map((bundle) => ({ id: bundle.id, title: bundle.title })),\n [data?.bundles],\n )\n\n const categoryFilters = React.useMemo(\n () => buildIntegrationMarketplaceFilterDefs(t, bundleFilterOptions),\n [bundleFilterOptions, t],\n )\n\n const load = React.useCallback(async () => {\n setIsLoading(true)\n const fallback: ListResponse = { items: [], bundles: [], total: 0, page: 1, pageSize: 100, totalPages: 1 }\n try {\n const call = await apiCall<ListResponse>(`/api/integrations${listQuery}`, undefined, { fallback })\n if (!call.ok) {\n flash(t('integrations.marketplace.loadError'), 'error')\n setIsLoading(false)\n return\n }\n setData(call.result ?? fallback)\n setIsLoading(false)\n } catch {\n // apiFetch throws on 401/403 even when its own redirect is suppressed\n // (e.g. a guarded repeat 401) \u2014 without this catch the page would spin\n // forever instead of surfacing the load error.\n flash(t('integrations.marketplace.loadError'), 'error')\n setIsLoading(false)\n }\n }, [listQuery, t])\n\n React.useEffect(() => {\n void load()\n }, [load, scopeVersion])\n\n React.useEffect(() => {\n setPage(1)\n }, [debouncedSearch, filterValues, selectedCategory, sortField, sortOrder])\n\n const handleToggle = React.useCallback(async (integrationId: string, enabled: boolean, updatedAt?: string | null) => {\n setTogglingIds((prev) => new Set(prev).add(integrationId))\n try {\n const call = await runMutation({\n mutationPayload: { integrationId, isEnabled: enabled },\n context: {\n formId: 'integrations.marketplace',\n operation: 'update',\n actionId: 'toggle-state',\n resourceKind: 'integrations.integration',\n resourceId: integrationId,\n integrationId,\n retryLastMutation,\n },\n operation: () => withScopedApiRequestHeaders(\n buildOptimisticLockHeader(updatedAt),\n () => apiCall<{ updatedAt?: string | null }>(`/api/integrations/${encodeURIComponent(integrationId)}/state`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ isEnabled: enabled }),\n }, { fallback: null }),\n ),\n })\n\n if (!call.ok) {\n flash(t('integrations.detail.stateError'), 'error')\n } else {\n const nextUpdatedAt = call.result?.updatedAt ?? null\n setData((prev) => {\n if (!prev) return prev\n return {\n ...prev,\n items: prev.items.map((item) =>\n item.id === integrationId\n ? { ...item, isEnabled: enabled, stateUpdatedAt: nextUpdatedAt ?? item.stateUpdatedAt }\n : item,\n ),\n }\n })\n }\n } catch {\n flash(t('integrations.detail.stateError'), 'error')\n } finally {\n setTogglingIds((prev) => { const next = new Set(prev); next.delete(integrationId); return next })\n }\n }, [retryLastMutation, runMutation, t])\n\n const grouped = React.useMemo(() => {\n if (!data) return { bundles: [] as Array<BundleItem & { integrations: IntegrationItem[] }>, standalone: [] as IntegrationItem[] }\n\n const bundled = new Map<string, IntegrationItem[]>()\n const standalone: IntegrationItem[] = []\n for (const item of data.items) {\n if (item.bundleId) {\n const list = bundled.get(item.bundleId) ?? []\n list.push(item)\n bundled.set(item.bundleId, list)\n } else {\n standalone.push(item)\n }\n }\n\n const bundles = (data.bundles ?? [])\n .filter((b) => bundled.has(b.id))\n .map((b) => ({ ...b, integrations: bundled.get(b.id) ?? [] }))\n\n return { bundles, standalone }\n }, [data])\n\n const renderCategoryIcon = React.useCallback((category: string | undefined, className: string) => {\n if (!category) return null\n const Icon = CATEGORY_ICONS[category]\n if (!Icon) return null\n return <Icon className={className} />\n }, [])\n\n const renderHealthBadge = React.useCallback((status: IntegrationItem['healthStatus']) => {\n return (\n <span\n className={`inline-flex shrink-0 items-center rounded-full px-2 py-0.5 text-xs font-semibold uppercase tracking-wide ${HEALTH_BADGE_CLASS[status] ?? HEALTH_BADGE_CLASS.unconfigured}`}\n >\n {t(`integrations.marketplace.health.${status}`, status)}\n </span>\n )\n }, [t])\n\n if (isLoading && !data) {\n return (\n <Page>\n <PageBody>\n <div className=\"flex items-center justify-center py-16\">\n <Spinner />\n </div>\n </PageBody>\n </Page>\n )\n }\n\n return (\n <Page>\n <PageBody className=\"space-y-6\">\n <section className=\"space-y-6 rounded-lg border bg-background p-6\">\n <header className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"space-y-0.5\">\n <h2 className=\"text-lg font-semibold\">{t('integrations.marketplace.title')}</h2>\n <p className=\"text-sm text-muted-foreground\">\n {t('integrations.marketplace.description')}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"relative w-full min-w-[200px] max-w-xs lg:w-64\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 size-4 text-muted-foreground pointer-events-none\" />\n <Input\n placeholder={t('integrations.marketplace.search')}\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n className=\"pl-8\"\n />\n </div>\n <label className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span className=\"sr-only\">{t('integrations.marketplace.sort.label', 'Sort by')}</span>\n <select\n className=\"h-9 rounded-md border border-input bg-background px-2 text-sm\"\n value={sortField}\n onChange={(e) => setSortField(e.target.value as typeof sortField)}\n >\n <option value=\"title\">{t('integrations.marketplace.sort.title', 'Title')}</option>\n <option value=\"category\">{t('integrations.marketplace.sort.category', 'Category')}</option>\n <option value=\"enabledAt\">{t('integrations.marketplace.sort.enabledAt', 'Enabled date')}</option>\n <option value=\"healthStatus\">{t('integrations.marketplace.sort.health', 'Health')}</option>\n </select>\n </label>\n <select\n className=\"h-9 rounded-md border border-input bg-background px-2 text-sm\"\n value={sortOrder}\n onChange={(e) => setSortOrder(e.target.value as typeof sortOrder)}\n aria-label={t('integrations.marketplace.sort.order', 'Sort order')}\n >\n <option value=\"asc\">{t('integrations.marketplace.sort.asc', 'Ascending')}</option>\n <option value=\"desc\">{t('integrations.marketplace.sort.desc', 'Descending')}</option>\n </select>\n </div>\n </header>\n\n <div className=\"lg:hidden\">\n <FilterBar\n searchValue={searchInput}\n onSearchChange={setSearchInput}\n searchPlaceholder={t('integrations.marketplace.search')}\n searchAlign=\"left\"\n filters={categoryFilters}\n values={filterValues}\n onApply={(values) => setFilterValues(normalizeIntegrationMarketplaceFilterValues(values))}\n onClear={() => setFilterValues({})}\n />\n </div>\n\n <div className=\"hidden lg:flex flex-wrap gap-1.5\">\n {INTEGRATION_MARKETPLACE_CATEGORIES.map((category) => {\n const Icon = CATEGORY_ICONS[category]\n return (\n <Button\n key={category}\n type=\"button\"\n variant={selectedCategory === category ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterValues(normalizeIntegrationMarketplaceFilterValues({ category }))}\n >\n {Icon ? <Icon className=\"mr-1.5 h-3.5 w-3.5\" /> : null}\n {t(`integrations.marketplace.categories.${category}`)}\n </Button>\n )\n })}\n </div>\n\n {isLoading ? (\n <div className=\"flex justify-center py-8\">\n <Spinner />\n </div>\n ) : null}\n\n {data && data.totalPages > 1 ? (\n <div className=\"flex flex-wrap items-center justify-between gap-2 text-sm text-muted-foreground\">\n <span>\n {data.total === 0\n ? t('integrations.marketplace.pagination.empty', 'No results')\n : t('integrations.marketplace.pagination.summary', {\n from: (data.page - 1) * data.pageSize + 1,\n to: Math.min(data.page * data.pageSize, data.total),\n total: data.total,\n })}\n </span>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={data.page <= 1}\n onClick={() => setPage((p) => Math.max(1, p - 1))}\n >\n {t('integrations.marketplace.pagination.prev', 'Previous')}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={data.page >= data.totalPages}\n onClick={() => setPage((p) => p + 1)}\n >\n {t('integrations.marketplace.pagination.next', 'Next')}\n </Button>\n </div>\n </div>\n ) : null}\n\n {grouped.bundles.map((bundle) => (\n <Card key={bundle.id}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <div>\n <CardTitle>{bundle.title}</CardTitle>\n {bundle.description && (\n <p className=\"text-muted-foreground text-sm mt-1\">{bundle.description}</p>\n )}\n <p className=\"text-muted-foreground text-xs mt-1\">\n {t('integrations.marketplace.integrations', { count: bundle.integrations.length })}\n </p>\n </div>\n <Button asChild variant=\"outline\" size=\"sm\">\n <Link href={`/backend/integrations/bundle/${encodeURIComponent(bundle.id)}`}>\n <Cog className=\"mr-1.5 h-4 w-4\" />\n {t('integrations.marketplace.configure')}\n </Link>\n </Button>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3\">\n {bundle.integrations.map((item) => (\n <div\n key={item.id}\n className=\"flex flex-col gap-2 rounded-lg border p-3\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {renderCategoryIcon(item.category, 'h-4 w-4 text-muted-foreground shrink-0')}\n <Link\n href={`/backend/integrations/${encodeURIComponent(item.id)}`}\n className=\"truncate text-sm font-medium hover:underline\"\n >\n {item.title}\n </Link>\n {renderHealthBadge(item.healthStatus)}\n </div>\n {(item.company || item.author || item.version) ? (\n <p className=\"text-xs text-muted-foreground\">\n {[item.company || item.author, item.version ? `v${item.version}` : null].filter(Boolean).join(' \u00B7 ')}\n </p>\n ) : null}\n </div>\n <Switch\n checked={item.isEnabled}\n disabled={togglingIds.has(item.id)}\n onCheckedChange={(checked) => void handleToggle(item.id, checked, item.stateUpdatedAt)}\n className=\"shrink-0\"\n />\n </div>\n <div className=\"flex items-end justify-between gap-2 border-t pt-2\">\n <div className=\"text-xs text-muted-foreground space-y-0.5\">\n <div>\n {t('integrations.marketplace.analytics.events', { count: item.analytics.totalCount })}\n </div>\n <div>\n {t('integrations.marketplace.analytics.errorRate', {\n rate: `${Math.round(item.analytics.errorRate * 1000) / 10}%`,\n })}\n </div>\n </div>\n <LogSparkline counts={item.analytics.dailyCounts} />\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n ))}\n\n {grouped.standalone.length > 0 && (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {grouped.standalone.map((item) => (\n <Card key={item.id} className=\"flex flex-col\">\n <CardHeader>\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n {renderCategoryIcon(item.category, 'h-4 w-4 text-muted-foreground shrink-0')}\n <CardTitle className=\"text-base\">{item.title}</CardTitle>\n {renderHealthBadge(item.healthStatus)}\n </div>\n <Switch\n checked={item.isEnabled}\n disabled={togglingIds.has(item.id)}\n onCheckedChange={(checked) => void handleToggle(item.id, checked, item.stateUpdatedAt)}\n className=\"shrink-0\"\n />\n </div>\n </CardHeader>\n <CardContent className=\"flex-1 space-y-2\">\n {item.description && (\n <p className=\"text-muted-foreground text-sm\">{item.description}</p>\n )}\n {(item.company || item.author || item.version) && (\n <p className=\"text-muted-foreground text-xs\">\n {[item.company || item.author, item.version ? `v${item.version}` : null].filter(Boolean).join(' \u00B7 ')}\n </p>\n )}\n <div className=\"flex items-end justify-between gap-2 border-t pt-3\">\n <div className=\"text-xs text-muted-foreground space-y-0.5\">\n <div>\n {t('integrations.marketplace.analytics.events', { count: item.analytics.totalCount })}\n </div>\n <div>\n {t('integrations.marketplace.analytics.errorRate', {\n rate: `${Math.round(item.analytics.errorRate * 1000) / 10}%`,\n })}\n </div>\n </div>\n <LogSparkline counts={item.analytics.dailyCounts} />\n </div>\n </CardContent>\n <div className=\"px-6 pb-4\">\n <Button asChild variant=\"outline\" size=\"sm\" className=\"w-full\">\n <Link href={`/backend/integrations/${encodeURIComponent(item.id)}`}>\n <Cog className=\"mr-1.5 h-4 w-4\" />\n {t('integrations.marketplace.configure')}\n </Link>\n </Button>\n </div>\n </Card>\n ))}\n </div>\n )}\n\n {grouped.bundles.length === 0 && grouped.standalone.length === 0 && !isLoading && (\n <div className=\"text-center py-12 text-muted-foreground\">\n {t('integrations.marketplace.noResults')}\n </div>\n )}\n </section>\n </PageBody>\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.6.8-develop.6917.1.af45bc96e2",
3
+ "version": "0.6.8-develop.6918.1.7b3f32b0c8",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -254,16 +254,16 @@
254
254
  "zod": "^4.4.3"
255
255
  },
256
256
  "peerDependencies": {
257
- "@open-mercato/ai-assistant": "0.6.8-develop.6917.1.af45bc96e2",
258
- "@open-mercato/shared": "0.6.8-develop.6917.1.af45bc96e2",
259
- "@open-mercato/ui": "0.6.8-develop.6917.1.af45bc96e2",
257
+ "@open-mercato/ai-assistant": "0.6.8-develop.6918.1.7b3f32b0c8",
258
+ "@open-mercato/shared": "0.6.8-develop.6918.1.7b3f32b0c8",
259
+ "@open-mercato/ui": "0.6.8-develop.6918.1.7b3f32b0c8",
260
260
  "react": "^19.0.0",
261
261
  "react-dom": "^19.0.0"
262
262
  },
263
263
  "devDependencies": {
264
- "@open-mercato/ai-assistant": "0.6.8-develop.6917.1.af45bc96e2",
265
- "@open-mercato/shared": "0.6.8-develop.6917.1.af45bc96e2",
266
- "@open-mercato/ui": "0.6.8-develop.6917.1.af45bc96e2",
264
+ "@open-mercato/ai-assistant": "0.6.8-develop.6918.1.7b3f32b0c8",
265
+ "@open-mercato/shared": "0.6.8-develop.6918.1.7b3f32b0c8",
266
+ "@open-mercato/ui": "0.6.8-develop.6918.1.7b3f32b0c8",
267
267
  "@testing-library/dom": "^10.4.1",
268
268
  "@testing-library/jest-dom": "^7.0.0",
269
269
  "@testing-library/react": "^16.3.1",
@@ -186,14 +186,22 @@ export default function IntegrationsMarketplacePage() {
186
186
  const load = React.useCallback(async () => {
187
187
  setIsLoading(true)
188
188
  const fallback: ListResponse = { items: [], bundles: [], total: 0, page: 1, pageSize: 100, totalPages: 1 }
189
- const call = await apiCall<ListResponse>(`/api/integrations${listQuery}`, undefined, { fallback })
190
- if (!call.ok) {
189
+ try {
190
+ const call = await apiCall<ListResponse>(`/api/integrations${listQuery}`, undefined, { fallback })
191
+ if (!call.ok) {
192
+ flash(t('integrations.marketplace.loadError'), 'error')
193
+ setIsLoading(false)
194
+ return
195
+ }
196
+ setData(call.result ?? fallback)
197
+ setIsLoading(false)
198
+ } catch {
199
+ // apiFetch throws on 401/403 even when its own redirect is suppressed
200
+ // (e.g. a guarded repeat 401) — without this catch the page would spin
201
+ // forever instead of surfacing the load error.
191
202
  flash(t('integrations.marketplace.loadError'), 'error')
192
203
  setIsLoading(false)
193
- return
194
204
  }
195
- setData(call.result ?? fallback)
196
- setIsLoading(false)
197
205
  }, [listQuery, t])
198
206
 
199
207
  React.useEffect(() => {