@powerhousedao/connect 6.2.2-dev.76 → 6.2.2-dev.77
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/{AddDriveModal-Bw0YuxZg.js → AddDriveModal-DIMewThf.js} +4 -4
- package/dist/{AddDriveModal-Bw0YuxZg.js.map → AddDriveModal-DIMewThf.js.map} +1 -1
- package/dist/{ClearStorageModal-tXyJ2dGV.js → ClearStorageModal-DKy2tPYb.js} +4 -4
- package/dist/{ClearStorageModal-tXyJ2dGV.js.map → ClearStorageModal-DKy2tPYb.js.map} +1 -1
- package/dist/{ConfirmDocumentUpgradeModal-9AaaQJTs.js → ConfirmDocumentUpgradeModal-CcpgpyOB.js} +4 -4
- package/dist/{ConfirmDocumentUpgradeModal-9AaaQJTs.js.map → ConfirmDocumentUpgradeModal-CcpgpyOB.js.map} +1 -1
- package/dist/{CookiesPolicyModal-CQ-zHJdw.js → CookiesPolicyModal-Bns4789o.js} +3 -3
- package/dist/{CookiesPolicyModal-CQ-zHJdw.js.map → CookiesPolicyModal-Bns4789o.js.map} +1 -1
- package/dist/{CreateDocumentModal-NNi4p6EI.js → CreateDocumentModal-MlA2YRaW.js} +3 -3
- package/dist/{CreateDocumentModal-NNi4p6EI.js.map → CreateDocumentModal-MlA2YRaW.js.map} +1 -1
- package/dist/{DebugSettingsModal-CE3uHISS.js → DebugSettingsModal-890WlVp4.js} +6 -6
- package/dist/{DebugSettingsModal-CE3uHISS.js.map → DebugSettingsModal-890WlVp4.js.map} +1 -1
- package/dist/{DeleteDriveModal-C7fnXMsR.js → DeleteDriveModal-gP7j8C0Y.js} +4 -4
- package/dist/{DeleteDriveModal-C7fnXMsR.js.map → DeleteDriveModal-gP7j8C0Y.js.map} +1 -1
- package/dist/{DeleteItemModal-BK_Y8Thj.js → DeleteItemModal-CMM-fPsz.js} +4 -4
- package/dist/{DeleteItemModal-BK_Y8Thj.js.map → DeleteItemModal-CMM-fPsz.js.map} +1 -1
- package/dist/{DisclaimerModal-DJPHCnFY.js → DisclaimerModal-meOyQCfU.js} +3 -3
- package/dist/{DisclaimerModal-DJPHCnFY.js.map → DisclaimerModal-meOyQCfU.js.map} +1 -1
- package/dist/{DocumentVersionUnsupportedModal-tBHLK6b1.js → DocumentVersionUnsupportedModal-TlDH1aP5.js} +3 -3
- package/dist/{DocumentVersionUnsupportedModal-tBHLK6b1.js.map → DocumentVersionUnsupportedModal-TlDH1aP5.js.map} +1 -1
- package/dist/{DownloadDocumentWithErrorsModal-sWu46HVB.js → DownloadDocumentWithErrorsModal-CCdbt2jJ.js} +3 -3
- package/dist/{DownloadDocumentWithErrorsModal-sWu46HVB.js.map → DownloadDocumentWithErrorsModal-CCdbt2jJ.js.map} +1 -1
- package/dist/{DriveAuthRequiredModal-D3IPAst0.js → DriveAuthRequiredModal-9GsPnOYi.js} +4 -4
- package/dist/{DriveAuthRequiredModal-D3IPAst0.js.map → DriveAuthRequiredModal-9GsPnOYi.js.map} +1 -1
- package/dist/{DriveSettingsModal-7OKx8foy.js → DriveSettingsModal-Bv0y1BEK.js} +3 -3
- package/dist/{DriveSettingsModal-7OKx8foy.js.map → DriveSettingsModal-Bv0y1BEK.js.map} +1 -1
- package/dist/{InspectorModal-BV9QR1MZ.js → InspectorModal-C3L5F4Ma.js} +6 -6
- package/dist/{InspectorModal-BV9QR1MZ.js.map → InspectorModal-C3L5F4Ma.js.map} +1 -1
- package/dist/{LoginModal-Cd2wGgG4.js → LoginModal-CxFHjxz8.js} +4 -4
- package/dist/{LoginModal-Cd2wGgG4.js.map → LoginModal-CxFHjxz8.js.map} +1 -1
- package/dist/{MissingPackageModal-DyP2-Ojb.js → MissingPackageModal-C6HO-a7E.js} +4 -4
- package/dist/{MissingPackageModal-DyP2-Ojb.js.map → MissingPackageModal-C6HO-a7E.js.map} +1 -1
- package/dist/{OpenFileDocumentsModal-DQ0Slw9y.js → OpenFileDocumentsModal-6MK7Ourm.js} +4 -4
- package/dist/{OpenFileDocumentsModal-DQ0Slw9y.js.map → OpenFileDocumentsModal-6MK7Ourm.js.map} +1 -1
- package/dist/{SettingsModal-Dk-Kp4kl.js → SettingsModal-DzW3OIrB.js} +149 -9
- package/dist/SettingsModal-DzW3OIrB.js.map +1 -0
- package/dist/{UpgradeDriveModal-wo5oO9mg.js → UpgradeDriveModal-077wPR2N.js} +3 -3
- package/dist/{UpgradeDriveModal-wo5oO9mg.js.map → UpgradeDriveModal-077wPR2N.js.map} +1 -1
- package/dist/app-loader-BLbUg8o4.js +4 -0
- package/dist/{app-loader-VDeDZD5T.js → app-loader-VArdOK2J.js} +77 -183
- package/dist/app-loader-VArdOK2J.js.map +1 -0
- package/dist/{build-info-B8kMAY35.js → build-info-1EmBSRGA.js} +5 -5
- package/dist/{build-info-B8kMAY35.js.map → build-info-1EmBSRGA.js.map} +1 -1
- package/dist/components-BmUSYnlz.js +5 -0
- package/dist/{connect.config-C-b_Yhd6.js → connect.config-XXdN7RFy.js} +4 -3
- package/dist/{connect.config-C-b_Yhd6.js.map → connect.config-XXdN7RFy.js.map} +1 -1
- package/dist/{connection-state-KCa1yljA.js → connection-state-DTSv8MDQ.js} +4 -4
- package/dist/{connection-state-KCa1yljA.js.map → connection-state-DTSv8MDQ.js.map} +1 -1
- package/dist/cookie-banner-BJrG_u38.js +70 -0
- package/dist/cookie-banner-BJrG_u38.js.map +1 -0
- package/dist/{reload-connect-toast-DDQEupCN.js → i18n-CWyz5j1Z.js} +5 -28
- package/dist/i18n-CWyz5j1Z.js.map +1 -0
- package/dist/{load-DUCtfMW3.js → load-RSUO_fUw.js} +10 -10
- package/dist/{load-DUCtfMW3.js.map → load-RSUO_fUw.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{package-ZLxXINym.js → package-C3Jxu89p.js} +5 -4
- package/dist/package-C3Jxu89p.js.map +1 -0
- package/dist/{pglite-seed-DRXPe7p-.js → pglite-seed-DQgqjlQu.js} +4 -4
- package/dist/{pglite-seed-DRXPe7p-.js.map → pglite-seed-DQgqjlQu.js.map} +1 -1
- package/dist/preferences-store-C-u8PIwU.js +104 -0
- package/dist/preferences-store-C-u8PIwU.js.map +1 -0
- package/dist/{reactor-Dn5J8dOX.js → reactor-C8E2rx64.js} +7 -7
- package/dist/{reactor-Dn5J8dOX.js.map → reactor-C8E2rx64.js.map} +1 -1
- package/dist/{registerServiceWorker-Bn1KWmk0.js → registerServiceWorker-D98IrUws.js} +4 -4
- package/dist/{registerServiceWorker-Bn1KWmk0.js.map → registerServiceWorker-D98IrUws.js.map} +1 -1
- package/dist/reload-connect-toast-BzHqUfbu.js +30 -0
- package/dist/reload-connect-toast-BzHqUfbu.js.map +1 -0
- package/dist/start-connect.js +1 -1
- package/dist/style.css +143 -0
- package/dist/{toast-CO6ChlzE.js → toast-DtfTKZND.js} +3 -3
- package/dist/{toast-CO6ChlzE.js.map → toast-DtfTKZND.js.map} +1 -1
- package/dist/{use-renown-login-BtGljnB4.js → use-renown-login-DtCtMWCo.js} +3 -3
- package/dist/{use-renown-login-BtGljnB4.js.map → use-renown-login-DtCtMWCo.js.map} +1 -1
- package/dist/{useRegistryPackages-DMhCvTWq.js → useRegistryPackages-dCWW6oNq.js} +3 -3
- package/dist/{useRegistryPackages-DMhCvTWq.js.map → useRegistryPackages-dCWW6oNq.js.map} +1 -1
- package/package.json +12 -11
- package/public/powerhouse.config.json +9 -1
- package/style.css +1 -0
- package/dist/SettingsModal-Dk-Kp4kl.js.map +0 -1
- package/dist/app-loader-BffxIMi7.js +0 -4
- package/dist/app-loader-VDeDZD5T.js.map +0 -1
- package/dist/components-jBXd290x.js +0 -5
- package/dist/package-ZLxXINym.js.map +0 -1
- package/dist/reload-connect-toast-DDQEupCN.js.map +0 -1
package/dist/{registerServiceWorker-Bn1KWmk0.js.map → registerServiceWorker-D98IrUws.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerServiceWorker-
|
|
1
|
+
{"version":3,"file":"registerServiceWorker-D98IrUws.js","sources":["../src/utils/registerServiceWorker.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { refreshPwaManifestLink } from \"./pwa-manifest-link.js\";\n\nconst basePath = connectConfig.routerBasename;\n\nconst serviceWorkerScriptPath = [basePath, \"service-worker.js\"]\n .join(\"/\")\n .replace(/\\/{2,}/gm, \"/\");\n\n// External store backing the refresh prompt: our hand-written service worker\n// (injectManifest, registerType: prompt) parks a new worker as \"waiting\" by not\n// calling skipWaiting on install; we flag that here so\n// service-worker-update-prompt.tsx can offer a Refresh instead of reloading\n// from under the user.\nlet updateAvailable = false;\nconst updateListeners = new Set<() => void>();\n\nfunction setUpdateAvailable(value: boolean) {\n if (updateAvailable === value) return;\n updateAvailable = value;\n for (const listener of updateListeners) listener();\n}\n\nexport function subscribeServiceWorkerUpdate(cb: () => void): () => void {\n updateListeners.add(cb);\n return () => {\n updateListeners.delete(cb);\n };\n}\n\nexport function getServiceWorkerUpdateAvailable(): boolean {\n return updateAvailable;\n}\n\nclass ServiceWorkerManager {\n ready = false;\n debug = false;\n registration: ServiceWorkerRegistration | null = null;\n // Only reload on controllerchange when the user actually accepted an update.\n // clientsClaim fires controllerchange on the very first install too, and we\n // must not reload then.\n #updateAccepted = false;\n #reloading = false;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n setDebug(debug: boolean) {\n this.debug = debug;\n }\n\n #log(...args: unknown[]) {\n if (this.debug) console.log(\"[ServiceWorker]\", ...args);\n }\n\n // Watch an installing worker; once it reaches \"installed\" while another\n // worker already controls the page, a new version is waiting → prompt.\n #trackInstalling(worker: ServiceWorker | null) {\n if (!worker) return;\n worker.addEventListener(\"statechange\", () => {\n if (worker.state === \"installed\" && navigator.serviceWorker.controller) {\n this.#log(\"New version installed and waiting\");\n setUpdateAvailable(true);\n }\n });\n }\n\n #handleRegistration(registration: ServiceWorkerRegistration) {\n this.registration = registration;\n this.ready = true;\n this.#log(\"registered\", registration);\n\n // A worker installed by a previous page load may already be waiting.\n if (registration.waiting && navigator.serviceWorker.controller) {\n setUpdateAvailable(true);\n }\n\n this.#trackInstalling(registration.installing);\n registration.addEventListener(\"updatefound\", () => {\n this.#trackInstalling(registration.installing);\n });\n }\n\n async #register() {\n try {\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n // First visit: boot fetches the runtime config before this SW controls\n // the page, so it never lands in the cache. Warm it now (clientsClaim\n // just gave us control) so a single online load is enough to go offline.\n this.#warmRuntimeConfigCache();\n // The SW only serves the dynamic manifest.webmanifest once it controls\n // the page. A package installed before that (its fragment already in\n // IndexedDB) was re-consumed against the static base manifest; now that\n // the dynamic route is live, re-attach the link so it picks up the\n // package's PWA config without a manual reload.\n refreshPwaManifestLink();\n // Reload once the worker we activated via applyUpdate() takes control.\n if (!this.#updateAccepted || this.#reloading) return;\n this.#reloading = true;\n window.location.reload();\n });\n\n const existing = await navigator.serviceWorker.getRegistration();\n if (existing) {\n this.#handleRegistration(existing);\n // Force an immediate check so a deploy that happened while the tab was\n // closed surfaces a prompt on the next load.\n await existing.update();\n } else {\n const registration = await navigator.serviceWorker.register(\n serviceWorkerScriptPath,\n );\n this.#handleRegistration(registration);\n }\n\n // Periodically poll for a new version while the tab stays open.\n const intervalId = setInterval(() => {\n void (async () => {\n const reg = await navigator.serviceWorker.getRegistration();\n if (!reg) {\n clearInterval(intervalId);\n return;\n }\n // Skip while a worker is mid-install or the browser is offline —\n // updating then would only fire a doomed network fetch (per the\n // vite-plugin-pwa periodic-update guidance).\n if (reg.installing || !navigator.onLine) return;\n await reg.update();\n })();\n }, connectConfig.appVersionCheckInterval);\n } catch (error) {\n console.error(\"ServiceWorker registration failed: \", error);\n }\n }\n\n registerServiceWorker(debug = false) {\n this.debug = debug;\n\n if (!(\"serviceWorker\" in navigator)) {\n console.warn(\"Service Worker not available\");\n return;\n }\n const start = () => {\n this.#register().catch(console.error);\n };\n // This runs from a React effect, which usually fires *after* the window\n // `load` event has already happened — so adding a load listener would never\n // fire. Register immediately when the page is already loaded; otherwise wait\n // for load to avoid contending with initial page resource fetches.\n if (document.readyState === \"complete\") {\n start();\n } else {\n window.addEventListener(\"load\", start, { once: true });\n }\n }\n\n // Fire-and-forget re-fetch so the controlling SW's NetworkFirst rule caches\n // the config (see controllerchange). The URL MUST match runtime-config.ts's\n // loader (`${import.meta.env.BASE_URL}powerhouse.config.json`) or the cache\n // keys won't line up.\n #warmRuntimeConfigCache() {\n void fetch(`${import.meta.env.BASE_URL}powerhouse.config.json`).catch(\n () => {},\n );\n }\n\n // Activate the waiting worker; the controllerchange handler then reloads.\n applyUpdate() {\n setUpdateAvailable(false);\n const waiting = this.registration?.waiting;\n if (!waiting) {\n // Nothing waiting (or already activated) — reload to pick up whatever\n // the active worker now serves.\n this.#reloading = true;\n window.location.reload();\n return;\n }\n this.#updateAccepted = true;\n waiting.postMessage({ type: \"SKIP_WAITING\" });\n }\n\n sendMessage(message: unknown) {\n const target =\n this.registration?.active ??\n this.registration?.waiting ??\n navigator.serviceWorker.controller;\n target?.postMessage(message);\n }\n\n // Drop any worker controlling this scope — used when offline support is\n // disabled (a disabled build also ships a self-destroying worker).\n async unregisterAll() {\n if (!(\"serviceWorker\" in navigator)) return;\n const registrations = await navigator.serviceWorker.getRegistrations();\n await Promise.all(registrations.map((r) => r.unregister()));\n }\n}\n\nexport const serviceWorkerManager = new ServiceWorkerManager();\n"],"names":["#log","#trackInstalling","#register","#warmRuntimeConfigCache","#updateAccepted","#reloading","#handleRegistration"],"mappings":"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","debug_id":"83705841-447f-57e3-9ec6-7446f19da792"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="05b1ba4b-0a7f-5467-97bb-0eee3405df1f")}catch(e){}}();
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
//#region src/services/sentry.ts
|
|
6
|
+
let sentry;
|
|
7
|
+
function setSentryModule(mod) {
|
|
8
|
+
sentry = mod;
|
|
9
|
+
}
|
|
10
|
+
function setUser(...args) {
|
|
11
|
+
sentry?.setUser(...args);
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/components/reload-connect-toast.tsx
|
|
15
|
+
const ReloadConnectToast = () => {
|
|
16
|
+
const { t } = useTranslation();
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
|
|
18
|
+
className: "font-medium",
|
|
19
|
+
children: t("notifications.reloadApp")
|
|
20
|
+
}), /* @__PURE__ */ jsxs("button", {
|
|
21
|
+
onClick: () => location.reload(),
|
|
22
|
+
className: "underline decoration-solid underline-offset-2",
|
|
23
|
+
children: [t("common.reloadConnect"), " 🔄"]
|
|
24
|
+
})] });
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { setSentryModule as n, setUser as r, ReloadConnectToast as t };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=reload-connect-toast-BzHqUfbu.js.map
|
|
30
|
+
//# debugId=05b1ba4b-0a7f-5467-97bb-0eee3405df1f
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reload-connect-toast-BzHqUfbu.js","sources":["../src/services/sentry.ts","../src/components/reload-connect-toast.tsx"],"sourcesContent":["// Lazy Sentry accessors: the SDK (and rrweb replay) stays off the boot path\n// until useInitSentry dynamically loads it. No-ops while Sentry is disabled.\nimport type * as SentryModule from \"@sentry/react\";\n\nlet sentry: typeof SentryModule | undefined;\n\nexport function setSentryModule(mod: typeof SentryModule | undefined): void {\n sentry = mod;\n}\n\nexport function captureException(\n ...args: Parameters<typeof SentryModule.captureException>\n): void {\n sentry?.captureException(...args);\n}\n\nexport function setUser(\n ...args: Parameters<typeof SentryModule.setUser>\n): void {\n sentry?.setUser(...args);\n}\n","import { useTranslation } from \"react-i18next\";\n\nexport const ReloadConnectToast = () => {\n const { t } = useTranslation();\n\n return (\n <div>\n <p className=\"font-medium\">{t(\"notifications.reloadApp\")}</p>\n <button\n onClick={() => location.reload()}\n className=\"underline decoration-solid underline-offset-2\"\n >\n {t(\"common.reloadConnect\")} 🔄\n </button>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;AAIA,IAAI;AAEJ,SAAgB,gBAAgB,KAA4C;AAC1E,UAAS;;AASX,SAAgB,QACd,GAAG,MACG;AACN,SAAQ,QAAQ,GAAG,KAAK;;;;ACjB1B,MAAa,2BAA2B;CACtC,MAAM,EAAE,MAAM,gBAAgB;AAE9B,QACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;YAAe,EAAE,0BAA0B;EAAK,CAAA,EAC7D,qBAAC,UAAD;EACE,eAAe,SAAS,QAAQ;EAChC,WAAU;YAFZ,CAIG,EAAE,uBAAuB,EAAC,MACpB;IACL,EAAA,CAAA","debug_id":"05b1ba4b-0a7f-5467-97bb-0eee3405df1f"}
|
package/dist/start-connect.js
CHANGED
|
@@ -5,7 +5,7 @@ import { createRoot } from "react-dom/client";
|
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
6
|
//#region start-connect.tsx
|
|
7
7
|
await loadRuntimeConfig();
|
|
8
|
-
const { AppLoader } = await import("./components-
|
|
8
|
+
const { AppLoader } = await import("./components-BmUSYnlz.js");
|
|
9
9
|
function updateLocalPackage(pkg) {
|
|
10
10
|
window.ph?.vetraPackageManager?.updateLocalPackage(pkg);
|
|
11
11
|
}
|
package/dist/style.css
CHANGED
|
@@ -427,6 +427,9 @@
|
|
|
427
427
|
.right-5 {
|
|
428
428
|
right: calc(var(--spacing) * 5);
|
|
429
429
|
}
|
|
430
|
+
.right-6 {
|
|
431
|
+
right: calc(var(--spacing) * 6);
|
|
432
|
+
}
|
|
430
433
|
.right-8 {
|
|
431
434
|
right: calc(var(--spacing) * 8);
|
|
432
435
|
}
|
|
@@ -442,6 +445,12 @@
|
|
|
442
445
|
.bottom-5 {
|
|
443
446
|
bottom: calc(var(--spacing) * 5);
|
|
444
447
|
}
|
|
448
|
+
.bottom-6 {
|
|
449
|
+
bottom: calc(var(--spacing) * 6);
|
|
450
|
+
}
|
|
451
|
+
.bottom-24 {
|
|
452
|
+
bottom: calc(var(--spacing) * 24);
|
|
453
|
+
}
|
|
445
454
|
.bottom-\[-2px\] {
|
|
446
455
|
bottom: -2px;
|
|
447
456
|
}
|
|
@@ -544,6 +553,9 @@
|
|
|
544
553
|
.my-1 {
|
|
545
554
|
margin-block: calc(var(--spacing) * 1);
|
|
546
555
|
}
|
|
556
|
+
.my-1\.5 {
|
|
557
|
+
margin-block: calc(var(--spacing) * 1.5);
|
|
558
|
+
}
|
|
547
559
|
.my-2 {
|
|
548
560
|
margin-block: calc(var(--spacing) * 2);
|
|
549
561
|
}
|
|
@@ -580,6 +592,9 @@
|
|
|
580
592
|
.mt-2 {
|
|
581
593
|
margin-top: calc(var(--spacing) * 2);
|
|
582
594
|
}
|
|
595
|
+
.mt-2\.5 {
|
|
596
|
+
margin-top: calc(var(--spacing) * 2.5);
|
|
597
|
+
}
|
|
583
598
|
.mt-3 {
|
|
584
599
|
margin-top: calc(var(--spacing) * 3);
|
|
585
600
|
}
|
|
@@ -749,10 +764,18 @@
|
|
|
749
764
|
width: calc(var(--spacing) * 8);
|
|
750
765
|
height: calc(var(--spacing) * 8);
|
|
751
766
|
}
|
|
767
|
+
.size-9 {
|
|
768
|
+
width: calc(var(--spacing) * 9);
|
|
769
|
+
height: calc(var(--spacing) * 9);
|
|
770
|
+
}
|
|
752
771
|
.size-10 {
|
|
753
772
|
width: calc(var(--spacing) * 10);
|
|
754
773
|
height: calc(var(--spacing) * 10);
|
|
755
774
|
}
|
|
775
|
+
.size-12 {
|
|
776
|
+
width: calc(var(--spacing) * 12);
|
|
777
|
+
height: calc(var(--spacing) * 12);
|
|
778
|
+
}
|
|
756
779
|
.size-\[3px\] {
|
|
757
780
|
width: 3px;
|
|
758
781
|
height: 3px;
|
|
@@ -895,6 +918,12 @@
|
|
|
895
918
|
.max-h-6 {
|
|
896
919
|
max-height: calc(var(--spacing) * 6);
|
|
897
920
|
}
|
|
921
|
+
.max-h-32 {
|
|
922
|
+
max-height: calc(var(--spacing) * 32);
|
|
923
|
+
}
|
|
924
|
+
.max-h-40 {
|
|
925
|
+
max-height: calc(var(--spacing) * 40);
|
|
926
|
+
}
|
|
898
927
|
.max-h-48 {
|
|
899
928
|
max-height: calc(var(--spacing) * 48);
|
|
900
929
|
}
|
|
@@ -922,6 +951,9 @@
|
|
|
922
951
|
.max-h-\[calc\(100dvh-14rem\)\] {
|
|
923
952
|
max-height: calc(100dvh - 14rem);
|
|
924
953
|
}
|
|
954
|
+
.max-h-\[min\(28rem\,calc\(100vh-8rem\)\)\] {
|
|
955
|
+
max-height: min(28rem, calc(100vh - 8rem));
|
|
956
|
+
}
|
|
925
957
|
.max-h-full {
|
|
926
958
|
max-height: 100%;
|
|
927
959
|
}
|
|
@@ -943,6 +975,9 @@
|
|
|
943
975
|
.min-h-12 {
|
|
944
976
|
min-height: calc(var(--spacing) * 12);
|
|
945
977
|
}
|
|
978
|
+
.min-h-\[2\.5rem\] {
|
|
979
|
+
min-height: 2.5rem;
|
|
980
|
+
}
|
|
946
981
|
.min-h-\[32px\] {
|
|
947
982
|
min-height: 32px;
|
|
948
983
|
}
|
|
@@ -1123,6 +1158,9 @@
|
|
|
1123
1158
|
.w-\[700px\] {
|
|
1124
1159
|
width: 700px;
|
|
1125
1160
|
}
|
|
1161
|
+
.w-\[min\(24rem\,calc\(100vw-3rem\)\)\] {
|
|
1162
|
+
width: min(24rem, calc(100vw - 3rem));
|
|
1163
|
+
}
|
|
1126
1164
|
.w-fit {
|
|
1127
1165
|
width: fit-content;
|
|
1128
1166
|
}
|
|
@@ -1153,6 +1191,9 @@
|
|
|
1153
1191
|
.max-w-\[80\%\] {
|
|
1154
1192
|
max-width: 80%;
|
|
1155
1193
|
}
|
|
1194
|
+
.max-w-\[85\%\] {
|
|
1195
|
+
max-width: 85%;
|
|
1196
|
+
}
|
|
1156
1197
|
.max-w-\[90vw\] {
|
|
1157
1198
|
max-width: 90vw;
|
|
1158
1199
|
}
|
|
@@ -1317,6 +1358,9 @@
|
|
|
1317
1358
|
.resize-none {
|
|
1318
1359
|
resize: none;
|
|
1319
1360
|
}
|
|
1361
|
+
.list-decimal {
|
|
1362
|
+
list-style-type: decimal;
|
|
1363
|
+
}
|
|
1320
1364
|
.list-disc {
|
|
1321
1365
|
list-style-type: disc;
|
|
1322
1366
|
}
|
|
@@ -1392,6 +1436,9 @@
|
|
|
1392
1436
|
.gap-1 {
|
|
1393
1437
|
gap: calc(var(--spacing) * 1);
|
|
1394
1438
|
}
|
|
1439
|
+
.gap-1\.5 {
|
|
1440
|
+
gap: calc(var(--spacing) * 1.5);
|
|
1441
|
+
}
|
|
1395
1442
|
.gap-2 {
|
|
1396
1443
|
gap: calc(var(--spacing) * 2);
|
|
1397
1444
|
}
|
|
@@ -1413,6 +1460,13 @@
|
|
|
1413
1460
|
.gap-\[-2px\] {
|
|
1414
1461
|
gap: -2px;
|
|
1415
1462
|
}
|
|
1463
|
+
.space-y-0\.5 {
|
|
1464
|
+
:where(& > :not(:last-child)) {
|
|
1465
|
+
--tw-space-y-reverse: 0;
|
|
1466
|
+
margin-block-start: calc(calc(var(--spacing) * 0.5) * var(--tw-space-y-reverse));
|
|
1467
|
+
margin-block-end: calc(calc(var(--spacing) * 0.5) * calc(1 - var(--tw-space-y-reverse)));
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1416
1470
|
.space-y-1 {
|
|
1417
1471
|
:where(& > :not(:last-child)) {
|
|
1418
1472
|
--tw-space-y-reverse: 0;
|
|
@@ -1427,6 +1481,20 @@
|
|
|
1427
1481
|
margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
|
|
1428
1482
|
}
|
|
1429
1483
|
}
|
|
1484
|
+
.space-y-3 {
|
|
1485
|
+
:where(& > :not(:last-child)) {
|
|
1486
|
+
--tw-space-y-reverse: 0;
|
|
1487
|
+
margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));
|
|
1488
|
+
margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)));
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
.space-y-4 {
|
|
1492
|
+
:where(& > :not(:last-child)) {
|
|
1493
|
+
--tw-space-y-reverse: 0;
|
|
1494
|
+
margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));
|
|
1495
|
+
margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)));
|
|
1496
|
+
}
|
|
1497
|
+
}
|
|
1430
1498
|
.space-y-6 {
|
|
1431
1499
|
:where(& > :not(:last-child)) {
|
|
1432
1500
|
--tw-space-y-reverse: 0;
|
|
@@ -1625,6 +1693,10 @@
|
|
|
1625
1693
|
border-left-style: var(--tw-border-style);
|
|
1626
1694
|
border-left-width: 1px;
|
|
1627
1695
|
}
|
|
1696
|
+
.border-l-2 {
|
|
1697
|
+
border-left-style: var(--tw-border-style);
|
|
1698
|
+
border-left-width: 2px;
|
|
1699
|
+
}
|
|
1628
1700
|
.border-dashed {
|
|
1629
1701
|
--tw-border-style: dashed;
|
|
1630
1702
|
border-style: dashed;
|
|
@@ -1643,6 +1715,12 @@
|
|
|
1643
1715
|
.border-destructive {
|
|
1644
1716
|
border-color: var(--destructive);
|
|
1645
1717
|
}
|
|
1718
|
+
.border-destructive\/40 {
|
|
1719
|
+
border-color: var(--destructive);
|
|
1720
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1721
|
+
border-color: color-mix(in oklab, var(--destructive) 40%, transparent);
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1646
1724
|
.border-foreground {
|
|
1647
1725
|
border-color: var(--foreground);
|
|
1648
1726
|
}
|
|
@@ -1724,6 +1802,12 @@
|
|
|
1724
1802
|
background-color: color-mix(in oklab, var(--muted-foreground) 20%, transparent);
|
|
1725
1803
|
}
|
|
1726
1804
|
}
|
|
1805
|
+
.bg-muted\/40 {
|
|
1806
|
+
background-color: var(--muted);
|
|
1807
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1808
|
+
background-color: color-mix(in oklab, var(--muted) 40%, transparent);
|
|
1809
|
+
}
|
|
1810
|
+
}
|
|
1727
1811
|
.bg-popover {
|
|
1728
1812
|
background-color: var(--popover);
|
|
1729
1813
|
}
|
|
@@ -1796,6 +1880,9 @@
|
|
|
1796
1880
|
.p-2 {
|
|
1797
1881
|
padding: calc(var(--spacing) * 2);
|
|
1798
1882
|
}
|
|
1883
|
+
.p-2\.5 {
|
|
1884
|
+
padding: calc(var(--spacing) * 2.5);
|
|
1885
|
+
}
|
|
1799
1886
|
.p-3 {
|
|
1800
1887
|
padding: calc(var(--spacing) * 3);
|
|
1801
1888
|
}
|
|
@@ -1979,12 +2066,18 @@
|
|
|
1979
2066
|
.pl-2 {
|
|
1980
2067
|
padding-left: calc(var(--spacing) * 2);
|
|
1981
2068
|
}
|
|
2069
|
+
.pl-2\.5 {
|
|
2070
|
+
padding-left: calc(var(--spacing) * 2.5);
|
|
2071
|
+
}
|
|
1982
2072
|
.pl-3 {
|
|
1983
2073
|
padding-left: calc(var(--spacing) * 3);
|
|
1984
2074
|
}
|
|
1985
2075
|
.pl-4 {
|
|
1986
2076
|
padding-left: calc(var(--spacing) * 4);
|
|
1987
2077
|
}
|
|
2078
|
+
.pl-5 {
|
|
2079
|
+
padding-left: calc(var(--spacing) * 5);
|
|
2080
|
+
}
|
|
1988
2081
|
.pl-6 {
|
|
1989
2082
|
padding-left: calc(var(--spacing) * 6);
|
|
1990
2083
|
}
|
|
@@ -2012,6 +2105,9 @@
|
|
|
2012
2105
|
.indent-\[-1ch\] {
|
|
2013
2106
|
text-indent: -1ch;
|
|
2014
2107
|
}
|
|
2108
|
+
.align-top {
|
|
2109
|
+
vertical-align: top;
|
|
2110
|
+
}
|
|
2015
2111
|
.font-mono {
|
|
2016
2112
|
font-family: var(--font-mono);
|
|
2017
2113
|
}
|
|
@@ -2082,6 +2178,9 @@
|
|
|
2082
2178
|
font-size: var(--text-xs);
|
|
2083
2179
|
line-height: calc(var(--spacing) * 5);
|
|
2084
2180
|
}
|
|
2181
|
+
.text-\[0\.8125rem\] {
|
|
2182
|
+
font-size: 0.8125rem;
|
|
2183
|
+
}
|
|
2085
2184
|
.text-\[10px\] {
|
|
2086
2185
|
font-size: 10px;
|
|
2087
2186
|
}
|
|
@@ -2105,6 +2204,10 @@
|
|
|
2105
2204
|
--tw-leading: 1;
|
|
2106
2205
|
line-height: 1;
|
|
2107
2206
|
}
|
|
2207
|
+
.leading-relaxed {
|
|
2208
|
+
--tw-leading: var(--leading-relaxed);
|
|
2209
|
+
line-height: var(--leading-relaxed);
|
|
2210
|
+
}
|
|
2108
2211
|
.font-bold {
|
|
2109
2212
|
--tw-font-weight: var(--font-weight-bold);
|
|
2110
2213
|
font-weight: var(--font-weight-bold);
|
|
@@ -2153,6 +2256,9 @@
|
|
|
2153
2256
|
.whitespace-nowrap {
|
|
2154
2257
|
white-space: nowrap;
|
|
2155
2258
|
}
|
|
2259
|
+
.whitespace-pre-wrap {
|
|
2260
|
+
white-space: pre-wrap;
|
|
2261
|
+
}
|
|
2156
2262
|
.text-background {
|
|
2157
2263
|
color: var(--background);
|
|
2158
2264
|
}
|
|
@@ -2881,6 +2987,11 @@
|
|
|
2881
2987
|
}
|
|
2882
2988
|
}
|
|
2883
2989
|
}
|
|
2990
|
+
.first\:mt-0 {
|
|
2991
|
+
&:first-child {
|
|
2992
|
+
margin-top: calc(var(--spacing) * 0);
|
|
2993
|
+
}
|
|
2994
|
+
}
|
|
2884
2995
|
.first\:group-first\/sidebar-item-wrapper\:after\:hidden {
|
|
2885
2996
|
&:first-child {
|
|
2886
2997
|
&:is(:where(.group\/sidebar-item-wrapper):first-child *) {
|
|
@@ -2891,6 +3002,11 @@
|
|
|
2891
3002
|
}
|
|
2892
3003
|
}
|
|
2893
3004
|
}
|
|
3005
|
+
.last\:mb-0 {
|
|
3006
|
+
&:last-child {
|
|
3007
|
+
margin-bottom: calc(var(--spacing) * 0);
|
|
3008
|
+
}
|
|
3009
|
+
}
|
|
2894
3010
|
.odd\:bg-card {
|
|
2895
3011
|
&:nth-child(odd) {
|
|
2896
3012
|
background-color: var(--card);
|
|
@@ -2943,6 +3059,16 @@
|
|
|
2943
3059
|
background-color: var(--accent);
|
|
2944
3060
|
}
|
|
2945
3061
|
}
|
|
3062
|
+
.hover\:scale-105 {
|
|
3063
|
+
&:hover {
|
|
3064
|
+
@media (hover: hover) {
|
|
3065
|
+
--tw-scale-x: 105%;
|
|
3066
|
+
--tw-scale-y: 105%;
|
|
3067
|
+
--tw-scale-z: 105%;
|
|
3068
|
+
scale: var(--tw-scale-x) var(--tw-scale-y);
|
|
3069
|
+
}
|
|
3070
|
+
}
|
|
3071
|
+
}
|
|
2946
3072
|
.hover\:hover-effect {
|
|
2947
3073
|
&:hover {
|
|
2948
3074
|
@media (hover: hover) {
|
|
@@ -2994,6 +3120,16 @@
|
|
|
2994
3120
|
}
|
|
2995
3121
|
}
|
|
2996
3122
|
}
|
|
3123
|
+
.hover\:bg-primary\/90 {
|
|
3124
|
+
&:hover {
|
|
3125
|
+
@media (hover: hover) {
|
|
3126
|
+
background-color: var(--primary);
|
|
3127
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
3128
|
+
background-color: color-mix(in oklab, var(--primary) 90%, transparent);
|
|
3129
|
+
}
|
|
3130
|
+
}
|
|
3131
|
+
}
|
|
3132
|
+
}
|
|
2997
3133
|
.hover\:pr-6 {
|
|
2998
3134
|
&:hover {
|
|
2999
3135
|
@media (hover: hover) {
|
|
@@ -3008,6 +3144,13 @@
|
|
|
3008
3144
|
}
|
|
3009
3145
|
}
|
|
3010
3146
|
}
|
|
3147
|
+
.hover\:text-foreground {
|
|
3148
|
+
&:hover {
|
|
3149
|
+
@media (hover: hover) {
|
|
3150
|
+
color: var(--foreground);
|
|
3151
|
+
}
|
|
3152
|
+
}
|
|
3153
|
+
}
|
|
3011
3154
|
.hover\:text-muted-foreground {
|
|
3012
3155
|
&:hover {
|
|
3013
3156
|
@media (hover: hover) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="acae0216-82a8-5642-8643-e6aaff6366c0")}catch(e){}}();
|
|
3
3
|
import { createElement } from "react";
|
|
4
4
|
import { ToastContainer, dismiss, toast } from "@powerhousedao/design-system/connect/toast";
|
|
5
5
|
//#region src/services/toast.ts
|
|
@@ -22,5 +22,5 @@ function dismissToast(toastId) {
|
|
|
22
22
|
//#endregion
|
|
23
23
|
export { dismissToast as n, toast$1 as r, ToastContainer$1 as t };
|
|
24
24
|
|
|
25
|
-
//# sourceMappingURL=toast-
|
|
26
|
-
//# debugId=
|
|
25
|
+
//# sourceMappingURL=toast-DtfTKZND.js.map
|
|
26
|
+
//# debugId=acae0216-82a8-5642-8643-e6aaff6366c0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast-
|
|
1
|
+
{"version":3,"file":"toast-DtfTKZND.js","sources":["../src/services/toast.ts"],"sourcesContent":["import type { ConnectToastOptions } from \"@powerhousedao/design-system/connect/toast\";\nimport {\n ToastContainer as BaseToastContainer,\n dismiss as baseDismiss,\n toast as baseToast,\n} from \"@powerhousedao/design-system/connect/toast\";\nimport { createElement, type ComponentProps } from \"react\";\n\nexport const CONNECT_TOAST_CONTAINER_ID = \"connect\";\n\ntype BaseToastContainerProps = ComponentProps<typeof BaseToastContainer>;\n\nexport const ToastContainer = (\n props: Omit<BaseToastContainerProps, \"containerId\"> = {},\n) =>\n createElement(BaseToastContainer, {\n containerId: CONNECT_TOAST_CONTAINER_ID,\n ...props,\n });\n\ntype ToastArgs = Parameters<typeof baseToast>;\nexport function toast(content: ToastArgs[0], options?: ConnectToastOptions) {\n const {\n type = \"default\",\n containerId = CONNECT_TOAST_CONTAINER_ID,\n ...restOptions\n } = options || {};\n return baseToast(content, { type, containerId, ...restOptions });\n}\n\nexport function dismissToast(toastId: string | number) {\n return baseDismiss(toastId);\n}\n"],"names":["ToastContainer","BaseToastContainer","toast","baseToast","baseDismiss"],"mappings":";;;;;AAQA,MAAa,6BAA6B;AAI1C,MAAaA,oBACX,QAAsD,EAAE,KAExD,cAAcC,gBAAoB;CAChC,aAAa;CACb,GAAG;CACJ,CAAC;AAGJ,SAAgBC,QAAM,SAAuB,SAA+B;CAC1E,MAAM,EACJ,OAAO,WACP,cAAc,4BACd,GAAG,gBACD,WAAW,EAAE;AACjB,QAAOC,MAAU,SAAS;EAAE;EAAM;EAAa,GAAG;EAAa,CAAC;;AAGlE,SAAgB,aAAa,SAA0B;AACrD,QAAOC,QAAY,QAAQ","debug_id":"acae0216-82a8-5642-8643-e6aaff6366c0"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f64d644b-2e18-5b99-94f3-3c633d46b2a8")}catch(e){}}();
|
|
3
3
|
import { useCallback, useMemo } from "react";
|
|
4
4
|
import { openRenown, showPHModal, useRenownAuth, useRenownLoginMethods } from "@powerhousedao/reactor-browser";
|
|
5
5
|
//#region src/hooks/use-renown-login.ts
|
|
@@ -48,5 +48,5 @@ function useRenownLoginProps() {
|
|
|
48
48
|
//#endregion
|
|
49
49
|
export { useRenownLoginProps as n, useOpenRenownLogin as t };
|
|
50
50
|
|
|
51
|
-
//# sourceMappingURL=use-renown-login-
|
|
52
|
-
//# debugId=
|
|
51
|
+
//# sourceMappingURL=use-renown-login-DtCtMWCo.js.map
|
|
52
|
+
//# debugId=f64d644b-2e18-5b99-94f3-3c633d46b2a8
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-renown-login-
|
|
1
|
+
{"version":3,"file":"use-renown-login-DtCtMWCo.js","sources":["../src/hooks/use-renown-login.ts"],"sourcesContent":["import type { RenownLoginOption } from \"@powerhousedao/design-system/connect\";\nimport {\n openRenown,\n showPHModal,\n useRenownAuth,\n useRenownLoginMethods,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\n// Opens the in-page login modal when wallet adapters are configured; otherwise\n// redirects straight to the Renown portal (no modal with only a redirect button).\nexport function useOpenRenownLogin(): () => void {\n const methods = useRenownLoginMethods();\n return useCallback(() => {\n if (methods.length > 0) {\n showPHModal({ type: \"login\" });\n } else {\n openRenown();\n }\n }, [methods]);\n}\n\nexport interface RenownLoginProps {\n onLogin: () => void;\n // One option per configured login method (wallet, Google, email, …). Empty\n // only when no adapters are configured (the redirect Connect button is used).\n methods: RenownLoginOption[];\n loading: boolean;\n error: string | null;\n}\n\nconst LAST_METHOD_KEY = \"renown:last-login-method\";\n\nfunction getLastLoginMethod(): string | null {\n try {\n return localStorage.getItem(LAST_METHOD_KEY);\n } catch {\n return null;\n }\n}\n\nfunction setLastLoginMethod(method: string): void {\n try {\n localStorage.setItem(LAST_METHOD_KEY, method);\n } catch {\n // localStorage unavailable (private mode / SSR) — the badge is optional.\n }\n}\n\n// Single source of the login wiring shared by every Connect CTA: in-page\n// sign-in (with redirect fallback) plus pending/error feedback.\nexport function useRenownLoginProps(): RenownLoginProps {\n const { login, pending, error } = useRenownAuth();\n const onLogin = useCallback(() => login(), [login]);\n\n // Method list (labels) comes from the shared primitive; Connect adds the\n // last-used badge + the onSelect wiring for its design-system card.\n const baseMethods = useRenownLoginMethods();\n\n const methods = useMemo<RenownLoginOption[]>(() => {\n const lastUsed = getLastLoginMethod();\n return baseMethods.map((method) => ({\n id: method.id,\n label: method.label,\n lastUsed: lastUsed === method.id,\n onSelect: () => {\n setLastLoginMethod(method.id);\n login(undefined, method.id);\n },\n }));\n }, [baseMethods, login]);\n\n return { onLogin, methods, loading: pending, error: error?.message ?? null };\n}\n"],"names":[],"mappings":";;;;;AAWA,SAAgB,qBAAiC;CAC/C,MAAM,UAAU,uBAAuB;AACvC,QAAO,kBAAkB;AACvB,MAAI,QAAQ,SAAS,EACnB,aAAY,EAAE,MAAM,SAAS,CAAC;MAE9B,aAAY;IAEb,CAAC,QAAQ,CAAC;;AAYf,MAAM,kBAAkB;AAExB,SAAS,qBAAoC;AAC3C,KAAI;AACF,SAAO,aAAa,QAAQ,gBAAgB;SACtC;AACN,SAAO;;;AAIX,SAAS,mBAAmB,QAAsB;AAChD,KAAI;AACF,eAAa,QAAQ,iBAAiB,OAAO;SACvC;;AAOV,SAAgB,sBAAwC;CACtD,MAAM,EAAE,OAAO,SAAS,UAAU,eAAe;CACjD,MAAM,UAAU,kBAAkB,OAAO,EAAE,CAAC,MAAM,CAAC;CAInD,MAAM,cAAc,uBAAuB;AAe3C,QAAO;EAAE;EAAS,SAbF,cAAmC;GACjD,MAAM,WAAW,oBAAoB;AACrC,UAAO,YAAY,KAAK,YAAY;IAClC,IAAI,OAAO;IACX,OAAO,OAAO;IACd,UAAU,aAAa,OAAO;IAC9B,gBAAgB;AACd,wBAAmB,OAAO,GAAG;AAC7B,WAAM,KAAA,GAAW,OAAO,GAAG;;IAE9B,EAAE;KACF,CAAC,aAAa,MAAM,CAAC;EAEG,SAAS;EAAS,OAAO,OAAO,WAAW;EAAM","debug_id":"f64d644b-2e18-5b99-94f3-3c633d46b2a8"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="eebf1fc5-5b03-5caa-958b-a4d7e505acf0")}catch(e){}}();
|
|
3
3
|
import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
|
|
4
4
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
5
|
import { getPackagePage, getPackagesForDocumentType, trimTrailingSlash, useVetraPackageManager } from "@powerhousedao/reactor-browser";
|
|
@@ -310,5 +310,5 @@ function getPackageStatusFromPackageSource(packageSource) {
|
|
|
310
310
|
//#endregion
|
|
311
311
|
export { useRegistryPackages as t };
|
|
312
312
|
|
|
313
|
-
//# sourceMappingURL=useRegistryPackages-
|
|
314
|
-
//# debugId=
|
|
313
|
+
//# sourceMappingURL=useRegistryPackages-dCWW6oNq.js.map
|
|
314
|
+
//# debugId=eebf1fc5-5b03-5caa-958b-a4d7e505acf0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRegistryPackages-DMhCvTWq.js","sources":["../src/hooks/useRegistryPackages.ts"],"sourcesContent":["import {\n getPackagePage,\n getPackagesForDocumentType,\n trimTrailingSlash,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n PackageInfo,\n PackageListItem,\n RegistryPackage,\n RegistryPackageList,\n RegistryPackageMap,\n RegistryPackageSource,\n RegistryPackageStatus,\n} from \"@powerhousedao/shared/registry\";\nimport { slimManifest } from \"@powerhousedao/shared/registry/manifest-slim\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\n\n/** Page size for the paginated Available-packages listing. */\nconst AVAILABLE_PAGE_SIZE = 30;\n\nexport function useRegistryPackages() {\n const packageManager = useVetraPackageManager();\n const packageManagerPackages = packageManager?.packages;\n const registryUrl = getRuntimeConfig().packageRegistryUrl ?? null;\n // Normalize so `http://host` and `http://host/` don't produce two separate\n // localStorage maps where the install/status flow reads from one while the\n // registry fetch writes to the other.\n const registryPackagesKey = `REGISTRY_PACKAGES:${registryUrl === null ? null : trimTrailingSlash(registryUrl)}`;\n const [registryPackagesMap, setRegistryPackagesMap] =\n useBestEffortLocalStorage<RegistryPackageMap>(registryPackagesKey, {});\n const registryPackageList: RegistryPackageList = useMemo(() => {\n return Array.from(Object.values(registryPackagesMap)).filter(\n (p) => p !== undefined,\n );\n }, [registryPackagesMap]);\n // Split for the two Package Manager tabs: installed is derivable from local\n // state alone (no network), available/dismissed come from the registry\n // fetch (or its localStorage cache).\n const installedPackages: RegistryPackageList = useMemo(\n () =>\n registryPackageList.filter(\n (p) => p.status === \"local-install\" || p.status === \"registry-install\",\n ),\n [registryPackageList],\n );\n // --- Available tab: paginated + server-searched, layered on the map ---\n //\n // The map above stays the single source of truth for each package's status,\n // version metadata and install state. `availableOrder` is the ordering layer\n // for the current search: a page-accumulated list of names. The rendered\n // available list looks each name up in the map and drops anything that is\n // now installed (it moves to the Installed tab) — so installing a row needs\n // no extra bookkeeping.\n const [availableOrder, setAvailableOrder] = useState<string[]>([]);\n const [availableTotal, setAvailableTotal] = useState<number | null>(null);\n const [availableHasMore, setAvailableHasMore] = useState(false);\n const [isLoadingAvailable, setIsLoadingAvailable] = useState(false);\n const [isLoadingMoreAvailable, setIsLoadingMoreAvailable] = useState(false);\n const [availableError, setAvailableError] = useState(false);\n\n // Latest search string (updated synchronously so a debounced fetch reads the\n // freshest query), the server offset for the next page, and a monotonic\n // request generation so out-of-order responses never clobber a newer query.\n const availableQueryRef = useRef(\"\");\n const nextOffsetRef = useRef(0);\n const requestGenerationRef = useRef(0);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const availablePackages: RegistryPackageList = useMemo(\n () =>\n availableOrder\n .map((name) => registryPackagesMap[name])\n .filter(\n (p): p is RegistryPackage =>\n p !== undefined &&\n (p.status === \"available\" || p.status === \"dismissed\"),\n ),\n [availableOrder, registryPackagesMap],\n );\n\n const fetchAvailablePage = useCallback(\n async ({ reset }: { reset: boolean }): Promise<void> => {\n if (registryUrl === null || !packageManager) return;\n const generation = ++requestGenerationRef.current;\n const offset = reset ? 0 : nextOffsetRef.current;\n const search = availableQueryRef.current;\n if (reset) setIsLoadingAvailable(true);\n else setIsLoadingMoreAvailable(true);\n setAvailableError(false);\n\n try {\n const page = await getPackagePage(registryUrl, {\n limit: AVAILABLE_PAGE_SIZE,\n offset,\n search: search || undefined,\n });\n // A newer search/reset superseded this request — drop its result.\n if (generation !== requestGenerationRef.current) return;\n\n setRegistryPackagesMap((oldPackages) => {\n const next: RegistryPackageMap = { ...oldPackages };\n for (const item of page.items) {\n const existing = next[item.name];\n if (!existing) {\n const status = getPackageStatusFromPackageSource(\n packageManager.getPackageSource(item.name),\n );\n next[item.name] = makeRegistryPackageFromListItem(item, status);\n } else {\n // Keep the existing (possibly fuller) entry; just refresh the\n // installed version and re-promote status. Never downgrade an\n // installed/dismissed row from a trimmed list item.\n next[item.name] = {\n ...existing,\n version:\n packageManager.getPackageVersion(item.name) ??\n item.version ??\n existing.version,\n status: promoteStatus(\n existing.status,\n packageManager.getPackageSource(item.name),\n ),\n };\n }\n }\n return next;\n });\n\n setAvailableOrder((prev) => {\n const base = reset ? [] : prev;\n const seen = new Set(base);\n const merged = [...base];\n for (const item of page.items) {\n if (!seen.has(item.name)) {\n seen.add(item.name);\n merged.push(item.name);\n }\n }\n return merged;\n });\n\n nextOffsetRef.current = offset + page.items.length;\n setAvailableTotal(page.total);\n setAvailableHasMore(page.hasMore);\n } catch (error: unknown) {\n if (generation !== requestGenerationRef.current) return;\n // Log the raw failure for debugging; the UI only gets a boolean so we\n // never surface generic API / network messages to the user.\n console.error(error);\n setAvailableError(true);\n } finally {\n // Only the newest request clears the spinners.\n if (generation === requestGenerationRef.current) {\n setIsLoadingAvailable(false);\n setIsLoadingMoreAvailable(false);\n }\n }\n },\n [registryUrl, packageManager, setRegistryPackagesMap],\n );\n\n /** Debounced server search — resets to page 1 for the new query. */\n const setAvailableSearch = useCallback(\n (query: string) => {\n availableQueryRef.current = query;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n void fetchAvailablePage({ reset: true });\n }, 300);\n },\n [fetchAvailablePage],\n );\n\n /** Load the next page (infinite scroll). No-op when exhausted/busy. */\n const loadMoreAvailable = useCallback(() => {\n if (!availableHasMore || isLoadingAvailable || isLoadingMoreAvailable) {\n return;\n }\n void fetchAvailablePage({ reset: false });\n }, [\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n fetchAvailablePage,\n ]);\n\n /**\n * Load page 1 the first time the Available tab is opened. Re-opening keeps\n * the accumulated pages; a fetch error leaves the panel's Retry to re-fetch\n * (this guard avoids auto-retry loops on tab re-open).\n */\n function ensureAvailableLoaded() {\n if (availableOrder.length > 0 || isLoadingAvailable || availableError) {\n return;\n }\n void fetchAvailablePage({ reset: true });\n }\n\n /**\n * Fetch full package info for a document type (via the legacy\n * `?documentType=` filter) and merge into the map. Lets MissingPackageModal\n * offer installs without loading the whole paginated listing.\n */\n const fetchPackagesByDocumentType = useCallback(\n async (documentType: string): Promise<RegistryPackage[]> => {\n if (registryUrl === null || !packageManager) return [];\n try {\n const infos = await getPackagesForDocumentType(\n registryUrl,\n documentType,\n );\n setRegistryPackagesMap((oldPackages) => {\n const next: RegistryPackageMap = { ...oldPackages };\n for (const info of infos) {\n const existing = next[info.name];\n const status = getPackageStatusFromPackageSource(\n packageManager.getPackageSource(info.name),\n );\n next[info.name] = existing\n ? {\n ...existing,\n status: promoteStatus(\n existing.status,\n packageManager.getPackageSource(info.name),\n ),\n }\n : makeRegistryPackageFromPackageInfo(info, status);\n }\n return next;\n });\n return infos.map((info) =>\n makeRegistryPackageFromPackageInfo(\n info,\n getPackageStatusFromPackageSource(\n packageManager.getPackageSource(info.name),\n ),\n ),\n );\n } catch (error: unknown) {\n console.error(error);\n return [];\n }\n },\n [registryUrl, packageManager, setRegistryPackagesMap],\n );\n\n // Clear any pending debounce on unmount.\n useEffect(\n () => () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n },\n [],\n );\n\n useEffect(() => {\n if (!packageManager) return;\n\n if (packageManagerPackages?.length) {\n for (const packageManagerPackage of packageManagerPackages) {\n setRegistryPackagesMap((existingRegistryPackages) => {\n const packageName = packageManagerPackage.manifest.name;\n const existingPackage = existingRegistryPackages[packageName];\n const newRegistryPackages = { ...existingRegistryPackages };\n const version = packageManager.getPackageVersion(packageName);\n if (existingPackage) {\n newRegistryPackages[packageName] = {\n ...existingPackage,\n version: version ?? existingPackage.version,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageName),\n ),\n };\n } else {\n const packageSource = packageManager.getPackageSource(packageName);\n const status = getPackageStatusFromPackageSource(packageSource);\n const newRegistryPackage = makeRegistryPackageFromDocumentModelLib(\n packageManagerPackage,\n status,\n version,\n );\n newRegistryPackages[packageName] = newRegistryPackage;\n }\n return newRegistryPackages;\n });\n }\n }\n }, [packageManagerPackages]);\n\n function updateRegistryPackageStatus(\n packageName: string,\n newStatus: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n const newRegistryPackage = newRegistryPackages[packageName];\n if (!newRegistryPackage) {\n console.error(\n \"Attempting to update status for package that does not exist.\",\n );\n return newRegistryPackages;\n }\n newRegistryPackages[packageName] = {\n ...newRegistryPackage,\n status: newStatus,\n };\n\n return newRegistryPackages;\n });\n }\n\n /**\n * Register a freshly-installed package that came in via the npm-uplink\n * fallback — the user typed a bare name, our local `/packages` didn't know\n * it, but the install succeeded because verdaccio proxy-fetched the tarball.\n *\n * This is the one legitimate case where the status update runs against a\n * name that wasn't in the registry map. We treat it as an insert rather\n * than logging the \"does not exist\" error. Data is pulled from the loaded\n * module so the UI card shows the real manifest immediately; the next\n * `/packages` refresh will add `versions`/`distTags`.\n */\n function registerFallbackRegistryPackage(\n packageName: string,\n loadedPackage: DocumentModelLib,\n version: string | undefined,\n status: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n newRegistryPackages[packageName] = {\n ...makeRegistryPackageFromDocumentModelLib(\n loadedPackage,\n status,\n version,\n ),\n name: packageName,\n };\n return newRegistryPackages;\n });\n }\n\n return {\n registryPackagesMap,\n registryPackageList,\n installedPackages,\n // Available tab (paginated + server search)\n availablePackages,\n availableTotal,\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n availableError,\n ensureAvailableLoaded,\n fetchAvailablePage,\n loadMoreAvailable,\n setAvailableSearch,\n fetchPackagesByDocumentType,\n // Status mutations\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n };\n}\n\n/**\n * Build a RegistryPackage from a trimmed paginated list item. Version metadata\n * (distTags/versions) and documentTypes are absent — the row lazy-loads them.\n */\nfunction makeRegistryPackageFromListItem(\n item: PackageListItem,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n name: item.name,\n path: item.path,\n documentTypes: [],\n version: item.version,\n status,\n manifest: {\n name: item.name,\n ...(item.description !== undefined\n ? { description: item.description }\n : {}),\n ...(item.category !== undefined ? { category: item.category } : {}),\n ...(item.publisher !== undefined ? { publisher: item.publisher } : {}),\n },\n };\n}\n\nfunction makeRegistryPackageFromDocumentModelLib(\n documentModelLib: DocumentModelLib,\n status: RegistryPackageStatus,\n version?: string,\n): RegistryPackage {\n return {\n name: documentModelLib.manifest.name,\n path: \"stub-path\",\n documentTypes: documentModelLib.documentModels.map(\n (d) => d.documentModel.global.id,\n ),\n status,\n manifest: slimManifest(documentModelLib.manifest),\n version,\n };\n}\n\nfunction makeRegistryPackageFromPackageInfo(\n packageInfo: PackageInfo,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n ...packageInfo,\n // Slim before caching: registry manifests are unvalidated JSON and have\n // carried multi-megabyte junk fields that blew the localStorage quota\n // (and the UI only reads the summary fields anyway).\n manifest: slimManifest(packageInfo.manifest),\n documentTypes: packageInfo.manifest?.documentModels?.map((d) => d.id) ?? [],\n status,\n };\n}\n\n/**\n * Like usehooks-ts' useLocalStorage, but persistence is best-effort: a failed\n * `setItem` (e.g. QuotaExceededError on an oversized payload) keeps the\n * in-memory state so the package manager still works for the session.\n * useLocalStorage couples the state update to the write — when the write\n * threw, the freshly fetched package list was discarded and the registry UI\n * rendered (and searched) an empty list.\n *\n * The key is derived from the boot-time runtime config and never changes\n * within a session, so no key-change rehydration is needed.\n */\nfunction useBestEffortLocalStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(\n () => readJsonFromStorage<T>(key) ?? initialValue,\n );\n\n useEffect(() => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n // Free the key and retry once — a stale oversized entry from an older\n // session may be occupying the quota this write needs.\n try {\n window.localStorage.removeItem(key);\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n console.warn(\n `Failed to persist \"${key}\" to localStorage; continuing with in-memory data.`,\n error,\n );\n }\n }\n }, [key, value]);\n\n return [value, setValue] as const;\n}\n\nfunction readJsonFromStorage<T>(key: string): T | null {\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? null : (JSON.parse(raw) as T);\n } catch {\n return null;\n }\n}\n\n/**\n * When refreshing a cached entry, promote `\"available\"` to whatever the\n * packageManager now reports — the cached `\"available\"` was almost certainly\n * recorded before `packageManager.addPackages()` finished on a prior session.\n * Never downgrade an already-installed entry, and never overwrite a deliberate\n * `\"dismissed\"` choice.\n */\nfunction promoteStatus(\n cachedStatus: RegistryPackageStatus,\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n if (cachedStatus !== \"available\") return cachedStatus;\n if (packageSource === null) return cachedStatus;\n return getPackageStatusFromPackageSource(packageSource);\n}\n\nfunction getPackageStatusFromPackageSource(\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n // if we check the package source for a package that came from the api and it doesn't exist yet,\n // then we know the package is available on the api but not installed\n if (packageSource === null) return \"available\";\n // show common package, local project package and locally installed packages as \"local-install\"\n if (\n packageSource === \"local-install\" ||\n packageSource === \"common\" ||\n packageSource === \"project\"\n )\n return \"local-install\";\n // show \"registry-install\" status for package source \"registry-install\"\n if (packageSource === \"registry-install\") return \"registry-install\";\n // fallback to available — we should probably do more checks here\n return \"available\";\n}\n"],"names":[],"mappings":"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","debug_id":"a2bca0ce-adce-512d-a646-5adf41d1dd3f"}
|
|
1
|
+
{"version":3,"file":"useRegistryPackages-dCWW6oNq.js","sources":["../src/hooks/useRegistryPackages.ts"],"sourcesContent":["import {\n getPackagePage,\n getPackagesForDocumentType,\n trimTrailingSlash,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n PackageInfo,\n PackageListItem,\n RegistryPackage,\n RegistryPackageList,\n RegistryPackageMap,\n RegistryPackageSource,\n RegistryPackageStatus,\n} from \"@powerhousedao/shared/registry\";\nimport { slimManifest } from \"@powerhousedao/shared/registry/manifest-slim\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\n\n/** Page size for the paginated Available-packages listing. */\nconst AVAILABLE_PAGE_SIZE = 30;\n\nexport function useRegistryPackages() {\n const packageManager = useVetraPackageManager();\n const packageManagerPackages = packageManager?.packages;\n const registryUrl = getRuntimeConfig().packageRegistryUrl ?? null;\n // Normalize so `http://host` and `http://host/` don't produce two separate\n // localStorage maps where the install/status flow reads from one while the\n // registry fetch writes to the other.\n const registryPackagesKey = `REGISTRY_PACKAGES:${registryUrl === null ? null : trimTrailingSlash(registryUrl)}`;\n const [registryPackagesMap, setRegistryPackagesMap] =\n useBestEffortLocalStorage<RegistryPackageMap>(registryPackagesKey, {});\n const registryPackageList: RegistryPackageList = useMemo(() => {\n return Array.from(Object.values(registryPackagesMap)).filter(\n (p) => p !== undefined,\n );\n }, [registryPackagesMap]);\n // Split for the two Package Manager tabs: installed is derivable from local\n // state alone (no network), available/dismissed come from the registry\n // fetch (or its localStorage cache).\n const installedPackages: RegistryPackageList = useMemo(\n () =>\n registryPackageList.filter(\n (p) => p.status === \"local-install\" || p.status === \"registry-install\",\n ),\n [registryPackageList],\n );\n // --- Available tab: paginated + server-searched, layered on the map ---\n //\n // The map above stays the single source of truth for each package's status,\n // version metadata and install state. `availableOrder` is the ordering layer\n // for the current search: a page-accumulated list of names. The rendered\n // available list looks each name up in the map and drops anything that is\n // now installed (it moves to the Installed tab) — so installing a row needs\n // no extra bookkeeping.\n const [availableOrder, setAvailableOrder] = useState<string[]>([]);\n const [availableTotal, setAvailableTotal] = useState<number | null>(null);\n const [availableHasMore, setAvailableHasMore] = useState(false);\n const [isLoadingAvailable, setIsLoadingAvailable] = useState(false);\n const [isLoadingMoreAvailable, setIsLoadingMoreAvailable] = useState(false);\n const [availableError, setAvailableError] = useState(false);\n\n // Latest search string (updated synchronously so a debounced fetch reads the\n // freshest query), the server offset for the next page, and a monotonic\n // request generation so out-of-order responses never clobber a newer query.\n const availableQueryRef = useRef(\"\");\n const nextOffsetRef = useRef(0);\n const requestGenerationRef = useRef(0);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const availablePackages: RegistryPackageList = useMemo(\n () =>\n availableOrder\n .map((name) => registryPackagesMap[name])\n .filter(\n (p): p is RegistryPackage =>\n p !== undefined &&\n (p.status === \"available\" || p.status === \"dismissed\"),\n ),\n [availableOrder, registryPackagesMap],\n );\n\n const fetchAvailablePage = useCallback(\n async ({ reset }: { reset: boolean }): Promise<void> => {\n if (registryUrl === null || !packageManager) return;\n const generation = ++requestGenerationRef.current;\n const offset = reset ? 0 : nextOffsetRef.current;\n const search = availableQueryRef.current;\n if (reset) setIsLoadingAvailable(true);\n else setIsLoadingMoreAvailable(true);\n setAvailableError(false);\n\n try {\n const page = await getPackagePage(registryUrl, {\n limit: AVAILABLE_PAGE_SIZE,\n offset,\n search: search || undefined,\n });\n // A newer search/reset superseded this request — drop its result.\n if (generation !== requestGenerationRef.current) return;\n\n setRegistryPackagesMap((oldPackages) => {\n const next: RegistryPackageMap = { ...oldPackages };\n for (const item of page.items) {\n const existing = next[item.name];\n if (!existing) {\n const status = getPackageStatusFromPackageSource(\n packageManager.getPackageSource(item.name),\n );\n next[item.name] = makeRegistryPackageFromListItem(item, status);\n } else {\n // Keep the existing (possibly fuller) entry; just refresh the\n // installed version and re-promote status. Never downgrade an\n // installed/dismissed row from a trimmed list item.\n next[item.name] = {\n ...existing,\n version:\n packageManager.getPackageVersion(item.name) ??\n item.version ??\n existing.version,\n status: promoteStatus(\n existing.status,\n packageManager.getPackageSource(item.name),\n ),\n };\n }\n }\n return next;\n });\n\n setAvailableOrder((prev) => {\n const base = reset ? [] : prev;\n const seen = new Set(base);\n const merged = [...base];\n for (const item of page.items) {\n if (!seen.has(item.name)) {\n seen.add(item.name);\n merged.push(item.name);\n }\n }\n return merged;\n });\n\n nextOffsetRef.current = offset + page.items.length;\n setAvailableTotal(page.total);\n setAvailableHasMore(page.hasMore);\n } catch (error: unknown) {\n if (generation !== requestGenerationRef.current) return;\n // Log the raw failure for debugging; the UI only gets a boolean so we\n // never surface generic API / network messages to the user.\n console.error(error);\n setAvailableError(true);\n } finally {\n // Only the newest request clears the spinners.\n if (generation === requestGenerationRef.current) {\n setIsLoadingAvailable(false);\n setIsLoadingMoreAvailable(false);\n }\n }\n },\n [registryUrl, packageManager, setRegistryPackagesMap],\n );\n\n /** Debounced server search — resets to page 1 for the new query. */\n const setAvailableSearch = useCallback(\n (query: string) => {\n availableQueryRef.current = query;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n void fetchAvailablePage({ reset: true });\n }, 300);\n },\n [fetchAvailablePage],\n );\n\n /** Load the next page (infinite scroll). No-op when exhausted/busy. */\n const loadMoreAvailable = useCallback(() => {\n if (!availableHasMore || isLoadingAvailable || isLoadingMoreAvailable) {\n return;\n }\n void fetchAvailablePage({ reset: false });\n }, [\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n fetchAvailablePage,\n ]);\n\n /**\n * Load page 1 the first time the Available tab is opened. Re-opening keeps\n * the accumulated pages; a fetch error leaves the panel's Retry to re-fetch\n * (this guard avoids auto-retry loops on tab re-open).\n */\n function ensureAvailableLoaded() {\n if (availableOrder.length > 0 || isLoadingAvailable || availableError) {\n return;\n }\n void fetchAvailablePage({ reset: true });\n }\n\n /**\n * Fetch full package info for a document type (via the legacy\n * `?documentType=` filter) and merge into the map. Lets MissingPackageModal\n * offer installs without loading the whole paginated listing.\n */\n const fetchPackagesByDocumentType = useCallback(\n async (documentType: string): Promise<RegistryPackage[]> => {\n if (registryUrl === null || !packageManager) return [];\n try {\n const infos = await getPackagesForDocumentType(\n registryUrl,\n documentType,\n );\n setRegistryPackagesMap((oldPackages) => {\n const next: RegistryPackageMap = { ...oldPackages };\n for (const info of infos) {\n const existing = next[info.name];\n const status = getPackageStatusFromPackageSource(\n packageManager.getPackageSource(info.name),\n );\n next[info.name] = existing\n ? {\n ...existing,\n status: promoteStatus(\n existing.status,\n packageManager.getPackageSource(info.name),\n ),\n }\n : makeRegistryPackageFromPackageInfo(info, status);\n }\n return next;\n });\n return infos.map((info) =>\n makeRegistryPackageFromPackageInfo(\n info,\n getPackageStatusFromPackageSource(\n packageManager.getPackageSource(info.name),\n ),\n ),\n );\n } catch (error: unknown) {\n console.error(error);\n return [];\n }\n },\n [registryUrl, packageManager, setRegistryPackagesMap],\n );\n\n // Clear any pending debounce on unmount.\n useEffect(\n () => () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n },\n [],\n );\n\n useEffect(() => {\n if (!packageManager) return;\n\n if (packageManagerPackages?.length) {\n for (const packageManagerPackage of packageManagerPackages) {\n setRegistryPackagesMap((existingRegistryPackages) => {\n const packageName = packageManagerPackage.manifest.name;\n const existingPackage = existingRegistryPackages[packageName];\n const newRegistryPackages = { ...existingRegistryPackages };\n const version = packageManager.getPackageVersion(packageName);\n if (existingPackage) {\n newRegistryPackages[packageName] = {\n ...existingPackage,\n version: version ?? existingPackage.version,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageName),\n ),\n };\n } else {\n const packageSource = packageManager.getPackageSource(packageName);\n const status = getPackageStatusFromPackageSource(packageSource);\n const newRegistryPackage = makeRegistryPackageFromDocumentModelLib(\n packageManagerPackage,\n status,\n version,\n );\n newRegistryPackages[packageName] = newRegistryPackage;\n }\n return newRegistryPackages;\n });\n }\n }\n }, [packageManagerPackages]);\n\n function updateRegistryPackageStatus(\n packageName: string,\n newStatus: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n const newRegistryPackage = newRegistryPackages[packageName];\n if (!newRegistryPackage) {\n console.error(\n \"Attempting to update status for package that does not exist.\",\n );\n return newRegistryPackages;\n }\n newRegistryPackages[packageName] = {\n ...newRegistryPackage,\n status: newStatus,\n };\n\n return newRegistryPackages;\n });\n }\n\n /**\n * Register a freshly-installed package that came in via the npm-uplink\n * fallback — the user typed a bare name, our local `/packages` didn't know\n * it, but the install succeeded because verdaccio proxy-fetched the tarball.\n *\n * This is the one legitimate case where the status update runs against a\n * name that wasn't in the registry map. We treat it as an insert rather\n * than logging the \"does not exist\" error. Data is pulled from the loaded\n * module so the UI card shows the real manifest immediately; the next\n * `/packages` refresh will add `versions`/`distTags`.\n */\n function registerFallbackRegistryPackage(\n packageName: string,\n loadedPackage: DocumentModelLib,\n version: string | undefined,\n status: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n newRegistryPackages[packageName] = {\n ...makeRegistryPackageFromDocumentModelLib(\n loadedPackage,\n status,\n version,\n ),\n name: packageName,\n };\n return newRegistryPackages;\n });\n }\n\n return {\n registryPackagesMap,\n registryPackageList,\n installedPackages,\n // Available tab (paginated + server search)\n availablePackages,\n availableTotal,\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n availableError,\n ensureAvailableLoaded,\n fetchAvailablePage,\n loadMoreAvailable,\n setAvailableSearch,\n fetchPackagesByDocumentType,\n // Status mutations\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n };\n}\n\n/**\n * Build a RegistryPackage from a trimmed paginated list item. Version metadata\n * (distTags/versions) and documentTypes are absent — the row lazy-loads them.\n */\nfunction makeRegistryPackageFromListItem(\n item: PackageListItem,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n name: item.name,\n path: item.path,\n documentTypes: [],\n version: item.version,\n status,\n manifest: {\n name: item.name,\n ...(item.description !== undefined\n ? { description: item.description }\n : {}),\n ...(item.category !== undefined ? { category: item.category } : {}),\n ...(item.publisher !== undefined ? { publisher: item.publisher } : {}),\n },\n };\n}\n\nfunction makeRegistryPackageFromDocumentModelLib(\n documentModelLib: DocumentModelLib,\n status: RegistryPackageStatus,\n version?: string,\n): RegistryPackage {\n return {\n name: documentModelLib.manifest.name,\n path: \"stub-path\",\n documentTypes: documentModelLib.documentModels.map(\n (d) => d.documentModel.global.id,\n ),\n status,\n manifest: slimManifest(documentModelLib.manifest),\n version,\n };\n}\n\nfunction makeRegistryPackageFromPackageInfo(\n packageInfo: PackageInfo,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n ...packageInfo,\n // Slim before caching: registry manifests are unvalidated JSON and have\n // carried multi-megabyte junk fields that blew the localStorage quota\n // (and the UI only reads the summary fields anyway).\n manifest: slimManifest(packageInfo.manifest),\n documentTypes: packageInfo.manifest?.documentModels?.map((d) => d.id) ?? [],\n status,\n };\n}\n\n/**\n * Like usehooks-ts' useLocalStorage, but persistence is best-effort: a failed\n * `setItem` (e.g. QuotaExceededError on an oversized payload) keeps the\n * in-memory state so the package manager still works for the session.\n * useLocalStorage couples the state update to the write — when the write\n * threw, the freshly fetched package list was discarded and the registry UI\n * rendered (and searched) an empty list.\n *\n * The key is derived from the boot-time runtime config and never changes\n * within a session, so no key-change rehydration is needed.\n */\nfunction useBestEffortLocalStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(\n () => readJsonFromStorage<T>(key) ?? initialValue,\n );\n\n useEffect(() => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n // Free the key and retry once — a stale oversized entry from an older\n // session may be occupying the quota this write needs.\n try {\n window.localStorage.removeItem(key);\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n console.warn(\n `Failed to persist \"${key}\" to localStorage; continuing with in-memory data.`,\n error,\n );\n }\n }\n }, [key, value]);\n\n return [value, setValue] as const;\n}\n\nfunction readJsonFromStorage<T>(key: string): T | null {\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? null : (JSON.parse(raw) as T);\n } catch {\n return null;\n }\n}\n\n/**\n * When refreshing a cached entry, promote `\"available\"` to whatever the\n * packageManager now reports — the cached `\"available\"` was almost certainly\n * recorded before `packageManager.addPackages()` finished on a prior session.\n * Never downgrade an already-installed entry, and never overwrite a deliberate\n * `\"dismissed\"` choice.\n */\nfunction promoteStatus(\n cachedStatus: RegistryPackageStatus,\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n if (cachedStatus !== \"available\") return cachedStatus;\n if (packageSource === null) return cachedStatus;\n return getPackageStatusFromPackageSource(packageSource);\n}\n\nfunction getPackageStatusFromPackageSource(\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n // if we check the package source for a package that came from the api and it doesn't exist yet,\n // then we know the package is available on the api but not installed\n if (packageSource === null) return \"available\";\n // show common package, local project package and locally installed packages as \"local-install\"\n if (\n packageSource === \"local-install\" ||\n packageSource === \"common\" ||\n packageSource === \"project\"\n )\n return \"local-install\";\n // show \"registry-install\" status for package source \"registry-install\"\n if (packageSource === \"registry-install\") return \"registry-install\";\n // fallback to available — we should probably do more checks here\n return \"available\";\n}\n"],"names":[],"mappings":"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","debug_id":"eebf1fc5-5b03-5caa-958b-a4d7e505acf0"}
|