@powerhousedao/connect 6.2.2-dev.42 → 6.2.2-dev.43
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-mTJUAV2Z.js → AddDriveModal-Bw0YuxZg.js} +4 -4
- package/dist/{AddDriveModal-mTJUAV2Z.js.map → AddDriveModal-Bw0YuxZg.js.map} +1 -1
- package/dist/{ClearStorageModal-BXzsRcaK.js → ClearStorageModal-DALRWDUf.js} +4 -4
- package/dist/{ClearStorageModal-BXzsRcaK.js.map → ClearStorageModal-DALRWDUf.js.map} +1 -1
- package/dist/ConfirmDocumentUpgradeModal-BfG-hh5V.js +110 -0
- package/dist/ConfirmDocumentUpgradeModal-BfG-hh5V.js.map +1 -0
- package/dist/{CookiesPolicyModal-Dpx-2TgP.js → CookiesPolicyModal-CQ-zHJdw.js} +3 -3
- package/dist/{CookiesPolicyModal-Dpx-2TgP.js.map → CookiesPolicyModal-CQ-zHJdw.js.map} +1 -1
- package/dist/{CreateDocumentModal-u-IaJUQ0.js → CreateDocumentModal-NNi4p6EI.js} +7 -5
- package/dist/CreateDocumentModal-NNi4p6EI.js.map +1 -0
- package/dist/{DebugSettingsModal-BMCgnMAd.js → DebugSettingsModal-B1UPf9zj.js} +4 -4
- package/dist/{DebugSettingsModal-BMCgnMAd.js.map → DebugSettingsModal-B1UPf9zj.js.map} +1 -1
- package/dist/{DeleteDriveModal-CJKhWtli.js → DeleteDriveModal-C7fnXMsR.js} +4 -4
- package/dist/{DeleteDriveModal-CJKhWtli.js.map → DeleteDriveModal-C7fnXMsR.js.map} +1 -1
- package/dist/{DeleteItemModal-DiieJw_o.js → DeleteItemModal-BK_Y8Thj.js} +4 -4
- package/dist/{DeleteItemModal-DiieJw_o.js.map → DeleteItemModal-BK_Y8Thj.js.map} +1 -1
- package/dist/{DisclaimerModal-DAvYIF9-.js → DisclaimerModal-DJPHCnFY.js} +3 -3
- package/dist/{DisclaimerModal-DAvYIF9-.js.map → DisclaimerModal-DJPHCnFY.js.map} +1 -1
- package/dist/DocumentVersionUnsupportedModal-tBHLK6b1.js +32 -0
- package/dist/DocumentVersionUnsupportedModal-tBHLK6b1.js.map +1 -0
- package/dist/{DownloadDocumentWithErrorsModal-CE4fa1k5.js → DownloadDocumentWithErrorsModal-sWu46HVB.js} +3 -3
- package/dist/{DownloadDocumentWithErrorsModal-CE4fa1k5.js.map → DownloadDocumentWithErrorsModal-sWu46HVB.js.map} +1 -1
- package/dist/{DriveAuthRequiredModal-BQaAWHTe.js → DriveAuthRequiredModal-D3IPAst0.js} +3 -3
- package/dist/{DriveAuthRequiredModal-BQaAWHTe.js.map → DriveAuthRequiredModal-D3IPAst0.js.map} +1 -1
- package/dist/{DriveSettingsModal-CqFeWu4r.js → DriveSettingsModal-7OKx8foy.js} +3 -3
- package/dist/{DriveSettingsModal-CqFeWu4r.js.map → DriveSettingsModal-7OKx8foy.js.map} +1 -1
- package/dist/{InspectorModal-6Fb5lj0h.js → InspectorModal-DgFukbWp.js} +4 -4
- package/dist/{InspectorModal-6Fb5lj0h.js.map → InspectorModal-DgFukbWp.js.map} +1 -1
- package/dist/{LoginModal-CX0RlUEa.js → LoginModal-Cd2wGgG4.js} +3 -3
- package/dist/{LoginModal-CX0RlUEa.js.map → LoginModal-Cd2wGgG4.js.map} +1 -1
- package/dist/{MissingPackageModal-C3acJ9r0.js → MissingPackageModal-DyP2-Ojb.js} +3 -3
- package/dist/{MissingPackageModal-C3acJ9r0.js.map → MissingPackageModal-DyP2-Ojb.js.map} +1 -1
- package/dist/{OpenFileDocumentsModal-CTUoSm2y.js → OpenFileDocumentsModal-r-z3ZbB8.js} +22 -4
- package/dist/OpenFileDocumentsModal-r-z3ZbB8.js.map +1 -0
- package/dist/{SettingsModal-mCvZ2aog.js → SettingsModal-BleJNvhi.js} +6 -6
- package/dist/{SettingsModal-mCvZ2aog.js.map → SettingsModal-BleJNvhi.js.map} +1 -1
- package/dist/{UpgradeDriveModal-rUHyJTc7.js → UpgradeDriveModal-wo5oO9mg.js} +3 -3
- package/dist/{UpgradeDriveModal-rUHyJTc7.js.map → UpgradeDriveModal-wo5oO9mg.js.map} +1 -1
- package/dist/app-loader--Kkm8Yn1.js +4 -0
- package/dist/{app-loader-CA5Scbv0.js → app-loader-Hd5w41YX.js} +83 -25
- package/dist/app-loader-Hd5w41YX.js.map +1 -0
- package/dist/{build-info-D6ookvPv.js → build-info-NU2GGCsv.js} +5 -5
- package/dist/{build-info-D6ookvPv.js.map → build-info-NU2GGCsv.js.map} +1 -1
- package/dist/components-ZNfj2mm0.js +5 -0
- package/dist/{load-6dVYurGU.js → load-coepVaLz.js} +7 -7
- package/dist/{load-6dVYurGU.js.map → load-coepVaLz.js.map} +1 -1
- package/dist/main.js +1 -1
- package/dist/{package-DHCFRb-F.js → package-DbFImwiL.js} +4 -4
- package/dist/package-DbFImwiL.js.map +1 -0
- package/dist/{reactor-ekhtKbY3.js → reactor-CxL_2DCj.js} +5 -5
- package/dist/{reactor-ekhtKbY3.js.map → reactor-CxL_2DCj.js.map} +1 -1
- package/dist/{reload-connect-toast-BkgP9i6_.js → reload-connect-toast-DDQEupCN.js} +7 -5
- package/dist/{reload-connect-toast-BkgP9i6_.js.map → reload-connect-toast-DDQEupCN.js.map} +1 -1
- package/dist/start-connect.js +1 -1
- package/dist/style.css +24 -0
- package/dist/{toast-BLv8rjmy.js → toast-CO6ChlzE.js} +8 -5
- package/dist/toast-CO6ChlzE.js.map +1 -0
- package/package.json +11 -11
- package/dist/CreateDocumentModal-u-IaJUQ0.js.map +0 -1
- package/dist/OpenFileDocumentsModal-CTUoSm2y.js.map +0 -1
- package/dist/app-loader-CA5Scbv0.js.map +0 -1
- package/dist/app-loader-DSHJFb5M.js +0 -4
- package/dist/components-BHzvjuV4.js +0 -5
- package/dist/package-DHCFRb-F.js.map +0 -1
- package/dist/toast-BLv8rjmy.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reload-connect-toast-
|
|
1
|
+
{"version":3,"file":"reload-connect-toast-DDQEupCN.js","sources":["../src/i18n/locales/en.json","../src/i18n/index.ts","../src/services/sentry.ts","../src/components/reload-connect-toast.tsx"],"sourcesContent":["","import type { Resource } from \"i18next\";\nimport i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport translationEN from \"./locales/en.json\" with { type: \"json\" };\n\nconst resources: Resource = {\n en: {\n code: \"en\",\n name: \"English\",\n translation: translationEN,\n },\n};\n\ni18n\n .use(initReactI18next)\n .init({\n resources,\n fallbackLng: \"en\",\n debug: false,\n interpolation: {\n escapeValue: false,\n },\n })\n .catch((e: unknown) => {\n console.error(e);\n });\n\nexport { i18n };\nexport default i18n;\n","// 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":["translationEN"],"mappings":";;;;;ACcA,KACG,IAAI,iBAAiB,CACrB,KAAK;CACJ,WAXwB,EAC1B,IAAI;EACF,MAAM;EACN,MAAM;EACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACD,EACF;CAMG,aAAa;CACb,OAAO;CACP,eAAe,EACb,aAAa,OACd;CACF,CAAC,CACD,OAAO,MAAe;AACrB,SAAQ,MAAM,EAAE;EAChB;;;ACtBJ,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":"0f632200-a36c-5667-a343-797df5644c5f"}
|
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-ZNfj2mm0.js");
|
|
9
9
|
function updateLocalPackage(pkg) {
|
|
10
10
|
window.ph?.vetraPackageManager?.updateLocalPackage(pkg);
|
|
11
11
|
}
|
package/dist/style.css
CHANGED
|
@@ -625,6 +625,9 @@
|
|
|
625
625
|
.mb-1 {
|
|
626
626
|
margin-bottom: calc(var(--spacing) * 1);
|
|
627
627
|
}
|
|
628
|
+
.mb-1\.5 {
|
|
629
|
+
margin-bottom: calc(var(--spacing) * 1.5);
|
|
630
|
+
}
|
|
628
631
|
.mb-2 {
|
|
629
632
|
margin-bottom: calc(var(--spacing) * 2);
|
|
630
633
|
}
|
|
@@ -1099,6 +1102,9 @@
|
|
|
1099
1102
|
.w-\[408px\] {
|
|
1100
1103
|
width: 408px;
|
|
1101
1104
|
}
|
|
1105
|
+
.w-\[440px\] {
|
|
1106
|
+
width: 440px;
|
|
1107
|
+
}
|
|
1102
1108
|
.w-\[450px\] {
|
|
1103
1109
|
width: 450px;
|
|
1104
1110
|
}
|
|
@@ -1603,6 +1609,10 @@
|
|
|
1603
1609
|
border-top-style: var(--tw-border-style);
|
|
1604
1610
|
border-top-width: 1px;
|
|
1605
1611
|
}
|
|
1612
|
+
.border-t-0 {
|
|
1613
|
+
border-top-style: var(--tw-border-style);
|
|
1614
|
+
border-top-width: 0px;
|
|
1615
|
+
}
|
|
1606
1616
|
.border-r {
|
|
1607
1617
|
border-right-style: var(--tw-border-style);
|
|
1608
1618
|
border-right-width: 1px;
|
|
@@ -1837,6 +1847,9 @@
|
|
|
1837
1847
|
.px-10 {
|
|
1838
1848
|
padding-inline: calc(var(--spacing) * 10);
|
|
1839
1849
|
}
|
|
1850
|
+
.py-0 {
|
|
1851
|
+
padding-block: calc(var(--spacing) * 0);
|
|
1852
|
+
}
|
|
1840
1853
|
.py-0\.5 {
|
|
1841
1854
|
padding-block: calc(var(--spacing) * 0.5);
|
|
1842
1855
|
}
|
|
@@ -1906,6 +1919,9 @@
|
|
|
1906
1919
|
.pr-1 {
|
|
1907
1920
|
padding-right: calc(var(--spacing) * 1);
|
|
1908
1921
|
}
|
|
1922
|
+
.pr-1\.5 {
|
|
1923
|
+
padding-right: calc(var(--spacing) * 1.5);
|
|
1924
|
+
}
|
|
1909
1925
|
.pr-2 {
|
|
1910
1926
|
padding-right: calc(var(--spacing) * 2);
|
|
1911
1927
|
}
|
|
@@ -2243,6 +2259,9 @@
|
|
|
2243
2259
|
.opacity-75 {
|
|
2244
2260
|
opacity: 75%;
|
|
2245
2261
|
}
|
|
2262
|
+
.opacity-80 {
|
|
2263
|
+
opacity: 80%;
|
|
2264
|
+
}
|
|
2246
2265
|
.opacity-100 {
|
|
2247
2266
|
opacity: 100%;
|
|
2248
2267
|
}
|
|
@@ -3485,6 +3504,11 @@
|
|
|
3485
3504
|
fill: var(--color-red-500);
|
|
3486
3505
|
}
|
|
3487
3506
|
}
|
|
3507
|
+
.\[\&_p\:empty\]\:hidden {
|
|
3508
|
+
& p:empty {
|
|
3509
|
+
display: none;
|
|
3510
|
+
}
|
|
3511
|
+
}
|
|
3488
3512
|
.\[\&_svg\]\:pointer-events-none {
|
|
3489
3513
|
& svg {
|
|
3490
3514
|
pointer-events: none;
|
|
@@ -1,7 +1,7 @@
|
|
|
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]="d22e5acd-014d-560f-a589-64e7fe7b7685")}catch(e){}}();
|
|
3
3
|
import { createElement } from "react";
|
|
4
|
-
import { ToastContainer, toast } from "@powerhousedao/design-system/connect/toast";
|
|
4
|
+
import { ToastContainer, dismiss, toast } from "@powerhousedao/design-system/connect/toast";
|
|
5
5
|
//#region src/services/toast.ts
|
|
6
6
|
const CONNECT_TOAST_CONTAINER_ID = "connect";
|
|
7
7
|
const ToastContainer$1 = (props = {}) => createElement(ToastContainer, {
|
|
@@ -16,8 +16,11 @@ function toast$1(content, options) {
|
|
|
16
16
|
...restOptions
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
|
+
function dismissToast(toastId) {
|
|
20
|
+
return dismiss(toastId);
|
|
21
|
+
}
|
|
19
22
|
//#endregion
|
|
20
|
-
export { toast$1 as
|
|
23
|
+
export { dismissToast as n, toast$1 as r, ToastContainer$1 as t };
|
|
21
24
|
|
|
22
|
-
//# sourceMappingURL=toast-
|
|
23
|
-
//# debugId=
|
|
25
|
+
//# sourceMappingURL=toast-CO6ChlzE.js.map
|
|
26
|
+
//# debugId=d22e5acd-014d-560f-a589-64e7fe7b7685
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast-CO6ChlzE.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":"d22e5acd-014d-560f-a589-64e7fe7b7685"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect",
|
|
3
3
|
"productName": "Powerhouse-Connect",
|
|
4
|
-
"version": "6.2.2-dev.
|
|
4
|
+
"version": "6.2.2-dev.43",
|
|
5
5
|
"description": "Powerhouse Connect",
|
|
6
6
|
"main": "dist/index.html",
|
|
7
7
|
"type": "module",
|
|
@@ -74,16 +74,16 @@
|
|
|
74
74
|
"usehooks-ts": "^3.1.1",
|
|
75
75
|
"wagmi": "2.19.5",
|
|
76
76
|
"zod": "4.3.6",
|
|
77
|
-
"@powerhousedao/config": "6.2.2-dev.
|
|
78
|
-
"@powerhousedao/
|
|
79
|
-
"@powerhousedao/
|
|
80
|
-
"@powerhousedao/reactor-
|
|
81
|
-
"@powerhousedao/
|
|
82
|
-
"@
|
|
83
|
-
"@
|
|
84
|
-
"
|
|
85
|
-
"@powerhousedao/vetra": "6.2.2-dev.
|
|
86
|
-
"
|
|
77
|
+
"@powerhousedao/config": "6.2.2-dev.43",
|
|
78
|
+
"@powerhousedao/reactor": "6.2.2-dev.43",
|
|
79
|
+
"@powerhousedao/reactor-attachments": "6.2.2-dev.43",
|
|
80
|
+
"@powerhousedao/reactor-browser": "6.2.2-dev.43",
|
|
81
|
+
"@powerhousedao/shared": "6.2.2-dev.43",
|
|
82
|
+
"@powerhousedao/vetra": "6.2.2-dev.43",
|
|
83
|
+
"@renown/sdk": "6.2.2-dev.43",
|
|
84
|
+
"document-model": "6.2.2-dev.43",
|
|
85
|
+
"@powerhousedao/powerhouse-vetra-packages": "6.2.2-dev.43",
|
|
86
|
+
"@powerhousedao/design-system": "6.2.2-dev.43"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
89
|
"@tailwindcss/cli": "4.2.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CreateDocumentModal-u-IaJUQ0.js","sources":["../src/components/modal/modals/CreateDocumentModal.tsx"],"sourcesContent":["import { CreateDocumentModal as ConnectCreateDocumentModal } from \"@powerhousedao/design-system/connect\";\nimport {\n addDocument,\n closePHModal,\n setSelectedNode,\n useDocumentModelModuleById,\n useParentFolderForSelectedNode,\n usePHModal,\n useSelectedDriveSafe,\n useSelectedFolder,\n} from \"@powerhousedao/reactor-browser\";\n\nexport const CreateDocumentModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"createDocument\";\n const documentType = open ? phModal.documentType : undefined;\n const documentModel = useDocumentModelModuleById(documentType);\n const [selectedDrive] = useSelectedDriveSafe();\n const selectedFolder = useSelectedFolder();\n const parentFolder = useParentFolderForSelectedNode();\n\n const onCreateDocument = async (documentName: string) => {\n closePHModal();\n if (!selectedDrive || !documentModel) return;\n\n const node = await addDocument(\n selectedDrive.header.id,\n documentName || `New ${documentModel.documentModel.global.name}`,\n documentModel.documentModel.global.id,\n selectedFolder?.id ?? parentFolder?.id,\n );\n setSelectedNode(node);\n };\n\n return (\n <ConnectCreateDocumentModal\n open={open}\n onContinue={(documentName) => {\n void onCreateDocument(documentName);\n }}\n onOpenChange={(status: boolean) => {\n if (!status) return closePHModal();\n }}\n />\n );\n};\n"],"names":["ConnectCreateDocumentModal"],"mappings":";;;;;;AAYA,MAAa,4BAAsC;CACjD,MAAM,UAAU,YAAY;CAC5B,MAAM,OAAO,SAAS,SAAS;CAE/B,MAAM,gBAAgB,2BADD,OAAO,QAAQ,eAAe,KAAA,EACW;CAC9D,MAAM,CAAC,iBAAiB,sBAAsB;CAC9C,MAAM,iBAAiB,mBAAmB;CAC1C,MAAM,eAAe,gCAAgC;CAErD,MAAM,mBAAmB,OAAO,iBAAyB;AACvD,gBAAc;AACd,MAAI,CAAC,iBAAiB,CAAC,cAAe;AAQtC,kBANa,MAAM,YACjB,cAAc,OAAO,IACrB,gBAAgB,OAAO,cAAc,cAAc,OAAO,QAC1D,cAAc,cAAc,OAAO,IACnC,gBAAgB,MAAM,cAAc,GACrC,CACoB;;AAGvB,QACE,oBAACA,uBAAD;EACQ;EACN,aAAa,iBAAiB;AACvB,oBAAiB,aAAa;;EAErC,eAAe,WAAoB;AACjC,OAAI,CAAC,OAAQ,QAAO,cAAc;;EAEpC,CAAA","debug_id":"e7cffccb-70d7-5ccb-b9f5-bfbcee9de9f4"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OpenFileDocumentsModal-CTUoSm2y.js","sources":["../src/utils/open-file-plan.ts","../src/components/modal/modals/OpenFileDocumentsModal.tsx"],"sourcesContent":["import { isDocumentTypeSupported } from \"@powerhousedao/reactor-browser\";\nimport type { Node } from \"@powerhousedao/shared/document-drive\";\nimport {\n getNextCopyNumber,\n isFileNode,\n} from \"@powerhousedao/shared/document-drive\";\n\n// Pure pre-flight planning for the open-file picker: given the pending files,\n// their parse results and the selected drive's nodes, decide per file whether\n// it can be imported, whether it collides with an existing document, and what\n// name it should be stored under. No reactor access — everything here derives\n// synchronously so the picker can recompute on every drive switch.\n\n/** What the one-time parse of a pending file yielded. */\nexport type ParsedFileInfo =\n | { state: \"parsed\"; id: string; documentType: string; headerName: string }\n // The document model isn't installed: the import path's package\n // auto-discovery may still resolve it, so the file stays importable —\n // but its header is unknown, so no duplicate check is possible.\n | { state: \"model-missing\" }\n // Corrupt zip / not a Powerhouse document.\n | { state: \"invalid\" };\n\nexport type PlannedRow =\n | { kind: \"checking\" }\n | { kind: \"invalid\" }\n | { kind: \"unsupported\" }\n | {\n kind: \"ready\";\n finalName: string;\n duplicate?: \"id\" | \"name\";\n renamed: boolean;\n };\n\nexport type PlanEntry = {\n /** Stable identity of the pending file (see pendingFileKey). */\n key: string;\n file: File;\n /** undefined while the parse is still in flight. */\n parsed: ParsedFileInfo | undefined;\n};\n\n/** Same name normalization the import stores (use-on-drop-file convention). */\nexport function storedFileName(file: File): string {\n return file.name.replace(/\\..+/gim, \"\");\n}\n\n/**\n * Duplicate semantics mirror the import path's isDocumentInLocation, scoped\n * to the drive ROOT: an id match, or a file node with the same name AND the\n * same document type. Renames follow the drive-tree copy convention\n * (\"name (copy) N\" via getNextCopyNumber). Names assigned within the batch\n * accumulate into the collision set, so two pending files that would store\n * the same name never end up identical either.\n */\nexport function planOpenFileImports(args: {\n entries: PlanEntry[];\n nodes: Node[];\n documentTypes: string[] | undefined;\n}): Map<string, PlannedRow> {\n const { entries, nodes, documentTypes } = args;\n const rootNodes = nodes.filter(\n (node) => (node.parentFolder ?? null) === null,\n );\n const rows = new Map<string, PlannedRow>();\n const assignedNames = new Set<string>();\n\n function uniqueName(base: string, driveNames: string[]): string {\n const collides = driveNames.includes(base) || assignedNames.has(base);\n if (!collides) return base;\n const candidates = [...driveNames, ...assignedNames];\n return `${base} (copy) ${getNextCopyNumber(candidates, base)}`;\n }\n\n for (const { key, file, parsed } of entries) {\n if (!parsed) {\n rows.set(key, { kind: \"checking\" });\n continue;\n }\n if (parsed.state === \"invalid\") {\n rows.set(key, { kind: \"invalid\" });\n continue;\n }\n\n if (parsed.state === \"model-missing\") {\n const base = storedFileName(file) || file.name;\n const finalName = uniqueName(base, []);\n assignedNames.add(finalName);\n rows.set(key, {\n kind: \"ready\",\n finalName,\n renamed: finalName !== base,\n });\n continue;\n }\n\n if (!isDocumentTypeSupported(parsed.documentType, documentTypes)) {\n rows.set(key, { kind: \"unsupported\" });\n continue;\n }\n\n // The stored name falls back to the document's own header name when the\n // file name is extension-only (\".phd\" normalizes to \"\").\n const base = storedFileName(file) || parsed.headerName;\n const sameTypeNames = rootNodes\n .filter(\n (node) => isFileNode(node) && node.documentType === parsed.documentType,\n )\n .map((node) => node.name);\n const idDuplicate = rootNodes.some((node) => node.id === parsed.id);\n const nameDuplicate = sameTypeNames.includes(base);\n\n const finalName = uniqueName(base, sameTypeNames);\n assignedNames.add(finalName);\n rows.set(key, {\n kind: \"ready\",\n finalName,\n duplicate: nameDuplicate ? \"name\" : idDuplicate ? \"id\" : undefined,\n renamed: finalName !== base,\n });\n }\n\n return rows;\n}\n","import { DriveIcon } from \"@powerhousedao/connect/components\";\nimport {\n clearPendingImportFiles,\n getPendingImportFiles,\n pendingFileKey,\n planOpenFileImports,\n runOpenFileImports,\n subscribePendingImportFiles,\n type ParsedFileInfo,\n type PlanEntry,\n type PlannedOpenFileImport,\n} from \"@powerhousedao/connect/utils\";\nimport { Modal } from \"@powerhousedao/design-system\";\nimport {\n Combobox,\n formatFileSize,\n ModalButton,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n DocumentModelNotFoundError,\n loadFile,\n setSelectedDrive,\n showPHModal,\n useDocumentTypes,\n useDrives,\n usePHModal,\n useUserPermissions,\n} from \"@powerhousedao/reactor-browser\";\nimport { useEffect, useState, useSyncExternalStore } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\n// Drive picker for documents opened through the OS file association (PWA\n// File Handling). This is the flow's ONLY dialog state: validity and\n// duplicate checks run up-front against the selected drive (inline errors,\n// automatic \"(copy) N\" renames surfaced as \"Rename and import\"), and on\n// confirmation the dialog closes — progress is shown by the floating upload\n// panel (OpenFileUploadList) driven from utils/open-file-uploads.ts, the same\n// UI drag-and-drop uses.\n//\n// The component only mounts while the modal is shown (ModalsContainer keys on\n// the modal type), so picker state starts fresh on every open.\n\n// Parse results are cached at module level so they survive the create-drive\n// detour (which unmounts this component) and are computed once per pending\n// file — loadFile replays the file's full operation history. Only header\n// fields are retained, never the parsed document. In-flight promises are\n// cached too, deduplicating StrictMode double-effects.\nconst parseCache = new Map<string, ParsedFileInfo | Promise<ParsedFileInfo>>();\n\nasync function parsePendingFile(file: File): Promise<ParsedFileInfo> {\n try {\n const document = await loadFile(file);\n return {\n state: \"parsed\",\n id: document.header.id,\n documentType: document.header.documentType,\n headerName: document.header.name,\n };\n } catch (error) {\n // Missing document model ≠ invalid: the import path's package\n // auto-discovery may still resolve it.\n if (DocumentModelNotFoundError.isError(error)) {\n return { state: \"model-missing\" };\n }\n return { state: \"invalid\" };\n }\n}\n\nexport function OpenFileDocumentsModal() {\n const phModal = usePHModal();\n const open = phModal?.type === \"openFileDocuments\";\n const { t } = useTranslation();\n const drives = useDrives();\n const documentTypes = useDocumentTypes();\n const { isAllowedToCreateDocuments } = useUserPermissions();\n const pendingFiles = useSyncExternalStore(\n subscribePendingImportFiles,\n getPendingImportFiles,\n );\n\n const [pickedDriveId, setPickedDriveId] = useState<string>();\n const [, setParseVersion] = useState(0);\n\n // Kick off (and cache) the one-time parse of each pending file. Gated on\n // the reactor being ready — never cache \"reactor not initialized\" as a\n // parse result; the effect re-runs when files change and drives arriving\n // re-render the modal anyway.\n useEffect(() => {\n if (!window.ph?.reactorClient) return;\n let cancelled = false;\n const pendingKeys = new Set(pendingFiles.map(pendingFileKey));\n for (const key of parseCache.keys()) {\n if (!pendingKeys.has(key)) parseCache.delete(key);\n }\n for (const file of pendingFiles) {\n const key = pendingFileKey(file);\n if (parseCache.has(key)) continue;\n const promise = parsePendingFile(file).then((info) => {\n parseCache.set(key, info);\n return info;\n });\n parseCache.set(key, promise);\n void promise.then(() => {\n if (!cancelled) setParseVersion((version) => version + 1);\n });\n }\n return () => {\n cancelled = true;\n };\n }, [pendingFiles]);\n\n // The first drive is preselected so opening a file is a single\n // confirmation; the select lets the user switch destination.\n const selectedDriveId = pickedDriveId ?? drives?.[0]?.header.id;\n const selectedDrive = drives?.find(\n (drive) => drive.header.id === selectedDriveId,\n );\n\n const driveOptions = (drives ?? []).map((drive) => ({\n // New local drives carry their name only in the global state until the\n // header syncs.\n label: drive.header.name || drive.state.global.name,\n value: drive.header.id,\n drive,\n }));\n type DriveOption = (typeof driveOptions)[number];\n\n // Pure derivations — recomputed on drive switch, on files arriving, and on\n // parses settling.\n const entries: PlanEntry[] = pendingFiles.map((file) => {\n const cached = parseCache.get(pendingFileKey(file));\n return {\n key: pendingFileKey(file),\n file,\n parsed: cached instanceof Promise ? undefined : cached,\n };\n });\n const plan = selectedDrive\n ? planOpenFileImports({\n entries,\n nodes: selectedDrive.state.global.nodes,\n documentTypes,\n })\n : new Map<string, never>();\n\n const planRows = [...plan.values()];\n const readyCount = planRows.filter((row) => row.kind === \"ready\").length;\n const anyChecking = planRows.some((row) => row.kind === \"checking\");\n const anyRenamed = planRows.some(\n (row) => row.kind === \"ready\" && row.renamed,\n );\n\n function onImport() {\n const drive = selectedDrive;\n if (!drive) return;\n const imports: PlannedOpenFileImport[] = [];\n for (const { key, file } of entries) {\n const row = plan.get(key);\n if (row?.kind === \"ready\") imports.push({ file, name: row.finalName });\n }\n if (imports.length === 0) return;\n // Ordering matters: the pending store must be cleared BEFORE the modal\n // closes — the launch-queue listener reopens this picker whenever the\n // modal clears while files are still pending.\n clearPendingImportFiles();\n closePHModal();\n setSelectedDrive(drive);\n void runOpenFileImports({\n driveId: drive.header.id,\n imports,\n documentTypes,\n });\n }\n\n function onCancel() {\n clearPendingImportFiles();\n closePHModal();\n }\n\n if (!open) return null;\n\n const hasDrives = (drives?.length ?? 0) > 0;\n\n function rowAnnotation(key: string) {\n const row = plan.get(key);\n if (!row) return null;\n switch (row.kind) {\n case \"checking\":\n return (\n <span className=\"text-xs text-muted-foreground\">\n {t(\"modals.openFileDocuments.checking\")}\n </span>\n );\n case \"invalid\":\n return (\n <span className=\"text-xs text-destructive\">\n {t(\"modals.openFileDocuments.invalidFile\")}\n </span>\n );\n case \"unsupported\":\n return (\n <span className=\"text-xs text-destructive\">\n {t(\"modals.openFileDocuments.unsupportedType\")}\n </span>\n );\n case \"ready\":\n // \"name\": same name + type already in the drive, so the file is\n // renamed to a copy. \"id\": same document id, imported as a fresh copy\n // under its original name. A row that only got renamed to avoid\n // clashing with another file in THIS batch is NOT in the drive, so it\n // must not claim to be — it gets the neutral rename hint instead.\n if (row.duplicate === \"name\") {\n return (\n <span className=\"text-xs text-muted-foreground\">\n {t(\"modals.openFileDocuments.duplicateHint\", {\n name: row.finalName,\n })}\n </span>\n );\n }\n if (row.duplicate === \"id\") {\n return (\n <span className=\"text-xs text-muted-foreground\">\n {t(\"modals.openFileDocuments.duplicateCopyHint\")}\n </span>\n );\n }\n if (row.renamed) {\n return (\n <span className=\"text-xs text-muted-foreground\">\n {t(\"modals.openFileDocuments.renamedHint\", {\n name: row.finalName,\n })}\n </span>\n );\n }\n return null;\n }\n }\n\n return (\n <Modal\n open={open}\n onOpenChange={(status) => {\n if (!status) onCancel();\n }}\n // The drive select's dropdown must be able to spill past the dialog\n // bounds instead of being clipped (the menu cannot portal to <body>:\n // Radix's modal pointer-events lock would make it unclickable there).\n contentProps={{ className: \"overflow-visible\" }}\n >\n <div className=\"w-[520px] p-6\">\n <div className=\"pb-2 text-2xl font-bold text-foreground\">\n {t(\"modals.openFileDocuments.title\", {\n count: pendingFiles.length,\n })}\n </div>\n\n {!isAllowedToCreateDocuments ? (\n <>\n <div className=\"my-6 rounded-md bg-background p-4 text-center text-foreground\">\n {t(\"modals.openFileDocuments.notAllowed\")}\n </div>\n <div className=\"mt-8 flex\">\n <ModalButton variant=\"cancel\" onClick={onCancel}>\n {t(\"common.cancel\")}\n </ModalButton>\n </div>\n </>\n ) : (\n <>\n <div className=\"my-4 flex flex-col gap-1 text-sm text-foreground\">\n {pendingFiles.map((file, index) => {\n const key = pendingFileKey(file);\n const annotation = rowAnnotation(key);\n return (\n <div\n key={`${index}-${key}`}\n className=\"flex flex-col gap-0.5 rounded-md bg-background px-3 py-2\"\n >\n <div className=\"flex justify-between gap-2\">\n <span className=\"truncate\">{file.name}</span>\n <span className=\"shrink-0 text-muted-foreground\">\n {formatFileSize(file.size)}\n </span>\n </div>\n {annotation}\n </div>\n );\n })}\n </div>\n\n {hasDrives ? (\n <>\n <div className=\"mb-2 text-sm text-muted-foreground\">\n {t(\"modals.openFileDocuments.body\")}\n </div>\n <Combobox\n id=\"open-file-documents-drive\"\n isSearchable={false}\n options={driveOptions}\n value={\n driveOptions.find(\n (option) => option.value === selectedDriveId,\n ) ?? null\n }\n onChange={(option) =>\n setPickedDriveId((option as DriveOption).value)\n }\n formatOptionLabel={(option) => {\n const { label, drive } = option as DriveOption;\n return (\n <span className=\"flex items-center gap-2\">\n <DriveIcon drive={drive} />\n <span className=\"truncate\">{label}</span>\n </span>\n );\n }}\n maxMenuHeight={200}\n />\n </>\n ) : (\n <div className=\"my-6 rounded-md bg-background p-4 text-center text-foreground\">\n {t(\"modals.openFileDocuments.noDrives\")}\n </div>\n )}\n\n <div className=\"mt-8 flex justify-between gap-3\">\n <ModalButton variant=\"cancel\" onClick={onCancel}>\n {t(\"common.cancel\")}\n </ModalButton>\n {hasDrives ? (\n <ModalButton\n variant=\"confirm\"\n disabled={!selectedDriveId || readyCount === 0 || anyChecking}\n onClick={onImport}\n >\n {anyRenamed\n ? t(\"modals.openFileDocuments.renameAndImport\")\n : t(\"modals.openFileDocuments.import\")}\n </ModalButton>\n ) : (\n <ModalButton\n variant=\"confirm\"\n onClick={() => showPHModal({ type: \"addDrive\" })}\n >\n {t(\"modals.openFileDocuments.createDrive\")}\n </ModalButton>\n )}\n </div>\n </>\n )}\n </div>\n </Modal>\n );\n}\n"],"names":[],"mappings":"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","debug_id":"a03dbaea-645c-5880-995a-73e76dca8446"}
|