@powerhousedao/connect 6.0.0-dev.25 → 6.0.0-dev.251
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/.env +1 -1
- package/dist/AddDriveModal-ZK9-BWMB.js +92 -0
- package/dist/AddDriveModal-ZK9-BWMB.js.map +1 -0
- package/dist/ClearStorageModal-Bfb3ube7.js +47 -0
- package/dist/ClearStorageModal-Bfb3ube7.js.map +1 -0
- package/dist/CookiesPolicyModal-DiXQV82b.js +33 -0
- package/dist/CookiesPolicyModal-DiXQV82b.js.map +1 -0
- package/dist/CreateDocumentModal-BhJh4nWt.js +31 -0
- package/dist/CreateDocumentModal-BhJh4nWt.js.map +1 -0
- package/dist/DebugSettingsModal-BvOhyXeo.js +172 -0
- package/dist/DebugSettingsModal-BvOhyXeo.js.map +1 -0
- package/dist/DeleteDriveModal-CbuIdjKY.js +43 -0
- package/dist/DeleteDriveModal-CbuIdjKY.js.map +1 -0
- package/dist/DeleteItemModal-9ErYlauT.js +42 -0
- package/dist/DeleteItemModal-9ErYlauT.js.map +1 -0
- package/dist/DisclaimerModal-CfDeiBz8.js +24 -0
- package/dist/DisclaimerModal-CfDeiBz8.js.map +1 -0
- package/dist/DownloadDocumentWithErrorsModal-KZGWQ4J7.js +44 -0
- package/dist/DownloadDocumentWithErrorsModal-KZGWQ4J7.js.map +1 -0
- package/dist/DriveSettingsModal-DEk05PS7.js +51 -0
- package/dist/DriveSettingsModal-DEk05PS7.js.map +1 -0
- package/dist/InspectorModal-DV7lUbNo.js +375 -0
- package/dist/InspectorModal-DV7lUbNo.js.map +1 -0
- package/dist/MissingPackageModal-B2EAV_VJ.js +37 -0
- package/dist/MissingPackageModal-B2EAV_VJ.js.map +1 -0
- package/dist/SettingsModal-2xX1Pgo0.js +297 -0
- package/dist/SettingsModal-2xX1Pgo0.js.map +1 -0
- package/dist/UpgradeDriveModal-BwI5E5k3.js +34 -0
- package/dist/UpgradeDriveModal-BwI5E5k3.js.map +1 -0
- package/dist/build-info-D-A4ZnXu.js +15 -0
- package/dist/build-info-D-A4ZnXu.js.map +1 -0
- package/dist/connect.config-Cuh0hj_Q.js +142 -0
- package/dist/connect.config-Cuh0hj_Q.js.map +1 -0
- package/dist/i18n-4rfcgnb9.js +128 -0
- package/dist/i18n-4rfcgnb9.js.map +1 -0
- package/dist/load-BVA6Yfno.js +112 -0
- package/dist/load-BVA6Yfno.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +12 -0
- package/dist/main.js.map +1 -0
- package/dist/package-CvMftS15.js +117 -0
- package/dist/package-CvMftS15.js.map +1 -0
- package/dist/packages.config-CiH8KJVN.js +32 -0
- package/dist/packages.config-CiH8KJVN.js.map +1 -0
- package/dist/pglite-runtime-Btp8ZXVH.js +135 -0
- package/dist/pglite-runtime-Btp8ZXVH.js.map +1 -0
- package/dist/pglite-seed-b1mJUaip.js +49 -0
- package/dist/pglite-seed-b1mJUaip.js.map +1 -0
- package/dist/pglite.worker.d.ts +1 -0
- package/dist/pglite.worker.js +18 -0
- package/dist/pglite.worker.js.map +1 -0
- package/dist/pglite.worker.legacy.d.ts +1 -0
- package/dist/pglite.worker.legacy.js +18 -0
- package/dist/pglite.worker.legacy.js.map +1 -0
- package/dist/reactor-DFuRedvV.js +913 -0
- package/dist/reactor-DFuRedvV.js.map +1 -0
- package/dist/registerServiceWorker-CMRF2LWE.js +79 -0
- package/dist/registerServiceWorker-CMRF2LWE.js.map +1 -0
- package/dist/sidebar-BXOORGUU.js +1473 -0
- package/dist/sidebar-BXOORGUU.js.map +1 -0
- package/dist/start-connect.d.ts +21 -0
- package/dist/start-connect.d.ts.map +1 -0
- package/dist/start-connect.js +19 -0
- package/dist/start-connect.js.map +1 -0
- package/{lib → dist}/style.css +2676 -665
- package/dist/toast-DnODOv28.js +23 -0
- package/dist/toast-DnODOv28.js.map +1 -0
- package/dist/useRegistryPackages-DK8swjWd.js +129 -0
- package/dist/useRegistryPackages-DK8swjWd.js.map +1 -0
- package/package.json +57 -121
- package/public/ph-packages.json +4 -0
- package/dist/assets/AddDriveModal-C7Z2sZK_.js +0 -1
- package/dist/assets/ClearStorageModal-DbOzc3ZU.js +0 -1
- package/dist/assets/CookiesPolicyModal-C_XO21OO.js +0 -1
- package/dist/assets/CreateDocumentModal-x_taiRz3.js +0 -1
- package/dist/assets/DebugSettingsModal-BJcOlsTZ.js +0 -1
- package/dist/assets/DeleteDriveModal-DeH9VQY9.js +0 -1
- package/dist/assets/DeleteItemModal-D7Qu84-q.js +0 -1
- package/dist/assets/DisclaimerModal-BQIg2v2R.js +0 -1
- package/dist/assets/DriveSettingsModal-bqGDyMI3.js +0 -1
- package/dist/assets/ExportDocumentWithErrorsModal-R7DEHij0.js +0 -1
- package/dist/assets/SettingsModal-DdG8aeDJ.js +0 -1
- package/dist/assets/UpgradeDriveModal-B-hBwR2i.js +0 -1
- package/dist/assets/_virtual_ph_external-packages-CM1tCR4L.js +0 -1
- package/dist/assets/config-CU-aFfVJ.js +0 -1
- package/dist/assets/connect-loader-CvOC68Ih.mp4 +0 -0
- package/dist/assets/design_system-BcEdk8na.js +0 -45
- package/dist/assets/design_system_connect-DP1bez4c.js +0 -47
- package/dist/assets/design_system_ui-BfiQDMDm.js +0 -1
- package/dist/assets/document_drive-CRnZJpoY.js +0 -316
- package/dist/assets/document_engineering-CzgOYc4D.js +0 -1
- package/dist/assets/document_model-Cvww2VA-.js +0 -230
- package/dist/assets/document_model_editor-DM4sUsBJ.js +0 -25
- package/dist/assets/drive_explorer-CT-nxWx1.js +0 -2
- package/dist/assets/graphql-AKTCpY7l.js +0 -75
- package/dist/assets/graphql-editor-DlrXC8fb.js +0 -73
- package/dist/assets/graphql_request-BJtmW2JS.js +0 -3
- package/dist/assets/hmr-LMNkvzP7.js +0 -1
- package/dist/assets/home-bg-BEhF9NuW.png +0 -0
- package/dist/assets/home-bg-BRYzhkhi.avif +0 -0
- package/dist/assets/hooks-CvLv823j.js +0 -12
- package/dist/assets/index-BQ4PI8SD.js +0 -18
- package/dist/assets/index-DAT-H4WM.js +0 -28
- package/dist/assets/index-Df9NBjHI.css +0 -1
- package/dist/assets/json-editor-CvAYdg64.js +0 -1
- package/dist/assets/nodefs-BCDFwcl8.js +0 -1
- package/dist/assets/opfs-ahp-P6iX3dK-.js +0 -3
- package/dist/assets/pg_dump-CW0pN9tG.wasm +0 -0
- package/dist/assets/postgres-CkP7QCDB.data +0 -0
- package/dist/assets/postgres-CyuUVpXN.wasm +0 -0
- package/dist/assets/powerhouse-rounded-CeKGGUG4.png +0 -0
- package/dist/assets/react/jsx-runtime-DldvXD6N.js +0 -1
- package/dist/assets/react-DQSxOgtG.js +0 -1
- package/dist/assets/react-dom/client-BVPiT_FE.js +0 -9
- package/dist/assets/react-dom-D6zQJsh6.js +0 -1
- package/dist/assets/reactor_browser-B5Ef2pxf.js +0 -129
- package/dist/assets/renown-short-hover-BiSLBV7L.png +0 -0
- package/dist/assets/rwa-report-Bb0W5-ac.png +0 -0
- package/dist/assets/sentry_browser-B4YoBIIG.js +0 -498
- package/dist/assets/sentry_react-cODD7zWc.js +0 -3
- package/dist/assets/state-schemas-DKbRkRW0.js +0 -2
- package/dist/assets/tailwind_merge-Dr4f9Rms.js +0 -1
- package/dist/assets/zod-9j67vCAu.js +0 -39
- package/dist/icon.ico +0 -0
- package/dist/index.html +0 -51
- package/dist/robots.txt +0 -3
- package/dist/settings.png +0 -0
- package/heroku/Dockerfile +0 -101
- package/heroku/Procfile +0 -1
- package/heroku/config/nginx.conf.template +0 -77
- package/heroku/heroku-entrypoint.sh +0 -38
- package/lib/cypress/e2e/navigation.cy.d.ts +0 -2
- package/lib/cypress/e2e/navigation.cy.d.ts.map +0 -1
- package/lib/cypress/e2e/navigation.cy.js +0 -221
- package/lib/cypress/e2e/navigation.cy.js.map +0 -1
- package/lib/cypress/e2e/utils/index.d.ts +0 -15
- package/lib/cypress/e2e/utils/index.d.ts.map +0 -1
- package/lib/cypress/e2e/utils/index.js +0 -121
- package/lib/cypress/e2e/utils/index.js.map +0 -1
- package/lib/cypress/support/commands.d.ts +0 -2
- package/lib/cypress/support/commands.d.ts.map +0 -1
- package/lib/cypress/support/commands.js +0 -29
- package/lib/cypress/support/commands.js.map +0 -1
- package/lib/cypress/support/e2e.d.ts +0 -2
- package/lib/cypress/support/e2e.d.ts.map +0 -1
- package/lib/cypress/support/e2e.js +0 -19
- package/lib/cypress/support/e2e.js.map +0 -1
- package/lib/cypress.config.d.ts +0 -3
- package/lib/cypress.config.d.ts.map +0 -1
- package/lib/cypress.config.js +0 -15
- package/lib/cypress.config.js.map +0 -1
- package/lib/package.copy.json +0 -177
- package/lib/scripts/render-skeleton.d.ts +0 -2
- package/lib/scripts/render-skeleton.d.ts.map +0 -1
- package/lib/scripts/render-skeleton.js +0 -11
- package/lib/scripts/render-skeleton.js.map +0 -1
- package/lib/src/components/analytics.d.ts +0 -8
- package/lib/src/components/analytics.d.ts.map +0 -1
- package/lib/src/components/analytics.js +0 -30
- package/lib/src/components/analytics.js.map +0 -1
- package/lib/src/components/app-loader.d.ts +0 -3
- package/lib/src/components/app-loader.d.ts.map +0 -1
- package/lib/src/components/app-loader.js +0 -20
- package/lib/src/components/app-loader.js.map +0 -1
- package/lib/src/components/app-skeleton.d.ts +0 -3
- package/lib/src/components/app-skeleton.d.ts.map +0 -1
- package/lib/src/components/app-skeleton.js +0 -38
- package/lib/src/components/app-skeleton.js.map +0 -1
- package/lib/src/components/app.d.ts +0 -2
- package/lib/src/components/app.d.ts.map +0 -1
- package/lib/src/components/app.js +0 -29
- package/lib/src/components/app.js.map +0 -1
- package/lib/src/components/button.d.ts +0 -3
- package/lib/src/components/button.d.ts.map +0 -1
- package/lib/src/components/button.js +0 -7
- package/lib/src/components/button.js.map +0 -1
- package/lib/src/components/cookie-banner.d.ts +0 -2
- package/lib/src/components/cookie-banner.d.ts.map +0 -1
- package/lib/src/components/cookie-banner.js +0 -48
- package/lib/src/components/cookie-banner.js.map +0 -1
- package/lib/src/components/document-editor-container.d.ts +0 -2
- package/lib/src/components/document-editor-container.d.ts.map +0 -1
- package/lib/src/components/document-editor-container.js +0 -65
- package/lib/src/components/document-editor-container.js.map +0 -1
- package/lib/src/components/dots-loader.d.ts +0 -2
- package/lib/src/components/dots-loader.d.ts.map +0 -1
- package/lib/src/components/dots-loader.js +0 -15
- package/lib/src/components/dots-loader.js.map +0 -1
- package/lib/src/components/drive-editor-container.d.ts +0 -2
- package/lib/src/components/drive-editor-container.d.ts.map +0 -1
- package/lib/src/components/drive-editor-container.js +0 -22
- package/lib/src/components/drive-editor-container.js.map +0 -1
- package/lib/src/components/drive-icon.d.ts +0 -5
- package/lib/src/components/drive-icon.d.ts.map +0 -1
- package/lib/src/components/drive-icon.js +0 -15
- package/lib/src/components/drive-icon.js.map +0 -1
- package/lib/src/components/editor-loader.d.ts +0 -9
- package/lib/src/components/editor-loader.d.ts.map +0 -1
- package/lib/src/components/editor-loader.js +0 -19
- package/lib/src/components/editor-loader.js.map +0 -1
- package/lib/src/components/editors.d.ts +0 -10
- package/lib/src/components/editors.d.ts.map +0 -1
- package/lib/src/components/editors.js +0 -89
- package/lib/src/components/editors.js.map +0 -1
- package/lib/src/components/error-boundary.d.ts +0 -103
- package/lib/src/components/error-boundary.d.ts.map +0 -1
- package/lib/src/components/error-boundary.js +0 -104
- package/lib/src/components/error-boundary.js.map +0 -1
- package/lib/src/components/footer.d.ts +0 -2
- package/lib/src/components/footer.d.ts.map +0 -1
- package/lib/src/components/footer.js +0 -16
- package/lib/src/components/footer.js.map +0 -1
- package/lib/src/components/index.d.ts +0 -22
- package/lib/src/components/index.d.ts.map +0 -1
- package/lib/src/components/index.js +0 -22
- package/lib/src/components/index.js.map +0 -1
- package/lib/src/components/login.d.ts +0 -2
- package/lib/src/components/login.d.ts.map +0 -1
- package/lib/src/components/login.js +0 -12
- package/lib/src/components/login.js.map +0 -1
- package/lib/src/components/modal/index.d.ts +0 -18
- package/lib/src/components/modal/index.d.ts.map +0 -1
- package/lib/src/components/modal/index.js +0 -18
- package/lib/src/components/modal/index.js.map +0 -1
- package/lib/src/components/modal/modals/AddDriveModal.d.ts +0 -2
- package/lib/src/components/modal/modals/AddDriveModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/AddDriveModal.js +0 -121
- package/lib/src/components/modal/modals/AddDriveModal.js.map +0 -1
- package/lib/src/components/modal/modals/ClearStorageModal.d.ts +0 -2
- package/lib/src/components/modal/modals/ClearStorageModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/ClearStorageModal.js +0 -35
- package/lib/src/components/modal/modals/ClearStorageModal.js.map +0 -1
- package/lib/src/components/modal/modals/CookiesPolicyModal.d.ts +0 -2
- package/lib/src/components/modal/modals/CookiesPolicyModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/CookiesPolicyModal.js +0 -16
- package/lib/src/components/modal/modals/CookiesPolicyModal.js.map +0 -1
- package/lib/src/components/modal/modals/CreateDocumentModal.d.ts +0 -2
- package/lib/src/components/modal/modals/CreateDocumentModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/CreateDocumentModal.js +0 -24
- package/lib/src/components/modal/modals/CreateDocumentModal.js.map +0 -1
- package/lib/src/components/modal/modals/DebugSettingsModal.d.ts +0 -2
- package/lib/src/components/modal/modals/DebugSettingsModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/DebugSettingsModal.js +0 -108
- package/lib/src/components/modal/modals/DebugSettingsModal.js.map +0 -1
- package/lib/src/components/modal/modals/DeleteDriveModal.d.ts +0 -2
- package/lib/src/components/modal/modals/DeleteDriveModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/DeleteDriveModal.js +0 -32
- package/lib/src/components/modal/modals/DeleteDriveModal.js.map +0 -1
- package/lib/src/components/modal/modals/DeleteItemModal.d.ts +0 -3
- package/lib/src/components/modal/modals/DeleteItemModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/DeleteItemModal.js +0 -33
- package/lib/src/components/modal/modals/DeleteItemModal.js.map +0 -1
- package/lib/src/components/modal/modals/DisclaimerModal.d.ts +0 -3
- package/lib/src/components/modal/modals/DisclaimerModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/DisclaimerModal.js +0 -12
- package/lib/src/components/modal/modals/DisclaimerModal.js.map +0 -1
- package/lib/src/components/modal/modals/DriveSettingsModal.d.ts +0 -2
- package/lib/src/components/modal/modals/DriveSettingsModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/DriveSettingsModal.js +0 -28
- package/lib/src/components/modal/modals/DriveSettingsModal.js.map +0 -1
- package/lib/src/components/modal/modals/ExportDocumentWithErrorsModal.d.ts +0 -2
- package/lib/src/components/modal/modals/ExportDocumentWithErrorsModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/ExportDocumentWithErrorsModal.js +0 -30
- package/lib/src/components/modal/modals/ExportDocumentWithErrorsModal.js.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/InspectorModal.d.ts +0 -2
- package/lib/src/components/modal/modals/InspectorModal/InspectorModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/InspectorModal.js +0 -29
- package/lib/src/components/modal/modals/InspectorModal/InspectorModal.js.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/index.d.ts +0 -2
- package/lib/src/components/modal/modals/InspectorModal/index.d.ts.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/index.js +0 -2
- package/lib/src/components/modal/modals/InspectorModal/index.js.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/useDbExplorer.d.ts +0 -31
- package/lib/src/components/modal/modals/InspectorModal/useDbExplorer.d.ts.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/useDbExplorer.js +0 -211
- package/lib/src/components/modal/modals/InspectorModal/useDbExplorer.js.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/useRemotesInspector.d.ts +0 -4
- package/lib/src/components/modal/modals/InspectorModal/useRemotesInspector.d.ts.map +0 -1
- package/lib/src/components/modal/modals/InspectorModal/useRemotesInspector.js +0 -12
- package/lib/src/components/modal/modals/InspectorModal/useRemotesInspector.js.map +0 -1
- package/lib/src/components/modal/modals/SettingsModal.d.ts +0 -3
- package/lib/src/components/modal/modals/SettingsModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/SettingsModal.js +0 -45
- package/lib/src/components/modal/modals/SettingsModal.js.map +0 -1
- package/lib/src/components/modal/modals/UpgradeDriveModal.d.ts +0 -3
- package/lib/src/components/modal/modals/UpgradeDriveModal.d.ts.map +0 -1
- package/lib/src/components/modal/modals/UpgradeDriveModal.js +0 -21
- package/lib/src/components/modal/modals/UpgradeDriveModal.js.map +0 -1
- package/lib/src/components/modal/modals/settings/about.d.ts +0 -2
- package/lib/src/components/modal/modals/settings/about.d.ts.map +0 -1
- package/lib/src/components/modal/modals/settings/about.js +0 -10
- package/lib/src/components/modal/modals/settings/about.js.map +0 -1
- package/lib/src/components/modal/modals/settings/danger-zone.d.ts +0 -2
- package/lib/src/components/modal/modals/settings/danger-zone.d.ts.map +0 -1
- package/lib/src/components/modal/modals/settings/danger-zone.js +0 -15
- package/lib/src/components/modal/modals/settings/danger-zone.js.map +0 -1
- package/lib/src/components/modal/modals/settings/default-editor.d.ts +0 -2
- package/lib/src/components/modal/modals/settings/default-editor.d.ts.map +0 -1
- package/lib/src/components/modal/modals/settings/default-editor.js +0 -18
- package/lib/src/components/modal/modals/settings/default-editor.js.map +0 -1
- package/lib/src/components/modal/modals/settings/package-manager.d.ts +0 -3
- package/lib/src/components/modal/modals/settings/package-manager.d.ts.map +0 -1
- package/lib/src/components/modal/modals/settings/package-manager.js +0 -87
- package/lib/src/components/modal/modals/settings/package-manager.js.map +0 -1
- package/lib/src/components/modal/modals-container.d.ts +0 -2
- package/lib/src/components/modal/modals-container.d.ts.map +0 -1
- package/lib/src/components/modal/modals-container.js +0 -66
- package/lib/src/components/modal/modals-container.js.map +0 -1
- package/lib/src/components/ph-logo.d.ts +0 -2
- package/lib/src/components/ph-logo.d.ts.map +0 -1
- package/lib/src/components/ph-logo.js +0 -7
- package/lib/src/components/ph-logo.js.map +0 -1
- package/lib/src/components/reload-connect-toast.d.ts +0 -2
- package/lib/src/components/reload-connect-toast.d.ts.map +0 -1
- package/lib/src/components/reload-connect-toast.js +0 -7
- package/lib/src/components/reload-connect-toast.js.map +0 -1
- package/lib/src/components/root.d.ts +0 -2
- package/lib/src/components/root.d.ts.map +0 -1
- package/lib/src/components/root.js +0 -8
- package/lib/src/components/root.js.map +0 -1
- package/lib/src/components/router.d.ts +0 -2
- package/lib/src/components/router.d.ts.map +0 -1
- package/lib/src/components/router.js +0 -41
- package/lib/src/components/router.js.map +0 -1
- package/lib/src/components/search-bar.d.ts +0 -2
- package/lib/src/components/search-bar.d.ts.map +0 -1
- package/lib/src/components/search-bar.js +0 -36
- package/lib/src/components/search-bar.js.map +0 -1
- package/lib/src/components/sidebar.d.ts +0 -2
- package/lib/src/components/sidebar.d.ts.map +0 -1
- package/lib/src/components/sidebar.js +0 -28
- package/lib/src/components/sidebar.js.map +0 -1
- package/lib/src/connect.config.d.ts +0 -115
- package/lib/src/connect.config.d.ts.map +0 -1
- package/lib/src/connect.config.js +0 -148
- package/lib/src/connect.config.js.map +0 -1
- package/lib/src/context/index.d.ts +0 -4
- package/lib/src/context/index.d.ts.map +0 -1
- package/lib/src/context/index.js +0 -4
- package/lib/src/context/index.js.map +0 -1
- package/lib/src/context/processor-manager.d.ts +0 -3
- package/lib/src/context/processor-manager.d.ts.map +0 -1
- package/lib/src/context/processor-manager.js +0 -189
- package/lib/src/context/processor-manager.js.map +0 -1
- package/lib/src/context/read-mode.d.ts +0 -2
- package/lib/src/context/read-mode.d.ts.map +0 -1
- package/lib/src/context/read-mode.js +0 -219
- package/lib/src/context/read-mode.js.map +0 -1
- package/lib/src/context/sentry-provider.d.ts +0 -6
- package/lib/src/context/sentry-provider.d.ts.map +0 -1
- package/lib/src/context/sentry-provider.js +0 -6
- package/lib/src/context/sentry-provider.js.map +0 -1
- package/lib/src/feature-flags.d.ts +0 -53
- package/lib/src/feature-flags.d.ts.map +0 -1
- package/lib/src/feature-flags.js +0 -186
- package/lib/src/feature-flags.js.map +0 -1
- package/lib/src/globals.d.ts +0 -9
- package/lib/src/globals.d.ts.map +0 -1
- package/lib/src/globals.js +0 -2
- package/lib/src/globals.js.map +0 -1
- package/lib/src/hmr.d.ts +0 -3
- package/lib/src/hmr.d.ts.map +0 -1
- package/lib/src/hmr.js +0 -2
- package/lib/src/hmr.js.map +0 -1
- package/lib/src/hooks/index.d.ts +0 -10
- package/lib/src/hooks/index.d.ts.map +0 -1
- package/lib/src/hooks/index.js +0 -10
- package/lib/src/hooks/index.js.map +0 -1
- package/lib/src/hooks/useAcceptedCookies.d.ts +0 -9
- package/lib/src/hooks/useAcceptedCookies.d.ts.map +0 -1
- package/lib/src/hooks/useAcceptedCookies.js +0 -34
- package/lib/src/hooks/useAcceptedCookies.js.map +0 -1
- package/lib/src/hooks/useCheckLatestVersion.d.ts +0 -2
- package/lib/src/hooks/useCheckLatestVersion.d.ts.map +0 -1
- package/lib/src/hooks/useCheckLatestVersion.js +0 -33
- package/lib/src/hooks/useCheckLatestVersion.js.map +0 -1
- package/lib/src/hooks/useClientErrorHandler.d.ts +0 -6
- package/lib/src/hooks/useClientErrorHandler.d.ts.map +0 -1
- package/lib/src/hooks/useClientErrorHandler.js +0 -131
- package/lib/src/hooks/useClientErrorHandler.js.map +0 -1
- package/lib/src/hooks/useCookieBanner.d.ts +0 -5
- package/lib/src/hooks/useCookieBanner.d.ts.map +0 -1
- package/lib/src/hooks/useCookieBanner.js +0 -32
- package/lib/src/hooks/useCookieBanner.js.map +0 -1
- package/lib/src/hooks/useInitSentry.d.ts +0 -2
- package/lib/src/hooks/useInitSentry.d.ts.map +0 -1
- package/lib/src/hooks/useInitSentry.js +0 -80
- package/lib/src/hooks/useInitSentry.js.map +0 -1
- package/lib/src/hooks/useNodeActions.d.ts +0 -6
- package/lib/src/hooks/useNodeActions.d.ts.map +0 -1
- package/lib/src/hooks/useNodeActions.js +0 -35
- package/lib/src/hooks/useNodeActions.js.map +0 -1
- package/lib/src/hooks/useUndoRedoShortcuts.d.ts +0 -8
- package/lib/src/hooks/useUndoRedoShortcuts.d.ts.map +0 -1
- package/lib/src/hooks/useUndoRedoShortcuts.js +0 -26
- package/lib/src/hooks/useUndoRedoShortcuts.js.map +0 -1
- package/lib/src/hooks/useWindowSize.d.ts +0 -5
- package/lib/src/hooks/useWindowSize.d.ts.map +0 -1
- package/lib/src/hooks/useWindowSize.js +0 -21
- package/lib/src/hooks/useWindowSize.js.map +0 -1
- package/lib/src/hooks/utils.d.ts +0 -7
- package/lib/src/hooks/utils.d.ts.map +0 -1
- package/lib/src/hooks/utils.js +0 -46
- package/lib/src/hooks/utils.js.map +0 -1
- package/lib/src/i18n/index.d.ts +0 -4
- package/lib/src/i18n/index.d.ts.map +0 -1
- package/lib/src/i18n/index.js +0 -26
- package/lib/src/i18n/index.js.map +0 -1
- package/lib/src/i18n/locales/en.json +0 -114
- package/lib/src/index.d.ts +0 -2
- package/lib/src/index.d.ts.map +0 -1
- package/lib/src/index.js +0 -2
- package/lib/src/index.js.map +0 -1
- package/lib/src/main.d.ts +0 -2
- package/lib/src/main.d.ts.map +0 -1
- package/lib/src/main.js +0 -5
- package/lib/src/main.js.map +0 -1
- package/lib/src/pages/content.d.ts +0 -2
- package/lib/src/pages/content.d.ts.map +0 -1
- package/lib/src/pages/content.js +0 -39
- package/lib/src/pages/content.js.map +0 -1
- package/lib/src/pages/demo/atlas-import.d.ts +0 -2
- package/lib/src/pages/demo/atlas-import.d.ts.map +0 -1
- package/lib/src/pages/demo/atlas-import.js +0 -122
- package/lib/src/pages/demo/atlas-import.js.map +0 -1
- package/lib/src/pages/index.d.ts +0 -4
- package/lib/src/pages/index.d.ts.map +0 -1
- package/lib/src/pages/index.js +0 -4
- package/lib/src/pages/index.js.map +0 -1
- package/lib/src/pages/settings.d.ts +0 -4
- package/lib/src/pages/settings.d.ts.map +0 -1
- package/lib/src/pages/settings.js +0 -9
- package/lib/src/pages/settings.js.map +0 -1
- package/lib/src/service-worker.d.ts +0 -2
- package/lib/src/service-worker.d.ts.map +0 -1
- package/lib/src/service-worker.js +0 -58
- package/lib/src/service-worker.js.map +0 -1
- package/lib/src/services/hmr.d.ts +0 -13
- package/lib/src/services/hmr.d.ts.map +0 -1
- package/lib/src/services/hmr.js +0 -85
- package/lib/src/services/hmr.js.map +0 -1
- package/lib/src/services/index.d.ts +0 -10
- package/lib/src/services/index.d.ts.map +0 -1
- package/lib/src/services/index.js +0 -9
- package/lib/src/services/index.js.map +0 -1
- package/lib/src/services/logger.d.ts +0 -2
- package/lib/src/services/logger.d.ts.map +0 -1
- package/lib/src/services/logger.js +0 -28
- package/lib/src/services/logger.js.map +0 -1
- package/lib/src/services/renown/browser.d.ts +0 -2
- package/lib/src/services/renown/browser.d.ts.map +0 -1
- package/lib/src/services/renown/browser.js +0 -6
- package/lib/src/services/renown/browser.js.map +0 -1
- package/lib/src/services/renown/constants.d.ts +0 -130
- package/lib/src/services/renown/constants.d.ts.map +0 -1
- package/lib/src/services/renown/constants.js +0 -41
- package/lib/src/services/renown/constants.js.map +0 -1
- package/lib/src/services/renown/utils.d.ts +0 -7
- package/lib/src/services/renown/utils.d.ts.map +0 -1
- package/lib/src/services/renown/utils.js +0 -20
- package/lib/src/services/renown/utils.js.map +0 -1
- package/lib/src/services/storage/base-storage.d.ts +0 -9
- package/lib/src/services/storage/base-storage.d.ts.map +0 -1
- package/lib/src/services/storage/base-storage.js +0 -21
- package/lib/src/services/storage/base-storage.js.map +0 -1
- package/lib/src/services/storage/browser.d.ts +0 -5
- package/lib/src/services/storage/browser.d.ts.map +0 -1
- package/lib/src/services/storage/browser.js +0 -25
- package/lib/src/services/storage/browser.js.map +0 -1
- package/lib/src/services/storage/types.d.ts +0 -6
- package/lib/src/services/storage/types.d.ts.map +0 -1
- package/lib/src/services/storage/types.js +0 -2
- package/lib/src/services/storage/types.js.map +0 -1
- package/lib/src/services/toast.d.ts +0 -8
- package/lib/src/services/toast.d.ts.map +0 -1
- package/lib/src/services/toast.js +0 -11
- package/lib/src/services/toast.js.map +0 -1
- package/lib/src/store/document-model.d.ts +0 -3
- package/lib/src/store/document-model.d.ts.map +0 -1
- package/lib/src/store/document-model.js +0 -80
- package/lib/src/store/document-model.js.map +0 -1
- package/lib/src/store/editor.d.ts +0 -5
- package/lib/src/store/editor.d.ts.map +0 -1
- package/lib/src/store/editor.js +0 -31
- package/lib/src/store/editor.js.map +0 -1
- package/lib/src/store/external-packages.d.ts +0 -4
- package/lib/src/store/external-packages.d.ts.map +0 -1
- package/lib/src/store/external-packages.js +0 -36
- package/lib/src/store/external-packages.js.map +0 -1
- package/lib/src/store/index.d.ts +0 -7
- package/lib/src/store/index.d.ts.map +0 -1
- package/lib/src/store/index.js +0 -7
- package/lib/src/store/index.js.map +0 -1
- package/lib/src/store/reactor.d.ts +0 -3
- package/lib/src/store/reactor.d.ts.map +0 -1
- package/lib/src/store/reactor.js +0 -272
- package/lib/src/store/reactor.js.map +0 -1
- package/lib/src/store/user.d.ts +0 -2
- package/lib/src/store/user.d.ts.map +0 -1
- package/lib/src/store/user.js +0 -16
- package/lib/src/store/user.js.map +0 -1
- package/lib/src/store/utils.d.ts +0 -2
- package/lib/src/store/utils.d.ts.map +0 -1
- package/lib/src/store/utils.js +0 -59
- package/lib/src/store/utils.js.map +0 -1
- package/lib/src/utils/browser.d.ts +0 -2
- package/lib/src/utils/browser.d.ts.map +0 -1
- package/lib/src/utils/browser.js +0 -9
- package/lib/src/utils/browser.js.map +0 -1
- package/lib/src/utils/document-editor-debug-tools.d.ts +0 -17
- package/lib/src/utils/document-editor-debug-tools.d.ts.map +0 -1
- package/lib/src/utils/document-editor-debug-tools.js +0 -55
- package/lib/src/utils/document-editor-debug-tools.js.map +0 -1
- package/lib/src/utils/drive-preservation.d.ts +0 -19
- package/lib/src/utils/drive-preservation.d.ts.map +0 -1
- package/lib/src/utils/drive-preservation.js +0 -51
- package/lib/src/utils/drive-preservation.js.map +0 -1
- package/lib/src/utils/drive-sections.d.ts +0 -31
- package/lib/src/utils/drive-sections.d.ts.map +0 -1
- package/lib/src/utils/drive-sections.js +0 -63
- package/lib/src/utils/drive-sections.js.map +0 -1
- package/lib/src/utils/index.d.ts +0 -12
- package/lib/src/utils/index.d.ts.map +0 -1
- package/lib/src/utils/index.js +0 -12
- package/lib/src/utils/index.js.map +0 -1
- package/lib/src/utils/join.d.ts +0 -2
- package/lib/src/utils/join.d.ts.map +0 -1
- package/lib/src/utils/join.js +0 -11
- package/lib/src/utils/join.js.map +0 -1
- package/lib/src/utils/openUrl.d.ts +0 -2
- package/lib/src/utils/openUrl.d.ts.map +0 -1
- package/lib/src/utils/openUrl.js +0 -3
- package/lib/src/utils/openUrl.js.map +0 -1
- package/lib/src/utils/path.d.ts +0 -4
- package/lib/src/utils/path.d.ts.map +0 -1
- package/lib/src/utils/path.js +0 -17
- package/lib/src/utils/path.js.map +0 -1
- package/lib/src/utils/reactor.d.ts +0 -26
- package/lib/src/utils/reactor.d.ts.map +0 -1
- package/lib/src/utils/reactor.js +0 -115
- package/lib/src/utils/reactor.js.map +0 -1
- package/lib/src/utils/registerServiceWorker.d.ts +0 -12
- package/lib/src/utils/registerServiceWorker.d.ts.map +0 -1
- package/lib/src/utils/registerServiceWorker.js +0 -97
- package/lib/src/utils/registerServiceWorker.js.map +0 -1
- package/lib/src/utils/signature.d.ts +0 -4
- package/lib/src/utils/signature.d.ts.map +0 -1
- package/lib/src/utils/signature.js +0 -36
- package/lib/src/utils/signature.js.map +0 -1
- package/lib/src/utils/slug.d.ts +0 -2
- package/lib/src/utils/slug.d.ts.map +0 -1
- package/lib/src/utils/slug.js +0 -4
- package/lib/src/utils/slug.js.map +0 -1
- package/lib/src/workers/pglite-worker.d.ts +0 -2
- package/lib/src/workers/pglite-worker.d.ts.map +0 -1
- package/lib/src/workers/pglite-worker.js +0 -32
- package/lib/src/workers/pglite-worker.js.map +0 -1
- package/lib/test/utils/signer.test.d.ts +0 -2
- package/lib/test/utils/signer.test.d.ts.map +0 -1
- package/lib/test/utils/signer.test.js +0 -330
- package/lib/test/utils/signer.test.js.map +0 -1
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/lib/vite.config.d.ts +0 -3
- package/lib/vite.config.d.ts.map +0 -1
- package/lib/vite.config.js +0 -59
- package/lib/vite.config.js.map +0 -1
- package/lib/vitest.config.d.ts +0 -3
- package/lib/vitest.config.d.ts.map +0 -1
- package/lib/vitest.config.js +0 -8
- package/lib/vitest.config.js.map +0 -1
- package/nginx.conf +0 -77
- package/package.copy.json +0 -177
- package/src/index.css +0 -5
|
@@ -0,0 +1,1473 @@
|
|
|
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]="0e6285c3-6ff2-51e3-bd29-e9f89fcb22f9")}catch(e){}}();
|
|
3
|
+
import { n as defaultPHAppConfig, r as defaultPHDocumentEditorConfig, t as connectConfig } from "./connect.config-Cuh0hj_Q.js";
|
|
4
|
+
import { n as toast, t as ToastContainer } from "./toast-DnODOv28.js";
|
|
5
|
+
import { t as i18n } from "./i18n-4rfcgnb9.js";
|
|
6
|
+
import { c as subscribeReactorPgMajor, d as createFileDataStore, f as idbError, l as IDB_STORE_NAME, m as readPgVersionFile, p as openIdb, r as getCachedReactorPgMajor, u as PRIMARY_IDB_NAMES } from "./pglite-runtime-Btp8ZXVH.js";
|
|
7
|
+
import { t as serviceWorkerManager } from "./registerServiceWorker-CMRF2LWE.js";
|
|
8
|
+
import { driveCollectionId, getRevisionFromDate, logout, openRenown, setPHAppConfig, setPHDocumentEditorConfig, setRevisionHistoryVisible, setSelectedDrive, setSelectedNode, showPHModal, useAppModuleById, useDefaultAppModule, useDocumentById, useDocumentModelModuleById, useDocumentOperations, useDrives, useEditorModuleById, useFallbackEditorModule, useNodeParentFolderById, usePHModal, usePackageDiscoveryService, useRevisionHistoryVisible, useSelectedDocument, useSelectedDocumentId, useSelectedDrive, useSelectedDriveSafe, useSelectedFolder, useSelectedTimelineItem, useSyncList, useUser } from "@powerhousedao/reactor-browser";
|
|
9
|
+
import { childLogger } from "document-model";
|
|
10
|
+
import React, { StrictMode, Suspense, lazy, useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
11
|
+
import { Trans, useTranslation } from "react-i18next";
|
|
12
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
13
|
+
import { Outlet, RouterProvider, createBrowserRouter, createRoutesFromChildren, matchRoutes, useLocation, useNavigationType } from "react-router-dom";
|
|
14
|
+
import { useHotkeys } from "react-hotkeys-hook";
|
|
15
|
+
import { AnimatedLoader, ConnectSidebar, ConnectTooltipProvider, CookieBanner, DefaultEditorLoader, DropZoneWrapper, HomeScreen, HomeScreenAddDriveItem, HomeScreenItem, PackageInstallModal, RevisionHistory, SidebarAddDriveItem, SidebarItem, useEns } from "@powerhousedao/design-system/connect";
|
|
16
|
+
import { GenericDriveExplorer } from "@powerhousedao/powerhouse-vetra-packages/editors";
|
|
17
|
+
import { Icon, Modal, PowerhouseButton } from "@powerhousedao/design-system";
|
|
18
|
+
import { ErrorBoundary } from "react-error-boundary";
|
|
19
|
+
import { PGlite } from "@electric-sql/pglite";
|
|
20
|
+
import { twMerge } from "tailwind-merge";
|
|
21
|
+
import { redo, undo } from "@powerhousedao/shared/document-model";
|
|
22
|
+
//#region src/hooks/useAcceptedCookies.ts
|
|
23
|
+
const ACCEPTED_COOKIES_KEY_STORAGE = `${connectConfig.routerBasename}:acceptedCookies`;
|
|
24
|
+
const listeners$3 = /* @__PURE__ */ new Set();
|
|
25
|
+
let cookies = getInitial$1();
|
|
26
|
+
function getInitial$1() {
|
|
27
|
+
try {
|
|
28
|
+
const value = localStorage.getItem(ACCEPTED_COOKIES_KEY_STORAGE);
|
|
29
|
+
return value ? JSON.parse(value) : {
|
|
30
|
+
analytics: false,
|
|
31
|
+
marketing: false,
|
|
32
|
+
functional: false
|
|
33
|
+
};
|
|
34
|
+
} catch {
|
|
35
|
+
return {
|
|
36
|
+
analytics: false,
|
|
37
|
+
marketing: false,
|
|
38
|
+
functional: false
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function getCookies() {
|
|
43
|
+
return cookies;
|
|
44
|
+
}
|
|
45
|
+
function setCookies(setter) {
|
|
46
|
+
cookies = setter(cookies);
|
|
47
|
+
localStorage.setItem(ACCEPTED_COOKIES_KEY_STORAGE, JSON.stringify(cookies));
|
|
48
|
+
listeners$3.forEach((fn) => fn());
|
|
49
|
+
}
|
|
50
|
+
function subscribe$1(fn) {
|
|
51
|
+
listeners$3.add(fn);
|
|
52
|
+
return () => listeners$3.delete(fn);
|
|
53
|
+
}
|
|
54
|
+
const useAcceptedCookies = () => {
|
|
55
|
+
return [useSyncExternalStore(subscribe$1, getCookies, getCookies), setCookies];
|
|
56
|
+
};
|
|
57
|
+
const COOKIE_BANNER_KEY_STORAGE = `${connectConfig.routerBasename}:display-cookie-banner`;
|
|
58
|
+
const listeners$2 = /* @__PURE__ */ new Set();
|
|
59
|
+
let bannerShown = getInitial();
|
|
60
|
+
function getInitial() {
|
|
61
|
+
try {
|
|
62
|
+
return localStorage.getItem(COOKIE_BANNER_KEY_STORAGE) !== "false";
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error(error);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function getCookieBannerState() {
|
|
69
|
+
return bannerShown;
|
|
70
|
+
}
|
|
71
|
+
function setCookieBannerState(state) {
|
|
72
|
+
bannerShown = state;
|
|
73
|
+
localStorage.setItem(COOKIE_BANNER_KEY_STORAGE, JSON.stringify(state));
|
|
74
|
+
}
|
|
75
|
+
function subscribe(fn) {
|
|
76
|
+
listeners$2.add(fn);
|
|
77
|
+
return () => listeners$2.delete(fn);
|
|
78
|
+
}
|
|
79
|
+
const useCookieBanner = () => {
|
|
80
|
+
return [useSyncExternalStore(subscribe, getCookieBannerState, getCookieBannerState), setCookieBannerState];
|
|
81
|
+
};
|
|
82
|
+
//#endregion
|
|
83
|
+
//#region src/hooks/useFailedInstallations.ts
|
|
84
|
+
const emptyArray$1 = [];
|
|
85
|
+
function useFailedInstallations() {
|
|
86
|
+
const discoveryService = usePackageDiscoveryService();
|
|
87
|
+
return useSyncExternalStore((cb) => discoveryService?.subscribeFailed(cb) ?? (() => {}), () => discoveryService?.getFailedInstallations() ?? emptyArray$1);
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region src/hooks/useInitSentry.ts
|
|
91
|
+
const logger$2 = childLogger(["sentry"]);
|
|
92
|
+
let clientStarted = false;
|
|
93
|
+
async function getSentry() {
|
|
94
|
+
return await import("@sentry/react");
|
|
95
|
+
}
|
|
96
|
+
async function initSentry() {
|
|
97
|
+
connectConfig.sentry;
|
|
98
|
+
const Sentry = await getSentry();
|
|
99
|
+
const integrations = [
|
|
100
|
+
Sentry.httpClientIntegration(),
|
|
101
|
+
Sentry.extraErrorDataIntegration({ depth: 5 }),
|
|
102
|
+
Sentry.replayIntegration(),
|
|
103
|
+
Sentry.captureConsoleIntegration({ levels: ["error"] })
|
|
104
|
+
];
|
|
105
|
+
if (connectConfig.sentry.tracing) integrations.push(Sentry.reactRouterV6BrowserTracingIntegration({
|
|
106
|
+
useEffect: React.useEffect,
|
|
107
|
+
useLocation,
|
|
108
|
+
useNavigationType,
|
|
109
|
+
createRoutesFromChildren,
|
|
110
|
+
matchRoutes
|
|
111
|
+
}));
|
|
112
|
+
Sentry.init({
|
|
113
|
+
release: connectConfig.sentry.release,
|
|
114
|
+
dsn: connectConfig.sentry.dsn,
|
|
115
|
+
environment: connectConfig.sentry.env,
|
|
116
|
+
integrations,
|
|
117
|
+
ignoreErrors: [
|
|
118
|
+
"User is not allowed to create files",
|
|
119
|
+
"User is not allowed to move documents",
|
|
120
|
+
"The user aborted a request."
|
|
121
|
+
],
|
|
122
|
+
sendDefaultPii: true,
|
|
123
|
+
tracesSampleRate: 1,
|
|
124
|
+
replaysSessionSampleRate: .1,
|
|
125
|
+
replaysOnErrorSampleRate: 1,
|
|
126
|
+
beforeSend(event, hint) {
|
|
127
|
+
const error = hint.originalException;
|
|
128
|
+
if (error instanceof TypeError && error.message.includes("Failed to fetch") && !navigator.onLine) return null;
|
|
129
|
+
return event;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
clientStarted = true;
|
|
133
|
+
}
|
|
134
|
+
async function closeClient() {
|
|
135
|
+
if (!clientStarted) return;
|
|
136
|
+
return (await getSentry()).getClient()?.close();
|
|
137
|
+
}
|
|
138
|
+
function useInitSentry() {
|
|
139
|
+
const [acceptedCookies] = useAcceptedCookies();
|
|
140
|
+
const { analytics } = acceptedCookies;
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
if (!analytics) {
|
|
143
|
+
closeClient().catch((error) => logger$2.error("@error", error));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (clientStarted || !connectConfig.sentry.dsn || connectConfig.sentry.dsn === "") return;
|
|
147
|
+
initSentry().catch((error) => logger$2.error("@error", error));
|
|
148
|
+
}, [analytics]);
|
|
149
|
+
}
|
|
150
|
+
//#endregion
|
|
151
|
+
//#region src/hooks/usePendingInstallations.ts
|
|
152
|
+
const emptyArray = [];
|
|
153
|
+
function usePendingInstallations() {
|
|
154
|
+
const discoveryService = usePackageDiscoveryService();
|
|
155
|
+
const cacheRef = useRef(emptyArray);
|
|
156
|
+
return useSyncExternalStore((cb) => discoveryService?.subscribePending(cb) ?? (() => {}), useCallback(() => {
|
|
157
|
+
if (!discoveryService) return emptyArray;
|
|
158
|
+
const next = discoveryService.getPendingInstallations() ?? emptyArray;
|
|
159
|
+
const prev = cacheRef.current;
|
|
160
|
+
if (next === prev || next.length === prev.length && next.every((p, i) => p === prev[i])) return prev;
|
|
161
|
+
cacheRef.current = next;
|
|
162
|
+
return next;
|
|
163
|
+
}, [discoveryService]));
|
|
164
|
+
}
|
|
165
|
+
//#endregion
|
|
166
|
+
//#region src/hooks/useUndoRedoShortcuts.ts
|
|
167
|
+
const useUndoRedoShortcuts = (props) => {
|
|
168
|
+
const { undo, redo, canRedo, canUndo } = props;
|
|
169
|
+
const isMac = window.navigator.userAgent.includes("Mac");
|
|
170
|
+
let undoShortcut = "ctrl+z";
|
|
171
|
+
let redoShortcut = "ctrl+y";
|
|
172
|
+
if (isMac) {
|
|
173
|
+
undoShortcut = "mod+z";
|
|
174
|
+
redoShortcut = "mod+shift+z";
|
|
175
|
+
}
|
|
176
|
+
useHotkeys(undoShortcut, (event) => {
|
|
177
|
+
event.preventDefault();
|
|
178
|
+
if (canUndo) undo();
|
|
179
|
+
}, {}, [canUndo, undo]);
|
|
180
|
+
useHotkeys(redoShortcut, (event) => {
|
|
181
|
+
event.preventDefault();
|
|
182
|
+
if (canRedo) redo();
|
|
183
|
+
}, {}, [canRedo, redo]);
|
|
184
|
+
};
|
|
185
|
+
//#endregion
|
|
186
|
+
//#region src/components/analytics.tsx
|
|
187
|
+
function gtag(...args) {
|
|
188
|
+
window.dataLayer?.push(...args);
|
|
189
|
+
}
|
|
190
|
+
const Analytics = () => {
|
|
191
|
+
const gaTrackingId = connectConfig.gaTrackingId;
|
|
192
|
+
const [{ analytics }] = useAcceptedCookies();
|
|
193
|
+
const useAnalytics = gaTrackingId && analytics;
|
|
194
|
+
useEffect(() => {
|
|
195
|
+
if (useAnalytics) {
|
|
196
|
+
const script = document.createElement("script");
|
|
197
|
+
script.src = `https://www.googletagmanager.com/gtag/js?id=${gaTrackingId}`;
|
|
198
|
+
script.async = true;
|
|
199
|
+
document.head.appendChild(script);
|
|
200
|
+
window.dataLayer = window.dataLayer || [];
|
|
201
|
+
gtag("js", /* @__PURE__ */ new Date());
|
|
202
|
+
gtag("config", gaTrackingId);
|
|
203
|
+
return () => {
|
|
204
|
+
document.head.removeChild(script);
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}, [useAnalytics, gaTrackingId]);
|
|
208
|
+
return null;
|
|
209
|
+
};
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region src/components/document-editor-container.tsx
|
|
212
|
+
function DocumentEditorContainer() {
|
|
213
|
+
const [selectedDocument] = useSelectedDocument();
|
|
214
|
+
const parentFolder = useNodeParentFolderById(selectedDocument.header.id);
|
|
215
|
+
useMemo(() => {
|
|
216
|
+
return async () => {};
|
|
217
|
+
}, []);
|
|
218
|
+
useCallback(() => {
|
|
219
|
+
setSelectedNode(parentFolder);
|
|
220
|
+
}, [parentFolder, setSelectedNode]);
|
|
221
|
+
return /* @__PURE__ */ jsx("div", {
|
|
222
|
+
id: "document-editor-container",
|
|
223
|
+
className: "flex-1",
|
|
224
|
+
"data-document-type": selectedDocument.header.documentType,
|
|
225
|
+
children: /* @__PURE__ */ jsx(DocumentEditor, { document: selectedDocument })
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region src/components/editor-loader.tsx
|
|
230
|
+
function EditorLoader(props) {
|
|
231
|
+
const [showLoading, setShowLoading] = useState(false);
|
|
232
|
+
useEffect(() => {
|
|
233
|
+
setTimeout(() => {
|
|
234
|
+
setShowLoading(true);
|
|
235
|
+
}, props.loadingTimeout ?? 200);
|
|
236
|
+
}, [props]);
|
|
237
|
+
if (!showLoading) return null;
|
|
238
|
+
const { customEditorLoader, ...defaultProps } = props;
|
|
239
|
+
if (customEditorLoader) return /* @__PURE__ */ jsx(Fragment, { children: customEditorLoader });
|
|
240
|
+
return /* @__PURE__ */ jsx(DefaultEditorLoader, { ...defaultProps });
|
|
241
|
+
}
|
|
242
|
+
//#endregion
|
|
243
|
+
//#region src/components/error-boundary.tsx
|
|
244
|
+
const logger$1 = childLogger(["Connect"]);
|
|
245
|
+
function hasCustomFallback(props) {
|
|
246
|
+
return "fallbackRender" in props;
|
|
247
|
+
}
|
|
248
|
+
function SilentFallback() {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Simple text-based fallback component.
|
|
253
|
+
* Displays a centered message when an error occurs.
|
|
254
|
+
*/
|
|
255
|
+
function TextFallback({ message = "Something went wrong" }) {
|
|
256
|
+
return /* @__PURE__ */ jsx("div", {
|
|
257
|
+
className: "text-center",
|
|
258
|
+
children: message
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Detailed fallback component showing full error information.
|
|
263
|
+
* Displays error message with a collapsible details section.
|
|
264
|
+
* Useful for development and debugging purposes.
|
|
265
|
+
*/
|
|
266
|
+
function DetailedFallback({ error, resetErrorBoundary }) {
|
|
267
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
268
|
+
const errorDetails = error instanceof Error ? error.stack ?? String(error.cause) : JSON.stringify(error, null, 2);
|
|
269
|
+
return /* @__PURE__ */ jsx("div", {
|
|
270
|
+
className: "z-10 mx-auto flex max-w-[80%] flex-1 items-center justify-center p-6",
|
|
271
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
272
|
+
className: "w-full max-w-lg rounded-lg border border-gray-500 bg-white p-6 shadow-sm",
|
|
273
|
+
children: [
|
|
274
|
+
/* @__PURE__ */ jsxs("div", {
|
|
275
|
+
className: "mb-3 flex items-center gap-2",
|
|
276
|
+
children: [/* @__PURE__ */ jsx(Icon, {
|
|
277
|
+
name: "Error",
|
|
278
|
+
className: "size-5 shrink-0"
|
|
279
|
+
}), /* @__PURE__ */ jsx("h1", {
|
|
280
|
+
className: "text-lg font-semibold",
|
|
281
|
+
children: "Something went wrong"
|
|
282
|
+
})]
|
|
283
|
+
}),
|
|
284
|
+
/* @__PURE__ */ jsx("p", {
|
|
285
|
+
className: "mb-4 text-sm text-gray-700",
|
|
286
|
+
children: errorMessage
|
|
287
|
+
}),
|
|
288
|
+
errorDetails !== "{}" && /* @__PURE__ */ jsxs("details", {
|
|
289
|
+
className: "group",
|
|
290
|
+
children: [/* @__PURE__ */ jsx("summary", {
|
|
291
|
+
className: "cursor-pointer text-sm font-medium text-gray-700 underline select-none hover:text-gray-700",
|
|
292
|
+
children: "Show details"
|
|
293
|
+
}), /* @__PURE__ */ jsx("pre", {
|
|
294
|
+
className: "mt-2 max-h-48 overflow-auto rounded-sm bg-gray-100 p-3 text-xs",
|
|
295
|
+
children: errorDetails
|
|
296
|
+
})]
|
|
297
|
+
}),
|
|
298
|
+
/* @__PURE__ */ jsx(PowerhouseButton, {
|
|
299
|
+
type: "button",
|
|
300
|
+
onClick: resetErrorBoundary,
|
|
301
|
+
className: "mt-4 px-3 py-1.5 text-base font-medium",
|
|
302
|
+
children: "Try again"
|
|
303
|
+
})
|
|
304
|
+
]
|
|
305
|
+
})
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Centered error message fallback component.
|
|
310
|
+
* Displays the error message in a centered, full-size container.
|
|
311
|
+
* Suitable for use as a custom fallbackRender when you need simple error display.
|
|
312
|
+
*/
|
|
313
|
+
function CenteredErrorMessage({ error }) {
|
|
314
|
+
return /* @__PURE__ */ jsx("div", {
|
|
315
|
+
className: "flex size-full items-center justify-center",
|
|
316
|
+
children: /* @__PURE__ */ jsx("h3", {
|
|
317
|
+
className: "text-lg font-semibold",
|
|
318
|
+
children: error instanceof Error ? error.message : String(error)
|
|
319
|
+
})
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
function getFallbackComponent(variant, fallbackMessage) {
|
|
323
|
+
switch (variant) {
|
|
324
|
+
case "silent": return SilentFallback;
|
|
325
|
+
case "text": return () => /* @__PURE__ */ jsx(TextFallback, { message: fallbackMessage });
|
|
326
|
+
case "detailed": return DetailedFallback;
|
|
327
|
+
default: return CenteredErrorMessage;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Unified error boundary component for catching and handling React errors.
|
|
332
|
+
*
|
|
333
|
+
* Built on top of `react-error-boundary`, this component provides:
|
|
334
|
+
* - Automatic error logging with configurable context
|
|
335
|
+
* - Multiple fallback UI variants (silent, text, detailed)
|
|
336
|
+
* - Support for custom fallback render functions
|
|
337
|
+
* - Reset capability via `resetKeys`
|
|
338
|
+
*
|
|
339
|
+
* @example
|
|
340
|
+
* // Using a predefined variant
|
|
341
|
+
* <ErrorBoundary variant="detailed" loggerContext={["Connect", "Editor"]}>
|
|
342
|
+
* <EditorComponent />
|
|
343
|
+
* </ErrorBoundary>
|
|
344
|
+
*
|
|
345
|
+
* @example
|
|
346
|
+
* // Using a custom message with the text variant
|
|
347
|
+
* <ErrorBoundary variant="text" fallbackMessage="Failed to load drives">
|
|
348
|
+
* <DrivesList />
|
|
349
|
+
* </ErrorBoundary>
|
|
350
|
+
*
|
|
351
|
+
* @example
|
|
352
|
+
* // Using a custom fallback render
|
|
353
|
+
* <ErrorBoundary
|
|
354
|
+
* fallbackRender={CenteredErrorMessage}
|
|
355
|
+
* onError={(error) => trackError(error)}
|
|
356
|
+
* >
|
|
357
|
+
* <MyComponent />
|
|
358
|
+
* </ErrorBoundary>
|
|
359
|
+
*
|
|
360
|
+
* @example
|
|
361
|
+
* // Silent mode for modals (renders null on error)
|
|
362
|
+
* <ErrorBoundary variant="silent" loggerContext={["Connect", "Modals"]}>
|
|
363
|
+
* <ModalContent />
|
|
364
|
+
* </ErrorBoundary>
|
|
365
|
+
*/
|
|
366
|
+
function ErrorBoundary$1(props) {
|
|
367
|
+
const { children, onError, resetKeys, loggerContext } = props;
|
|
368
|
+
const handleError = (error, info) => {
|
|
369
|
+
if (error.message.includes("Failed to fetch dynamically imported module") && error.message.includes("node_modules/.vite")) {
|
|
370
|
+
console.error(error);
|
|
371
|
+
console.log("Outdated chunk detected, reloading page...");
|
|
372
|
+
window.location.reload();
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
(loggerContext ? childLogger(loggerContext) : logger$1).error("@error @info", error, info);
|
|
376
|
+
onError?.(error, info);
|
|
377
|
+
};
|
|
378
|
+
return /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
379
|
+
fallbackRender: hasCustomFallback(props) ? props.fallbackRender : getFallbackComponent(props.variant, props.fallbackMessage),
|
|
380
|
+
onError: handleError,
|
|
381
|
+
resetKeys,
|
|
382
|
+
children
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
//#endregion
|
|
386
|
+
//#region src/components/app-container.tsx
|
|
387
|
+
function AppContainer() {
|
|
388
|
+
const [selectedDrive] = useSelectedDrive();
|
|
389
|
+
const selectedDocumentId = useSelectedDocumentId();
|
|
390
|
+
const app = useAppModuleById(selectedDrive.header.meta?.preferredEditor);
|
|
391
|
+
const defaultApp = useDefaultAppModule();
|
|
392
|
+
const AppComponent = app?.Component ?? defaultApp?.Component ?? GenericDriveExplorer.Component;
|
|
393
|
+
if (!AppComponent) throw new Error("No app component found");
|
|
394
|
+
return /* @__PURE__ */ jsx(ErrorBoundary$1, {
|
|
395
|
+
variant: "detailed",
|
|
396
|
+
resetKeys: [selectedDrive.header.id],
|
|
397
|
+
loggerContext: ["Connect", "App"],
|
|
398
|
+
children: /* @__PURE__ */ jsx(Suspense, {
|
|
399
|
+
fallback: /* @__PURE__ */ jsx(EditorLoader, {}),
|
|
400
|
+
children: /* @__PURE__ */ jsx(DropZoneWrapper, {
|
|
401
|
+
className: "flex h-full flex-col overflow-auto",
|
|
402
|
+
children: /* @__PURE__ */ jsx(AppComponent, { children: selectedDocumentId ? /* @__PURE__ */ jsx(DocumentEditorContainer, {}) : null })
|
|
403
|
+
})
|
|
404
|
+
})
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
//#endregion
|
|
408
|
+
//#region src/utils/browser.ts
|
|
409
|
+
function getBasePath() {
|
|
410
|
+
if (typeof document === "undefined") return "/";
|
|
411
|
+
return document.querySelector("base")?.getAttribute("href") || "/";
|
|
412
|
+
}
|
|
413
|
+
//#endregion
|
|
414
|
+
//#region src/utils/document-editor-debug-tools.ts
|
|
415
|
+
var DocumentEditorDebugTools = class {
|
|
416
|
+
document;
|
|
417
|
+
operations = [];
|
|
418
|
+
constructor(document) {
|
|
419
|
+
if (document) this.document = document;
|
|
420
|
+
}
|
|
421
|
+
operationsToTableObject(operations) {
|
|
422
|
+
return operations.map((op) => ({
|
|
423
|
+
...op,
|
|
424
|
+
input: JSON.stringify(op.action.input)
|
|
425
|
+
}));
|
|
426
|
+
}
|
|
427
|
+
setDocument(document) {
|
|
428
|
+
this.document = document;
|
|
429
|
+
}
|
|
430
|
+
getDocument() {
|
|
431
|
+
return this.document;
|
|
432
|
+
}
|
|
433
|
+
getOperations() {
|
|
434
|
+
return this.operations;
|
|
435
|
+
}
|
|
436
|
+
pushOperation(operation) {
|
|
437
|
+
this.operations.push(operation);
|
|
438
|
+
}
|
|
439
|
+
operationsTable() {
|
|
440
|
+
if (!this.document) console.warn("No document");
|
|
441
|
+
const ops = Object.values(this.document?.operations || {}).filter((array) => array !== void 0).flatMap((array) => array).sort((a, b) => a.index - b.index);
|
|
442
|
+
console.table(this.operationsToTableObject(ops));
|
|
443
|
+
}
|
|
444
|
+
scopeOperationsTable(scope) {
|
|
445
|
+
if (!this.document) console.warn("No document");
|
|
446
|
+
const ops = this.document?.operations[scope] || [];
|
|
447
|
+
console.table(this.operationsToTableObject(ops));
|
|
448
|
+
}
|
|
449
|
+
operationsLog() {
|
|
450
|
+
console.log(this.operations);
|
|
451
|
+
}
|
|
452
|
+
operationsLogTable() {
|
|
453
|
+
console.table(this.operationsToTableObject(this.operations));
|
|
454
|
+
}
|
|
455
|
+
clear() {
|
|
456
|
+
this.operations = [];
|
|
457
|
+
this.document = void 0;
|
|
458
|
+
}
|
|
459
|
+
};
|
|
460
|
+
//#endregion
|
|
461
|
+
//#region src/components/migration-status.ts
|
|
462
|
+
let current = null;
|
|
463
|
+
const listeners$1 = /* @__PURE__ */ new Set();
|
|
464
|
+
function setMigrationStatus(status) {
|
|
465
|
+
current = status;
|
|
466
|
+
for (const l of listeners$1) l();
|
|
467
|
+
}
|
|
468
|
+
function getMigrationStatus() {
|
|
469
|
+
return current;
|
|
470
|
+
}
|
|
471
|
+
function subscribeMigrationStatus(cb) {
|
|
472
|
+
listeners$1.add(cb);
|
|
473
|
+
return () => {
|
|
474
|
+
listeners$1.delete(cb);
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
//#endregion
|
|
478
|
+
//#region src/utils/pglite-migration.ts
|
|
479
|
+
const BACKUP_PREFIX = "ph-pglite-backup::";
|
|
480
|
+
const BACKUP_INDEX_KEY = "ph:pglite-backups";
|
|
481
|
+
const BACKUP_RETENTION_MS = 720 * 60 * 60 * 1e3;
|
|
482
|
+
const LEGACY_DUMPERS = { 16: async () => {
|
|
483
|
+
const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([import("pglite-legacy-02"), import("pglite-tools-legacy-02/pg_dump")]);
|
|
484
|
+
return async (idbName) => {
|
|
485
|
+
const pg = new LegacyPGlite(`idb://${idbName.replace(/^\/pglite\//, "")}`);
|
|
486
|
+
try {
|
|
487
|
+
await pg.waitReady;
|
|
488
|
+
return await (await pgDump({ pg })).text();
|
|
489
|
+
} finally {
|
|
490
|
+
await pg.close();
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
} };
|
|
494
|
+
function deleteIdb(name, timeoutMs = 15e3) {
|
|
495
|
+
return new Promise((resolve, reject) => {
|
|
496
|
+
const req = indexedDB.deleteDatabase(name);
|
|
497
|
+
let settled = false;
|
|
498
|
+
const done = (fn) => {
|
|
499
|
+
if (settled) return;
|
|
500
|
+
settled = true;
|
|
501
|
+
fn();
|
|
502
|
+
};
|
|
503
|
+
const timer = setTimeout(() => done(() => reject(/* @__PURE__ */ new Error(`IDB delete timed out for ${name} after ${timeoutMs}ms`))), timeoutMs);
|
|
504
|
+
req.onsuccess = () => done(() => {
|
|
505
|
+
clearTimeout(timer);
|
|
506
|
+
resolve();
|
|
507
|
+
});
|
|
508
|
+
req.onerror = () => done(() => {
|
|
509
|
+
clearTimeout(timer);
|
|
510
|
+
reject(idbError(req, `IDB delete failed for ${name}`));
|
|
511
|
+
});
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
async function clearFileData(name) {
|
|
515
|
+
const db = await openIdb(name, 21, createFileDataStore);
|
|
516
|
+
try {
|
|
517
|
+
await new Promise((resolve, reject) => {
|
|
518
|
+
const tx = db.transaction(IDB_STORE_NAME, "readwrite");
|
|
519
|
+
tx.oncomplete = () => resolve();
|
|
520
|
+
tx.onerror = () => reject(idbError(tx, `FILE_DATA clear failed for ${name}`));
|
|
521
|
+
tx.onabort = () => reject(idbError(tx, `FILE_DATA clear aborted for ${name}`));
|
|
522
|
+
tx.objectStore(IDB_STORE_NAME).clear();
|
|
523
|
+
});
|
|
524
|
+
} finally {
|
|
525
|
+
db.close();
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
async function cloneFileData(sourceName, destName) {
|
|
529
|
+
const source = await openIdb(sourceName, 21, createFileDataStore);
|
|
530
|
+
try {
|
|
531
|
+
const dest = await openIdb(destName, 21, createFileDataStore);
|
|
532
|
+
try {
|
|
533
|
+
const readStore = source.transaction(IDB_STORE_NAME, "readonly").objectStore(IDB_STORE_NAME);
|
|
534
|
+
const entries = await new Promise((resolve, reject) => {
|
|
535
|
+
const out = [];
|
|
536
|
+
const req = readStore.openCursor();
|
|
537
|
+
req.onerror = () => reject(idbError(req, `FILE_DATA read cursor failed for ${sourceName}`));
|
|
538
|
+
req.onsuccess = () => {
|
|
539
|
+
const cursor = req.result;
|
|
540
|
+
if (!cursor) return resolve(out);
|
|
541
|
+
out.push({
|
|
542
|
+
key: cursor.key,
|
|
543
|
+
value: cursor.value
|
|
544
|
+
});
|
|
545
|
+
cursor.continue();
|
|
546
|
+
};
|
|
547
|
+
});
|
|
548
|
+
await new Promise((resolve, reject) => {
|
|
549
|
+
const writeTx = dest.transaction(IDB_STORE_NAME, "readwrite");
|
|
550
|
+
writeTx.oncomplete = () => resolve();
|
|
551
|
+
writeTx.onerror = () => reject(idbError(writeTx, `FILE_DATA write failed for ${destName}`));
|
|
552
|
+
writeTx.onabort = () => reject(idbError(writeTx, `FILE_DATA write aborted for ${destName}`));
|
|
553
|
+
const writeStore = writeTx.objectStore(IDB_STORE_NAME);
|
|
554
|
+
writeStore.clear();
|
|
555
|
+
for (const { key, value } of entries) writeStore.put(value, key);
|
|
556
|
+
});
|
|
557
|
+
} finally {
|
|
558
|
+
dest.close();
|
|
559
|
+
}
|
|
560
|
+
} finally {
|
|
561
|
+
source.close();
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
function readBackupIndex() {
|
|
565
|
+
try {
|
|
566
|
+
const raw = localStorage.getItem(BACKUP_INDEX_KEY);
|
|
567
|
+
if (!raw) return [];
|
|
568
|
+
const parsed = JSON.parse(raw);
|
|
569
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
570
|
+
} catch {
|
|
571
|
+
return [];
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
function writeBackupIndex(records) {
|
|
575
|
+
try {
|
|
576
|
+
localStorage.setItem(BACKUP_INDEX_KEY, JSON.stringify(records));
|
|
577
|
+
} catch {}
|
|
578
|
+
}
|
|
579
|
+
function registerBackup(rec) {
|
|
580
|
+
writeBackupIndex([...readBackupIndex(), rec]);
|
|
581
|
+
}
|
|
582
|
+
function forgetBackup(name) {
|
|
583
|
+
writeBackupIndex(readBackupIndex().filter((r) => r.name !== name));
|
|
584
|
+
}
|
|
585
|
+
async function janitor() {
|
|
586
|
+
const cutoff = Date.now() - BACKUP_RETENTION_MS;
|
|
587
|
+
const keep = [];
|
|
588
|
+
for (const rec of readBackupIndex()) {
|
|
589
|
+
if (rec.createdAt >= cutoff) {
|
|
590
|
+
keep.push(rec);
|
|
591
|
+
continue;
|
|
592
|
+
}
|
|
593
|
+
try {
|
|
594
|
+
await deleteIdb(rec.name);
|
|
595
|
+
} catch (err) {
|
|
596
|
+
console.warn(`Failed to delete expired pglite backup ${rec.name}`, err);
|
|
597
|
+
keep.push(rec);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
writeBackupIndex(keep);
|
|
601
|
+
}
|
|
602
|
+
function publishPhase(idbName, phase) {
|
|
603
|
+
setMigrationStatus({
|
|
604
|
+
idbName,
|
|
605
|
+
phase
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
async function migrateIdbIfNeeded(idbName) {
|
|
609
|
+
const major = await readPgVersionFile(idbName);
|
|
610
|
+
if (major === null || major === 17) return;
|
|
611
|
+
const loader = LEGACY_DUMPERS[major];
|
|
612
|
+
if (!loader) throw new Error(`Unsupported legacy PGlite data dir: PG_VERSION=${major} for ${idbName}`);
|
|
613
|
+
const backupName = `${BACKUP_PREFIX}${idbName}::${(/* @__PURE__ */ new Date()).toISOString()}`;
|
|
614
|
+
const backupRec = {
|
|
615
|
+
name: backupName,
|
|
616
|
+
idbName,
|
|
617
|
+
createdAt: Date.now()
|
|
618
|
+
};
|
|
619
|
+
publishPhase(idbName, "clone");
|
|
620
|
+
await cloneFileData(idbName, backupName);
|
|
621
|
+
registerBackup(backupRec);
|
|
622
|
+
let sql;
|
|
623
|
+
try {
|
|
624
|
+
publishPhase(idbName, "dump");
|
|
625
|
+
sql = await (await loader())(idbName);
|
|
626
|
+
} catch (err) {
|
|
627
|
+
await deleteIdb(backupName).catch(() => {});
|
|
628
|
+
forgetBackup(backupName);
|
|
629
|
+
throw err;
|
|
630
|
+
}
|
|
631
|
+
try {
|
|
632
|
+
await clearFileData(idbName);
|
|
633
|
+
publishPhase(idbName, "restore");
|
|
634
|
+
const pg = new PGlite(`idb://${idbName.replace(/^\/pglite\//, "")}`, { relaxedDurability: false });
|
|
635
|
+
try {
|
|
636
|
+
await pg.waitReady;
|
|
637
|
+
console.info(`[pglite-migration] Dump preamble (first 500 chars):\n${sql.slice(0, 500)}`);
|
|
638
|
+
try {
|
|
639
|
+
await pg.exec("SET standard_conforming_strings = off;");
|
|
640
|
+
} catch (gucErr) {
|
|
641
|
+
console.warn("[pglite-migration] Could not force standard_conforming_strings=off", gucErr);
|
|
642
|
+
}
|
|
643
|
+
try {
|
|
644
|
+
await pg.exec(sql);
|
|
645
|
+
} catch (execErr) {
|
|
646
|
+
logRestoreFailure(idbName, sql, execErr);
|
|
647
|
+
throw execErr;
|
|
648
|
+
}
|
|
649
|
+
} finally {
|
|
650
|
+
await pg.close();
|
|
651
|
+
}
|
|
652
|
+
} catch (err) {
|
|
653
|
+
await rollbackFromBackup(idbName, backupName, err);
|
|
654
|
+
throw err;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
function logRestoreFailure(idbName, sql, err) {
|
|
658
|
+
const errObj = err;
|
|
659
|
+
const position = typeof errObj.position === "string" ? parseInt(errObj.position, 10) : typeof errObj.position === "number" ? errObj.position : NaN;
|
|
660
|
+
console.error(`[pglite-migration] Restore failed for ${idbName}`, {
|
|
661
|
+
message: errObj.message,
|
|
662
|
+
code: errObj.code,
|
|
663
|
+
severity: errObj.severity,
|
|
664
|
+
detail: errObj.detail,
|
|
665
|
+
where: errObj.where,
|
|
666
|
+
position: errObj.position,
|
|
667
|
+
sqlLength: sql.length
|
|
668
|
+
});
|
|
669
|
+
if (Number.isFinite(position) && position > 0) {
|
|
670
|
+
const zeroBased = position - 1;
|
|
671
|
+
const start = Math.max(0, zeroBased - 200);
|
|
672
|
+
const end = Math.min(sql.length, zeroBased + 200);
|
|
673
|
+
const before = sql.slice(start, zeroBased);
|
|
674
|
+
const at = sql.slice(zeroBased, zeroBased + 1);
|
|
675
|
+
const after = sql.slice(zeroBased + 1, end);
|
|
676
|
+
console.error(`[pglite-migration] SQL context around position ${position}:\n${before}»${at}«${after}`);
|
|
677
|
+
const lineStart = sql.lastIndexOf("\n", zeroBased) + 1;
|
|
678
|
+
const lineEnd = sql.indexOf("\n", zeroBased);
|
|
679
|
+
const line = sql.slice(lineStart, lineEnd === -1 ? sql.length : lineEnd);
|
|
680
|
+
console.error(`[pglite-migration] Failing line (truncated to 500 chars):\n${line.slice(0, 500)}`);
|
|
681
|
+
} else console.error(`[pglite-migration] No position info. First 2000 chars of dump:\n${sql.slice(0, 2e3)}`);
|
|
682
|
+
}
|
|
683
|
+
async function rollbackFromBackup(idbName, backupName, originalError) {
|
|
684
|
+
try {
|
|
685
|
+
await clearFileData(idbName).catch(() => {});
|
|
686
|
+
await cloneFileData(backupName, idbName);
|
|
687
|
+
} catch (rollbackErr) {
|
|
688
|
+
console.error(`PGlite migration failed AND rollback failed for ${idbName}. Primary error:`, originalError, "Rollback error:", rollbackErr);
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
await deleteIdb(backupName).catch(() => {});
|
|
692
|
+
forgetBackup(backupName);
|
|
693
|
+
}
|
|
694
|
+
async function migrateAllLocked() {
|
|
695
|
+
for (const idbName of PRIMARY_IDB_NAMES) await migrateIdbIfNeeded(idbName);
|
|
696
|
+
setMigrationStatus(null);
|
|
697
|
+
}
|
|
698
|
+
async function migrateAllIfNeeded() {
|
|
699
|
+
janitor().catch((err) => console.warn("PGlite backup janitor failed", err));
|
|
700
|
+
if (!(typeof navigator !== "undefined" && "locks" in navigator && typeof navigator.locks.request === "function")) {
|
|
701
|
+
await migrateAllLocked();
|
|
702
|
+
return;
|
|
703
|
+
}
|
|
704
|
+
await navigator.locks.request("ph-pglite-migration", { mode: "exclusive" }, async () => {
|
|
705
|
+
await migrateAllLocked();
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
//#endregion
|
|
709
|
+
//#region src/components/app-skeleton.tsx
|
|
710
|
+
const LOADER_DELAY = 250;
|
|
711
|
+
const PHASE_LABEL = {
|
|
712
|
+
clone: "Backing up local database…",
|
|
713
|
+
dump: "Exporting data from previous version…",
|
|
714
|
+
restore: "Restoring data into the new database…"
|
|
715
|
+
};
|
|
716
|
+
const MigrationOverlay = () => {
|
|
717
|
+
const status = useSyncExternalStore(subscribeMigrationStatus, getMigrationStatus, () => null);
|
|
718
|
+
if (!status) return null;
|
|
719
|
+
return /* @__PURE__ */ jsx("div", {
|
|
720
|
+
className: "absolute inset-0 z-20 flex items-center justify-center",
|
|
721
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
722
|
+
className: "rounded-lg bg-white/90 px-6 py-4 text-sm text-gray-900 shadow-lg",
|
|
723
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
724
|
+
className: "font-medium",
|
|
725
|
+
children: "Upgrading local database…"
|
|
726
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
727
|
+
className: "text-gray-600",
|
|
728
|
+
children: PHASE_LABEL[status.phase]
|
|
729
|
+
})]
|
|
730
|
+
})
|
|
731
|
+
});
|
|
732
|
+
};
|
|
733
|
+
const Loader = ({ delay = LOADER_DELAY }) => {
|
|
734
|
+
const isSSR = typeof window === "undefined";
|
|
735
|
+
const showInitialLoader = typeof document !== "undefined" && document.body.getAttribute("data-show-loader") === "true";
|
|
736
|
+
const [showLoading, setShowLoading] = useState(!delay || showInitialLoader);
|
|
737
|
+
useEffect(() => {
|
|
738
|
+
const id = setTimeout(() => {
|
|
739
|
+
setShowLoading(true);
|
|
740
|
+
}, delay);
|
|
741
|
+
return () => clearTimeout(id);
|
|
742
|
+
}, []);
|
|
743
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
744
|
+
className: `skeleton-loader absolute inset-0 z-10 flex items-center justify-center ${showLoading ? "" : "hidden"}`,
|
|
745
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
746
|
+
className: "animate-pulse overflow-hidden rounded-full shadow-lg",
|
|
747
|
+
children: /* @__PURE__ */ jsx(AnimatedLoader, {})
|
|
748
|
+
}), isSSR ? /* @__PURE__ */ jsx("script", { dangerouslySetInnerHTML: { __html: `setTimeout(() => {
|
|
749
|
+
document.querySelector('.skeleton-loader')?.classList.remove('hidden');
|
|
750
|
+
document.body.setAttribute('data-show-loader', 'true');
|
|
751
|
+
}, ${delay})` } }) : null]
|
|
752
|
+
});
|
|
753
|
+
};
|
|
754
|
+
const AppSkeleton = (props) => {
|
|
755
|
+
const isSSR = typeof window === "undefined";
|
|
756
|
+
const isHomeScreen = !isSSR && window.location.pathname === getBasePath();
|
|
757
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
758
|
+
className: "flex h-screen overflow-hidden",
|
|
759
|
+
children: [
|
|
760
|
+
/* @__PURE__ */ jsx(ConnectSidebar, {
|
|
761
|
+
className: "animate-pulse",
|
|
762
|
+
onLogin: void 0,
|
|
763
|
+
onDisconnect: void 0,
|
|
764
|
+
onClickSettings: void 0,
|
|
765
|
+
address: void 0
|
|
766
|
+
}),
|
|
767
|
+
/* @__PURE__ */ jsx(HomeScreen, {
|
|
768
|
+
containerClassName: isSSR || !isHomeScreen ? "hidden home-screen" : void 0,
|
|
769
|
+
children: props.children ?? null
|
|
770
|
+
}),
|
|
771
|
+
isSSR ? /* @__PURE__ */ jsx("script", { dangerouslySetInnerHTML: { __html: `
|
|
772
|
+
const baseEl = document.querySelector('base');
|
|
773
|
+
const href = baseEl?.getAttribute('href');
|
|
774
|
+
const basePath = href || '/';
|
|
775
|
+
if (window.location.pathname === basePath) {
|
|
776
|
+
document.querySelector('.home-screen')?.classList.remove('hidden')
|
|
777
|
+
}` } }) : null,
|
|
778
|
+
!props.children ? /* @__PURE__ */ jsx(Loader, {}) : null,
|
|
779
|
+
/* @__PURE__ */ jsx(MigrationOverlay, {})
|
|
780
|
+
]
|
|
781
|
+
});
|
|
782
|
+
};
|
|
783
|
+
//#endregion
|
|
784
|
+
//#region src/components/migration-banner.tsx
|
|
785
|
+
let dismissed = false;
|
|
786
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
787
|
+
function notify() {
|
|
788
|
+
for (const l of listeners) l();
|
|
789
|
+
}
|
|
790
|
+
function dismiss() {
|
|
791
|
+
dismissed = true;
|
|
792
|
+
notify();
|
|
793
|
+
}
|
|
794
|
+
function subscribeDismissed(cb) {
|
|
795
|
+
listeners.add(cb);
|
|
796
|
+
return () => {
|
|
797
|
+
listeners.delete(cb);
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
function getDismissed() {
|
|
801
|
+
return dismissed;
|
|
802
|
+
}
|
|
803
|
+
const MigrationBanner = () => {
|
|
804
|
+
const isDismissed = useSyncExternalStore(subscribeDismissed, getDismissed, () => false);
|
|
805
|
+
const major = useSyncExternalStore(subscribeReactorPgMajor, getCachedReactorPgMajor, () => void 0);
|
|
806
|
+
const [migrating, setMigrating] = useState(false);
|
|
807
|
+
const [error, setError] = useState(null);
|
|
808
|
+
if (major === void 0 || major === null || major === 17) return null;
|
|
809
|
+
if (isDismissed) return null;
|
|
810
|
+
const handleMigrate = () => {
|
|
811
|
+
setError(null);
|
|
812
|
+
setMigrating(true);
|
|
813
|
+
migrateAllIfNeeded().then(() => {
|
|
814
|
+
window.location.reload();
|
|
815
|
+
}).catch((err) => {
|
|
816
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
817
|
+
setMigrating(false);
|
|
818
|
+
});
|
|
819
|
+
};
|
|
820
|
+
return /* @__PURE__ */ jsx("div", {
|
|
821
|
+
className: "absolute inset-x-0 top-0 z-30 flex justify-center p-3",
|
|
822
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
823
|
+
className: "flex max-w-3xl items-center gap-3 rounded-lg border border-yellow-500 bg-yellow-400 px-4 py-3 text-sm text-gray-900 shadow-lg",
|
|
824
|
+
children: [
|
|
825
|
+
/* @__PURE__ */ jsxs("div", {
|
|
826
|
+
className: "flex-1",
|
|
827
|
+
children: [
|
|
828
|
+
/* @__PURE__ */ jsxs("div", {
|
|
829
|
+
className: "font-semibold",
|
|
830
|
+
children: [
|
|
831
|
+
"Your local database uses Postgres ",
|
|
832
|
+
major,
|
|
833
|
+
"."
|
|
834
|
+
]
|
|
835
|
+
}),
|
|
836
|
+
/* @__PURE__ */ jsxs("div", {
|
|
837
|
+
className: "text-gray-800",
|
|
838
|
+
children: [
|
|
839
|
+
"Migrate to Postgres ",
|
|
840
|
+
17,
|
|
841
|
+
" to pick up the latest features. Your data will be backed up first."
|
|
842
|
+
]
|
|
843
|
+
}),
|
|
844
|
+
error && /* @__PURE__ */ jsxs("div", {
|
|
845
|
+
className: "mt-2 font-medium text-red-900",
|
|
846
|
+
children: ["Migration failed: ", error]
|
|
847
|
+
})
|
|
848
|
+
]
|
|
849
|
+
}),
|
|
850
|
+
/* @__PURE__ */ jsx("button", {
|
|
851
|
+
type: "button",
|
|
852
|
+
disabled: migrating,
|
|
853
|
+
onClick: handleMigrate,
|
|
854
|
+
className: "rounded-sm bg-gray-900 px-3 py-1 text-sm font-medium text-white hover:bg-gray-800 disabled:opacity-50",
|
|
855
|
+
children: migrating ? "Migrating…" : "Migrate now"
|
|
856
|
+
}),
|
|
857
|
+
/* @__PURE__ */ jsx("button", {
|
|
858
|
+
type: "button",
|
|
859
|
+
disabled: migrating,
|
|
860
|
+
onClick: dismiss,
|
|
861
|
+
className: "rounded-sm border border-gray-900 bg-transparent px-3 py-1 text-sm font-medium text-gray-900 hover:bg-gray-900/10 disabled:opacity-50",
|
|
862
|
+
children: "Dismiss"
|
|
863
|
+
})
|
|
864
|
+
]
|
|
865
|
+
})
|
|
866
|
+
});
|
|
867
|
+
};
|
|
868
|
+
//#endregion
|
|
869
|
+
//#region src/components/modal/modals-container.tsx
|
|
870
|
+
const AddDriveModal$1 = lazy(() => import("./AddDriveModal-ZK9-BWMB.js").then((m) => ({ default: m.AddDriveModal })));
|
|
871
|
+
const ClearStorageModal = lazy(() => import("./ClearStorageModal-Bfb3ube7.js").then((m) => ({ default: m.ClearStorageModal })));
|
|
872
|
+
const CookiesPolicyModal = lazy(() => import("./CookiesPolicyModal-DiXQV82b.js").then((m) => ({ default: m.CookiesPolicyModal })));
|
|
873
|
+
const CreateDocumentModal$1 = lazy(() => import("./CreateDocumentModal-BhJh4nWt.js").then((m) => ({ default: m.CreateDocumentModal })));
|
|
874
|
+
const DebugSettingsModal = lazy(() => import("./DebugSettingsModal-BvOhyXeo.js").then((m) => ({ default: m.DebugSettingsModal })));
|
|
875
|
+
const DeleteDriveModal = lazy(() => import("./DeleteDriveModal-CbuIdjKY.js").then((m) => ({ default: m.DeleteDriveModal })));
|
|
876
|
+
const DeleteItemModal = lazy(() => import("./DeleteItemModal-9ErYlauT.js").then((m) => ({ default: m.DeleteItemModal })));
|
|
877
|
+
const DisclaimerModal = lazy(() => import("./DisclaimerModal-CfDeiBz8.js").then((m) => ({ default: m.DisclaimerModal })));
|
|
878
|
+
const DriveSettingsModal$1 = lazy(() => import("./DriveSettingsModal-DEk05PS7.js").then((m) => ({ default: m.DriveSettingsModal })));
|
|
879
|
+
const DownloadDocumentWithErrorsModal = lazy(() => import("./DownloadDocumentWithErrorsModal-KZGWQ4J7.js").then((m) => ({ default: m.DownloadDocumentWithErrorsModal })));
|
|
880
|
+
const SettingsModal$1 = lazy(() => import("./SettingsModal-2xX1Pgo0.js").then((m) => ({ default: m.SettingsModal })));
|
|
881
|
+
const UpgradeDriveModal = lazy(() => import("./UpgradeDriveModal-BwI5E5k3.js").then((m) => ({ default: m.UpgradeDriveModal })));
|
|
882
|
+
const modalComponents = {
|
|
883
|
+
addDrive: AddDriveModal$1,
|
|
884
|
+
clearStorage: ClearStorageModal,
|
|
885
|
+
cookiesPolicy: CookiesPolicyModal,
|
|
886
|
+
createDocument: CreateDocumentModal$1,
|
|
887
|
+
debugSettings: DebugSettingsModal,
|
|
888
|
+
deleteDrive: DeleteDriveModal,
|
|
889
|
+
deleteItem: DeleteItemModal,
|
|
890
|
+
disclaimer: DisclaimerModal,
|
|
891
|
+
driveSettings: DriveSettingsModal$1,
|
|
892
|
+
downloadDocumentWithErrors: DownloadDocumentWithErrorsModal,
|
|
893
|
+
inspector: lazy(() => import("./InspectorModal-DV7lUbNo.js").then((m) => ({ default: m.InspectorModal }))),
|
|
894
|
+
settings: SettingsModal$1,
|
|
895
|
+
upgradeDrive: UpgradeDriveModal,
|
|
896
|
+
missingPackage: lazy(() => import("./MissingPackageModal-B2EAV_VJ.js").then((m) => ({ default: m.ConnectMissingPackageModal })))
|
|
897
|
+
};
|
|
898
|
+
const ModalsContainer = lazy(async () => {
|
|
899
|
+
return { default: () => {
|
|
900
|
+
const phModal = usePHModal();
|
|
901
|
+
if (!phModal?.type) return null;
|
|
902
|
+
const ModalComponent = modalComponents[phModal.type];
|
|
903
|
+
return ModalComponent ? /* @__PURE__ */ jsx(ErrorBoundary$1, {
|
|
904
|
+
variant: "silent",
|
|
905
|
+
loggerContext: ["Connect", "Modals"],
|
|
906
|
+
children: /* @__PURE__ */ jsx(Suspense, {
|
|
907
|
+
fallback: null,
|
|
908
|
+
children: /* @__PURE__ */ jsx(ModalComponent, {})
|
|
909
|
+
})
|
|
910
|
+
}) : null;
|
|
911
|
+
} };
|
|
912
|
+
});
|
|
913
|
+
//#endregion
|
|
914
|
+
//#region src/components/app-loader.tsx
|
|
915
|
+
const AppLoader = (props) => {
|
|
916
|
+
const Load = lazy(() => import("./load-BVA6Yfno.js").then((m) => m.loadComponent(props.localPackage)));
|
|
917
|
+
return /* @__PURE__ */ jsx(StrictMode, { children: /* @__PURE__ */ jsxs(ErrorBoundary$1, {
|
|
918
|
+
fallbackRender: (props) => /* @__PURE__ */ jsx(AppSkeleton, { children: /* @__PURE__ */ jsx(DetailedFallback, { ...props }) }),
|
|
919
|
+
resetKeys: [props.localPackage],
|
|
920
|
+
loggerContext: ["Connect"],
|
|
921
|
+
children: [
|
|
922
|
+
/* @__PURE__ */ jsx(Suspense, {
|
|
923
|
+
fallback: /* @__PURE__ */ jsx(AppSkeleton, {}),
|
|
924
|
+
name: "AppLoader",
|
|
925
|
+
children: /* @__PURE__ */ jsx(Load, {
|
|
926
|
+
...props,
|
|
927
|
+
children: /* @__PURE__ */ jsx(App, {})
|
|
928
|
+
})
|
|
929
|
+
}),
|
|
930
|
+
/* @__PURE__ */ jsx(Suspense, {
|
|
931
|
+
name: "CookieBanner",
|
|
932
|
+
children: /* @__PURE__ */ jsx(CookieBanner$1, {})
|
|
933
|
+
}),
|
|
934
|
+
/* @__PURE__ */ jsx(Suspense, {
|
|
935
|
+
name: "ModalsContainer",
|
|
936
|
+
children: /* @__PURE__ */ jsx(ModalsContainer, {})
|
|
937
|
+
}),
|
|
938
|
+
/* @__PURE__ */ jsx(MigrationBanner, {})
|
|
939
|
+
]
|
|
940
|
+
}) });
|
|
941
|
+
};
|
|
942
|
+
//#endregion
|
|
943
|
+
//#region src/context/sentry-provider.tsx
|
|
944
|
+
const SentryProvider = ({ children }) => {
|
|
945
|
+
useInitSentry();
|
|
946
|
+
return children;
|
|
947
|
+
};
|
|
948
|
+
//#endregion
|
|
949
|
+
//#region src/components/missing-model-banner.tsx
|
|
950
|
+
const reasonLabels = {
|
|
951
|
+
"no-registry": "No package registry is configured.",
|
|
952
|
+
"not-in-registry": "No matching package found in the registry.",
|
|
953
|
+
"registry-error": "Couldn't reach the package registry.",
|
|
954
|
+
"install-failed": "Package failed to install.",
|
|
955
|
+
dismissed: "Installation was dismissed."
|
|
956
|
+
};
|
|
957
|
+
function canRetry(reason) {
|
|
958
|
+
return reason !== "no-registry";
|
|
959
|
+
}
|
|
960
|
+
function MissingModelBanner() {
|
|
961
|
+
const failed = useFailedInstallations();
|
|
962
|
+
const [open, setOpen] = useState(false);
|
|
963
|
+
if (failed.length === 0) return null;
|
|
964
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
|
|
965
|
+
className: "flex items-center justify-between gap-3 bg-amber-100 px-4 py-2 text-sm text-amber-900",
|
|
966
|
+
children: [/* @__PURE__ */ jsx("span", { children: failed.length === 1 ? "1 document type couldn't load (missing model)." : `${failed.length} document types couldn't load (missing models).` }), /* @__PURE__ */ jsx("button", {
|
|
967
|
+
type: "button",
|
|
968
|
+
onClick: () => setOpen(true),
|
|
969
|
+
className: "rounded-md border border-amber-300 bg-white px-3 py-1 text-amber-900 hover:bg-amber-50",
|
|
970
|
+
children: "View"
|
|
971
|
+
})]
|
|
972
|
+
}), /* @__PURE__ */ jsx(MissingModelDetailsModal, {
|
|
973
|
+
open,
|
|
974
|
+
failed,
|
|
975
|
+
onClose: () => setOpen(false)
|
|
976
|
+
})] });
|
|
977
|
+
}
|
|
978
|
+
function MissingModelDetailsModal(props) {
|
|
979
|
+
const { open, failed, onClose } = props;
|
|
980
|
+
const discoveryService = usePackageDiscoveryService();
|
|
981
|
+
const [retrying, setRetrying] = useState(() => /* @__PURE__ */ new Set());
|
|
982
|
+
async function handleRetry(documentType) {
|
|
983
|
+
if (!discoveryService) return;
|
|
984
|
+
setRetrying((prev) => new Set(prev).add(documentType));
|
|
985
|
+
try {
|
|
986
|
+
await discoveryService.retryInstallation(documentType);
|
|
987
|
+
} finally {
|
|
988
|
+
setRetrying((prev) => {
|
|
989
|
+
const next = new Set(prev);
|
|
990
|
+
next.delete(documentType);
|
|
991
|
+
return next;
|
|
992
|
+
});
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
return /* @__PURE__ */ jsx(Modal, {
|
|
996
|
+
open,
|
|
997
|
+
onOpenChange: (isOpen) => {
|
|
998
|
+
if (!isOpen) onClose();
|
|
999
|
+
},
|
|
1000
|
+
contentProps: { className: "rounded-3xl" },
|
|
1001
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
1002
|
+
className: "w-[520px] max-w-[90vw] p-6",
|
|
1003
|
+
children: [
|
|
1004
|
+
/* @__PURE__ */ jsx("div", {
|
|
1005
|
+
className: "border-b border-slate-100 pb-2 text-2xl font-bold text-gray-800",
|
|
1006
|
+
children: "Missing document models"
|
|
1007
|
+
}),
|
|
1008
|
+
/* @__PURE__ */ jsx("div", {
|
|
1009
|
+
className: "my-4 text-sm text-gray-600",
|
|
1010
|
+
children: "The following document types couldn't be loaded. Documents using them won't display until the underlying package is installed."
|
|
1011
|
+
}),
|
|
1012
|
+
failed.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
1013
|
+
className: "rounded-xl bg-slate-50 p-4 text-sm text-gray-600",
|
|
1014
|
+
children: "No outstanding failures."
|
|
1015
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
1016
|
+
className: "flex max-h-[60vh] flex-col gap-3 overflow-y-auto",
|
|
1017
|
+
children: failed.map((entry) => {
|
|
1018
|
+
const isRetrying = retrying.has(entry.documentType);
|
|
1019
|
+
const retryDisabled = !canRetry(entry.reason) || isRetrying;
|
|
1020
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
1021
|
+
className: "rounded-xl bg-slate-50 p-4",
|
|
1022
|
+
children: [
|
|
1023
|
+
/* @__PURE__ */ jsx("div", {
|
|
1024
|
+
className: "mb-1 font-mono text-sm font-semibold text-gray-800",
|
|
1025
|
+
children: entry.documentType
|
|
1026
|
+
}),
|
|
1027
|
+
/* @__PURE__ */ jsx("div", {
|
|
1028
|
+
className: "mb-2 text-xs text-gray-600",
|
|
1029
|
+
children: reasonLabels[entry.reason]
|
|
1030
|
+
}),
|
|
1031
|
+
entry.packageNames.length > 0 ? /* @__PURE__ */ jsxs("div", {
|
|
1032
|
+
className: "mb-2 text-xs text-gray-500",
|
|
1033
|
+
children: [
|
|
1034
|
+
"Package",
|
|
1035
|
+
entry.packageNames.length > 1 ? "s" : "",
|
|
1036
|
+
":",
|
|
1037
|
+
" ",
|
|
1038
|
+
entry.packageNames.join(", ")
|
|
1039
|
+
]
|
|
1040
|
+
}) : null,
|
|
1041
|
+
entry.error ? /* @__PURE__ */ jsx("div", {
|
|
1042
|
+
className: "mb-2 font-mono text-xs wrap-break-word text-red-700",
|
|
1043
|
+
children: entry.error.message
|
|
1044
|
+
}) : null,
|
|
1045
|
+
/* @__PURE__ */ jsx("div", {
|
|
1046
|
+
className: "flex justify-end",
|
|
1047
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
1048
|
+
type: "button",
|
|
1049
|
+
onClick: () => void handleRetry(entry.documentType),
|
|
1050
|
+
disabled: retryDisabled,
|
|
1051
|
+
title: canRetry(entry.reason) ? void 0 : "No registry is configured; nothing to retry against.",
|
|
1052
|
+
className: twMerge("min-h-[32px] rounded-xl px-3 py-1 text-sm font-semibold text-white transition-all hover:scale-105", retryDisabled ? "cursor-not-allowed bg-gray-300 hover:scale-100" : "bg-gray-800 active:opacity-75"),
|
|
1053
|
+
children: isRetrying ? "Retrying..." : "Try install again"
|
|
1054
|
+
})
|
|
1055
|
+
})
|
|
1056
|
+
]
|
|
1057
|
+
}, entry.documentType);
|
|
1058
|
+
})
|
|
1059
|
+
}),
|
|
1060
|
+
/* @__PURE__ */ jsx("div", {
|
|
1061
|
+
className: "mt-4 flex justify-end",
|
|
1062
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
1063
|
+
type: "button",
|
|
1064
|
+
onClick: onClose,
|
|
1065
|
+
className: "min-h-[36px] rounded-xl border border-slate-200 bg-white px-4 py-2 text-sm font-semibold text-slate-800 hover:bg-slate-50",
|
|
1066
|
+
children: "Close"
|
|
1067
|
+
})
|
|
1068
|
+
})
|
|
1069
|
+
]
|
|
1070
|
+
})
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1073
|
+
//#endregion
|
|
1074
|
+
//#region src/components/package-install-prompt.tsx
|
|
1075
|
+
function PackageInstallPrompt() {
|
|
1076
|
+
const pendingInstallations = usePendingInstallations();
|
|
1077
|
+
const discoveryService = usePackageDiscoveryService();
|
|
1078
|
+
if (!discoveryService || pendingInstallations.length === 0) return null;
|
|
1079
|
+
return /* @__PURE__ */ jsx(PackageInstallModal, {
|
|
1080
|
+
pendingInstallations: pendingInstallations.flatMap((p) => p.packageNames.map((packageName) => ({
|
|
1081
|
+
documentType: p.documentType,
|
|
1082
|
+
packageName
|
|
1083
|
+
}))),
|
|
1084
|
+
onInstall: (packageName) => discoveryService.approveInstallation(packageName),
|
|
1085
|
+
onDismiss: (packageName) => discoveryService.dismissInstallation(packageName)
|
|
1086
|
+
});
|
|
1087
|
+
}
|
|
1088
|
+
//#endregion
|
|
1089
|
+
//#region src/components/app.tsx
|
|
1090
|
+
const App = () => {
|
|
1091
|
+
useEffect(() => {
|
|
1092
|
+
const handlePreloadError = (event) => {
|
|
1093
|
+
const payload = event.payload;
|
|
1094
|
+
const failedUrl = (payload instanceof Error ? payload.message : String(payload ?? "")).match(/https?:\/\/[^\s"']+/)?.[0];
|
|
1095
|
+
if (failedUrl && !failedUrl.startsWith(window.location.origin)) {
|
|
1096
|
+
console.debug(`[Connect] Skipping reload — vite:preloadError for off-origin URL: ${failedUrl}`);
|
|
1097
|
+
return;
|
|
1098
|
+
}
|
|
1099
|
+
console.log("Outdated chunks detected, reloading page...");
|
|
1100
|
+
window.location.reload();
|
|
1101
|
+
};
|
|
1102
|
+
window.addEventListener("vite:preloadError", handlePreloadError);
|
|
1103
|
+
return () => {
|
|
1104
|
+
window.removeEventListener("vite:preloadError", handlePreloadError);
|
|
1105
|
+
};
|
|
1106
|
+
}, []);
|
|
1107
|
+
useEffect(() => {
|
|
1108
|
+
if (import.meta.env.MODE === "development") window.documentEditorDebugTools = new DocumentEditorDebugTools();
|
|
1109
|
+
else serviceWorkerManager.registerServiceWorker(false);
|
|
1110
|
+
}, []);
|
|
1111
|
+
return /* @__PURE__ */ jsxs(SentryProvider, { children: [
|
|
1112
|
+
/* @__PURE__ */ jsx(ToastContainer, { position: "bottom-right" }),
|
|
1113
|
+
/* @__PURE__ */ jsx(MissingModelBanner, {}),
|
|
1114
|
+
/* @__PURE__ */ jsx(Router, {}),
|
|
1115
|
+
/* @__PURE__ */ jsx(PackageInstallPrompt, {}),
|
|
1116
|
+
/* @__PURE__ */ jsx(Analytics, {})
|
|
1117
|
+
] });
|
|
1118
|
+
};
|
|
1119
|
+
//#endregion
|
|
1120
|
+
//#region src/components/cookie-banner.tsx
|
|
1121
|
+
const isCookieAccepted = (cookies, id) => {
|
|
1122
|
+
return cookies.some((cookie) => cookie.id === id && cookie.value);
|
|
1123
|
+
};
|
|
1124
|
+
const CookieBanner$1 = () => {
|
|
1125
|
+
const { t } = useTranslation(void 0, {
|
|
1126
|
+
useSuspense: true,
|
|
1127
|
+
i18n
|
|
1128
|
+
});
|
|
1129
|
+
const [showBanner, setShowBanner] = useCookieBanner();
|
|
1130
|
+
const [, setAcceptedCookies] = useAcceptedCookies();
|
|
1131
|
+
const cookiesInput = [{
|
|
1132
|
+
id: "analytics-cookie",
|
|
1133
|
+
label: t("cookieBanner.cookies.analytics"),
|
|
1134
|
+
value: true
|
|
1135
|
+
}];
|
|
1136
|
+
const handleAccept = (cookies) => {
|
|
1137
|
+
setShowBanner(false);
|
|
1138
|
+
if (isCookieAccepted(cookies, "analytics-cookie")) setAcceptedCookies((acceptedCookies) => ({
|
|
1139
|
+
...acceptedCookies,
|
|
1140
|
+
analytics: true
|
|
1141
|
+
}));
|
|
1142
|
+
};
|
|
1143
|
+
const handleReject = () => {
|
|
1144
|
+
setShowBanner(false);
|
|
1145
|
+
setAcceptedCookies(() => ({
|
|
1146
|
+
analytics: false,
|
|
1147
|
+
functional: false,
|
|
1148
|
+
marketing: false
|
|
1149
|
+
}));
|
|
1150
|
+
};
|
|
1151
|
+
if (!showBanner) return null;
|
|
1152
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
1153
|
+
className: "absolute inset-0 z-10000 backdrop-blur-sm",
|
|
1154
|
+
children: [/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black opacity-15" }), /* @__PURE__ */ jsx("div", {
|
|
1155
|
+
className: "absolute inset-x-0 bottom-0 flex justify-center bg-white px-10 pt-10 pb-16 shadow-lg",
|
|
1156
|
+
children: /* @__PURE__ */ jsx(CookieBanner, {
|
|
1157
|
+
className: "max-w-[1024px]",
|
|
1158
|
+
cookies: cookiesInput,
|
|
1159
|
+
onSubmit: handleAccept,
|
|
1160
|
+
onReject: handleReject,
|
|
1161
|
+
submitLabel: t("cookieBanner.accept"),
|
|
1162
|
+
rejectLabel: t("cookieBanner.reject"),
|
|
1163
|
+
children: /* @__PURE__ */ jsx("p", {
|
|
1164
|
+
className: "font-semibold text-gray-500",
|
|
1165
|
+
children: /* @__PURE__ */ jsx(Trans, {
|
|
1166
|
+
i18nKey: "cookieBanner.message",
|
|
1167
|
+
components: { a: /* @__PURE__ */ jsx("a", {
|
|
1168
|
+
onClick: () => showPHModal({ type: "cookiesPolicy" }),
|
|
1169
|
+
className: "cursor-pointer text-gray-900 hover:underline"
|
|
1170
|
+
}, "cookieBanner.message-link") }
|
|
1171
|
+
}, "cookieBanner.message")
|
|
1172
|
+
})
|
|
1173
|
+
})
|
|
1174
|
+
})]
|
|
1175
|
+
});
|
|
1176
|
+
};
|
|
1177
|
+
//#endregion
|
|
1178
|
+
//#region src/components/drive-icon.tsx
|
|
1179
|
+
function DriveIcon({ drive }) {
|
|
1180
|
+
const remotes = useSyncList();
|
|
1181
|
+
const isRemoteDrive = useMemo(() => {
|
|
1182
|
+
if (!drive) return false;
|
|
1183
|
+
return remotes.some((remote) => remote.collectionId === driveCollectionId("main", drive.header.id));
|
|
1184
|
+
}, [remotes, drive]);
|
|
1185
|
+
const driveIconSrc = drive?.state.global.icon;
|
|
1186
|
+
if (driveIconSrc) return /* @__PURE__ */ jsx("img", {
|
|
1187
|
+
src: driveIconSrc,
|
|
1188
|
+
alt: drive.header.name,
|
|
1189
|
+
height: 32,
|
|
1190
|
+
width: 32
|
|
1191
|
+
});
|
|
1192
|
+
if (!isRemoteDrive) return /* @__PURE__ */ jsx(Icon, {
|
|
1193
|
+
name: "Hdd",
|
|
1194
|
+
size: 32
|
|
1195
|
+
});
|
|
1196
|
+
return /* @__PURE__ */ jsx(Icon, {
|
|
1197
|
+
name: "Server",
|
|
1198
|
+
size: 32
|
|
1199
|
+
});
|
|
1200
|
+
}
|
|
1201
|
+
//#endregion
|
|
1202
|
+
//#region src/components/editors.tsx
|
|
1203
|
+
function EditorError({ message }) {
|
|
1204
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1205
|
+
className: "flex size-full items-center justify-center",
|
|
1206
|
+
children: /* @__PURE__ */ jsx("h3", {
|
|
1207
|
+
className: "text-lg font-semibold",
|
|
1208
|
+
children: message
|
|
1209
|
+
})
|
|
1210
|
+
});
|
|
1211
|
+
}
|
|
1212
|
+
const DocumentEditor = (props) => {
|
|
1213
|
+
const { document: initialDocument } = props;
|
|
1214
|
+
const selectedTimelineItem = useSelectedTimelineItem();
|
|
1215
|
+
const revisionHistoryVisible = useRevisionHistoryVisible();
|
|
1216
|
+
const [document, dispatch] = useDocumentById(initialDocument.header.id);
|
|
1217
|
+
const documentId = document?.header.id ?? void 0;
|
|
1218
|
+
const documentName = document?.header.name ?? void 0;
|
|
1219
|
+
const documentType = document?.header.documentType ?? void 0;
|
|
1220
|
+
const preferredEditor = document?.header.meta?.preferredEditor ?? void 0;
|
|
1221
|
+
const { globalOperations, localOperations, isLoading: isLoadingOperations, refetch: refetchOperations } = useDocumentOperations(documentId);
|
|
1222
|
+
useEffect(() => {
|
|
1223
|
+
if (revisionHistoryVisible) refetchOperations();
|
|
1224
|
+
}, [revisionHistoryVisible, refetchOperations]);
|
|
1225
|
+
const globalRevisionNumber = document?.header.revision.global ?? 0;
|
|
1226
|
+
const localRevisionNumber = document?.header.revision.local ?? 0;
|
|
1227
|
+
const documentModelModule = useDocumentModelModuleById(documentType);
|
|
1228
|
+
const preferredEditorModule = useEditorModuleById(preferredEditor);
|
|
1229
|
+
const fallbackEditorModule = useFallbackEditorModule(documentType);
|
|
1230
|
+
const editorModule = preferredEditorModule ?? fallbackEditorModule;
|
|
1231
|
+
const isLoadingDocument = !document;
|
|
1232
|
+
const isLoadingEditor = editorModule && documentType && !editorModule.documentTypes.includes(documentType) && !editorModule.documentTypes.includes("*");
|
|
1233
|
+
const canUndo = globalRevisionNumber > 0 || localRevisionNumber > 0;
|
|
1234
|
+
const canRedo = !!document?.clipboard.length;
|
|
1235
|
+
const addUndoAction = () => dispatch(undo());
|
|
1236
|
+
const addRedoAction = () => dispatch(redo());
|
|
1237
|
+
useUndoRedoShortcuts({
|
|
1238
|
+
undo: addUndoAction,
|
|
1239
|
+
redo: addRedoAction,
|
|
1240
|
+
canUndo,
|
|
1241
|
+
canRedo
|
|
1242
|
+
});
|
|
1243
|
+
useEffect(() => {
|
|
1244
|
+
return () => {
|
|
1245
|
+
window.documentEditorDebugTools?.clear();
|
|
1246
|
+
};
|
|
1247
|
+
}, []);
|
|
1248
|
+
const [editorError, setEditorError] = useState(void 0);
|
|
1249
|
+
useEffect(() => {
|
|
1250
|
+
if (editorError && editorError.documentId !== documentId) setEditorError(void 0);
|
|
1251
|
+
}, [editorError, documentId]);
|
|
1252
|
+
const handleEditorError = (error, info) => {
|
|
1253
|
+
setEditorError({
|
|
1254
|
+
error,
|
|
1255
|
+
documentId,
|
|
1256
|
+
info
|
|
1257
|
+
});
|
|
1258
|
+
};
|
|
1259
|
+
if (isLoadingEditor) return /* @__PURE__ */ jsx(EditorLoader, { message: "Loading editor" });
|
|
1260
|
+
if (isLoadingDocument) return /* @__PURE__ */ jsx(EditorLoader, { message: "Loading document" });
|
|
1261
|
+
if (!documentModelModule) return /* @__PURE__ */ jsx(EditorError, { message: /* @__PURE__ */ jsxs("div", {
|
|
1262
|
+
className: "text-center leading-10",
|
|
1263
|
+
children: [/* @__PURE__ */ jsxs("p", { children: [
|
|
1264
|
+
"Unable to open the document because the document model \"",
|
|
1265
|
+
documentType,
|
|
1266
|
+
"\" is not supported."
|
|
1267
|
+
] }), /* @__PURE__ */ jsxs("p", { children: [
|
|
1268
|
+
"Go to the",
|
|
1269
|
+
" ",
|
|
1270
|
+
/* @__PURE__ */ jsx("button", {
|
|
1271
|
+
type: "button",
|
|
1272
|
+
className: "cursor-pointer underline",
|
|
1273
|
+
onClick: () => {
|
|
1274
|
+
showPHModal({ type: "settings" });
|
|
1275
|
+
},
|
|
1276
|
+
children: "package manager"
|
|
1277
|
+
}),
|
|
1278
|
+
" ",
|
|
1279
|
+
"to install this document model"
|
|
1280
|
+
] })]
|
|
1281
|
+
}) });
|
|
1282
|
+
if (!editorModule) return /* @__PURE__ */ jsx(EditorError, { message: /* @__PURE__ */ jsxs("div", {
|
|
1283
|
+
className: "text-center leading-10",
|
|
1284
|
+
children: [/* @__PURE__ */ jsx("p", { children: "Unable to open the document because no editor has been found" }), /* @__PURE__ */ jsxs("p", { children: [
|
|
1285
|
+
"Go to the",
|
|
1286
|
+
" ",
|
|
1287
|
+
/* @__PURE__ */ jsx("button", {
|
|
1288
|
+
type: "button",
|
|
1289
|
+
className: "cursor-pointer underline",
|
|
1290
|
+
onClick: () => {
|
|
1291
|
+
showPHModal({ type: "settings" });
|
|
1292
|
+
},
|
|
1293
|
+
children: "package manager"
|
|
1294
|
+
}),
|
|
1295
|
+
" ",
|
|
1296
|
+
"an editor for the \"$",
|
|
1297
|
+
documentType,
|
|
1298
|
+
"\" document type"
|
|
1299
|
+
] })]
|
|
1300
|
+
}) });
|
|
1301
|
+
const EditorComponent = editorModule.Component;
|
|
1302
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1303
|
+
className: "relative h-full",
|
|
1304
|
+
id: "document-editor-context",
|
|
1305
|
+
"data-editor": editorModule.config.id,
|
|
1306
|
+
"data-document-type": documentType,
|
|
1307
|
+
children: revisionHistoryVisible ? isLoadingOperations ? /* @__PURE__ */ jsx(EditorLoader, { message: "Loading operations" }) : /* @__PURE__ */ jsx(RevisionHistory, {
|
|
1308
|
+
documentTitle: documentName ?? "",
|
|
1309
|
+
documentId: documentId ?? "",
|
|
1310
|
+
globalOperations,
|
|
1311
|
+
localOperations,
|
|
1312
|
+
onClose: () => setRevisionHistoryVisible(false),
|
|
1313
|
+
documentState: document.state,
|
|
1314
|
+
onCopyState: () => {
|
|
1315
|
+
toast("Copied document state to clipboard", { type: "success" });
|
|
1316
|
+
},
|
|
1317
|
+
onCopyDocId: () => {
|
|
1318
|
+
toast("Copied document ID to clipboard", { type: "success" });
|
|
1319
|
+
}
|
|
1320
|
+
}, documentId) : /* @__PURE__ */ jsx(Suspense, {
|
|
1321
|
+
fallback: /* @__PURE__ */ jsx(EditorLoader, { message: "Loading editor" }),
|
|
1322
|
+
name: "EditorLoader",
|
|
1323
|
+
children: /* @__PURE__ */ jsx(ErrorBoundary$1, {
|
|
1324
|
+
fallbackRender: CenteredErrorMessage,
|
|
1325
|
+
resetKeys: [documentId],
|
|
1326
|
+
onError: handleEditorError,
|
|
1327
|
+
loggerContext: ["Connect", "DocumentEditor"],
|
|
1328
|
+
children: !editorError?.error && /* @__PURE__ */ jsx(EditorComponent, {
|
|
1329
|
+
context: {
|
|
1330
|
+
readMode: !!selectedTimelineItem,
|
|
1331
|
+
selectedTimelineRevision: getRevisionFromDate(selectedTimelineItem?.startDate, selectedTimelineItem?.endDate, globalOperations)
|
|
1332
|
+
},
|
|
1333
|
+
documentId: document.header.id
|
|
1334
|
+
}, documentId)
|
|
1335
|
+
})
|
|
1336
|
+
})
|
|
1337
|
+
});
|
|
1338
|
+
};
|
|
1339
|
+
//#endregion
|
|
1340
|
+
//#region src/components/root.tsx
|
|
1341
|
+
function Root() {
|
|
1342
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1343
|
+
className: "h-screen",
|
|
1344
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
1345
|
+
className: `flex h-screen items-stretch overflow-auto`,
|
|
1346
|
+
role: "presentation",
|
|
1347
|
+
tabIndex: 0,
|
|
1348
|
+
children: /* @__PURE__ */ jsxs(Suspense, {
|
|
1349
|
+
name: "Root",
|
|
1350
|
+
children: [/* @__PURE__ */ jsx(Sidebar, {}), /* @__PURE__ */ jsx("div", {
|
|
1351
|
+
className: "relative flex-1 overflow-auto",
|
|
1352
|
+
children: /* @__PURE__ */ jsx(Outlet, {})
|
|
1353
|
+
})]
|
|
1354
|
+
})
|
|
1355
|
+
})
|
|
1356
|
+
});
|
|
1357
|
+
}
|
|
1358
|
+
//#endregion
|
|
1359
|
+
//#region src/pages/content.tsx
|
|
1360
|
+
function Content() {
|
|
1361
|
+
const [selectedDrive] = useSelectedDriveSafe();
|
|
1362
|
+
const selectedFolder = useSelectedFolder();
|
|
1363
|
+
const selectedDocumentId = useSelectedDocumentId();
|
|
1364
|
+
useEffect(() => {
|
|
1365
|
+
if (!selectedDocumentId) setPHDocumentEditorConfig(defaultPHDocumentEditorConfig);
|
|
1366
|
+
}, [selectedDocumentId]);
|
|
1367
|
+
useEffect(() => {
|
|
1368
|
+
if (!selectedDrive) setPHAppConfig(defaultPHAppConfig);
|
|
1369
|
+
}, [selectedDrive]);
|
|
1370
|
+
return /* @__PURE__ */ jsx(ContentContainer, { children: !selectedDocumentId && !selectedDrive && !selectedFolder ? /* @__PURE__ */ jsx(HomeScreenContainer, {}) : /* @__PURE__ */ jsx(AppContainer, {}) });
|
|
1371
|
+
}
|
|
1372
|
+
function ContentContainer({ children }) {
|
|
1373
|
+
return /* @__PURE__ */ jsx("div", {
|
|
1374
|
+
className: "flex h-full flex-col overflow-auto",
|
|
1375
|
+
id: "content-view",
|
|
1376
|
+
children
|
|
1377
|
+
});
|
|
1378
|
+
}
|
|
1379
|
+
function DriveItem({ drive }) {
|
|
1380
|
+
const description = useAppModuleById(drive.header.meta?.preferredEditor)?.config.name || "Drive Explorer App";
|
|
1381
|
+
return /* @__PURE__ */ jsx(HomeScreenItem, {
|
|
1382
|
+
title: drive.state.global.name || drive.header.name,
|
|
1383
|
+
description,
|
|
1384
|
+
icon: /* @__PURE__ */ jsx(DriveIcon, { drive }),
|
|
1385
|
+
onClick: () => setSelectedDrive(drive)
|
|
1386
|
+
}, drive.header.id);
|
|
1387
|
+
}
|
|
1388
|
+
function HomeScreenContainer() {
|
|
1389
|
+
const drives = useDrives();
|
|
1390
|
+
const config = connectConfig;
|
|
1391
|
+
return /* @__PURE__ */ jsxs(HomeScreen, { children: [drives?.map((drive) => {
|
|
1392
|
+
return /* @__PURE__ */ jsx(DriveItem, { drive }, drive.header.id);
|
|
1393
|
+
}), config.drives.addDriveEnabled && /* @__PURE__ */ jsx(HomeScreenAddDriveItem, {})] });
|
|
1394
|
+
}
|
|
1395
|
+
//#endregion
|
|
1396
|
+
//#region src/components/router.tsx
|
|
1397
|
+
function createRouter(routes) {
|
|
1398
|
+
const routerBasename = connectConfig.routerBasename;
|
|
1399
|
+
return createBrowserRouter(routes, {
|
|
1400
|
+
basename: routerBasename,
|
|
1401
|
+
future: {
|
|
1402
|
+
v7_fetcherPersist: true,
|
|
1403
|
+
v7_relativeSplatPath: true
|
|
1404
|
+
}
|
|
1405
|
+
});
|
|
1406
|
+
}
|
|
1407
|
+
function createRoutes() {
|
|
1408
|
+
return [{
|
|
1409
|
+
element: /* @__PURE__ */ jsx(Suspense, {
|
|
1410
|
+
name: "RouteRoot",
|
|
1411
|
+
children: /* @__PURE__ */ jsx(Root, {})
|
|
1412
|
+
}),
|
|
1413
|
+
children: [{
|
|
1414
|
+
index: true,
|
|
1415
|
+
path: "d?/:driveId?/*?",
|
|
1416
|
+
element: /* @__PURE__ */ jsx(Suspense, {
|
|
1417
|
+
name: "Drive",
|
|
1418
|
+
children: /* @__PURE__ */ jsx(Content, {})
|
|
1419
|
+
})
|
|
1420
|
+
}]
|
|
1421
|
+
}];
|
|
1422
|
+
}
|
|
1423
|
+
const router = createRouter(createRoutes());
|
|
1424
|
+
const Router = () => {
|
|
1425
|
+
return /* @__PURE__ */ jsx(RouterProvider, { router });
|
|
1426
|
+
};
|
|
1427
|
+
//#endregion
|
|
1428
|
+
//#region src/components/sidebar.tsx
|
|
1429
|
+
function Sidebar() {
|
|
1430
|
+
const user = useUser();
|
|
1431
|
+
const drives = useDrives();
|
|
1432
|
+
const [selectedDrive] = useSelectedDriveSafe();
|
|
1433
|
+
const connectDebug = localStorage.getItem("CONNECT_DEBUG") === "true";
|
|
1434
|
+
const ensName = user?.ens?.name || user?.profile?.username || void 0;
|
|
1435
|
+
const avatarUrl = user?.ens?.avatarUrl || user?.profile?.userImage || void 0;
|
|
1436
|
+
const ensInfo = useEns(!avatarUrl ? user?.address : void 0);
|
|
1437
|
+
const onClickSettings = () => {
|
|
1438
|
+
showPHModal({ type: "settings" });
|
|
1439
|
+
};
|
|
1440
|
+
const onAddDriveClick = () => {
|
|
1441
|
+
showPHModal({ type: "addDrive" });
|
|
1442
|
+
};
|
|
1443
|
+
const etherscanUrl = user?.address ? `https://etherscan.io/address/${user.address}` : "";
|
|
1444
|
+
return /* @__PURE__ */ jsx(ConnectTooltipProvider, { children: /* @__PURE__ */ jsx(ConnectSidebar, {
|
|
1445
|
+
id: "sidebar",
|
|
1446
|
+
onClick: () => setSelectedDrive(void 0),
|
|
1447
|
+
onClickSettings,
|
|
1448
|
+
address: user?.address,
|
|
1449
|
+
onLogin: openRenown,
|
|
1450
|
+
onDisconnect: logout,
|
|
1451
|
+
ensName: ensName || ensInfo.data?.ens,
|
|
1452
|
+
avatarUrl: avatarUrl || ensInfo.data?.avatar_small || ensInfo.data?.avatar_url || void 0,
|
|
1453
|
+
etherscanUrl,
|
|
1454
|
+
showDebug: connectDebug,
|
|
1455
|
+
onDebugClick: () => showPHModal({ type: "debugSettings" }),
|
|
1456
|
+
children: /* @__PURE__ */ jsxs(ErrorBoundary$1, {
|
|
1457
|
+
variant: "text",
|
|
1458
|
+
fallbackMessage: "There was an error loading drives",
|
|
1459
|
+
loggerContext: ["Connect", "Sidebar"],
|
|
1460
|
+
children: [drives?.map((drive, index) => /* @__PURE__ */ jsx(SidebarItem, {
|
|
1461
|
+
title: drive.header.name,
|
|
1462
|
+
onClick: () => setSelectedDrive(drive),
|
|
1463
|
+
active: selectedDrive?.header.id === drive.header.id,
|
|
1464
|
+
icon: /* @__PURE__ */ jsx(DriveIcon, { drive })
|
|
1465
|
+
}, index)), connectConfig.drives.addDriveEnabled && /* @__PURE__ */ jsx(SidebarAddDriveItem, { onClick: onAddDriveClick })]
|
|
1466
|
+
})
|
|
1467
|
+
}) });
|
|
1468
|
+
}
|
|
1469
|
+
//#endregion
|
|
1470
|
+
export { AppLoader as t };
|
|
1471
|
+
|
|
1472
|
+
//# sourceMappingURL=sidebar-BXOORGUU.js.map
|
|
1473
|
+
//# debugId=0e6285c3-6ff2-51e3-bd29-e9f89fcb22f9
|