@proveanything/smartlinks-utils-ui 1.13.19 → 1.14.1
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.
- package/dist/{chunk-WCUKTVWC.js → chunk-H3X6KFEN.js} +98 -3
- package/dist/chunk-H3X6KFEN.js.map +1 -0
- package/dist/components/LinkPicker/index.js +1 -1
- package/dist/components/RecordsAdmin/index.js +4 -4
- package/dist/components/RecordsAdmin/index.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
- package/dist/chunk-WCUKTVWC.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ export { AdminPageHeader, ErrorBoundary, HINTS_PREFS_APP_ID, HINTS_PREFS_KEY, us
|
|
|
7
7
|
import './chunk-S27GIYV7.js';
|
|
8
8
|
export { FacetRuleEditor } from './chunk-WVCNIX7N.js';
|
|
9
9
|
import './chunk-DH5HG5DW.js';
|
|
10
|
-
export { LinkPicker, resolveLink, useLinkTargets } from './chunk-
|
|
10
|
+
export { LinkPicker, resolveLink, useLinkTargets } from './chunk-H3X6KFEN.js';
|
|
11
11
|
import { assertStylesLoaded } from './chunk-OLYC54YT.js';
|
|
12
12
|
import './chunk-5UQQYXCX.js';
|
|
13
13
|
export { cn } from './chunk-L7FQ52F5.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proveanything/smartlinks-utils-ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.1",
|
|
4
4
|
"description": "Reusable React components for SmartLinks microapps — Asset Picker, Conditions Editor, Icon Picker, and more.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"access": "public"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
|
-
"@proveanything/smartlinks": "^1.
|
|
62
|
+
"@proveanything/smartlinks": "^1.15.0",
|
|
63
63
|
"@tanstack/react-query": "^5.0.0",
|
|
64
64
|
"react": "^18.0.0",
|
|
65
65
|
"react-dom": "^18.0.0"
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"devDependencies": {
|
|
73
|
-
"@proveanything/smartlinks": "
|
|
73
|
+
"@proveanything/smartlinks": "1.15.0",
|
|
74
74
|
"@tanstack/react-query": "^5.56.0",
|
|
75
75
|
"@types/react": "^18.3.0",
|
|
76
76
|
"@types/react-dom": "^18.3.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/LinkPicker/useLinkTargets.ts","../src/components/LinkPicker/LinkPicker.tsx","../src/components/LinkPicker/resolveLink.ts","../src/components/LinkPicker/index.ts"],"names":["qs","useState","useEffect","useMemo"],"mappings":"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","file":"chunk-WCUKTVWC.js","sourcesContent":["// =============================================================================\r\n// useLinkTargets — discover apps + linkable entries for a collection\r\n// =============================================================================\r\n// Hook used by <LinkPicker /> (and available standalone) to enumerate every\r\n// navigable target visible to the current collection. Combines:\r\n// - The list of installed apps (from SL.collection.getAppsConfig).\r\n// - Each app's static manifest.linkable (best-effort, fetched per app).\r\n// - Each app's appConfig.linkable (dynamic content entries).\r\n//\r\n// Results are cached per collection so the picker can be opened repeatedly\r\n// without re-fetching.\r\n\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport * as SL from '@proveanything/smartlinks';\r\nimport type { LinkableEntry } from './types';\r\n\r\nexport interface DiscoveredApp {\r\n id: string;\r\n name: string;\r\n faIcon?: string;\r\n hidden?: boolean;\r\n /** True when the app declared itself deep-linkable in collection apps config. */\r\n supportsDeepLinks?: boolean;\r\n manifestUrl?: string;\r\n}\r\n\r\ninterface CacheEntry {\r\n apps?: DiscoveredApp[];\r\n linkables?: Map<string, LinkableEntry[]>; // appId -> entries\r\n promise?: Promise<void>;\r\n}\r\n\r\nconst cache = new Map<string, CacheEntry>();\r\n\r\nfunction entryId(e: { path?: string; title: string; params?: Record<string, string> }): string {\r\n // Stable, content-addressed id: path + sorted params, falling back to title.\r\n const base = e.path || e.title.toLowerCase().replace(/\\s+/g, '-');\r\n if (!e.params || Object.keys(e.params).length === 0) return base;\r\n const qs = Object.keys(e.params)\r\n .sort()\r\n .map((k) => `${k}=${e.params![k]}`)\r\n .join('&');\r\n return `${base}?${qs}`;\r\n}\r\n\r\nasync function fetchManifest(url: string): Promise<any | null> {\r\n try {\r\n const res = await fetch(url, { credentials: 'omit' });\r\n if (!res.ok) return null;\r\n return await res.json();\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nasync function loadCollection(collectionId: string): Promise<CacheEntry> {\r\n const existing = cache.get(collectionId);\r\n if (existing?.apps) return existing;\r\n if (existing?.promise) {\r\n await existing.promise;\r\n return cache.get(collectionId)!;\r\n }\r\n\r\n const entry: CacheEntry = {};\r\n const promise = (async () => {\r\n const result: any = await (SL as any).collection.getAppsConfig(collectionId);\r\n const apps: any[] = Array.isArray(result?.apps) ? result.apps : [];\r\n const discovered: DiscoveredApp[] = apps.map((a) => ({\r\n id: a.id,\r\n name: a.name || a.id,\r\n faIcon: a.faIcon,\r\n hidden: a.hidden,\r\n supportsDeepLinks: a.supportsDeepLinks,\r\n manifestUrl: a.manifestUrl,\r\n }));\r\n entry.apps = discovered;\r\n entry.linkables = new Map();\r\n\r\n // Fan out: per-app linkable discovery. Failures are silent (the app simply\r\n // shows zero deep links, which the UI handles gracefully).\r\n await Promise.all(\r\n discovered.map(async (app) => {\r\n const out: LinkableEntry[] = [];\r\n\r\n // Static — manifest.linkable\r\n if (app.manifestUrl) {\r\n const manifest = await fetchManifest(app.manifestUrl);\r\n const list: any[] = Array.isArray(manifest?.linkable) ? manifest.linkable : [];\r\n for (const l of list) {\r\n if (!l?.title) continue;\r\n out.push({\r\n appId: app.id,\r\n id: entryId(l),\r\n title: String(l.title),\r\n path: l.path ? String(l.path) : undefined,\r\n params: l.params && typeof l.params === 'object' ? { ...l.params } : undefined,\r\n source: 'manifest',\r\n });\r\n }\r\n }\r\n\r\n // Dynamic — appConfig.linkable\r\n try {\r\n const cfg: any = await (SL as any).appConfiguration.getConfig({\r\n collectionId,\r\n appId: app.id,\r\n });\r\n const list: any[] = Array.isArray(cfg?.linkable) ? cfg.linkable : [];\r\n for (const l of list) {\r\n if (!l?.title) continue;\r\n out.push({\r\n appId: app.id,\r\n id: entryId(l),\r\n title: String(l.title),\r\n path: l.path ? String(l.path) : undefined,\r\n params: l.params && typeof l.params === 'object' ? { ...l.params } : undefined,\r\n source: 'config',\r\n });\r\n }\r\n } catch {\r\n // No config or no read access — fine.\r\n }\r\n\r\n entry.linkables!.set(app.id, out);\r\n })\r\n );\r\n\r\n cache.set(collectionId, entry);\r\n })();\r\n\r\n entry.promise = promise;\r\n cache.set(collectionId, entry);\r\n await promise;\r\n return cache.get(collectionId)!;\r\n}\r\n\r\nexport interface UseLinkTargetsOptions {\r\n collectionId?: string;\r\n includeCurrentApp?: boolean;\r\n currentAppId?: string;\r\n}\r\n\r\nexport interface UseLinkTargetsReturn {\r\n loading: boolean;\r\n apps: DiscoveredApp[];\r\n /** Map of appId -> linkable entries (after current-app filtering). */\r\n linkables: Map<string, LinkableEntry[]>;\r\n /** Flat list across all visible apps, useful for search. */\r\n allLinkables: LinkableEntry[];\r\n}\r\n\r\nexport function useLinkTargets(opts: UseLinkTargetsOptions): UseLinkTargetsReturn {\r\n const { collectionId, includeCurrentApp = true, currentAppId } = opts;\r\n const [tick, setTick] = useState(0);\r\n\r\n useEffect(() => {\r\n if (!collectionId) return;\r\n let cancelled = false;\r\n loadCollection(collectionId).then(() => {\r\n if (!cancelled) setTick((t) => t + 1);\r\n });\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [collectionId]);\r\n\r\n return useMemo(() => {\r\n if (!collectionId) {\r\n return { loading: false, apps: [], linkables: new Map(), allLinkables: [] };\r\n }\r\n const entry = cache.get(collectionId);\r\n if (!entry?.apps) return { loading: true, apps: [], linkables: new Map(), allLinkables: [] };\r\n\r\n const apps = entry.apps.filter((a) => {\r\n if (a.hidden) return false;\r\n if (!includeCurrentApp && currentAppId && a.id === currentAppId) return false;\r\n return true;\r\n });\r\n\r\n const linkables = new Map<string, LinkableEntry[]>();\r\n const all: LinkableEntry[] = [];\r\n for (const a of apps) {\r\n const list = entry.linkables?.get(a.id) ?? [];\r\n linkables.set(a.id, list);\r\n for (const l of list) all.push(l);\r\n }\r\n\r\n return { loading: false, apps, linkables, allLinkables: all };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [collectionId, includeCurrentApp, currentAppId, tick]);\r\n}","// =============================================================================\r\n// LinkPicker — Component\r\n// =============================================================================\r\n// Universal link/app/deep-link picker. Produces a `LinkTarget` discriminated\r\n// union — never a resolved URL — because real navigation happens at runtime in\r\n// container/widget context where additional params (proof, product, variant,\r\n// batch) are injected by the platform.\r\n\r\nimport React, { useMemo, useState, useEffect } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { ExternalLink, AppWindow, Link2, Loader2 } from 'lucide-react';\r\nimport type {\r\n LinkPickerProps,\r\n LinkTarget,\r\n LinkKind,\r\n LinkOpenTarget,\r\n} from './types';\r\nimport { useLinkTargets } from './useLinkTargets';\r\n\r\nconst KIND_META: Record<LinkKind, { label: string; icon: React.ComponentType<{ className?: string }> }> = {\r\n external: { label: 'External URL', icon: ExternalLink },\r\n app: { label: 'App', icon: AppWindow },\r\n deep: { label: 'Page in app', icon: Link2 },\r\n};\r\n\r\nexport const LinkPicker: React.FC<LinkPickerProps> = ({\r\n value,\r\n onChange,\r\n allow = ['external', 'app', 'deep'],\r\n includeCurrentApp = true,\r\n collectionId,\r\n currentAppId,\r\n className,\r\n}) => {\r\n const initialKind: LinkKind = value?.kind ?? allow[0];\r\n const [kind, setKind] = useState<LinkKind>(initialKind);\r\n\r\n // Keep tab in sync if value is replaced externally\r\n useEffect(() => {\r\n if (value?.kind && value.kind !== kind) setKind(value.kind);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [value?.kind]);\r\n\r\n const { loading, apps, linkables } = useLinkTargets({\r\n collectionId,\r\n includeCurrentApp,\r\n currentAppId,\r\n });\r\n\r\n function emit(next: LinkTarget | null) {\r\n onChange?.(next);\r\n }\r\n\r\n function setKindAndReset(next: LinkKind) {\r\n setKind(next);\r\n if (!value || value.kind !== next) emit(null);\r\n }\r\n\r\n return (\r\n <div className={cn('space-y-3', className)}>\r\n {allow.length > 1 && (\r\n <div className=\"flex gap-1 border-b border-border pb-2\">\r\n {allow.map((k) => {\r\n const Meta = KIND_META[k];\r\n const Icon = Meta.icon;\r\n const active = k === kind;\r\n return (\r\n <button\r\n key={k}\r\n type=\"button\"\r\n onClick={() => setKindAndReset(k)}\r\n className={cn(\r\n 'inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-semibold rounded-md transition-colors',\r\n active\r\n ? 'bg-primary text-primary-foreground'\r\n : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'\r\n )}\r\n >\r\n <Icon className=\"w-3.5 h-3.5\" />\r\n {Meta.label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n\r\n {kind === 'external' && (\r\n <ExternalForm value={value?.kind === 'external' ? value : null} onChange={emit} />\r\n )}\r\n\r\n {(kind === 'app' || kind === 'deep') && (\r\n loading ? (\r\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground py-6 justify-center\">\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n Loading apps…\r\n </div>\r\n ) : (\r\n <AppDeepForm\r\n kind={kind}\r\n value={value && (value.kind === 'app' || value.kind === 'deep') ? value : null}\r\n apps={apps}\r\n linkables={linkables}\r\n onChange={emit}\r\n />\r\n )\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// External URL form\r\n// ---------------------------------------------------------------------------\r\nconst ExternalForm: React.FC<{\r\n value: LinkTarget | null;\r\n onChange: (v: LinkTarget | null) => void;\r\n}> = ({ value, onChange }) => {\r\n const url = value?.kind === 'external' ? value.url : '';\r\n const target: LinkOpenTarget = value?.kind === 'external' ? value.target : '_blank';\r\n\r\n function update(patch: { url?: string; target?: LinkOpenTarget }) {\r\n const next: LinkTarget = {\r\n kind: 'external',\r\n url: patch.url ?? url,\r\n target: patch.target ?? target,\r\n };\r\n if (!next.url) {\r\n onChange(null);\r\n return;\r\n }\r\n if (next.target === '_blank') next.rel = 'noopener noreferrer';\r\n onChange(next);\r\n }\r\n\r\n return (\r\n <div className=\"space-y-2\">\r\n <label className=\"text-xs font-medium text-muted-foreground\">URL</label>\r\n <input\r\n type=\"url\"\r\n inputMode=\"url\"\r\n placeholder=\"https://example.com\"\r\n value={url}\r\n onChange={(e) => update({ url: e.target.value })}\r\n className=\"w-full px-3 py-2 text-sm rounded-md border border-border bg-transparent focus:outline-none focus:ring-1 focus:ring-ring\"\r\n />\r\n <div className=\"flex gap-1\">\r\n {(['_self', '_blank'] as LinkOpenTarget[]).map((t) => (\r\n <button\r\n key={t}\r\n type=\"button\"\r\n onClick={() => update({ target: t })}\r\n className={cn(\r\n 'px-2.5 py-1 text-xs font-medium rounded-full transition-colors',\r\n target === t\r\n ? 'bg-foreground text-background'\r\n : 'bg-muted text-muted-foreground hover:bg-accent'\r\n )}\r\n >\r\n {t === '_self' ? 'Same window' : 'New window'}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// App + Deep Link form\r\n// ---------------------------------------------------------------------------\r\nconst AppDeepForm: React.FC<{\r\n kind: 'app' | 'deep';\r\n value: LinkTarget | null;\r\n apps: ReturnType<typeof useLinkTargets>['apps'];\r\n linkables: ReturnType<typeof useLinkTargets>['linkables'];\r\n onChange: (v: LinkTarget | null) => void;\r\n}> = ({ kind, value, apps, linkables, onChange }) => {\r\n const selectedAppId =\r\n value && (value.kind === 'app' || value.kind === 'deep') ? value.appId : '';\r\n const selectedDeepId = value?.kind === 'deep' ? value.deepLinkId : '';\r\n const target: LinkOpenTarget =\r\n (value?.kind === 'app' || value?.kind === 'deep' ? value.target : undefined) ?? '_self';\r\n\r\n const entries = useMemo(\r\n () => (selectedAppId ? linkables.get(selectedAppId) ?? [] : []),\r\n [linkables, selectedAppId]\r\n );\r\n\r\n function selectApp(appId: string) {\r\n if (!appId) return onChange(null);\r\n if (kind === 'app') {\r\n onChange({ kind: 'app', appId, target });\r\n } else {\r\n // Switching app under 'deep' — clear deep selection\r\n onChange({ kind: 'deep', appId, deepLinkId: '', params: undefined, target });\r\n }\r\n }\r\n\r\n function selectDeep(deepLinkId: string) {\r\n if (!selectedAppId) return;\r\n const entry = entries.find((e) => e.id === deepLinkId);\r\n onChange({\r\n kind: 'deep',\r\n appId: selectedAppId,\r\n deepLinkId,\r\n params: entry?.params,\r\n target,\r\n });\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-muted-foreground\">App</label>\r\n {apps.length === 0 ? (\r\n <p className=\"text-xs text-muted-foreground italic\">No apps available in this collection.</p>\r\n ) : (\r\n <select\r\n value={selectedAppId}\r\n onChange={(e) => selectApp(e.target.value)}\r\n className=\"w-full px-3 py-2 text-sm rounded-md border border-border bg-transparent focus:outline-none focus:ring-1 focus:ring-ring\"\r\n >\r\n <option value=\"\">— Choose app —</option>\r\n {apps.map((a) => (\r\n <option key={a.id} value={a.id}>{a.name}</option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n\r\n {kind === 'deep' && selectedAppId && (\r\n <div className=\"space-y-1\">\r\n <label className=\"text-xs font-medium text-muted-foreground\">Page</label>\r\n {entries.length === 0 ? (\r\n <p className=\"text-xs text-muted-foreground italic\">\r\n This app has no deep-linkable pages. Switch to <em>App</em> to link to its default route.\r\n </p>\r\n ) : (\r\n <select\r\n value={selectedDeepId}\r\n onChange={(e) => selectDeep(e.target.value)}\r\n className=\"w-full px-3 py-2 text-sm rounded-md border border-border bg-transparent focus:outline-none focus:ring-1 focus:ring-ring\"\r\n >\r\n <option value=\"\">— Choose page —</option>\r\n {entries.map((e) => (\r\n <option key={`${e.source}:${e.id}`} value={e.id}>\r\n {e.title}\r\n </option>\r\n ))}\r\n </select>\r\n )}\r\n </div>\r\n )}\r\n\r\n {selectedAppId && (\r\n <div className=\"text-[11px] text-muted-foreground\">\r\n Resolved at runtime within the surrounding container — context params are added automatically.\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};","// =============================================================================\r\n// resolveLink — runtime navigation helper\r\n// =============================================================================\r\n// As of `@proveanything/smartlinks` **1.11.13**, the canonical resolver lives\r\n// at `SL.navigation.resolveLink`. Public consumers (widgets, executors)\r\n// should call it directly — it ships with the SDK, has no React/DOM coupling\r\n// beyond `window`, and emits `click_link` analytics when `track` is supplied.\r\n//\r\n// This module remains as a **fallback shim** for two cases:\r\n// 1. Tests / sandboxes that aren't running inside the SmartLinks SDK.\r\n// 2. Older host apps still pinned to SDK < 1.11.13.\r\n// At runtime we delegate to `window.SL.navigation.resolveLink` when present,\r\n// so call sites get the real implementation (analytics, embedded detection,\r\n// future improvements) for free. The local copy mirrors the same API.\r\n//\r\n// @deprecated Prefer `SL.navigation.resolveLink` from `@proveanything/smartlinks`.\r\n\r\nimport type { LinkTarget } from './types';\r\n\r\n/** Subset of `SL.analytics.browser.trackLinkClick` context fields. */\r\nexport interface LinkTrackingContext {\r\n collectionId: string;\r\n productId?: string;\r\n proofId?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface ResolveLinkContext {\r\n /** True when running inside a SmartLinks container/widget/iframe. */\r\n embedded?: boolean;\r\n /**\r\n * Override for the postMessage target (defaults to `window.parent`). Useful\r\n * for tests and for hosts that proxy messages.\r\n */\r\n postTarget?: Window | null;\r\n /** Window for standalone navigation (defaults to `window`). */\r\n win?: Window;\r\n /**\r\n * Forwarded to `SL.navigation.resolveLink` when delegating. Causes a\r\n * `click_link` analytics event to fire immediately before navigation.\r\n * Ignored by the local fallback shim (no SDK = no analytics pipeline).\r\n *\r\n * @example { track: { collectionId, productId } }\r\n */\r\n track?: LinkTrackingContext;\r\n}\r\n\r\nexport interface ResolvedLink {\r\n /** Imperatively perform the navigation. */\r\n navigate(): void;\r\n /** Human-readable summary, suitable for tooltips / aria-labels. */\r\n describe(): string;\r\n}\r\n\r\nfunction detectEmbedded(): boolean {\r\n if (typeof window === 'undefined') return false;\r\n try {\r\n return window.parent && window.parent !== window;\r\n } catch {\r\n return true;\r\n }\r\n}\r\n\r\n/** Look up `window.SL.navigation.resolveLink` if the SDK is loaded. */\r\nfunction getSdkResolver(): ((link: LinkTarget, ctx?: ResolveLinkContext) => ResolvedLink) | null {\r\n if (typeof window === 'undefined') return null;\r\n const sl = (window as unknown as { SL?: { navigation?: { resolveLink?: unknown } } }).SL;\r\n const fn = sl?.navigation?.resolveLink;\r\n return typeof fn === 'function' ? (fn as (link: LinkTarget, ctx?: ResolveLinkContext) => ResolvedLink) : null;\r\n}\r\n\r\nexport function resolveLink(link: LinkTarget, ctx: ResolveLinkContext = {}): ResolvedLink {\r\n // Prefer the SDK resolver — it carries analytics and stays in lock-step\r\n // with the platform's navigation contract.\r\n const sdk = getSdkResolver();\r\n if (sdk) return sdk(link, ctx);\r\n\r\n const win = ctx.win ?? (typeof window !== 'undefined' ? window : (undefined as any));\r\n const embedded = ctx.embedded ?? detectEmbedded();\r\n\r\n return {\r\n navigate() {\r\n if (!win) return;\r\n\r\n if (link.kind === 'external') {\r\n if (link.target === '_blank') {\r\n win.open(link.url, '_blank', link.rel ? `noopener,noreferrer` : 'noopener,noreferrer');\r\n } else {\r\n win.location.assign(link.url);\r\n }\r\n return;\r\n }\r\n\r\n if (embedded) {\r\n const target = ctx.postTarget ?? win.parent;\r\n if (!target) return;\r\n // Standard navigation message — mirrors the smartlinks-route-change\r\n // shape the parent platform already understands. The parent fills in\r\n // collectionId / productId / etc. before broadcasting.\r\n target.postMessage(\r\n {\r\n type: 'smartlinks-navigate',\r\n appId: link.appId,\r\n path: link.kind === 'deep' ? deepPath(link.deepLinkId) : '/',\r\n params: link.kind === 'deep' ? link.params ?? {} : {},\r\n target: link.target ?? '_self',\r\n },\r\n '*'\r\n );\r\n return;\r\n }\r\n\r\n // Standalone fallback — best-effort hash route. The SDK ships a\r\n // canonical version of this once `SL.navigation.resolveLink` lands.\r\n const hash = link.kind === 'deep'\r\n ? `#${deepPath(link.deepLinkId)}${qs(link.params)}`\r\n : `#/`;\r\n const url = `${win.location.pathname}?appId=${encodeURIComponent(link.appId)}${hash}`;\r\n if (link.target === '_blank') win.open(url, '_blank', 'noopener,noreferrer');\r\n else win.location.assign(url);\r\n },\r\n describe() {\r\n if (link.kind === 'external') return `Open ${link.url}`;\r\n if (link.kind === 'app') return `Open app ${link.appId}`;\r\n return `Open ${link.appId} → ${link.deepLinkId}`;\r\n },\r\n };\r\n}\r\n\r\nfunction deepPath(deepLinkId: string): string {\r\n // deepLinkId is `path` (or `path?params`) when minted from manifest entries,\r\n // and a slug otherwise. Normalise to a hash-route path.\r\n const [path] = deepLinkId.split('?');\r\n if (!path) return '/';\r\n return path.startsWith('/') ? path : `/${path}`;\r\n}\r\n\r\nfunction qs(params?: Record<string, string>): string {\r\n if (!params) return '';\r\n const keys = Object.keys(params);\r\n if (!keys.length) return '';\r\n const usp = new URLSearchParams();\r\n for (const k of keys) usp.set(k, params[k]);\r\n return `?${usp.toString()}`;\r\n}","import '../../styles.css';\r\nimport { assertStylesLoaded } from '../../utils/assertStylesLoaded';\r\nassertStylesLoaded();\r\n\r\nexport { LinkPicker } from './LinkPicker';\r\nexport { useLinkTargets } from './useLinkTargets';\r\nexport type { DiscoveredApp, UseLinkTargetsOptions, UseLinkTargetsReturn } from './useLinkTargets';\r\nexport { resolveLink } from './resolveLink';\r\nexport type { ResolveLinkContext, ResolvedLink, LinkTrackingContext } from './resolveLink';\r\nexport type {\r\n LinkPickerProps,\r\n LinkTarget,\r\n LinkKind,\r\n LinkOpenTarget,\r\n ExternalLinkTarget,\r\n AppLinkTarget,\r\n DeepLinkTarget,\r\n LinkableEntry,\r\n} from './types';"]}
|