@powerhousedao/connect 3.3.0-dev.17 → 3.3.0-dev.18

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.
Files changed (92) hide show
  1. package/dist/assets/{AddDriveModal.BO5NByKG.js → AddDriveModal.CqpXGqZK.js} +2 -2
  2. package/dist/assets/{AddDriveModal.BO5NByKG.js.map → AddDriveModal.CqpXGqZK.js.map} +1 -1
  3. package/dist/assets/{AddLocalDriveModal.D96D5Bah.js → AddLocalDriveModal.DJ7OB4Yo.js} +2 -2
  4. package/dist/assets/{AddLocalDriveModal.D96D5Bah.js.map → AddLocalDriveModal.DJ7OB4Yo.js.map} +1 -1
  5. package/dist/assets/{AddRemoteDriveModal.BPvQppgL.js → AddRemoteDriveModal.IOAtDyOA.js} +2 -2
  6. package/dist/assets/{AddRemoteDriveModal.BPvQppgL.js.map → AddRemoteDriveModal.IOAtDyOA.js.map} +1 -1
  7. package/dist/assets/{ConfirmationModal.C6BEQwoI.js → ConfirmationModal.BLX_Fgxf.js} +2 -2
  8. package/dist/assets/{ConfirmationModal.C6BEQwoI.js.map → ConfirmationModal.BLX_Fgxf.js.map} +1 -1
  9. package/dist/assets/{CookiesPolicyModal.BEhaheOU.js → CookiesPolicyModal.CkS39vny.js} +2 -2
  10. package/dist/assets/{CookiesPolicyModal.BEhaheOU.js.map → CookiesPolicyModal.CkS39vny.js.map} +1 -1
  11. package/dist/assets/{CreateDocumentModal.6GKkx6RQ.js → CreateDocumentModal.C_SvcPHp.js} +2 -2
  12. package/dist/assets/{CreateDocumentModal.6GKkx6RQ.js.map → CreateDocumentModal.C_SvcPHp.js.map} +1 -1
  13. package/dist/assets/{DebugSettingsModal.DZ-60rUP.js → DebugSettingsModal.U8shkuGE.js} +2 -2
  14. package/dist/assets/{DebugSettingsModal.DZ-60rUP.js.map → DebugSettingsModal.U8shkuGE.js.map} +1 -1
  15. package/dist/assets/{DeleteDriveModal.B3SG8tZB.js → DeleteDriveModal.C8k99Qt3.js} +2 -2
  16. package/dist/assets/{DeleteDriveModal.B3SG8tZB.js.map → DeleteDriveModal.C8k99Qt3.js.map} +1 -1
  17. package/dist/assets/{DeleteItemModal.pMEEVzdV.js → DeleteItemModal.DYsVSZ5o.js} +2 -2
  18. package/dist/assets/{DeleteItemModal.pMEEVzdV.js.map → DeleteItemModal.DYsVSZ5o.js.map} +1 -1
  19. package/dist/assets/{DisclaimerModal.C2qfI8uK.js → DisclaimerModal.C40A4BZS.js} +2 -2
  20. package/dist/assets/{DisclaimerModal.C2qfI8uK.js.map → DisclaimerModal.C40A4BZS.js.map} +1 -1
  21. package/dist/assets/{DriveSettingsModal.C1ZtlJBT.js → DriveSettingsModal.YG4M4mId.js} +2 -2
  22. package/dist/assets/{DriveSettingsModal.C1ZtlJBT.js.map → DriveSettingsModal.YG4M4mId.js.map} +1 -1
  23. package/dist/assets/{SettingsModal.f8uXgvi-.js → SettingsModal.BdBfr48z.js} +2 -2
  24. package/dist/assets/{SettingsModal.f8uXgvi-.js.map → SettingsModal.BdBfr48z.js.map} +1 -1
  25. package/dist/assets/{Trans.BGcRaz_1.js → Trans.-pu2RC5T.js} +2 -2
  26. package/dist/assets/{Trans.BGcRaz_1.js.map → Trans.-pu2RC5T.js.map} +1 -1
  27. package/dist/assets/{UpgradeDriveModal.BdzKq7CR.js → UpgradeDriveModal.BVZNcfsQ.js} +2 -2
  28. package/dist/assets/{UpgradeDriveModal.BdzKq7CR.js.map → UpgradeDriveModal.BVZNcfsQ.js.map} +1 -1
  29. package/dist/assets/app-skeleton.js +1 -1
  30. package/dist/assets/{app.BvUVPkxD.js → app.AxNgvvJN.js} +4 -4
  31. package/dist/assets/{app.BvUVPkxD.js.map → app.AxNgvvJN.js.map} +1 -1
  32. package/dist/assets/{atlas-import.CS8x1CMj.js → atlas-import.BH8nYSAO.js} +2 -2
  33. package/dist/assets/{atlas-import.CS8x1CMj.js.map → atlas-import.BH8nYSAO.js.map} +1 -1
  34. package/dist/assets/{connect.config.CoIqPBUZ.js → connect.config.CFYnBL6U.js} +2 -2
  35. package/dist/assets/{connect.config.CoIqPBUZ.js.map → connect.config.CFYnBL6U.js.map} +1 -1
  36. package/dist/assets/{content.CtU8uvil.js → content.QL6btUsj.js} +3 -3
  37. package/dist/assets/{content.CtU8uvil.js.map → content.QL6btUsj.js.map} +1 -1
  38. package/dist/assets/{cookie-banner.BuyyM8w2.js → cookie-banner.CK9jlnrx.js} +2 -2
  39. package/dist/assets/{cookie-banner.BuyyM8w2.js.map → cookie-banner.CK9jlnrx.js.map} +1 -1
  40. package/dist/assets/{home.ChO-KTwb.js → home.Bad_Yv87.js} +2 -2
  41. package/dist/assets/{home.ChO-KTwb.js.map → home.Bad_Yv87.js.map} +1 -1
  42. package/dist/assets/{index.Te94ULrh.js → index.4YAZr2Bw.js} +3 -3
  43. package/dist/assets/{index.Te94ULrh.js.map → index.4YAZr2Bw.js.map} +1 -1
  44. package/dist/assets/{index.BgkOHC3c.js → index.BTLd54yF.js} +2 -2
  45. package/dist/assets/{index.BgkOHC3c.js.map → index.BTLd54yF.js.map} +1 -1
  46. package/dist/assets/{index.BmFXIbqO.js → index.Byj3oFOp.js} +2 -2
  47. package/dist/assets/{index.BmFXIbqO.js.map → index.Byj3oFOp.js.map} +1 -1
  48. package/dist/assets/{index.wy7S0TZ8.js → index.CRO2Ovjl.js} +2 -2
  49. package/dist/assets/{index.wy7S0TZ8.js.map → index.CRO2Ovjl.js.map} +1 -1
  50. package/dist/assets/{index.CjJMrKrN.js → index.Cll-QH04.js} +2 -2
  51. package/dist/assets/{index.CjJMrKrN.js.map → index.Cll-QH04.js.map} +1 -1
  52. package/dist/assets/{index.zwkKMaOZ.js → index.D0b1w8wj.js} +2 -2
  53. package/dist/assets/{index.zwkKMaOZ.js.map → index.D0b1w8wj.js.map} +1 -1
  54. package/dist/assets/{index.BapSoqiD.js → index.DFyMrewv.js} +4 -4
  55. package/dist/assets/{index.BapSoqiD.js.map → index.DFyMrewv.js.map} +1 -1
  56. package/dist/assets/{index.CnkuPKeF.js → index.DXS67Eio.js} +2 -2
  57. package/dist/assets/{index.CnkuPKeF.js.map → index.DXS67Eio.js.map} +1 -1
  58. package/dist/assets/{main.PoURbO0e.js → main.snTImpzW.js} +3 -3
  59. package/dist/assets/{main.PoURbO0e.js.map → main.snTImpzW.js.map} +1 -1
  60. package/dist/assets/{modal.DBiwmRE6.js → modal.C_KhS39L.js} +3 -3
  61. package/dist/assets/{modal.DBiwmRE6.js.map → modal.C_KhS39L.js.map} +1 -1
  62. package/dist/assets/{modals.BnkLK0Sb.js → modals.CoFWMspf.js} +2 -2
  63. package/dist/assets/{modals.BnkLK0Sb.js.map → modals.CoFWMspf.js.map} +1 -1
  64. package/dist/assets/{nodefs.BbkfN3E3.js → nodefs.Ckv3nYAO.js} +2 -2
  65. package/dist/assets/{nodefs.BbkfN3E3.js.map → nodefs.Ckv3nYAO.js.map} +1 -1
  66. package/dist/assets/{opfs-ahp.EtXrzCL2.js → opfs-ahp.js-oMwzH.js} +2 -2
  67. package/dist/assets/{opfs-ahp.EtXrzCL2.js.map → opfs-ahp.js-oMwzH.js.map} +1 -1
  68. package/dist/assets/{react-error-boundary.esm.CwMnLDyV.js → react-error-boundary.esm.BVdm9PKb.js} +2 -2
  69. package/dist/assets/{react-error-boundary.esm.CwMnLDyV.js.map → react-error-boundary.esm.BVdm9PKb.js.map} +1 -1
  70. package/dist/assets/{registerServiceWorker.BOlmXRaf.js → registerServiceWorker.Q08tfb4y.js} +2 -2
  71. package/dist/assets/{registerServiceWorker.BOlmXRaf.js.map → registerServiceWorker.Q08tfb4y.js.map} +1 -1
  72. package/dist/assets/{root.DnK5r-WV.js → root.C9SXFlIj.js} +2 -2
  73. package/dist/assets/{root.DnK5r-WV.js.map → root.C9SXFlIj.js.map} +1 -1
  74. package/dist/assets/{toast.C3qNDopK.js → toast.EfwsdSRg.js} +2 -2
  75. package/dist/assets/{toast.C3qNDopK.js.map → toast.EfwsdSRg.js.map} +1 -1
  76. package/dist/assets/{useAcceptedCookies.Cx0XPOxv.js → useAcceptedCookies.CB2k4zPg.js} +2 -2
  77. package/dist/assets/{useAcceptedCookies.Cx0XPOxv.js.map → useAcceptedCookies.CB2k4zPg.js.map} +1 -1
  78. package/dist/assets/useConnectConfig.cp0910kK.js +2 -0
  79. package/dist/assets/{useConnectConfig.DmZj0ZmA.js.map → useConnectConfig.cp0910kK.js.map} +1 -1
  80. package/dist/assets/useDefaultDocumentModelEditor.B-7sf2rs.js +2 -0
  81. package/dist/assets/{useDefaultDocumentModelEditor.woJcAkkh.js.map → useDefaultDocumentModelEditor.B-7sf2rs.js.map} +1 -1
  82. package/dist/assets/{useDocumentDriveServer.LScoSCtt.js → useDocumentDriveServer.BR9qvGmM.js} +2 -2
  83. package/dist/assets/{useDocumentDriveServer.LScoSCtt.js.map → useDocumentDriveServer.BR9qvGmM.js.map} +1 -1
  84. package/dist/assets/{useFeatureFlags.CuH-Ce22.js → useFeatureFlags.B8bfi2uc.js} +2 -2
  85. package/dist/assets/{useFeatureFlags.CuH-Ce22.js.map → useFeatureFlags.B8bfi2uc.js.map} +1 -1
  86. package/dist/assets/{user.Bwi_fGbx.js → user.B1tnDc-G.js} +4 -4
  87. package/dist/assets/{user.Bwi_fGbx.js.map → user.B1tnDc-G.js.map} +1 -1
  88. package/dist/index.html +1 -1
  89. package/dist/vite-envs.sh +1 -1
  90. package/package.json +9 -9
  91. package/dist/assets/useConnectConfig.DmZj0ZmA.js +0 -2
  92. package/dist/assets/useDefaultDocumentModelEditor.woJcAkkh.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"useDocumentDriveServer.LScoSCtt.js","sources":["../../src/utils/document-model.ts","../../src/utils/file.ts","../../src/utils/signature.ts","../../src/hooks/useDocumentDriveServer.ts"],"sourcesContent":["import { type Unsubscribe } from '#services';\nimport { childLogger, type IDocumentDriveServer } from 'document-drive';\nimport type {\n ActionErrorCallback,\n ActionFromDocument,\n Operation,\n OperationFromDocument,\n OperationScope,\n PHDocument,\n Reducer,\n} from 'document-model';\nimport { useEffect, useState } from 'react';\n\nconst logger = childLogger([\n 'utils/document-model',\n Math.floor(Math.random() * 999).toString(),\n]);\n\nexport const FILE_UPLOAD_OPERATIONS_CHUNK_SIZE = parseInt(\n import.meta.env.FILE_UPLOAD_OPERATIONS_CHUNK_SIZE || '50',\n);\n\nexport type DocumentDispatchCallback<TDocument extends PHDocument> = (\n operation: OperationFromDocument<TDocument>,\n state: {\n prevState: TDocument;\n newState: TDocument;\n },\n) => void;\n\nexport type DocumentDispatch<TDocument extends PHDocument> = (\n action: ActionFromDocument<TDocument>,\n callback?: DocumentDispatchCallback<TDocument>,\n onErrorCallback?: ActionErrorCallback,\n) => void;\n\nexport function wrapReducer<TDocument extends PHDocument>(\n reducer: Reducer<TDocument> | undefined,\n onError?: (error: unknown) => void,\n): Reducer<TDocument> {\n return (state, action) => {\n if (!reducer) return state;\n try {\n return reducer(state, action);\n } catch (error) {\n onError?.(error);\n return state;\n }\n };\n}\n\ntype OnErrorHandler = (error: unknown) => void;\n\nexport function useDocumentDispatch<TDocument extends PHDocument>(\n documentReducer: Reducer<TDocument> | undefined,\n initialState: TDocument | undefined,\n onError: OnErrorHandler = logger.error,\n): readonly [TDocument | undefined, DocumentDispatch<TDocument>, unknown] {\n const [state, setState] = useState(initialState);\n const [error, setError] = useState<unknown>();\n\n const onErrorHandler: OnErrorHandler = error => {\n setError(error);\n onError(error);\n };\n\n useEffect(() => {\n setState(initialState);\n setError(undefined);\n }, [initialState]);\n\n const dispatch: DocumentDispatch<TDocument> = (\n action,\n callback,\n onErrorCallback?: ActionErrorCallback,\n ) => {\n setError(undefined);\n setState(_state => {\n if (!documentReducer || !_state) return _state;\n\n try {\n const newState = documentReducer(_state, action);\n const scope = action.scope ?? 'global';\n const operations = newState.operations[scope];\n const operation = operations[operations.length - 1];\n\n if (operation.error) {\n const error = new Error(operation.error);\n\n onErrorHandler(error);\n onErrorCallback?.(error);\n }\n\n callback?.(operation, {\n prevState: { ..._state },\n newState: { ...newState },\n });\n\n return newState;\n } catch (error) {\n onErrorHandler(error);\n onErrorCallback?.(error);\n return _state;\n }\n });\n };\n\n return [state, dispatch, error] as const;\n}\n\nasync function waitForUpdate(\n timeout: number,\n documentId: string,\n scope: OperationScope,\n lastIndex: number,\n reactor: IDocumentDriveServer,\n) {\n let unsubscribe: Unsubscribe | undefined;\n const promise = new Promise<void>(resolve => {\n unsubscribe = reactor.on('strandUpdate', update => {\n logger.verbose(`reactor.on(strandUpdate)`, update);\n const sameScope =\n update.documentId === documentId && update.scope == scope;\n\n if (!sameScope) {\n logger.verbose(\n `reactor.on(strandUpdate) Ignoring wrong scope: ${update.documentId}:${update.scope} <> ${documentId}:${scope}`,\n );\n return;\n }\n\n const lastUpdateIndex = update.operations.at(-1)?.index;\n if (lastUpdateIndex && lastUpdateIndex >= lastIndex) {\n logger.verbose(\n `reactor.on(strandUpdate) Resolving ${update.documentId}:${update.scope} rev ${lastUpdateIndex} >= ${lastIndex}`,\n );\n resolve();\n } else {\n logger.verbose(\n `reactor.on(strandUpdate) Not resolving ${update.documentId}:${update.scope} rev ${lastUpdateIndex} < ${lastIndex}`,\n );\n }\n });\n });\n\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(\n () =>\n reject(\n new Error(\n `Timed out waiting for operation ${lastIndex} for document ${documentId}`,\n ),\n ),\n timeout,\n ),\n );\n\n const withTimeout = Promise.race([promise, timeoutPromise]);\n void withTimeout.finally(() => {\n unsubscribe?.();\n });\n\n return withTimeout;\n}\n\nexport async function uploadDocumentOperations(\n drive: string,\n documentId: string,\n document: PHDocument,\n reactor: IDocumentDriveServer,\n pushOperations: (\n driveId: string,\n id: string,\n operations: Operation[],\n ) => Promise<PHDocument | undefined>,\n options?: { waitForSync?: boolean; operationsLimit?: number },\n) {\n const operationsLimit =\n options?.operationsLimit || FILE_UPLOAD_OPERATIONS_CHUNK_SIZE;\n\n logger.verbose(\n `uploadDocumentOperations(drive: ${drive}, documentId:${documentId}, ops: ${Object.keys(document.operations).join(',')}, limit:${operationsLimit})`,\n );\n\n for (const operations of Object.values(document.operations)) {\n for (let i = 0; i < operations.length; i += operationsLimit) {\n logger.verbose(\n `uploadDocumentOperations:for(i:${i}, ops:${operations.length}, limit:${operationsLimit}): START`,\n );\n const chunk = operations.slice(i, i + operationsLimit);\n const operation = chunk.at(-1);\n if (!operation) {\n break;\n }\n const { scope } = operation;\n\n /*\n TODO: check why the waitForUpdate promise does not resolve after the first iteration\n if (options?.waitForSync) {\n void pushOperations(drive, documentId, chunk);\n await waitForUpdate(\n 10000,\n documentId,\n scope,\n operation.index,\n reactor,\n );\n } else {\n await pushOperations(drive, documentId, chunk);\n }\n */\n\n await pushOperations(drive, documentId, chunk);\n\n logger.verbose(\n `uploadDocumentOperations:for:waitForUpdate(${documentId}:${scope} rev ${operation.index}): NEXT`,\n );\n }\n }\n\n logger.verbose(\n `uploadDocumentOperations:for:waitForUpdate(${documentId}): END`,\n );\n}\n","import { logger } from 'document-drive';\nimport {\n baseLoadFromInput,\n baseSaveToFileHandle,\n createZip,\n type DocumentModelModule,\n type PHDocument,\n} from 'document-model';\n\nconst downloadFile = async (document: PHDocument) => {\n const zip = createZip(document);\n zip.generateAsync({ type: 'blob' })\n .then(blob => {\n const link = window.document.createElement('a');\n link.style.display = 'none';\n link.href = URL.createObjectURL(blob);\n link.download = `${document.header.name || 'Untitled'}.zip`;\n\n window.document.body.appendChild(link);\n link.click();\n\n window.document.body.removeChild(link);\n })\n .catch(logger.error);\n};\n\nexport async function exportFile(\n document: PHDocument,\n getDocumentModelModule: (\n documentType: string,\n ) => DocumentModelModule | undefined,\n) {\n const documentModelModule = getDocumentModelModule(\n document.header.documentType,\n );\n if (!documentModelModule) {\n throw new Error(\n `Document model not supported: ${document.header.documentType}`,\n );\n }\n\n const extension = documentModelModule.documentModel.extension;\n\n // Fallback for browsers that don't support showSaveFilePicker\n if (!window.showSaveFilePicker) {\n await downloadFile(document);\n return;\n }\n try {\n const fileHandle = await window.showSaveFilePicker({\n // @ts-expect-error - Document model should know that name can be defined in global state\n suggestedName: `${document.name || document.state.global?.name || 'Untitled'}.${\n extension ? `${extension}.` : ''\n }zip`,\n });\n\n await baseSaveToFileHandle(document, fileHandle);\n const path = (await fileHandle.getFile()).path;\n if (typeof window !== 'undefined') {\n window.electronAPI?.fileSaved(document, path);\n }\n return path;\n } catch (e) {\n // ignores error if user cancelled the file picker\n if (!(e instanceof DOMException && e.name === 'AbortError')) {\n throw e;\n }\n }\n}\n\nexport async function loadFile(\n path: string | File,\n getDocumentModelModule: (\n documentType: string,\n ) => DocumentModelModule | undefined,\n) {\n const baseDocument = await baseLoadFromInput(\n path,\n (state: PHDocument) => state,\n { checkHashes: true },\n );\n const documentModelModule = getDocumentModelModule(\n baseDocument.header.documentType,\n );\n if (!documentModelModule) {\n throw new Error(\n `Document \"${baseDocument.header.documentType}\" is not supported`,\n );\n }\n return documentModelModule.utils.loadFromInput(path);\n}\n","import { logger } from 'document-drive';\nimport {\n type Action,\n type ActionSigner,\n buildSignedOperation,\n type OperationFromDocument,\n type OperationSignatureContext,\n type PHDocument,\n type Reducer,\n type User,\n} from 'document-model';\n\nexport async function signOperation<TDocument extends PHDocument>(\n operation: OperationFromDocument<TDocument>,\n sign: (data: Uint8Array) => Promise<Uint8Array>,\n documentId: string,\n document: TDocument,\n reducer?: Reducer<TDocument>,\n user?: User,\n): Promise<OperationFromDocument<TDocument>> {\n if (!user) return operation;\n if (!operation.context) return operation;\n if (!operation.context.signer) return operation;\n if (!reducer) {\n logger.error(\n `Document model '${document.header.documentType}' does not have a reducer`,\n );\n return operation;\n }\n\n const context: Omit<\n OperationSignatureContext,\n 'operation' | 'previousStateHash'\n > = {\n documentId,\n signer: operation.context.signer,\n };\n\n const signedOperation = await buildSignedOperation(\n operation,\n reducer,\n document,\n context,\n sign,\n );\n\n return signedOperation;\n}\n\nexport function addActionContext<A extends Action = Action>(\n action: A,\n connectDid?: string,\n user?: User,\n) {\n if (!user) return action;\n\n const signer: ActionSigner = {\n app: {\n name: 'Connect',\n key: connectDid || '',\n },\n user: {\n address: user.address,\n networkId: user.networkId,\n chainId: user.chainId,\n },\n signatures: [],\n };\n\n return {\n context: { signer },\n ...action,\n };\n}\n","import {\n useDocumentAdminStorage,\n useGetDocumentModelModule,\n useUnwrappedReactor,\n useUser,\n} from '#store';\nimport {\n addActionContext,\n loadFile,\n signOperation,\n uploadDocumentOperations,\n} from '#utils';\nimport {\n ERROR,\n FILE,\n LOCAL,\n type SharingType,\n type UiNode,\n} from '@powerhousedao/design-system';\nimport {\n type DocumentDriveAction,\n type DocumentDriveDocument,\n type DriveInput,\n PullResponderTransmitter,\n type PullResponderTrigger,\n type RemoteDriveOptions,\n type StrandUpdate,\n type SyncStatus,\n SynchronizationUnitNotFoundError,\n type Trigger,\n addFolder,\n addTrigger,\n childLogger,\n copyNode,\n createDriveState,\n deleteNode,\n documentDriveReducer,\n generateAddNodeAction,\n generateNodesCopy,\n isDocumentDrive,\n isFileNode,\n isFolderNode,\n moveNode,\n removeTrigger,\n setAvailableOffline,\n setDriveName,\n setSharingType,\n updateFile,\n updateNode,\n} from 'document-drive';\nimport {\n type GetDocumentOptions,\n type Listener,\n} from 'document-drive/server/types';\nimport { type Operation, type PHDocument, generateId } from 'document-model';\nimport { useCallback, useMemo } from 'react';\nimport { useConnectCrypto, useConnectDid } from './useConnectCrypto.js';\nimport { useDocumentDrives } from './useDocumentDrives.js';\nimport { useUserPermissions } from './useUserPermissions.js';\n\n// TODO this should be added to the document model\nexport interface SortOptions {\n afterNodePath?: string;\n}\n\nexport function useDocumentDriveServer() {\n const logger = childLogger([\n 'useDocumentDriveServer',\n Math.floor(Math.random() * 999).toString(),\n ]);\n\n const { isAllowedToCreateDocuments, isAllowedToEditDocuments } =\n useUserPermissions() || {\n isAllowedToCreateDocuments: false,\n isAllowedToEditDocuments: false,\n };\n const user = useUser() || undefined;\n const connectDid = useConnectDid();\n const { sign } = useConnectCrypto();\n const reactor = useUnwrappedReactor();\n const storage = useDocumentAdminStorage();\n\n const getDocumentModelModule = useGetDocumentModelModule();\n\n const [documentDrives, refreshDocumentDrives, , documentDrivesStatus] =\n useDocumentDrives();\n\n const reactorLoaded = !!reactor;\n\n const openFile = useCallback(\n async (drive: string, id: string, options?: GetDocumentOptions) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n const document = await reactor.getDocument(drive, id, options);\n if (!document) {\n throw new Error(\n `There was an error opening file with id ${id} on drive ${drive}`,\n );\n }\n return document;\n },\n [reactor],\n );\n\n const getDocumentsIds = useCallback(\n async (driveId: string) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const ids = await reactor.getDocuments(driveId);\n return ids;\n },\n [reactor],\n );\n\n const _addDriveOperation = useCallback(\n async (driveId: string, action: DocumentDriveAction) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n let drive = documentDrives.find(\n drive => drive.header.id === driveId,\n );\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const driveCopy = { ...drive };\n\n drive = documentDriveReducer(\n drive,\n addActionContext(action, connectDid, user),\n );\n const scope = action.scope ?? 'global';\n const operations = drive.operations[scope];\n const operation = operations.findLast(\n op => op.type === action.type,\n );\n if (!operation) {\n throw new Error('There was an error applying the operation');\n }\n\n // sign operation\n const signedOperation = await signOperation<DocumentDriveDocument>(\n operation,\n sign,\n driveId,\n driveCopy,\n documentDriveReducer,\n user,\n );\n\n try {\n const result = await reactor.queueDriveOperation(\n driveId,\n signedOperation,\n );\n\n if (result.status !== 'SUCCESS') {\n logger.error(result.error);\n }\n\n if (result.operations.length) {\n await refreshDocumentDrives();\n }\n\n if (result.document && !isDocumentDrive(result.document)) {\n throw new Error(\n 'Received document is not a Document Drive',\n );\n }\n return result.document;\n } catch (error) {\n logger.error(error);\n return drive;\n }\n },\n [\n documentDrives,\n refreshDocumentDrives,\n reactor,\n sign,\n user,\n connectDid,\n ],\n );\n\n const addDocument = useCallback(\n async (\n driveId: string,\n name: string,\n documentType: string,\n parentFolder?: string,\n document?: PHDocument,\n ) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create documents');\n }\n\n let drive = documentDrives.find(d => d.header.id === driveId);\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const documentId = generateId();\n const action = generateAddNodeAction(\n drive.state.global,\n {\n id: documentId,\n name,\n parentFolder: parentFolder ?? null,\n documentType,\n document,\n },\n ['global'],\n );\n\n drive = await _addDriveOperation(driveId, action);\n\n const node = drive?.state.global.nodes.find(\n node => node.id === documentId,\n );\n if (!node || !isFileNode(node)) {\n throw new Error('There was an error adding document');\n }\n\n return node;\n },\n [_addDriveOperation, documentDrives, isAllowedToCreateDocuments],\n );\n\n const addOperations = useCallback(\n async (\n driveId: string,\n id: string | undefined,\n operations: Operation[],\n ) => {\n if (!isAllowedToEditDocuments) {\n throw new Error('User is not allowed to edit documents');\n }\n\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const drive = documentDrives.find(\n drive => drive.header.id === driveId,\n );\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const result =\n id !== undefined\n ? await reactor.queueOperations(driveId, id, operations)\n : await reactor.queueDriveOperations(\n driveId,\n operations as Operation<DocumentDriveAction>[],\n );\n\n if (result.operations.length) {\n await refreshDocumentDrives();\n }\n refreshDocumentDrives().catch(logger.error);\n return result.document;\n },\n [documentDrives, isAllowedToEditDocuments, reactor],\n );\n\n const addFile = useCallback(\n async (\n file: string | File,\n drive: string,\n name?: string,\n parentFolder?: string,\n ) => {\n logger.verbose(\n `addFile(drive: ${drive}, name: ${name}, folder: ${parentFolder})`,\n );\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create files');\n }\n const document = await loadFile(file, getDocumentModelModule);\n\n // first create the file with the initial state of document\n const initialDocument: PHDocument = {\n header: document.header,\n history: document.history,\n initialState: document.initialState,\n state: document.state,\n operations: {\n global: [],\n local: [],\n },\n clipboard: [],\n };\n const fileNode = await addDocument(\n drive,\n name ||\n (typeof file === 'string'\n ? document.header.name\n : file.name),\n document.header.documentType,\n parentFolder,\n initialDocument,\n );\n\n // then add all the operations\n const driveDocument = documentDrives.find(\n documentDrive => documentDrive.header.id === drive,\n );\n const waitForSync =\n driveDocument && driveDocument.state.local.listeners.length > 0;\n\n uploadDocumentOperations(\n drive,\n fileNode.id,\n document,\n reactor,\n addOperations,\n { waitForSync },\n ).catch(error => {\n throw error;\n });\n },\n [\n addDocument,\n addOperations,\n getDocumentModelModule,\n isAllowedToCreateDocuments,\n reactor,\n ],\n );\n\n const handleUpdateFile = useCallback(\n async (\n driveId: string,\n id: string,\n documentType?: string,\n name?: string,\n parentFolder?: string,\n ) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to update files');\n }\n const drive = await _addDriveOperation(\n driveId,\n updateFile({\n id,\n name: name || undefined,\n parentFolder,\n documentType,\n }),\n );\n\n const node = drive?.state.global.nodes.find(node => node.id === id);\n if (!node || !isFileNode(node)) {\n throw new Error('There was an error updating document');\n }\n return node;\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleAddFolder = useCallback(\n async (driveId: string, name: string, parentFolder?: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create folders');\n }\n const folderId = generateId();\n const drive = await _addDriveOperation(\n driveId,\n addFolder({\n id: folderId,\n name,\n parentFolder,\n }),\n );\n\n const node = drive?.state.global.nodes.find(\n node => node.id === folderId,\n );\n if (!node || !isFolderNode(node)) {\n throw new Error('There was an error adding folder');\n }\n return node;\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleDeleteNode = useCallback(\n async (drive: string, id: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to delete documents');\n }\n await _addDriveOperation(\n drive,\n deleteNode({\n id,\n }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const renameNode = useCallback(\n async (driveId: string, id: string, name: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to rename documents');\n }\n const drive = await _addDriveOperation(\n driveId,\n updateNode({\n id,\n name,\n }),\n );\n\n const node = drive?.state.global.nodes.find(node => node.id === id);\n if (!node) {\n throw new Error('There was an error renaming node');\n }\n return node;\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleMoveNode = useCallback(\n async (src: UiNode, target: UiNode) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to move documents');\n }\n\n if (target.kind === FILE || src.parentFolder === target.id) return;\n\n await _addDriveOperation(\n target.driveId,\n moveNode({\n srcFolder: src.id,\n targetParentFolder: target.id,\n }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleCopyNode = useCallback(\n async (src: UiNode, target: UiNode) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to copy documents');\n }\n\n if (target.kind === FILE) return;\n\n const drive = documentDrives.find(\n drive => drive.header.id === src.driveId,\n );\n\n if (!drive) return;\n\n const copyNodesInput = generateNodesCopy(\n {\n srcId: src.id,\n targetParentFolder: target.id,\n targetName: src.name,\n },\n () => generateId(),\n drive.state.global.nodes,\n );\n\n const copyActions = copyNodesInput.map(copyNodeInput =>\n copyNode(copyNodeInput),\n );\n\n const result = await reactor.addDriveActions(\n src.driveId,\n copyActions,\n );\n if (result.operations.length) {\n await refreshDocumentDrives();\n } else if (result.status !== 'SUCCESS') {\n logger.error(\n `Error copying files: ${result.status}`,\n result.error,\n );\n }\n },\n [\n documentDrives,\n isAllowedToCreateDocuments,\n refreshDocumentDrives,\n reactor,\n ],\n );\n\n const addOperation = useCallback(\n async (driveId: string, id: string, operation: Operation) => {\n if (!isAllowedToEditDocuments) {\n throw new Error('User is not allowed to edit documents');\n }\n\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const drive = documentDrives.find(\n drive => drive.header.id === driveId,\n );\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const newDocument = await reactor.addOperation(\n driveId,\n id,\n operation,\n );\n return newDocument.document;\n },\n [documentDrives, isAllowedToEditDocuments, reactor],\n );\n\n const addDrive = useCallback(\n async (drive: DriveInput, preferredEditor?: string) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create drives');\n }\n const id = drive.id || generateId();\n drive = createDriveState(drive);\n const newDrive = await reactor.addDrive(\n {\n global: drive.global,\n local: drive.local,\n id,\n },\n preferredEditor,\n );\n await refreshDocumentDrives();\n return newDrive;\n },\n [isAllowedToCreateDocuments, refreshDocumentDrives, reactor],\n );\n\n const addRemoteDrive = useCallback(\n async (url: string, options: RemoteDriveOptions) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const newDrive = await reactor.addRemoteDrive(url, options);\n await refreshDocumentDrives();\n return newDrive;\n },\n [refreshDocumentDrives, reactor],\n );\n\n const deleteDrive = useCallback(\n async (id: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to delete drives');\n }\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const drive = documentDrives.find(drive => drive.header.id === id);\n if (!drive) {\n throw new Error(`Drive with id ${id} not found`);\n }\n await reactor.deleteDrive(id);\n return refreshDocumentDrives();\n },\n [\n documentDrives,\n isAllowedToCreateDocuments,\n refreshDocumentDrives,\n reactor,\n ],\n );\n\n const renameDrive = useCallback(\n async (id: string, name: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to rename drives');\n }\n return _addDriveOperation(id, setDriveName({ name }));\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const setDriveAvailableOffline = useCallback(\n async (id: string, availableOffline: boolean) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error(\n 'User is not allowed to change drive availability',\n );\n }\n return _addDriveOperation(\n id,\n setAvailableOffline({ availableOffline }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const setDriveSharingType = useCallback(\n async (id: string, sharingType: SharingType) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error(\n 'User is not allowed to change drive availability',\n );\n }\n return _addDriveOperation(\n id,\n setSharingType({ type: sharingType }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const getSyncStatus = useCallback(\n async (\n syncId: string,\n sharingType: SharingType,\n ): Promise<SyncStatus | undefined> => {\n if (sharingType === LOCAL) return;\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n try {\n const syncStatus = reactor.getSyncStatus(syncId);\n if (syncStatus instanceof SynchronizationUnitNotFoundError)\n return 'INITIAL_SYNC';\n return syncStatus;\n } catch (error) {\n console.error(error);\n return ERROR;\n }\n },\n [reactor],\n );\n\n const getSyncStatusSync = useCallback(\n (syncId: string, sharingType: SharingType): SyncStatus | undefined => {\n if (sharingType === LOCAL) return;\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n try {\n const syncStatus = reactor.getSyncStatus(syncId);\n if (syncStatus instanceof SynchronizationUnitNotFoundError)\n return 'INITIAL_SYNC';\n return syncStatus;\n } catch (error) {\n console.error(error);\n return ERROR;\n }\n },\n [reactor],\n );\n\n const onStrandUpdate = useCallback(\n (cb: (update: StrandUpdate) => void) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n return reactor.on('strandUpdate', cb);\n },\n [reactor],\n );\n\n const onOperationsAdded = useCallback(\n (\n cb: (\n driveId: string,\n documentId: string | null | undefined,\n operations: Operation[],\n ) => void,\n ) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n return reactor.on('operationsAdded', cb);\n },\n [reactor],\n );\n\n const onSyncStatus = useCallback(\n (cb: (driveId: string, status: SyncStatus, error?: Error) => void) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n return reactor.on('syncStatus', cb);\n },\n [reactor],\n );\n\n const clearStorage = useCallback(async () => {\n // reactor may have not loaded yet\n if (!reactor) {\n return;\n }\n\n await storage.clear();\n await refreshDocumentDrives();\n }, [refreshDocumentDrives, reactor, storage]);\n\n const handleRemoveTrigger = useCallback(\n async (driveId: string, triggerId: string) => {\n const drive = await _addDriveOperation(\n driveId,\n removeTrigger({ triggerId }),\n );\n\n const trigger = drive?.state.local.triggers.find(\n trigger => trigger.id === triggerId,\n );\n\n if (trigger) {\n throw new Error(\n `There was an error removing trigger ${triggerId}`,\n );\n }\n },\n [_addDriveOperation],\n );\n\n const registerNewPullResponderTrigger = useCallback(\n async (\n driveId: string,\n url: string,\n options: Pick<RemoteDriveOptions, 'pullFilter' | 'pullInterval'>,\n ): Promise<PullResponderTrigger> => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const uuid = generateId();\n const listener: Listener = {\n driveId,\n listenerId: uuid,\n block: false,\n filter: {\n branch: options.pullFilter?.branch ?? [],\n documentId: options.pullFilter?.documentId ?? [],\n documentType: options.pullFilter?.documentType ?? [],\n scope: options.pullFilter?.scope ?? [],\n },\n system: false,\n label: `Pullresponder #${uuid}`,\n callInfo: {\n data: '',\n name: 'PullResponder',\n transmitterType: 'PullResponder',\n },\n };\n\n // TODO: circular reference\n // TODO: once we have DI, remove this and pass around\n const listenerManager = reactor.listeners;\n listener.transmitter = new PullResponderTransmitter(\n listener,\n listenerManager,\n );\n\n // set the listener on the manager directly (bypassing operations)\n try {\n await listenerManager.setListener(driveId, listener);\n } catch (error) {\n throw new Error(`Listener couldn't be registered: ${error}`);\n }\n\n // for backwards compatibility: return everything but the transmitter\n return {\n driveId,\n filter: listener.filter,\n data: {\n interval: `${options.pullInterval}` || '1000',\n listenerId: uuid,\n url,\n },\n id: uuid,\n type: 'PullResponder',\n };\n },\n [reactor],\n );\n\n const handleAddTrigger = useCallback(\n async (driveId: string, trigger: Trigger) => {\n const drive = await _addDriveOperation(\n driveId,\n addTrigger({ trigger }),\n );\n\n const newTrigger = drive?.state.local.triggers.find(\n trigger => trigger.id === trigger.id,\n );\n\n if (!newTrigger) {\n throw new Error(\n `There was an error adding the trigger ${trigger.id}`,\n );\n }\n },\n [_addDriveOperation],\n );\n\n return useMemo(\n () => ({\n reactorLoaded,\n documentDrives,\n documentDrivesStatus,\n addDocument,\n openFile,\n addFile,\n updateFile: handleUpdateFile,\n addFolder: handleAddFolder,\n deleteNode: handleDeleteNode,\n renameNode,\n moveNode: handleMoveNode,\n copyNode: handleCopyNode,\n addOperation,\n addOperations,\n addDrive,\n addRemoteDrive,\n deleteDrive,\n renameDrive,\n setDriveAvailableOffline,\n setDriveSharingType,\n getSyncStatus,\n getSyncStatusSync,\n onStrandUpdate,\n onSyncStatus,\n clearStorage,\n removeTrigger: handleRemoveTrigger,\n addTrigger: handleAddTrigger,\n registerNewPullResponderTrigger,\n getDocumentsIds,\n onOperationsAdded,\n }),\n [\n reactorLoaded,\n addDocument,\n addDrive,\n addFile,\n handleAddFolder,\n addOperation,\n addOperations,\n addRemoteDrive,\n handleAddTrigger,\n clearStorage,\n handleCopyNode,\n deleteDrive,\n handleDeleteNode,\n documentDrives,\n documentDrivesStatus,\n getSyncStatus,\n getSyncStatusSync,\n handleMoveNode,\n onStrandUpdate,\n onSyncStatus,\n openFile,\n registerNewPullResponderTrigger,\n handleRemoveTrigger,\n renameDrive,\n renameNode,\n setDriveAvailableOffline,\n setDriveSharingType,\n handleUpdateFile,\n getDocumentsIds,\n onOperationsAdded,\n ],\n );\n}\n\nexport type TDocumentDriveServer = ReturnType<typeof useDocumentDriveServer>;\n"],"names":["logger","childLogger","FILE_UPLOAD_OPERATIONS_CHUNK_SIZE","useDocumentDispatch","documentReducer","initialState","onError","state","setState","useState","error","setError","onErrorHandler","useEffect","action","callback","onErrorCallback","_state","newState","scope","operations","operation","uploadDocumentOperations","drive","documentId","document","reactor","pushOperations","options","operationsLimit","i","chunk","downloadFile","createZip","blob","link","exportFile","getDocumentModelModule","documentModelModule","extension","fileHandle","_a","baseSaveToFileHandle","path","_b","e","loadFile","baseDocument","baseLoadFromInput","signOperation","sign","reducer","user","context","buildSignedOperation","addActionContext","connectDid","useDocumentDriveServer","isAllowedToCreateDocuments","isAllowedToEditDocuments","useUserPermissions","useUser","useConnectDid","useConnectCrypto","useUnwrappedReactor","storage","useDocumentAdminStorage","useGetDocumentModelModule","documentDrives","refreshDocumentDrives","documentDrivesStatus","useDocumentDrives","reactorLoaded","openFile","useCallback","id","getDocumentsIds","driveId","_addDriveOperation","driveCopy","documentDriveReducer","op","signedOperation","result","isDocumentDrive","addDocument","name","documentType","parentFolder","d","generateId","generateAddNodeAction","node","isFileNode","addOperations","addFile","file","initialDocument","fileNode","documentDrive","handleUpdateFile","updateFile","handleAddFolder","folderId","addFolder","isFolderNode","handleDeleteNode","deleteNode","renameNode","updateNode","handleMoveNode","src","target","FILE","moveNode","handleCopyNode","copyActions","generateNodesCopy","copyNodeInput","copyNode","addOperation","addDrive","preferredEditor","createDriveState","newDrive","addRemoteDrive","url","deleteDrive","renameDrive","setDriveName","setDriveAvailableOffline","availableOffline","setAvailableOffline","setDriveSharingType","sharingType","setSharingType","getSyncStatus","syncId","LOCAL","syncStatus","SynchronizationUnitNotFoundError","ERROR","getSyncStatusSync","onStrandUpdate","cb","onOperationsAdded","onSyncStatus","clearStorage","handleRemoveTrigger","triggerId","removeTrigger","trigger","registerNewPullResponderTrigger","uuid","listener","_c","_d","listenerManager","PullResponderTransmitter","handleAddTrigger","addTrigger","useMemo"],"mappings":"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"}
1
+ {"version":3,"file":"useDocumentDriveServer.BR9qvGmM.js","sources":["../../src/utils/document-model.ts","../../src/utils/file.ts","../../src/utils/signature.ts","../../src/hooks/useDocumentDriveServer.ts"],"sourcesContent":["import { type Unsubscribe } from '#services';\nimport { childLogger, type IDocumentDriveServer } from 'document-drive';\nimport type {\n ActionErrorCallback,\n ActionFromDocument,\n Operation,\n OperationFromDocument,\n OperationScope,\n PHDocument,\n Reducer,\n} from 'document-model';\nimport { useEffect, useState } from 'react';\n\nconst logger = childLogger([\n 'utils/document-model',\n Math.floor(Math.random() * 999).toString(),\n]);\n\nexport const FILE_UPLOAD_OPERATIONS_CHUNK_SIZE = parseInt(\n import.meta.env.FILE_UPLOAD_OPERATIONS_CHUNK_SIZE || '50',\n);\n\nexport type DocumentDispatchCallback<TDocument extends PHDocument> = (\n operation: OperationFromDocument<TDocument>,\n state: {\n prevState: TDocument;\n newState: TDocument;\n },\n) => void;\n\nexport type DocumentDispatch<TDocument extends PHDocument> = (\n action: ActionFromDocument<TDocument>,\n callback?: DocumentDispatchCallback<TDocument>,\n onErrorCallback?: ActionErrorCallback,\n) => void;\n\nexport function wrapReducer<TDocument extends PHDocument>(\n reducer: Reducer<TDocument> | undefined,\n onError?: (error: unknown) => void,\n): Reducer<TDocument> {\n return (state, action) => {\n if (!reducer) return state;\n try {\n return reducer(state, action);\n } catch (error) {\n onError?.(error);\n return state;\n }\n };\n}\n\ntype OnErrorHandler = (error: unknown) => void;\n\nexport function useDocumentDispatch<TDocument extends PHDocument>(\n documentReducer: Reducer<TDocument> | undefined,\n initialState: TDocument | undefined,\n onError: OnErrorHandler = logger.error,\n): readonly [TDocument | undefined, DocumentDispatch<TDocument>, unknown] {\n const [state, setState] = useState(initialState);\n const [error, setError] = useState<unknown>();\n\n const onErrorHandler: OnErrorHandler = error => {\n setError(error);\n onError(error);\n };\n\n useEffect(() => {\n setState(initialState);\n setError(undefined);\n }, [initialState]);\n\n const dispatch: DocumentDispatch<TDocument> = (\n action,\n callback,\n onErrorCallback?: ActionErrorCallback,\n ) => {\n setError(undefined);\n setState(_state => {\n if (!documentReducer || !_state) return _state;\n\n try {\n const newState = documentReducer(_state, action);\n const scope = action.scope ?? 'global';\n const operations = newState.operations[scope];\n const operation = operations[operations.length - 1];\n\n if (operation.error) {\n const error = new Error(operation.error);\n\n onErrorHandler(error);\n onErrorCallback?.(error);\n }\n\n callback?.(operation, {\n prevState: { ..._state },\n newState: { ...newState },\n });\n\n return newState;\n } catch (error) {\n onErrorHandler(error);\n onErrorCallback?.(error);\n return _state;\n }\n });\n };\n\n return [state, dispatch, error] as const;\n}\n\nasync function waitForUpdate(\n timeout: number,\n documentId: string,\n scope: OperationScope,\n lastIndex: number,\n reactor: IDocumentDriveServer,\n) {\n let unsubscribe: Unsubscribe | undefined;\n const promise = new Promise<void>(resolve => {\n unsubscribe = reactor.on('strandUpdate', update => {\n logger.verbose(`reactor.on(strandUpdate)`, update);\n const sameScope =\n update.documentId === documentId && update.scope == scope;\n\n if (!sameScope) {\n logger.verbose(\n `reactor.on(strandUpdate) Ignoring wrong scope: ${update.documentId}:${update.scope} <> ${documentId}:${scope}`,\n );\n return;\n }\n\n const lastUpdateIndex = update.operations.at(-1)?.index;\n if (lastUpdateIndex && lastUpdateIndex >= lastIndex) {\n logger.verbose(\n `reactor.on(strandUpdate) Resolving ${update.documentId}:${update.scope} rev ${lastUpdateIndex} >= ${lastIndex}`,\n );\n resolve();\n } else {\n logger.verbose(\n `reactor.on(strandUpdate) Not resolving ${update.documentId}:${update.scope} rev ${lastUpdateIndex} < ${lastIndex}`,\n );\n }\n });\n });\n\n const timeoutPromise = new Promise((_, reject) =>\n setTimeout(\n () =>\n reject(\n new Error(\n `Timed out waiting for operation ${lastIndex} for document ${documentId}`,\n ),\n ),\n timeout,\n ),\n );\n\n const withTimeout = Promise.race([promise, timeoutPromise]);\n void withTimeout.finally(() => {\n unsubscribe?.();\n });\n\n return withTimeout;\n}\n\nexport async function uploadDocumentOperations(\n drive: string,\n documentId: string,\n document: PHDocument,\n reactor: IDocumentDriveServer,\n pushOperations: (\n driveId: string,\n id: string,\n operations: Operation[],\n ) => Promise<PHDocument | undefined>,\n options?: { waitForSync?: boolean; operationsLimit?: number },\n) {\n const operationsLimit =\n options?.operationsLimit || FILE_UPLOAD_OPERATIONS_CHUNK_SIZE;\n\n logger.verbose(\n `uploadDocumentOperations(drive: ${drive}, documentId:${documentId}, ops: ${Object.keys(document.operations).join(',')}, limit:${operationsLimit})`,\n );\n\n for (const operations of Object.values(document.operations)) {\n for (let i = 0; i < operations.length; i += operationsLimit) {\n logger.verbose(\n `uploadDocumentOperations:for(i:${i}, ops:${operations.length}, limit:${operationsLimit}): START`,\n );\n const chunk = operations.slice(i, i + operationsLimit);\n const operation = chunk.at(-1);\n if (!operation) {\n break;\n }\n const { scope } = operation;\n\n /*\n TODO: check why the waitForUpdate promise does not resolve after the first iteration\n if (options?.waitForSync) {\n void pushOperations(drive, documentId, chunk);\n await waitForUpdate(\n 10000,\n documentId,\n scope,\n operation.index,\n reactor,\n );\n } else {\n await pushOperations(drive, documentId, chunk);\n }\n */\n\n await pushOperations(drive, documentId, chunk);\n\n logger.verbose(\n `uploadDocumentOperations:for:waitForUpdate(${documentId}:${scope} rev ${operation.index}): NEXT`,\n );\n }\n }\n\n logger.verbose(\n `uploadDocumentOperations:for:waitForUpdate(${documentId}): END`,\n );\n}\n","import { logger } from 'document-drive';\nimport {\n baseLoadFromInput,\n baseSaveToFileHandle,\n createZip,\n type DocumentModelModule,\n type PHDocument,\n} from 'document-model';\n\nconst downloadFile = async (document: PHDocument) => {\n const zip = createZip(document);\n zip.generateAsync({ type: 'blob' })\n .then(blob => {\n const link = window.document.createElement('a');\n link.style.display = 'none';\n link.href = URL.createObjectURL(blob);\n link.download = `${document.header.name || 'Untitled'}.zip`;\n\n window.document.body.appendChild(link);\n link.click();\n\n window.document.body.removeChild(link);\n })\n .catch(logger.error);\n};\n\nexport async function exportFile(\n document: PHDocument,\n getDocumentModelModule: (\n documentType: string,\n ) => DocumentModelModule | undefined,\n) {\n const documentModelModule = getDocumentModelModule(\n document.header.documentType,\n );\n if (!documentModelModule) {\n throw new Error(\n `Document model not supported: ${document.header.documentType}`,\n );\n }\n\n const extension = documentModelModule.documentModel.extension;\n\n // Fallback for browsers that don't support showSaveFilePicker\n if (!window.showSaveFilePicker) {\n await downloadFile(document);\n return;\n }\n try {\n const fileHandle = await window.showSaveFilePicker({\n // @ts-expect-error - Document model should know that name can be defined in global state\n suggestedName: `${document.name || document.state.global?.name || 'Untitled'}.${\n extension ? `${extension}.` : ''\n }zip`,\n });\n\n await baseSaveToFileHandle(document, fileHandle);\n const path = (await fileHandle.getFile()).path;\n if (typeof window !== 'undefined') {\n window.electronAPI?.fileSaved(document, path);\n }\n return path;\n } catch (e) {\n // ignores error if user cancelled the file picker\n if (!(e instanceof DOMException && e.name === 'AbortError')) {\n throw e;\n }\n }\n}\n\nexport async function loadFile(\n path: string | File,\n getDocumentModelModule: (\n documentType: string,\n ) => DocumentModelModule | undefined,\n) {\n const baseDocument = await baseLoadFromInput(\n path,\n (state: PHDocument) => state,\n { checkHashes: true },\n );\n const documentModelModule = getDocumentModelModule(\n baseDocument.header.documentType,\n );\n if (!documentModelModule) {\n throw new Error(\n `Document \"${baseDocument.header.documentType}\" is not supported`,\n );\n }\n return documentModelModule.utils.loadFromInput(path);\n}\n","import { logger } from 'document-drive';\nimport {\n type Action,\n type ActionSigner,\n buildSignedOperation,\n type OperationFromDocument,\n type OperationSignatureContext,\n type PHDocument,\n type Reducer,\n type User,\n} from 'document-model';\n\nexport async function signOperation<TDocument extends PHDocument>(\n operation: OperationFromDocument<TDocument>,\n sign: (data: Uint8Array) => Promise<Uint8Array>,\n documentId: string,\n document: TDocument,\n reducer?: Reducer<TDocument>,\n user?: User,\n): Promise<OperationFromDocument<TDocument>> {\n if (!user) return operation;\n if (!operation.context) return operation;\n if (!operation.context.signer) return operation;\n if (!reducer) {\n logger.error(\n `Document model '${document.header.documentType}' does not have a reducer`,\n );\n return operation;\n }\n\n const context: Omit<\n OperationSignatureContext,\n 'operation' | 'previousStateHash'\n > = {\n documentId,\n signer: operation.context.signer,\n };\n\n const signedOperation = await buildSignedOperation(\n operation,\n reducer,\n document,\n context,\n sign,\n );\n\n return signedOperation;\n}\n\nexport function addActionContext<A extends Action = Action>(\n action: A,\n connectDid?: string,\n user?: User,\n) {\n if (!user) return action;\n\n const signer: ActionSigner = {\n app: {\n name: 'Connect',\n key: connectDid || '',\n },\n user: {\n address: user.address,\n networkId: user.networkId,\n chainId: user.chainId,\n },\n signatures: [],\n };\n\n return {\n context: { signer },\n ...action,\n };\n}\n","import {\n useDocumentAdminStorage,\n useGetDocumentModelModule,\n useUnwrappedReactor,\n useUser,\n} from '#store';\nimport {\n addActionContext,\n loadFile,\n signOperation,\n uploadDocumentOperations,\n} from '#utils';\nimport {\n ERROR,\n FILE,\n LOCAL,\n type SharingType,\n type UiNode,\n} from '@powerhousedao/design-system';\nimport {\n type DocumentDriveAction,\n type DocumentDriveDocument,\n type DriveInput,\n PullResponderTransmitter,\n type PullResponderTrigger,\n type RemoteDriveOptions,\n type StrandUpdate,\n type SyncStatus,\n SynchronizationUnitNotFoundError,\n type Trigger,\n addFolder,\n addTrigger,\n childLogger,\n copyNode,\n createDriveState,\n deleteNode,\n documentDriveReducer,\n generateAddNodeAction,\n generateNodesCopy,\n isDocumentDrive,\n isFileNode,\n isFolderNode,\n moveNode,\n removeTrigger,\n setAvailableOffline,\n setDriveName,\n setSharingType,\n updateFile,\n updateNode,\n} from 'document-drive';\nimport {\n type GetDocumentOptions,\n type Listener,\n} from 'document-drive/server/types';\nimport { type Operation, type PHDocument, generateId } from 'document-model';\nimport { useCallback, useMemo } from 'react';\nimport { useConnectCrypto, useConnectDid } from './useConnectCrypto.js';\nimport { useDocumentDrives } from './useDocumentDrives.js';\nimport { useUserPermissions } from './useUserPermissions.js';\n\n// TODO this should be added to the document model\nexport interface SortOptions {\n afterNodePath?: string;\n}\n\nexport function useDocumentDriveServer() {\n const logger = childLogger([\n 'useDocumentDriveServer',\n Math.floor(Math.random() * 999).toString(),\n ]);\n\n const { isAllowedToCreateDocuments, isAllowedToEditDocuments } =\n useUserPermissions() || {\n isAllowedToCreateDocuments: false,\n isAllowedToEditDocuments: false,\n };\n const user = useUser() || undefined;\n const connectDid = useConnectDid();\n const { sign } = useConnectCrypto();\n const reactor = useUnwrappedReactor();\n const storage = useDocumentAdminStorage();\n\n const getDocumentModelModule = useGetDocumentModelModule();\n\n const [documentDrives, refreshDocumentDrives, , documentDrivesStatus] =\n useDocumentDrives();\n\n const reactorLoaded = !!reactor;\n\n const openFile = useCallback(\n async (drive: string, id: string, options?: GetDocumentOptions) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n const document = await reactor.getDocument(drive, id, options);\n if (!document) {\n throw new Error(\n `There was an error opening file with id ${id} on drive ${drive}`,\n );\n }\n return document;\n },\n [reactor],\n );\n\n const getDocumentsIds = useCallback(\n async (driveId: string) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const ids = await reactor.getDocuments(driveId);\n return ids;\n },\n [reactor],\n );\n\n const _addDriveOperation = useCallback(\n async (driveId: string, action: DocumentDriveAction) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n let drive = documentDrives.find(\n drive => drive.header.id === driveId,\n );\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const driveCopy = { ...drive };\n\n drive = documentDriveReducer(\n drive,\n addActionContext(action, connectDid, user),\n );\n const scope = action.scope ?? 'global';\n const operations = drive.operations[scope];\n const operation = operations.findLast(\n op => op.type === action.type,\n );\n if (!operation) {\n throw new Error('There was an error applying the operation');\n }\n\n // sign operation\n const signedOperation = await signOperation<DocumentDriveDocument>(\n operation,\n sign,\n driveId,\n driveCopy,\n documentDriveReducer,\n user,\n );\n\n try {\n const result = await reactor.queueDriveOperation(\n driveId,\n signedOperation,\n );\n\n if (result.status !== 'SUCCESS') {\n logger.error(result.error);\n }\n\n if (result.operations.length) {\n await refreshDocumentDrives();\n }\n\n if (result.document && !isDocumentDrive(result.document)) {\n throw new Error(\n 'Received document is not a Document Drive',\n );\n }\n return result.document;\n } catch (error) {\n logger.error(error);\n return drive;\n }\n },\n [\n documentDrives,\n refreshDocumentDrives,\n reactor,\n sign,\n user,\n connectDid,\n ],\n );\n\n const addDocument = useCallback(\n async (\n driveId: string,\n name: string,\n documentType: string,\n parentFolder?: string,\n document?: PHDocument,\n ) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create documents');\n }\n\n let drive = documentDrives.find(d => d.header.id === driveId);\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const documentId = generateId();\n const action = generateAddNodeAction(\n drive.state.global,\n {\n id: documentId,\n name,\n parentFolder: parentFolder ?? null,\n documentType,\n document,\n },\n ['global'],\n );\n\n drive = await _addDriveOperation(driveId, action);\n\n const node = drive?.state.global.nodes.find(\n node => node.id === documentId,\n );\n if (!node || !isFileNode(node)) {\n throw new Error('There was an error adding document');\n }\n\n return node;\n },\n [_addDriveOperation, documentDrives, isAllowedToCreateDocuments],\n );\n\n const addOperations = useCallback(\n async (\n driveId: string,\n id: string | undefined,\n operations: Operation[],\n ) => {\n if (!isAllowedToEditDocuments) {\n throw new Error('User is not allowed to edit documents');\n }\n\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const drive = documentDrives.find(\n drive => drive.header.id === driveId,\n );\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const result =\n id !== undefined\n ? await reactor.queueOperations(driveId, id, operations)\n : await reactor.queueDriveOperations(\n driveId,\n operations as Operation<DocumentDriveAction>[],\n );\n\n if (result.operations.length) {\n await refreshDocumentDrives();\n }\n refreshDocumentDrives().catch(logger.error);\n return result.document;\n },\n [documentDrives, isAllowedToEditDocuments, reactor],\n );\n\n const addFile = useCallback(\n async (\n file: string | File,\n drive: string,\n name?: string,\n parentFolder?: string,\n ) => {\n logger.verbose(\n `addFile(drive: ${drive}, name: ${name}, folder: ${parentFolder})`,\n );\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create files');\n }\n const document = await loadFile(file, getDocumentModelModule);\n\n // first create the file with the initial state of document\n const initialDocument: PHDocument = {\n header: document.header,\n history: document.history,\n initialState: document.initialState,\n state: document.state,\n operations: {\n global: [],\n local: [],\n },\n clipboard: [],\n };\n const fileNode = await addDocument(\n drive,\n name ||\n (typeof file === 'string'\n ? document.header.name\n : file.name),\n document.header.documentType,\n parentFolder,\n initialDocument,\n );\n\n // then add all the operations\n const driveDocument = documentDrives.find(\n documentDrive => documentDrive.header.id === drive,\n );\n const waitForSync =\n driveDocument && driveDocument.state.local.listeners.length > 0;\n\n uploadDocumentOperations(\n drive,\n fileNode.id,\n document,\n reactor,\n addOperations,\n { waitForSync },\n ).catch(error => {\n throw error;\n });\n },\n [\n addDocument,\n addOperations,\n getDocumentModelModule,\n isAllowedToCreateDocuments,\n reactor,\n ],\n );\n\n const handleUpdateFile = useCallback(\n async (\n driveId: string,\n id: string,\n documentType?: string,\n name?: string,\n parentFolder?: string,\n ) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to update files');\n }\n const drive = await _addDriveOperation(\n driveId,\n updateFile({\n id,\n name: name || undefined,\n parentFolder,\n documentType,\n }),\n );\n\n const node = drive?.state.global.nodes.find(node => node.id === id);\n if (!node || !isFileNode(node)) {\n throw new Error('There was an error updating document');\n }\n return node;\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleAddFolder = useCallback(\n async (driveId: string, name: string, parentFolder?: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create folders');\n }\n const folderId = generateId();\n const drive = await _addDriveOperation(\n driveId,\n addFolder({\n id: folderId,\n name,\n parentFolder,\n }),\n );\n\n const node = drive?.state.global.nodes.find(\n node => node.id === folderId,\n );\n if (!node || !isFolderNode(node)) {\n throw new Error('There was an error adding folder');\n }\n return node;\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleDeleteNode = useCallback(\n async (drive: string, id: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to delete documents');\n }\n await _addDriveOperation(\n drive,\n deleteNode({\n id,\n }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const renameNode = useCallback(\n async (driveId: string, id: string, name: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to rename documents');\n }\n const drive = await _addDriveOperation(\n driveId,\n updateNode({\n id,\n name,\n }),\n );\n\n const node = drive?.state.global.nodes.find(node => node.id === id);\n if (!node) {\n throw new Error('There was an error renaming node');\n }\n return node;\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleMoveNode = useCallback(\n async (src: UiNode, target: UiNode) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to move documents');\n }\n\n if (target.kind === FILE || src.parentFolder === target.id) return;\n\n await _addDriveOperation(\n target.driveId,\n moveNode({\n srcFolder: src.id,\n targetParentFolder: target.id,\n }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const handleCopyNode = useCallback(\n async (src: UiNode, target: UiNode) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to copy documents');\n }\n\n if (target.kind === FILE) return;\n\n const drive = documentDrives.find(\n drive => drive.header.id === src.driveId,\n );\n\n if (!drive) return;\n\n const copyNodesInput = generateNodesCopy(\n {\n srcId: src.id,\n targetParentFolder: target.id,\n targetName: src.name,\n },\n () => generateId(),\n drive.state.global.nodes,\n );\n\n const copyActions = copyNodesInput.map(copyNodeInput =>\n copyNode(copyNodeInput),\n );\n\n const result = await reactor.addDriveActions(\n src.driveId,\n copyActions,\n );\n if (result.operations.length) {\n await refreshDocumentDrives();\n } else if (result.status !== 'SUCCESS') {\n logger.error(\n `Error copying files: ${result.status}`,\n result.error,\n );\n }\n },\n [\n documentDrives,\n isAllowedToCreateDocuments,\n refreshDocumentDrives,\n reactor,\n ],\n );\n\n const addOperation = useCallback(\n async (driveId: string, id: string, operation: Operation) => {\n if (!isAllowedToEditDocuments) {\n throw new Error('User is not allowed to edit documents');\n }\n\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const drive = documentDrives.find(\n drive => drive.header.id === driveId,\n );\n if (!drive) {\n throw new Error(`Drive with id ${driveId} not found`);\n }\n\n const newDocument = await reactor.addOperation(\n driveId,\n id,\n operation,\n );\n return newDocument.document;\n },\n [documentDrives, isAllowedToEditDocuments, reactor],\n );\n\n const addDrive = useCallback(\n async (drive: DriveInput, preferredEditor?: string) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to create drives');\n }\n const id = drive.id || generateId();\n drive = createDriveState(drive);\n const newDrive = await reactor.addDrive(\n {\n global: drive.global,\n local: drive.local,\n id,\n },\n preferredEditor,\n );\n await refreshDocumentDrives();\n return newDrive;\n },\n [isAllowedToCreateDocuments, refreshDocumentDrives, reactor],\n );\n\n const addRemoteDrive = useCallback(\n async (url: string, options: RemoteDriveOptions) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const newDrive = await reactor.addRemoteDrive(url, options);\n await refreshDocumentDrives();\n return newDrive;\n },\n [refreshDocumentDrives, reactor],\n );\n\n const deleteDrive = useCallback(\n async (id: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to delete drives');\n }\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const drive = documentDrives.find(drive => drive.header.id === id);\n if (!drive) {\n throw new Error(`Drive with id ${id} not found`);\n }\n await reactor.deleteDrive(id);\n return refreshDocumentDrives();\n },\n [\n documentDrives,\n isAllowedToCreateDocuments,\n refreshDocumentDrives,\n reactor,\n ],\n );\n\n const renameDrive = useCallback(\n async (id: string, name: string) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error('User is not allowed to rename drives');\n }\n return _addDriveOperation(id, setDriveName({ name }));\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const setDriveAvailableOffline = useCallback(\n async (id: string, availableOffline: boolean) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error(\n 'User is not allowed to change drive availability',\n );\n }\n return _addDriveOperation(\n id,\n setAvailableOffline({ availableOffline }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const setDriveSharingType = useCallback(\n async (id: string, sharingType: SharingType) => {\n if (!isAllowedToCreateDocuments) {\n throw new Error(\n 'User is not allowed to change drive availability',\n );\n }\n return _addDriveOperation(\n id,\n setSharingType({ type: sharingType }),\n );\n },\n [_addDriveOperation, isAllowedToCreateDocuments],\n );\n\n const getSyncStatus = useCallback(\n async (\n syncId: string,\n sharingType: SharingType,\n ): Promise<SyncStatus | undefined> => {\n if (sharingType === LOCAL) return;\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n try {\n const syncStatus = reactor.getSyncStatus(syncId);\n if (syncStatus instanceof SynchronizationUnitNotFoundError)\n return 'INITIAL_SYNC';\n return syncStatus;\n } catch (error) {\n console.error(error);\n return ERROR;\n }\n },\n [reactor],\n );\n\n const getSyncStatusSync = useCallback(\n (syncId: string, sharingType: SharingType): SyncStatus | undefined => {\n if (sharingType === LOCAL) return;\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n try {\n const syncStatus = reactor.getSyncStatus(syncId);\n if (syncStatus instanceof SynchronizationUnitNotFoundError)\n return 'INITIAL_SYNC';\n return syncStatus;\n } catch (error) {\n console.error(error);\n return ERROR;\n }\n },\n [reactor],\n );\n\n const onStrandUpdate = useCallback(\n (cb: (update: StrandUpdate) => void) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n return reactor.on('strandUpdate', cb);\n },\n [reactor],\n );\n\n const onOperationsAdded = useCallback(\n (\n cb: (\n driveId: string,\n documentId: string | null | undefined,\n operations: Operation[],\n ) => void,\n ) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n return reactor.on('operationsAdded', cb);\n },\n [reactor],\n );\n\n const onSyncStatus = useCallback(\n (cb: (driveId: string, status: SyncStatus, error?: Error) => void) => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n return reactor.on('syncStatus', cb);\n },\n [reactor],\n );\n\n const clearStorage = useCallback(async () => {\n // reactor may have not loaded yet\n if (!reactor) {\n return;\n }\n\n await storage.clear();\n await refreshDocumentDrives();\n }, [refreshDocumentDrives, reactor, storage]);\n\n const handleRemoveTrigger = useCallback(\n async (driveId: string, triggerId: string) => {\n const drive = await _addDriveOperation(\n driveId,\n removeTrigger({ triggerId }),\n );\n\n const trigger = drive?.state.local.triggers.find(\n trigger => trigger.id === triggerId,\n );\n\n if (trigger) {\n throw new Error(\n `There was an error removing trigger ${triggerId}`,\n );\n }\n },\n [_addDriveOperation],\n );\n\n const registerNewPullResponderTrigger = useCallback(\n async (\n driveId: string,\n url: string,\n options: Pick<RemoteDriveOptions, 'pullFilter' | 'pullInterval'>,\n ): Promise<PullResponderTrigger> => {\n if (!reactor) {\n throw new Error('Reactor is not loaded');\n }\n\n const uuid = generateId();\n const listener: Listener = {\n driveId,\n listenerId: uuid,\n block: false,\n filter: {\n branch: options.pullFilter?.branch ?? [],\n documentId: options.pullFilter?.documentId ?? [],\n documentType: options.pullFilter?.documentType ?? [],\n scope: options.pullFilter?.scope ?? [],\n },\n system: false,\n label: `Pullresponder #${uuid}`,\n callInfo: {\n data: '',\n name: 'PullResponder',\n transmitterType: 'PullResponder',\n },\n };\n\n // TODO: circular reference\n // TODO: once we have DI, remove this and pass around\n const listenerManager = reactor.listeners;\n listener.transmitter = new PullResponderTransmitter(\n listener,\n listenerManager,\n );\n\n // set the listener on the manager directly (bypassing operations)\n try {\n await listenerManager.setListener(driveId, listener);\n } catch (error) {\n throw new Error(`Listener couldn't be registered: ${error}`);\n }\n\n // for backwards compatibility: return everything but the transmitter\n return {\n driveId,\n filter: listener.filter,\n data: {\n interval: `${options.pullInterval}` || '1000',\n listenerId: uuid,\n url,\n },\n id: uuid,\n type: 'PullResponder',\n };\n },\n [reactor],\n );\n\n const handleAddTrigger = useCallback(\n async (driveId: string, trigger: Trigger) => {\n const drive = await _addDriveOperation(\n driveId,\n addTrigger({ trigger }),\n );\n\n const newTrigger = drive?.state.local.triggers.find(\n trigger => trigger.id === trigger.id,\n );\n\n if (!newTrigger) {\n throw new Error(\n `There was an error adding the trigger ${trigger.id}`,\n );\n }\n },\n [_addDriveOperation],\n );\n\n return useMemo(\n () => ({\n reactorLoaded,\n documentDrives,\n documentDrivesStatus,\n addDocument,\n openFile,\n addFile,\n updateFile: handleUpdateFile,\n addFolder: handleAddFolder,\n deleteNode: handleDeleteNode,\n renameNode,\n moveNode: handleMoveNode,\n copyNode: handleCopyNode,\n addOperation,\n addOperations,\n addDrive,\n addRemoteDrive,\n deleteDrive,\n renameDrive,\n setDriveAvailableOffline,\n setDriveSharingType,\n getSyncStatus,\n getSyncStatusSync,\n onStrandUpdate,\n onSyncStatus,\n clearStorage,\n removeTrigger: handleRemoveTrigger,\n addTrigger: handleAddTrigger,\n registerNewPullResponderTrigger,\n getDocumentsIds,\n onOperationsAdded,\n }),\n [\n reactorLoaded,\n addDocument,\n addDrive,\n addFile,\n handleAddFolder,\n addOperation,\n addOperations,\n addRemoteDrive,\n handleAddTrigger,\n clearStorage,\n handleCopyNode,\n deleteDrive,\n handleDeleteNode,\n documentDrives,\n documentDrivesStatus,\n getSyncStatus,\n getSyncStatusSync,\n handleMoveNode,\n onStrandUpdate,\n onSyncStatus,\n openFile,\n registerNewPullResponderTrigger,\n handleRemoveTrigger,\n renameDrive,\n renameNode,\n setDriveAvailableOffline,\n setDriveSharingType,\n handleUpdateFile,\n getDocumentsIds,\n onOperationsAdded,\n ],\n );\n}\n\nexport type TDocumentDriveServer = ReturnType<typeof useDocumentDriveServer>;\n"],"names":["logger","childLogger","FILE_UPLOAD_OPERATIONS_CHUNK_SIZE","useDocumentDispatch","documentReducer","initialState","onError","state","setState","useState","error","setError","onErrorHandler","useEffect","action","callback","onErrorCallback","_state","newState","scope","operations","operation","uploadDocumentOperations","drive","documentId","document","reactor","pushOperations","options","operationsLimit","i","chunk","downloadFile","createZip","blob","link","exportFile","getDocumentModelModule","documentModelModule","extension","fileHandle","_a","baseSaveToFileHandle","path","_b","e","loadFile","baseDocument","baseLoadFromInput","signOperation","sign","reducer","user","context","buildSignedOperation","addActionContext","connectDid","useDocumentDriveServer","isAllowedToCreateDocuments","isAllowedToEditDocuments","useUserPermissions","useUser","useConnectDid","useConnectCrypto","useUnwrappedReactor","storage","useDocumentAdminStorage","useGetDocumentModelModule","documentDrives","refreshDocumentDrives","documentDrivesStatus","useDocumentDrives","reactorLoaded","openFile","useCallback","id","getDocumentsIds","driveId","_addDriveOperation","driveCopy","documentDriveReducer","op","signedOperation","result","isDocumentDrive","addDocument","name","documentType","parentFolder","d","generateId","generateAddNodeAction","node","isFileNode","addOperations","addFile","file","initialDocument","fileNode","documentDrive","handleUpdateFile","updateFile","handleAddFolder","folderId","addFolder","isFolderNode","handleDeleteNode","deleteNode","renameNode","updateNode","handleMoveNode","src","target","FILE","moveNode","handleCopyNode","copyActions","generateNodesCopy","copyNodeInput","copyNode","addOperation","addDrive","preferredEditor","createDriveState","newDrive","addRemoteDrive","url","deleteDrive","renameDrive","setDriveName","setDriveAvailableOffline","availableOffline","setAvailableOffline","setDriveSharingType","sharingType","setSharingType","getSyncStatus","syncId","LOCAL","syncStatus","SynchronizationUnitNotFoundError","ERROR","getSyncStatusSync","onStrandUpdate","cb","onOperationsAdded","onSyncStatus","clearStorage","handleRemoveTrigger","triggerId","removeTrigger","trigger","registerNewPullResponderTrigger","uuid","listener","_c","_d","listenerManager","PullResponderTransmitter","handleAddTrigger","addTrigger","useMemo"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{useMemo as O,useCallback as D,useEffect as X}from"react";import{a as w,b4 as Z,b as v,ab as ee,b5 as te,b6 as ne,b7 as oe,b8 as re,b9 as se,n as U,m as ae,a1 as C}from"./index.BapSoqiD.js";import{e as ie,b2 as ce,b3 as ue,b4 as le,b as de,u as fe,d as me}from"./user.Bwi_fGbx.js";import{c as V}from"./connect.config.CoIqPBUZ.js";import{c as F,u as B,b as g,a as we}from"./index.Te94ULrh.js";const A=V.routerBasename,ge=(e,t,n,o)=>{const r=F(`${A}:${e}`,t,void 0);return r.debugLabel=`storageAtom:${A}:${e}`,r},qe=(e,t,n)=>{const o=F(e,t,{getItem(r,a){const u=localStorage.getItem(`${A}:${r}`);return u?JSON.parse(u):a},setItem(r,a){localStorage.setItem(`${A}:${r}`,JSON.stringify(a)),n(a)},removeItem(r){localStorage.removeItem(`${A}:${r}`)},subscribe(r,a){if(typeof window.addEventListener>"u")return()=>null;function u(l){l.storageArea===localStorage&&l.key===`${A}:${r}`&&a(l.newValue??"")}return window.addEventListener("storage",u),()=>window.removeEventListener("storage",u)}});return o.debugLabel=`storageAtomWithCallback:${A}:${e}`,o};function pe(e){const t=w(0),n=w(()=>({i:0}),(i,s)=>{const c=i(n);return Object.assign(c,{m:!0,peek:i,set:s}),s(t,d=>d+1),()=>{c.m=!1,u(c),l(c)}});n.onMount=i=>i();const o=w(i=>{i(t);const s=i(n);if(!s.m||s.irc||s.i&&!s.irf)return s.p;l(s);const c=new Map,d=m=>{const p=i(m);return c.set(m,p),p};d.peek=s.peek;const f=(...m)=>{try{return++s.i,s.set(...m)}finally{Array.from(c.keys(),i),--s.i}};f.recurse=(m,...p)=>{if(!s.fc)try{return s.irc=!0,s.set(m,...p)}finally{s.irc=!1,Array.from(c).some(b)&&a(s)}};function b([m,p]){return i(m)!==p}++s.i;function E(){try{if(s.irf=!1,!s.m)return;u(s),s.c=r.effect(d,f)}catch(m){s.e=m,a(s)}finally{s.p=void 0,--s.i}}return s.irf?E():s.p=Promise.resolve().then(E)}),r=w(i=>void i(o));return r.effect=e,r;function a(i){try{i.irf=!0,i.set(t,s=>s+1)}finally{i.irf=!1}}function u(i){if(typeof i.c=="function")try{i.fc=!0,i.c()}finally{i.fc=!1,i.c=void 0}}function l(i){if("e"in i){const s=i.e;throw delete i.e,s}}}const y=new WeakMap;function W(e,t=Z()){y.has(t)||y.set(t,new Map);const n=y.get(t);let o=n.get(e);if(!o){const r=pe(e);let a=t.sub(r,()=>{});o=()=>{a&&(n.delete(e),n.size===0&&y.delete(t),a=void a())},n.set(e,o)}return o}const Ae=window.__VITE_ENVS.PH_CONNECT_RENOWN_URL||"https://www.renown.id",he=window.__VITE_ENVS.PH_CONNECT_RENOWN_NETWORK_ID||"eip155",be=window.__VITE_ENVS.PH_CONNECT_RENOWN_CHAIN_ID||"1",De=[ee,te];function ve(...e){const t=new Map;for(const n of e)t.set(n.documentModel.id,n);return Array.from(t.values())}function Ee(e){return e.map(t=>t.documentModels).reduce((t,n)=>t.concat(n),[])}const M=w(async e=>{const t=await e(ie),n=Ee(t);return ve(...De,...n)});M.debugLabel="documentModelsAtomInConnect";const J=B(M);J.debugLabel="unwrappedDocumentModelsAtomInConnect";const x=()=>v(J),_e=function(e){const t=W(n=>{n(M).then(e).catch(r=>{throw r})},g);return()=>t()};function ye(e,t){return t==null?void 0:t.find(n=>n.documentModel.id===e)}const Qe=()=>{const e=x();return t=>ye(t,e)},Ye=()=>{const e=x(),{config:t}=Be(),{enabledEditors:n,disabledEditors:o}=t.editors;if(!e)return;const r=e.filter(a=>a.documentModel.id!=="powerhouse/document-drive");return n==="*"?e:o==="*"?[]:o?r.filter(a=>!o.includes(a.documentModel.id)):n?r.filter(a=>n.includes(a.documentModel.id)):r},k=window.__VITE_ENVS.PH_CONNECT_DEFAULT_DRIVES_URL||void 0,S=k?k.split(","):[],Ie=()=>({defaultDrives:{remoteDrives:S.map(t=>({url:t,options:{sharingType:"PUBLIC",availableOffline:!0,listeners:[{block:!0,callInfo:{data:t,name:"switchboard-push",transmitterType:"SwitchboardPush"},filter:{branch:["main"],documentId:["*"],documentType:["*"],scope:["global"]},label:"Switchboard Sync",listenerId:"1",system:!0}],triggers:[]}})),removeOldRemoteDrives:S.length>0?{strategy:"preserve-by-url-and-detach",urls:S}:{strategy:"preserve-all"}}});function Le(e){return new ne(e)}function Te(e,t){return new oe(e).withStorage(t).withCache(new re).withQueueManager(new se(1,10)).withOptions({...Ie()}).build()}async function Ce(e){await Me(e);const t=await e.initialize(),n=t==null?void 0:t.at(0);if(n)throw n;const o=await e.getDrives();if(!(o!=null&&o.length)&&V.drives.sections.LOCAL.enabled)return e.addDrive({id:ae(),slug:"my-local-drive",global:{name:"My Local Drive",icon:null},local:{availableOffline:!1,sharingType:"private",listeners:[],triggers:[]}}).catch(U.error)}async function Me(e){const t=await g.get(ce),n=await(t==null?void 0:t.user()),o=await ue();n!=null&&n.address&&e.setGenerateJwtHandler(async r=>o.getBearerToken(r,n.address))}async function Se(){let e;return Promise.race([new Promise((t,n)=>(e=W(o=>{try{const r=o(le);(r==="finished"||r==="error")&&t()}catch(r){n(new Error(`Error observing renown status: ${r instanceof Error?r.message:"Unknown error"}`))}},g),()=>e==null?void 0:e())),new Promise((t,n)=>{setTimeout(()=>{e==null||e(),n(new Error("Timed out waiting for renown to initialize"))},5e3)})]).catch(t=>{e==null||e(),U.warn(t)})}async function Ne(){var o;await Se();const e=g.get($),t=await g.get(M),n=((o=window.electronAPI)==null?void 0:o.documentDrive)??Te(t,e);return await Ce(n),n}const $=w(Le(V.routerBasename));$.debugLabel="storageAtomInConnect";const h=we(()=>Ne());h.debugLabel="reactorAtomInConnect";const G=B(h);G.debugLabel="unwrappedReactorInConnect";const Xe=()=>v(h),Ze=()=>v($),Re=()=>v(G),et=()=>v(H),H=w(void 0);H.onMount=e=>{Oe(e)};H.debugLabel="reactorAsyncAtomInConnect";let N;h.onMount=e=>{N||e(async t=>{const n=await t;return N||(N=_e(o=>{n.setDocumentModelModules(o)})),n})};const Oe=function(e){const t=W(n=>{n(h).then(e).catch(r=>{throw r})},g);return()=>t()},P=w(new Map);P.debugLabel="documentDrivesAtomInConnect";function Pe(e){return Object.keys(e.operations).map(t=>{var n;return`${t}:${e.operations[t].length}:${(n=e.operations[t].at(-1))==null?void 0:n.hash}`}).join(":")}function z(e){return e.map(Pe).join("&")}const j=e=>()=>w(t=>e?t(P).get(e)??[]:[],(t,n,o)=>{n(P,r=>{if(!e)return new Map;const a=r.get(e)??[];return a.length!==o.length||z(a)!==z(o)?new Map(r).set(e,o):r})});j.debugLabel="readWriteDocumentDrivesAtomInConnect";const K=w("INITIAL");K.debugLabel="documentDrivesInitializedInConnect";const Ue=250;let R;const I=new Array;function Ve(e,t,n){R&&clearTimeout(R),I.push(t);const o=[...I];R=setTimeout(()=>{e().then(()=>{for(;o.length;){const r=o.shift();if(r){r();const a=I.indexOf(r);a>-1&&I.splice(a,1)}}}).catch(n)},Ue)}async function We(e){const t=[],n=await e.getDrives()??[];for(const o of n)try{const r=await e.getDrive(o);if(!r)continue;t.push(r)}catch(r){console.error(r)}return t}function tt(){const e=Re(),[t,n]=C(O(j(e),[e])),o=D(async()=>{if(e)return new Promise((l,i)=>{Ve(()=>We(e).then(s=>{n(s)}).catch(i),l,i)})},[e]),[r,a]=C(K);r==="INITIAL"&&e&&(a("LOADING"),o().then(()=>a("LOADED")).catch(()=>a("ERROR")));const u=D(l=>{if(!e)return;const i=e.on("syncStatus",async(m,p,_)=>{_&&console.error(_),_&&await o()}),s=e.on("strandUpdate",()=>o()),c=e.on("driveAdded",()=>o()),d=e.on("driveDeleted",()=>o()),f=e.on("driveOperationsAdded",()=>o()),b=e.on("clientStrandsError",l.strandsErrorHandler),E=e.on("defaultRemoteDrive",()=>o());return()=>{s(),i(),c(),d(),f(),b(),E()}},[e,o]);return O(()=>[t,o,u,r],[t,r])}const q=w("initial");q.debugLabel="loginStatusAtomInConnect";const $e=()=>{const[e,t]=C(q),n=de(),o=fe(),{did:r,getBearerToken:a}=me(),u=D(async()=>{var d;const s=await r(),c=new URL(Ae);if(c.searchParams.set("connect",s),c.searchParams.set("network",he),c.searchParams.set("chain",be),window.electronAPI){const f=await window.electronAPI.protocol();c.searchParams.set("deeplink",f),await window.electronAPI.openURL(c.toString())}else{const f=new URL(window.location.pathname,window.location.origin);c.searchParams.set("returnUrl",f.toJSON()),(d=window.open(c,"_self"))==null||d.focus()}},[r]),l=D(async s=>{if(o)try{t("checking");const c=await o.user();if((c==null?void 0:c.did)===s)return t("authorized"),c;const d=await o.login(s);if(d)return t("authorized"),g.get(h).then(f=>{f.setGenerateJwtHandler(async b=>a(b,d.address))}).catch(f=>console.error(f)),d;t("not-authorized")}catch(c){t("not-authorized"),U.error(c)}},[o]);X(()=>{n&&e!=="authorized"&&t("authorized")},[n,e]);const i=D(async()=>{t("initial"),await(o==null?void 0:o.logout()),g.get(h).then(s=>{s.removeJwtHandler()}).catch(s=>console.error(s))},[o]);return O(()=>({openRenown:u,user:n,status:n?"authorized":e,login:o?l:void 0,logout:i}),[o,u,n,e,l,i])};function He(){const{user:e,status:t}=$e(),n=window.__VITE_ENVS.PH_CONNECT_ARBITRUM_ALLOW_LIST,o=window.__VITE_ENVS.PH_CONNECT_RWA_ALLOW_LIST,r=!!n&&n!=="",a=!!o&&o!=="";if(r&&a)throw new Error("Both Arbitrum and RWA allow lists are defined. Please only define one.");if(!r&&!a)return{isAllowed:!0,allowListType:"none"};if(e!==void 0){if(r){const u=n.split(",");return t!=="authorized"||!e?{isAllowed:!1,allowListType:"arbitrum"}:u.includes(e.address)?{isAllowed:!0,allowListType:"arbitrum"}:{isAllowed:!1,allowListType:"arbitrum"}}if(a){const u=o.split(",");return t!=="authorized"||!e?{isAllowed:!1,allowListType:"rwa"}:u.includes(e.address)?{isAllowed:!0,allowListType:"rwa"}:{isAllowed:!1,allowListType:"rwa"}}return{isAllowed:!0,allowListType:"none"}}}function nt(){const e=He();if(!e)return;const{allowListType:t,isAllowed:n}=e;return t==="arbitrum"?{isAllowedToCreateDocuments:n,isAllowedToEditDocuments:!0}:t==="rwa"?{isAllowedToCreateDocuments:n,isAllowedToEditDocuments:n}:{isAllowedToCreateDocuments:!0,isAllowedToEditDocuments:!0}}const ke="feature-flags-config",L=window.__VITE_ENVS.PH_CONNECT_ENABLED_EDITORS||void 0,ze=L==null?void 0:L.split(","),T=window.__VITE_ENVS.PH_CONNECT_DISABLED_EDITORS||"powerhouse/document-drive",Fe=T==null?void 0:T.split(","),Q={editors:{enabledEditors:L==="*"?"*":ze,disabledEditors:T==="*"?"*":Fe}},Y=ge(ke,Q);Y.debugLabel="featureFlagAtomInConnect";const Be=()=>{const[e,t]=C(Y);return{config:{...Q,...e},setConfig:t}};export{Ae as R,nt as a,qe as b,Pe as c,z as d,Qe as e,Xe as f,Ye as g,Re as h,tt as i,$e as j,he as k,be as l,ge as m,Ze as n,h as r,et as u};
2
- //# sourceMappingURL=useFeatureFlags.CuH-Ce22.js.map
1
+ import{useMemo as O,useCallback as D,useEffect as X}from"react";import{a as w,b4 as Z,b as v,ab as ee,b5 as te,b6 as ne,b7 as oe,b8 as re,b9 as se,n as U,m as ae,a1 as C}from"./index.DFyMrewv.js";import{e as ie,b2 as ce,b3 as ue,b4 as le,b as de,u as fe,d as me}from"./user.B1tnDc-G.js";import{c as V}from"./connect.config.CFYnBL6U.js";import{c as F,u as B,b as g,a as we}from"./index.4YAZr2Bw.js";const A=V.routerBasename,ge=(e,t,n,o)=>{const r=F(`${A}:${e}`,t,void 0);return r.debugLabel=`storageAtom:${A}:${e}`,r},qe=(e,t,n)=>{const o=F(e,t,{getItem(r,a){const u=localStorage.getItem(`${A}:${r}`);return u?JSON.parse(u):a},setItem(r,a){localStorage.setItem(`${A}:${r}`,JSON.stringify(a)),n(a)},removeItem(r){localStorage.removeItem(`${A}:${r}`)},subscribe(r,a){if(typeof window.addEventListener>"u")return()=>null;function u(l){l.storageArea===localStorage&&l.key===`${A}:${r}`&&a(l.newValue??"")}return window.addEventListener("storage",u),()=>window.removeEventListener("storage",u)}});return o.debugLabel=`storageAtomWithCallback:${A}:${e}`,o};function pe(e){const t=w(0),n=w(()=>({i:0}),(i,s)=>{const c=i(n);return Object.assign(c,{m:!0,peek:i,set:s}),s(t,d=>d+1),()=>{c.m=!1,u(c),l(c)}});n.onMount=i=>i();const o=w(i=>{i(t);const s=i(n);if(!s.m||s.irc||s.i&&!s.irf)return s.p;l(s);const c=new Map,d=m=>{const p=i(m);return c.set(m,p),p};d.peek=s.peek;const f=(...m)=>{try{return++s.i,s.set(...m)}finally{Array.from(c.keys(),i),--s.i}};f.recurse=(m,...p)=>{if(!s.fc)try{return s.irc=!0,s.set(m,...p)}finally{s.irc=!1,Array.from(c).some(b)&&a(s)}};function b([m,p]){return i(m)!==p}++s.i;function E(){try{if(s.irf=!1,!s.m)return;u(s),s.c=r.effect(d,f)}catch(m){s.e=m,a(s)}finally{s.p=void 0,--s.i}}return s.irf?E():s.p=Promise.resolve().then(E)}),r=w(i=>void i(o));return r.effect=e,r;function a(i){try{i.irf=!0,i.set(t,s=>s+1)}finally{i.irf=!1}}function u(i){if(typeof i.c=="function")try{i.fc=!0,i.c()}finally{i.fc=!1,i.c=void 0}}function l(i){if("e"in i){const s=i.e;throw delete i.e,s}}}const y=new WeakMap;function W(e,t=Z()){y.has(t)||y.set(t,new Map);const n=y.get(t);let o=n.get(e);if(!o){const r=pe(e);let a=t.sub(r,()=>{});o=()=>{a&&(n.delete(e),n.size===0&&y.delete(t),a=void a())},n.set(e,o)}return o}const Ae=window.__VITE_ENVS.PH_CONNECT_RENOWN_URL||"https://www.renown.id",he=window.__VITE_ENVS.PH_CONNECT_RENOWN_NETWORK_ID||"eip155",be=window.__VITE_ENVS.PH_CONNECT_RENOWN_CHAIN_ID||"1",De=[ee,te];function ve(...e){const t=new Map;for(const n of e)t.set(n.documentModel.id,n);return Array.from(t.values())}function Ee(e){return e.map(t=>t.documentModels).reduce((t,n)=>t.concat(n),[])}const M=w(async e=>{const t=await e(ie),n=Ee(t);return ve(...De,...n)});M.debugLabel="documentModelsAtomInConnect";const J=B(M);J.debugLabel="unwrappedDocumentModelsAtomInConnect";const x=()=>v(J),_e=function(e){const t=W(n=>{n(M).then(e).catch(r=>{throw r})},g);return()=>t()};function ye(e,t){return t==null?void 0:t.find(n=>n.documentModel.id===e)}const Qe=()=>{const e=x();return t=>ye(t,e)},Ye=()=>{const e=x(),{config:t}=Be(),{enabledEditors:n,disabledEditors:o}=t.editors;if(!e)return;const r=e.filter(a=>a.documentModel.id!=="powerhouse/document-drive");return n==="*"?e:o==="*"?[]:o?r.filter(a=>!o.includes(a.documentModel.id)):n?r.filter(a=>n.includes(a.documentModel.id)):r},k=window.__VITE_ENVS.PH_CONNECT_DEFAULT_DRIVES_URL||void 0,S=k?k.split(","):[],Ie=()=>({defaultDrives:{remoteDrives:S.map(t=>({url:t,options:{sharingType:"PUBLIC",availableOffline:!0,listeners:[{block:!0,callInfo:{data:t,name:"switchboard-push",transmitterType:"SwitchboardPush"},filter:{branch:["main"],documentId:["*"],documentType:["*"],scope:["global"]},label:"Switchboard Sync",listenerId:"1",system:!0}],triggers:[]}})),removeOldRemoteDrives:S.length>0?{strategy:"preserve-by-url-and-detach",urls:S}:{strategy:"preserve-all"}}});function Le(e){return new ne(e)}function Te(e,t){return new oe(e).withStorage(t).withCache(new re).withQueueManager(new se(1,10)).withOptions({...Ie()}).build()}async function Ce(e){await Me(e);const t=await e.initialize(),n=t==null?void 0:t.at(0);if(n)throw n;const o=await e.getDrives();if(!(o!=null&&o.length)&&V.drives.sections.LOCAL.enabled)return e.addDrive({id:ae(),slug:"my-local-drive",global:{name:"My Local Drive",icon:null},local:{availableOffline:!1,sharingType:"private",listeners:[],triggers:[]}}).catch(U.error)}async function Me(e){const t=await g.get(ce),n=await(t==null?void 0:t.user()),o=await ue();n!=null&&n.address&&e.setGenerateJwtHandler(async r=>o.getBearerToken(r,n.address))}async function Se(){let e;return Promise.race([new Promise((t,n)=>(e=W(o=>{try{const r=o(le);(r==="finished"||r==="error")&&t()}catch(r){n(new Error(`Error observing renown status: ${r instanceof Error?r.message:"Unknown error"}`))}},g),()=>e==null?void 0:e())),new Promise((t,n)=>{setTimeout(()=>{e==null||e(),n(new Error("Timed out waiting for renown to initialize"))},5e3)})]).catch(t=>{e==null||e(),U.warn(t)})}async function Ne(){var o;await Se();const e=g.get($),t=await g.get(M),n=((o=window.electronAPI)==null?void 0:o.documentDrive)??Te(t,e);return await Ce(n),n}const $=w(Le(V.routerBasename));$.debugLabel="storageAtomInConnect";const h=we(()=>Ne());h.debugLabel="reactorAtomInConnect";const G=B(h);G.debugLabel="unwrappedReactorInConnect";const Xe=()=>v(h),Ze=()=>v($),Re=()=>v(G),et=()=>v(H),H=w(void 0);H.onMount=e=>{Oe(e)};H.debugLabel="reactorAsyncAtomInConnect";let N;h.onMount=e=>{N||e(async t=>{const n=await t;return N||(N=_e(o=>{n.setDocumentModelModules(o)})),n})};const Oe=function(e){const t=W(n=>{n(h).then(e).catch(r=>{throw r})},g);return()=>t()},P=w(new Map);P.debugLabel="documentDrivesAtomInConnect";function Pe(e){return Object.keys(e.operations).map(t=>{var n;return`${t}:${e.operations[t].length}:${(n=e.operations[t].at(-1))==null?void 0:n.hash}`}).join(":")}function z(e){return e.map(Pe).join("&")}const j=e=>()=>w(t=>e?t(P).get(e)??[]:[],(t,n,o)=>{n(P,r=>{if(!e)return new Map;const a=r.get(e)??[];return a.length!==o.length||z(a)!==z(o)?new Map(r).set(e,o):r})});j.debugLabel="readWriteDocumentDrivesAtomInConnect";const K=w("INITIAL");K.debugLabel="documentDrivesInitializedInConnect";const Ue=250;let R;const I=new Array;function Ve(e,t,n){R&&clearTimeout(R),I.push(t);const o=[...I];R=setTimeout(()=>{e().then(()=>{for(;o.length;){const r=o.shift();if(r){r();const a=I.indexOf(r);a>-1&&I.splice(a,1)}}}).catch(n)},Ue)}async function We(e){const t=[],n=await e.getDrives()??[];for(const o of n)try{const r=await e.getDrive(o);if(!r)continue;t.push(r)}catch(r){console.error(r)}return t}function tt(){const e=Re(),[t,n]=C(O(j(e),[e])),o=D(async()=>{if(e)return new Promise((l,i)=>{Ve(()=>We(e).then(s=>{n(s)}).catch(i),l,i)})},[e]),[r,a]=C(K);r==="INITIAL"&&e&&(a("LOADING"),o().then(()=>a("LOADED")).catch(()=>a("ERROR")));const u=D(l=>{if(!e)return;const i=e.on("syncStatus",async(m,p,_)=>{_&&console.error(_),_&&await o()}),s=e.on("strandUpdate",()=>o()),c=e.on("driveAdded",()=>o()),d=e.on("driveDeleted",()=>o()),f=e.on("driveOperationsAdded",()=>o()),b=e.on("clientStrandsError",l.strandsErrorHandler),E=e.on("defaultRemoteDrive",()=>o());return()=>{s(),i(),c(),d(),f(),b(),E()}},[e,o]);return O(()=>[t,o,u,r],[t,r])}const q=w("initial");q.debugLabel="loginStatusAtomInConnect";const $e=()=>{const[e,t]=C(q),n=de(),o=fe(),{did:r,getBearerToken:a}=me(),u=D(async()=>{var d;const s=await r(),c=new URL(Ae);if(c.searchParams.set("connect",s),c.searchParams.set("network",he),c.searchParams.set("chain",be),window.electronAPI){const f=await window.electronAPI.protocol();c.searchParams.set("deeplink",f),await window.electronAPI.openURL(c.toString())}else{const f=new URL(window.location.pathname,window.location.origin);c.searchParams.set("returnUrl",f.toJSON()),(d=window.open(c,"_self"))==null||d.focus()}},[r]),l=D(async s=>{if(o)try{t("checking");const c=await o.user();if((c==null?void 0:c.did)===s)return t("authorized"),c;const d=await o.login(s);if(d)return t("authorized"),g.get(h).then(f=>{f.setGenerateJwtHandler(async b=>a(b,d.address))}).catch(f=>console.error(f)),d;t("not-authorized")}catch(c){t("not-authorized"),U.error(c)}},[o]);X(()=>{n&&e!=="authorized"&&t("authorized")},[n,e]);const i=D(async()=>{t("initial"),await(o==null?void 0:o.logout()),g.get(h).then(s=>{s.removeJwtHandler()}).catch(s=>console.error(s))},[o]);return O(()=>({openRenown:u,user:n,status:n?"authorized":e,login:o?l:void 0,logout:i}),[o,u,n,e,l,i])};function He(){const{user:e,status:t}=$e(),n=window.__VITE_ENVS.PH_CONNECT_ARBITRUM_ALLOW_LIST,o=window.__VITE_ENVS.PH_CONNECT_RWA_ALLOW_LIST,r=!!n&&n!=="",a=!!o&&o!=="";if(r&&a)throw new Error("Both Arbitrum and RWA allow lists are defined. Please only define one.");if(!r&&!a)return{isAllowed:!0,allowListType:"none"};if(e!==void 0){if(r){const u=n.split(",");return t!=="authorized"||!e?{isAllowed:!1,allowListType:"arbitrum"}:u.includes(e.address)?{isAllowed:!0,allowListType:"arbitrum"}:{isAllowed:!1,allowListType:"arbitrum"}}if(a){const u=o.split(",");return t!=="authorized"||!e?{isAllowed:!1,allowListType:"rwa"}:u.includes(e.address)?{isAllowed:!0,allowListType:"rwa"}:{isAllowed:!1,allowListType:"rwa"}}return{isAllowed:!0,allowListType:"none"}}}function nt(){const e=He();if(!e)return;const{allowListType:t,isAllowed:n}=e;return t==="arbitrum"?{isAllowedToCreateDocuments:n,isAllowedToEditDocuments:!0}:t==="rwa"?{isAllowedToCreateDocuments:n,isAllowedToEditDocuments:n}:{isAllowedToCreateDocuments:!0,isAllowedToEditDocuments:!0}}const ke="feature-flags-config",L=window.__VITE_ENVS.PH_CONNECT_ENABLED_EDITORS||void 0,ze=L==null?void 0:L.split(","),T=window.__VITE_ENVS.PH_CONNECT_DISABLED_EDITORS||"powerhouse/document-drive",Fe=T==null?void 0:T.split(","),Q={editors:{enabledEditors:L==="*"?"*":ze,disabledEditors:T==="*"?"*":Fe}},Y=ge(ke,Q);Y.debugLabel="featureFlagAtomInConnect";const Be=()=>{const[e,t]=C(Y);return{config:{...Q,...e},setConfig:t}};export{Ae as R,nt as a,qe as b,Pe as c,z as d,Qe as e,Xe as f,Ye as g,Re as h,tt as i,$e as j,he as k,be as l,ge as m,Ze as n,h as r,et as u};
2
+ //# sourceMappingURL=useFeatureFlags.B8bfi2uc.js.map