@powerhousedao/connect 1.0.0-dev.191 → 1.0.0-dev.193

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 (40) hide show
  1. package/dist/assets/{app-BIDiEHBz.js → app-ACX0Clye.js} +5 -5
  2. package/dist/assets/{app-BIDiEHBz.js.map → app-ACX0Clye.js.map} +1 -1
  3. package/dist/assets/{app-loader-CU-gFJvb.js → app-loader-37r2eMk_.js} +3 -3
  4. package/dist/assets/{app-loader-CU-gFJvb.js.map → app-loader-37r2eMk_.js.map} +1 -1
  5. package/dist/assets/{browser-HhGAAWtQ.js → browser-YDp_xMjJ.js} +4 -4
  6. package/dist/assets/{browser-HhGAAWtQ.js.map → browser-YDp_xMjJ.js.map} +1 -1
  7. package/dist/assets/{ccip-D8Vl-oON.js → ccip-CGTUXc2u.js} +2 -2
  8. package/dist/assets/{ccip-D8Vl-oON.js.map → ccip-CGTUXc2u.js.map} +1 -1
  9. package/dist/assets/{content-DUAVRmAa.js → content-D-8F3NIl.js} +3 -3
  10. package/dist/assets/{content-DUAVRmAa.js.map → content-D-8F3NIl.js.map} +1 -1
  11. package/dist/assets/{editor-CdT7i7GG.js → editor-BbmqzUVS.js} +2 -2
  12. package/dist/assets/{editor-CdT7i7GG.js.map → editor-BbmqzUVS.js.map} +1 -1
  13. package/dist/assets/{editor-DmHEwtqc.js → editor-CU_oft0S.js} +2 -2
  14. package/dist/assets/{editor-DmHEwtqc.js.map → editor-CU_oft0S.js.map} +1 -1
  15. package/dist/assets/{editor-CCx8SVcE.js → editor-DF09Xm9F.js} +2 -2
  16. package/dist/assets/{editor-CCx8SVcE.js.map → editor-DF09Xm9F.js.map} +1 -1
  17. package/dist/assets/{editor-CaKlOHRk.js → editor-YpthKte0.js} +2 -2
  18. package/dist/assets/{editor-CaKlOHRk.js.map → editor-YpthKte0.js.map} +1 -1
  19. package/dist/assets/{editors-C_HvlNCl.js → editors-CUSze4lr.js} +4 -4
  20. package/dist/assets/{editors-C_HvlNCl.js.map → editors-CUSze4lr.js.map} +1 -1
  21. package/dist/assets/{index-fUQXjnk1.js → index-DX_EzB-C.js} +3 -3
  22. package/dist/assets/{index-fUQXjnk1.js.map → index-DX_EzB-C.js.map} +1 -1
  23. package/dist/assets/{index-BgDn--mP.js → index-zOgcw8RH.js} +2 -2
  24. package/dist/assets/{index-BgDn--mP.js.map → index-zOgcw8RH.js.map} +1 -1
  25. package/dist/assets/{main.CuhK_teW.js → main.Dn_g_SSw.js} +2 -2
  26. package/dist/assets/{main.CuhK_teW.js.map → main.Dn_g_SSw.js.map} +1 -1
  27. package/dist/assets/{root-CiT_af3P.js → root-Dm2tQkYV.js} +2 -2
  28. package/dist/assets/{root-CiT_af3P.js.map → root-Dm2tQkYV.js.map} +1 -1
  29. package/dist/assets/{router-i6g_L9gI.js → router-Tgbf-6i0.js} +4 -4
  30. package/dist/assets/{router-i6g_L9gI.js.map → router-Tgbf-6i0.js.map} +1 -1
  31. package/dist/assets/{useUiNodes-BXGcF2vL.js → useUiNodes-Cf5bUEDX.js} +2 -2
  32. package/dist/assets/{useUiNodes-BXGcF2vL.js.map → useUiNodes-Cf5bUEDX.js.map} +1 -1
  33. package/dist/index.html +3 -3
  34. package/dist/service-worker.js +1 -1
  35. package/dist/studio/index.d.ts +2 -0
  36. package/dist/studio/index.js +21 -10
  37. package/dist/studio/server.d.ts +2 -0
  38. package/dist/swEnv.js +2 -2
  39. package/dist/vite-envs.sh +5 -5
  40. package/package.json +9 -8
@@ -1 +1 @@
1
- {"version":3,"file":"useUiNodes-BXGcF2vL.js","sources":["../../src/store/document-drive.ts","../../src/utils/drive-sections.ts","../../src/hooks/useDocumentDriveById.ts","../../node_modules/lz-string/libs/lz-string.js","../../src/utils/getSwitchboardUrl.ts","../../src/utils/openUrl.ts","../../src/hooks/useOpenSwitchboardLink.ts","../../src/hooks/useUiNodes.ts"],"sourcesContent":["import { FILE, TUiNodesContext } from '@powerhousedao/design-system';\nimport { Document, Operation } from 'document-model/document';\nimport { atom, useAtom } from 'jotai';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { IReadModeContext } from 'src/context/read-mode';\nimport { documentToHash } from 'src/hooks/useDocumentDrives';\nimport { TDocumentDriveServer } from 'src/hooks/useDocumentDriveServer';\nimport { logger } from 'src/services/logger';\n\nfunction debounceOperations(\n callback: (operations: Operation[]) => Promise<Document | undefined>,\n timeout = 50,\n) {\n let timer: number;\n const operations: Operation[] = [];\n return (operation: Operation) => {\n if (timer) {\n clearTimeout(timer);\n }\n const index = operations.findIndex(\n op => op.scope === operation.scope && op.index === operation.index,\n );\n if (index > -1) {\n const oldOperation = operations[index];\n if (\n !(\n oldOperation.type === operation.type &&\n JSON.stringify(operation.input) ===\n JSON.stringify(oldOperation.input)\n )\n ) {\n console.warn(\n 'Two conflicting operations were dispatched:',\n oldOperation,\n operation,\n );\n }\n operations[index] = operation;\n } else {\n operations.push(operation);\n }\n return new Promise<Document | undefined>((resolve, reject) => {\n timer = setTimeout(() => {\n callback(operations).then(resolve).catch(reject);\n }, timeout) as unknown as number;\n });\n };\n}\n\ntype FileNodeDocument =\n | {\n driveId: string;\n documentId: string;\n documentType: string;\n document: Document | undefined;\n status: 'LOADING' | 'ERROR';\n }\n | {\n driveId: string;\n documentId: string;\n documentType: string;\n document: Document;\n status: 'LOADED';\n }\n | undefined;\n\nconst documentCacheAtom = atom(new Map<string, Document>());\n\nconst singletonFileNodeDocumentAtom = atom<FileNodeDocument>(undefined);\nconst fileNodeDocumentAtom = atom(\n get => get(singletonFileNodeDocumentAtom),\n (get, set, newValue: FileNodeDocument) => {\n const currentValue = get(singletonFileNodeDocumentAtom);\n\n // if document will be loaded then sets\n // the cached version while it loads\n const documentCache = get(documentCacheAtom);\n if (!newValue?.document && newValue?.status === 'LOADING') {\n newValue.document = documentCache.get(\n `${newValue.driveId}:${newValue.documentId}`,\n );\n }\n\n // only change if the provided file node is different\n if (\n currentValue?.driveId !== newValue?.driveId ||\n currentValue?.documentId !== newValue?.documentId ||\n currentValue?.documentType !== newValue?.documentType ||\n currentValue?.status !== newValue?.status ||\n !!currentValue?.document !== !!newValue?.document ||\n (currentValue?.document &&\n newValue?.document &&\n documentToHash(currentValue.document) !==\n documentToHash(newValue.document))\n ) {\n // if document has been fetched then updates the cache\n if (newValue?.status === 'LOADED') {\n documentCache.set(\n `${newValue.driveId}:${newValue.documentId}`,\n newValue.document,\n );\n }\n\n set(singletonFileNodeDocumentAtom, newValue);\n return true;\n }\n\n return false;\n },\n);\n\nconst selectedDocumentAtom = atom(\n get => get(fileNodeDocumentAtom)?.document,\n (get, set, document: Document | undefined) => {\n const fileNodeDocument = get(fileNodeDocumentAtom);\n if (!fileNodeDocument) {\n throw new Error('fileNodeDocument is undefined');\n } else if (!document) {\n set(fileNodeDocumentAtom, undefined);\n } else {\n set(fileNodeDocumentAtom, { ...fileNodeDocument, document });\n }\n },\n);\n\nexport function useFileNodeDocument(\n props: TUiNodesContext & TDocumentDriveServer & IReadModeContext,\n) {\n const {\n selectedNode,\n selectedDriveNode,\n openFile,\n addOperations,\n onStrandUpdate,\n fetchDocument: fetchReadDocument,\n } = props;\n const [fileNodeDocument, setFileNodeDocument] =\n useAtom(fileNodeDocumentAtom);\n const isReadMode =\n selectedDriveNode?.sharingType !== 'LOCAL' &&\n selectedDriveNode?.syncStatus === undefined;\n const driveId = selectedNode?.driveId;\n const documentId = selectedNode?.id;\n const kind = selectedNode?.kind;\n const documentType =\n kind === 'FILE' ? selectedNode?.documentType : undefined;\n\n const [selectedDocument, setSelectedDocument] =\n useAtom(selectedDocumentAtom);\n\n const fetchDocument = useCallback(\n async (driveId: string, id: string, documentType: string) => {\n const document = await (isReadMode\n ? fetchReadDocument(driveId, id, documentType)\n : openFile(driveId, id));\n if (document instanceof Error) {\n throw document;\n }\n return document;\n },\n [fetchReadDocument, isReadMode, openFile],\n );\n\n useEffect(() => {\n // if selected node is undefine then clears fileNodeDocument\n if (!driveId || !documentId || !documentType) {\n if (fileNodeDocument) {\n setFileNodeDocument(undefined);\n }\n return;\n }\n\n // if selectedNode changes then fetches fileNodeDocument\n if (\n driveId !== fileNodeDocument?.driveId ||\n documentId !== fileNodeDocument.documentId ||\n documentType !== fileNodeDocument.documentType\n ) {\n const changed = setFileNodeDocument({\n driveId,\n documentId,\n documentType,\n document: undefined,\n status: 'LOADING',\n });\n\n // if the selected file node changed then fetches the new document\n if (changed) {\n fetchDocument(driveId, documentId, documentType)\n .then(document =>\n setFileNodeDocument(\n document\n ? {\n driveId,\n documentId,\n documentType,\n document,\n status: 'LOADED',\n }\n : {\n driveId,\n documentId,\n documentType,\n document,\n status: 'ERROR',\n },\n ),\n )\n .catch(error => {\n logger.error(error);\n setFileNodeDocument({\n driveId,\n documentId,\n documentType,\n document: undefined,\n status: 'ERROR',\n });\n });\n }\n }\n }, [\n selectedNode,\n documentId,\n documentType,\n driveId,\n fetchDocument,\n fileNodeDocument,\n setFileNodeDocument,\n ]);\n\n useEffect(() => {\n if (\n !fileNodeDocument?.driveId ||\n !fileNodeDocument.documentId ||\n !fileNodeDocument.documentType\n ) {\n return;\n }\n\n // watches for strand updates to update the document\n const removeListener = onStrandUpdate(strand => {\n if (\n strand.driveId === fileNodeDocument.driveId &&\n strand.documentId === fileNodeDocument.documentId\n ) {\n fetchDocument(\n fileNodeDocument.driveId,\n fileNodeDocument.documentId,\n fileNodeDocument.documentType,\n )\n .then(setSelectedDocument)\n .catch(logger.error);\n }\n });\n\n return removeListener;\n }, [\n fileNodeDocument?.driveId,\n fileNodeDocument?.documentId,\n fileNodeDocument?.documentType,\n onStrandUpdate,\n fetchDocument,\n setSelectedDocument,\n ]);\n\n const addOperationToSelectedDocument = useMemo(() => {\n if (driveId && documentId && kind === FILE) {\n return debounceOperations(operations =>\n addOperations(driveId, documentId, operations),\n );\n }\n }, [addOperations, driveId, documentId, kind]);\n\n const isSelectedDocument =\n kind === FILE &&\n fileNodeDocument?.driveId === driveId &&\n fileNodeDocument?.documentId === documentId;\n\n return useMemo(\n () => ({\n fileNodeDocument,\n selectedDocument: isSelectedDocument ? selectedDocument : undefined,\n setSelectedDocument,\n addOperationToSelectedDocument,\n }),\n [\n fileNodeDocument,\n isSelectedDocument,\n selectedDocument,\n setSelectedDocument,\n addOperationToSelectedDocument,\n ],\n );\n}\n","import {\n CLOUD,\n debugNodeOptions,\n defaultDriveOptions,\n defaultFileOptions,\n defaultFolderOptions,\n DELETE,\n DRIVE,\n FILE,\n FOLDER,\n LOCAL,\n PUBLIC,\n SharingType,\n} from '@powerhousedao/design-system';\nimport connectConfig from 'connect-config';\nimport { ReactNode } from 'react';\n\n// Enables debug options for the drive\nconst connectDebug = localStorage.getItem('CONNECT_DEBUG') === 'true';\n\nconst DriveSections: {\n sharingType: SharingType;\n label: ReactNode;\n}[] = [\n { sharingType: PUBLIC, label: 'Public Drives' },\n { sharingType: CLOUD, label: 'Secure Cloud Drives' },\n { sharingType: LOCAL, label: 'My Local Drives' },\n] as const;\n\nconst getSectionConfig = (sharingType: SharingType) => {\n return connectConfig.drives.sections[sharingType];\n};\n\nexport function getDriveNodeOptions(sharingType: SharingType) {\n const options = [...defaultDriveOptions];\n\n if (connectConfig.drives.sections[sharingType].allowDelete) {\n options.push(DELETE);\n }\n\n if (connectDebug) {\n options.push(...debugNodeOptions);\n }\n\n return options;\n}\n\nexport function getFileNodeOptions() {\n const options = [...defaultFileOptions];\n\n if (connectDebug) {\n options.push(...debugNodeOptions);\n }\n\n return options;\n}\n\nexport function getFolderNodeOptions() {\n const options = [...defaultFolderOptions];\n\n if (connectDebug) {\n options.push(...debugNodeOptions);\n }\n\n return options;\n}\n\nexport function getNodeOptions() {\n return {\n [LOCAL]: {\n [DRIVE]: getDriveNodeOptions(LOCAL),\n [FOLDER]: getFolderNodeOptions(),\n [FILE]: getFileNodeOptions(),\n },\n [CLOUD]: {\n [DRIVE]: getDriveNodeOptions(CLOUD),\n [FOLDER]: getFolderNodeOptions(),\n [FILE]: getFileNodeOptions(),\n },\n [PUBLIC]: {\n [DRIVE]: getDriveNodeOptions(PUBLIC),\n [FOLDER]: getFolderNodeOptions(),\n [FILE]: getFileNodeOptions(),\n },\n } as const;\n}\n\nexport const driveSections = DriveSections.filter(\n section => getSectionConfig(section.sharingType).enabled,\n).map(section => {\n const sectionConfig = getSectionConfig(section.sharingType);\n\n return {\n ...section,\n disableAddDrives: !sectionConfig.allowAdd,\n };\n});\n","import { DocumentDriveState } from 'document-model-libs/document-drive';\nimport { useDocumentDriveServer } from './useDocumentDriveServer';\n\ntype ExtendedDocumentDriveState = DocumentDriveState & { remoteUrl?: string };\n\nexport function useDocumentDriveById(driveId: string | undefined) {\n const { documentDrives } = useDocumentDriveServer();\n\n if (!driveId) return {\n drive: null,\n remoteUrl: null,\n isRemoteDrive: false,\n };\n\n const drive = documentDrives.find(\n drive => drive.state.global.id === driveId,\n );\n\n const pullResponder = drive?.state.local.triggers.find(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n trigger => trigger.type === 'PullResponder',\n );\n\n const { remoteUrl } = (drive?.state.global ||\n {}) as ExtendedDocumentDriveState;\n\n const isRemoteDrive = !!remoteUrl || !!pullResponder;\n\n return {\n drive,\n remoteUrl: remoteUrl || pullResponder?.data?.url,\n isRemoteDrive,\n };\n}\n","// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.5\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n if (!baseReverseDic[alphabet]) {\n baseReverseDic[alphabet] = {};\n for (var i=0 ; i<alphabet.length ; i++) {\n baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n }\n }\n return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n compressToBase64 : function (input) {\n if (input == null) return \"\";\n var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n switch (res.length % 4) { // To produce valid Base64\n default: // When could this happen ?\n case 0 : return res;\n case 1 : return res+\"===\";\n case 2 : return res+\"==\";\n case 3 : return res+\"=\";\n }\n },\n\n decompressFromBase64 : function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n },\n\n compressToUTF16 : function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n },\n\n decompressFromUTF16: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n },\n\n //compress into uint8array (UCS-2 big endian format)\n compressToUint8Array: function (uncompressed) {\n var compressed = LZString.compress(uncompressed);\n var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n var current_value = compressed.charCodeAt(i);\n buf[i*2] = current_value >>> 8;\n buf[i*2+1] = current_value % 256;\n }\n return buf;\n },\n\n //decompress from uint8array (UCS-2 big endian format)\n decompressFromUint8Array:function (compressed) {\n if (compressed===null || compressed===undefined){\n return LZString.decompress(compressed);\n } else {\n var buf=new Array(compressed.length/2); // 2 bytes per character\n for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n buf[i]=compressed[i*2]*256+compressed[i*2+1];\n }\n\n var result = [];\n buf.forEach(function (c) {\n result.push(f(c));\n });\n return LZString.decompress(result.join(''));\n\n }\n\n },\n\n\n //compress into a string that is already URI encoded\n compressToEncodedURIComponent: function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n },\n\n //decompress from an output of compressToEncodedURIComponent\n decompressFromEncodedURIComponent:function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n input = input.replace(/ /g, \"+\");\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n },\n\n compress: function (uncompressed) {\n return LZString._compress(uncompressed, 16, function(a){return f(a);});\n },\n _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n if (uncompressed == null) return \"\";\n var i, value,\n context_dictionary= {},\n context_dictionaryToCreate= {},\n context_c=\"\",\n context_wc=\"\",\n context_w=\"\",\n context_enlargeIn= 2, // Compensate for the first entry which should not count\n context_dictSize= 3,\n context_numBits= 2,\n context_data=[],\n context_data_val=0,\n context_data_position=0,\n ii;\n\n for (ii = 0; ii < uncompressed.length; ii += 1) {\n context_c = uncompressed.charAt(ii);\n if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n context_dictionary[context_c] = context_dictSize++;\n context_dictionaryToCreate[context_c] = true;\n }\n\n context_wc = context_w + context_c;\n if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n context_w = context_wc;\n } else {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position ==bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n // Add wc to the dictionary.\n context_dictionary[context_wc] = context_dictSize++;\n context_w = String(context_c);\n }\n }\n\n // Output the code for w.\n if (context_w !== \"\") {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n }\n\n // Mark the end of the stream\n value = 2;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n // Flush the last char\n while (true) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data.push(getCharFromInt(context_data_val));\n break;\n }\n else context_data_position++;\n }\n return context_data.join('');\n },\n\n decompress: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n },\n\n _decompress: function (length, resetValue, getNextValue) {\n var dictionary = [],\n next,\n enlargeIn = 4,\n dictSize = 4,\n numBits = 3,\n entry = \"\",\n result = [],\n i,\n w,\n bits, resb, maxpower, power,\n c,\n data = {val:getNextValue(0), position:resetValue, index:1};\n\n for (i = 0; i < 3; i += 1) {\n dictionary[i] = i;\n }\n\n bits = 0;\n maxpower = Math.pow(2,2);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (next = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 2:\n return \"\";\n }\n dictionary[3] = c;\n w = c;\n result.push(c);\n while (true) {\n if (data.index > length) {\n return \"\";\n }\n\n bits = 0;\n maxpower = Math.pow(2,numBits);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (c = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 2:\n return result.join('');\n }\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n if (dictionary[c]) {\n entry = dictionary[c];\n } else {\n if (c === dictSize) {\n entry = w + w.charAt(0);\n } else {\n return null;\n }\n }\n result.push(entry);\n\n // Add w+entry[0] to the dictionary.\n dictionary[dictSize++] = w + entry.charAt(0);\n enlargeIn--;\n\n w = entry;\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n }\n }\n};\n return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n module.exports = LZString\n} else if( typeof angular !== 'undefined' && angular != null ) {\n angular.module('LZString', [])\n .factory('LZString', function () {\n return LZString;\n });\n}\n","import LZString from 'lz-string';\n\nconst rwaQuery = `... on RealWorldAssets {\n state {\n portfolio {\n __typename\n ... on FixedIncome {\n name\n CUSIP\n purchaseDate\n purchasePrice\n purchaseProceeds\n salesProceeds\n totalDiscount\n spvId\n }\n ... on Cash {\n id\n balance\n }\n }\n transactions {\n id\n type\n entryTime\n cashBalanceChange\n fees {\n id\n serviceProviderFeeTypeId\n amount\n }\n txRef\n cashTransaction {\n id\n assetId\n amount\n entryTime\n tradeTime\n settlementTime\n accountId\n counterPartyAccountId\n }\n fixedIncomeTransaction {\n id\n assetId\n amount\n entryTime\n tradeTime\n settlementTime\n accountId\n counterPartyAccountId\n }\n }\n }\n }`;\n\nconst accountSnapshot = `... on AccountSnapshot {\n state {\n id\n ownerId\n ownerType\n period\n start\n end\n actualsComparison {\n month\n reportedActuals\n currency\n netExpenses {\n offChainIncluded {amount difference}\n onChainOnly {amount difference}\n }\n }\n snapshotAccount {\n id\n accountLabel\n accountAddress\n accountType\n groupAccountId\n offChain\n upstreamAccountId\n }\n }\n }`;\n\nconst budgetStatement = `... on BudgetStatement {\n state {\n month\n quoteCurrency\n accounts {\n name\n address\n lineItems {\n actual\n payment\n budgetCap\n }\n }\n ftes {\n value\n }\n }\n }`;\n\nconst getQuery = (\n documentId: string,\n documentType: string,\n encodeQuery = true,\n) => {\n let query = ``;\n\n if (documentType === 'powerhouse/account-snapshot') {\n query = accountSnapshot;\n }\n\n if (documentType === 'powerhouse/budget-statement') {\n query = budgetStatement;\n }\n\n if (documentType === 'makerdao/rwa-portfolio') {\n query = rwaQuery;\n }\n\n const queryString = `query {\n document(id:\"${documentId}\") {\n name\n documentType\n revision\n created\n lastModified\n ${query}\n }\n}`;\n\n if (!encodeQuery) {\n return queryString;\n }\n\n return encodeURIComponent(queryString);\n};\n\nconst getLocalReactorUrl = (\n remoteUrl: string,\n documentType: string,\n documentId: string,\n) => {\n const query = getQuery(documentId, documentType, false);\n\n const explorerURLState = LZString.compressToEncodedURIComponent(\n JSON.stringify({\n document: query.trim(),\n }),\n );\n\n const url = remoteUrl + `?explorerURLState=${explorerURLState}`;\n return url.toString();\n};\n\nexport const getSwitchboardUrl = (\n remoteUrl: string,\n documentType: string,\n documentId: string,\n) => {\n if (remoteUrl.includes('localhost')) {\n return getLocalReactorUrl(remoteUrl, documentType, documentId);\n }\n\n const explorerUrl = remoteUrl.replace(/\\/d\\//, '/graphql/');\n const query = getQuery(documentId, documentType);\n const url = explorerUrl + `?query=${query}`;\n\n return url.toString();\n};\n","const openBrowserUrl = (url: string) => window.open(url, '_blank');\n\nexport const openUrl = window.electronAPI?.openURL ?? openBrowserUrl;\n","import { FILE, UiNode } from '@powerhousedao/design-system';\nimport { getSwitchboardUrl } from 'src/utils/getSwitchboardUrl';\nimport { openUrl } from 'src/utils/openUrl';\nimport { useDocumentDriveById } from './useDocumentDriveById';\n\nexport const useOpenSwitchboardLink = (driveId: string | undefined) => {\n const { isRemoteDrive, remoteUrl } = useDocumentDriveById(driveId);\n\n return async (uiNode?: UiNode | null) => {\n if (uiNode?.kind !== FILE || !remoteUrl || !isRemoteDrive) return;\n\n const url = new URL(remoteUrl);\n const baseUrl = url.origin;\n\n const switchboardUrl = getSwitchboardUrl(\n remoteUrl,\n uiNode.documentType,\n uiNode.id,\n );\n\n await openUrl(switchboardUrl);\n };\n};\n","import {\n AddLocalDriveInput,\n AddRemoteDriveInput,\n CLOUD,\n DRIVE,\n FILE,\n FOLDER,\n LOCAL,\n PUBLIC,\n SharingType,\n SUCCESS,\n toast,\n UiDriveNode,\n UiFileNode,\n UiFolderNode,\n UiNode,\n useUiNodesContext,\n} from '@powerhousedao/design-system';\nimport { ReadDrive } from 'document-drive';\nimport { DocumentDriveDocument } from 'document-model-libs/document-drive';\nimport { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useModal } from 'src/components/modal';\nimport { useReadModeContext } from 'src/context/read-mode';\nimport { useFileNodeDocument } from 'src/store/document-drive';\nimport {\n useFilteredDocumentModels,\n useGetDocumentModel,\n} from 'src/store/document-model';\nimport { getNodeOptions } from 'src/utils/drive-sections';\nimport { makeNodeSlugFromNodeName } from 'src/utils/slug';\nimport { useDocumentDriveById } from './useDocumentDriveById';\nimport { useDocumentDriveServer } from './useDocumentDriveServer';\nimport { useOpenSwitchboardLink } from './useOpenSwitchboardLink';\nimport { useUserPermissions } from './useUserPermissions';\n\nexport function useUiNodes() {\n const { showModal } = useModal();\n const { t } = useTranslation();\n const uiNodesContext = useUiNodesContext();\n const {\n selectedDriveNode,\n driveNodes,\n selectedParentNode,\n setSelectedNode,\n getParentNode,\n } = uiNodesContext;\n const readModeContext = useReadModeContext();\n const documentDriveServer = useDocumentDriveServer();\n const {\n addFolder,\n addFile,\n renameNode,\n deleteNode,\n addDrive,\n addRemoteDrive,\n deleteDrive,\n renameDrive,\n setDriveAvailableOffline,\n setDriveSharingType,\n copyNode,\n moveNode,\n getSyncStatus,\n removeTrigger,\n addTrigger,\n registerNewPullResponderTrigger,\n } = documentDriveServer;\n const selectedDocumentDrive = useDocumentDriveById(selectedDriveNode?.id);\n const openSwitchboardLink = useOpenSwitchboardLink(selectedDriveNode?.id);\n const userPermissions = useUserPermissions();\n const nodeOptions = getNodeOptions();\n const documentModels = useFilteredDocumentModels();\n const getDocumentModel = useGetDocumentModel();\n const fileNodeDocument = useFileNodeDocument({\n ...uiNodesContext,\n ...documentDriveServer,\n ...readModeContext,\n });\n\n const makeUiDriveNode = useCallback(\n async (drive: DocumentDriveDocument | ReadDrive) => {\n const isReadDrive = 'readContext' in drive;\n const { id, name, icon, slug } = drive.state.global;\n const { sharingType: _sharingType, availableOffline } = !isReadDrive\n ? drive.state.local\n : { sharingType: PUBLIC, availableOffline: false };\n const __sharingType = _sharingType?.toUpperCase();\n const sharingType = (\n __sharingType === 'PRIVATE' ? LOCAL : __sharingType\n ) as SharingType;\n const driveSyncStatus = !isReadDrive\n ? await getSyncStatus(id, sharingType)\n : undefined;\n\n // TODO: rempve this after integration in design-system\n const normalizedDriveSyncStatus =\n driveSyncStatus === 'INITIAL_SYNC'\n ? 'SYNCING'\n : driveSyncStatus;\n\n const driveNode: UiDriveNode = {\n id,\n name,\n slug: slug || null,\n kind: DRIVE,\n children: [],\n nodeMap: {},\n sharingType,\n syncStatus: normalizedDriveSyncStatus,\n availableOffline,\n icon,\n parentFolder: null,\n driveId: id,\n };\n\n const nodes = drive.state.global.nodes.map(n => {\n const node = {\n ...n,\n slug: makeNodeSlugFromNodeName(n.name),\n driveId: id,\n parentFolder: n.parentFolder || id,\n kind: n.kind.toUpperCase(),\n syncStatus: normalizedDriveSyncStatus,\n sharingType,\n };\n\n if (node.kind === DRIVE) {\n throw new Error('Drive nodes should not be nested');\n }\n\n if (node.kind === FILE) {\n return node as UiFileNode;\n }\n\n return {\n ...node,\n children: [],\n } as UiFolderNode;\n });\n\n for (const node of nodes) {\n driveNode.nodeMap[node.id] = node;\n }\n\n for await (const node of nodes) {\n if (node.kind === FILE) {\n const fileSyncStatus = !isReadDrive\n ? await getSyncStatus(\n node.synchronizationUnits[0].syncId,\n sharingType,\n )\n : undefined;\n\n // TODO: rempve this after integration in design-system\n const normalizedFileSyncStatus =\n fileSyncStatus === 'INITIAL_SYNC'\n ? 'SYNCING'\n : fileSyncStatus;\n\n node.syncStatus = normalizedFileSyncStatus;\n }\n\n if (node.parentFolder === id) {\n driveNode.children.push(node);\n continue;\n }\n const parent = driveNode.nodeMap[node.parentFolder];\n\n if (parent.kind === FILE) {\n throw new Error(\n `Parent node ${node.parentFolder} is a file, not a folder`,\n );\n }\n\n parent.children.push(node);\n\n if (node.syncStatus !== SUCCESS) {\n parent.syncStatus = node.syncStatus;\n }\n }\n\n return driveNode;\n },\n [getSyncStatus],\n );\n\n const makeUiDriveNodes = useCallback(\n async (documentDrives: DocumentDriveDocument[]) => {\n return Promise.all(documentDrives.map(makeUiDriveNode));\n },\n [makeUiDriveNode],\n );\n\n const onAddFolder = useCallback(\n async (name: string, parentNode: UiNode | null) => {\n if (!parentNode) {\n throw new Error('Parent node is required');\n }\n if (parentNode.kind === FILE) {\n throw new Error('Cannot add folder to a file');\n }\n return await addFolder(parentNode.driveId, name, parentNode.id);\n },\n [addFolder],\n );\n\n const onRenameNode = useCallback(\n async (name: string, uiNode: UiNode) => {\n if (uiNode.kind === DRIVE) {\n throw new Error(\n 'Drive can only be renamed from the drive settings modal',\n );\n }\n return await renameNode(uiNode.driveId, uiNode.id, name);\n },\n [renameNode],\n );\n\n const onCopyNode = useCallback(\n async (uiNode: UiNode, targetNode: UiNode) => {\n if (uiNode.kind === DRIVE) {\n throw new Error('Drive cannot be duplicated');\n }\n\n await copyNode(uiNode, targetNode);\n },\n [copyNode],\n );\n\n const onMoveNode = useCallback(\n async (uiNode: UiNode, targetNode: UiNode) => {\n if (uiNode.kind === DRIVE) {\n throw new Error('Drive cannot be moved');\n }\n\n await moveNode(uiNode, targetNode);\n },\n [moveNode],\n );\n\n const onAddFile = useCallback(\n async (file: File, parentNode: UiNode | null) => {\n if (!parentNode) {\n throw new Error('Parent node is required');\n }\n if (parentNode.kind === FILE) {\n throw new Error('Cannot add file to a file');\n }\n\n const fileName = file.name.replace(/\\.zip$/gim, '');\n\n return await addFile(\n file,\n parentNode.driveId,\n fileName,\n parentNode.id,\n );\n },\n [addFile],\n );\n\n const onDuplicateNode = useCallback(\n async (uiNode: UiNode) => {\n if (!selectedParentNode) return;\n\n if (uiNode.kind === DRIVE) {\n throw new Error('Drive cannot be duplicated');\n }\n\n await copyNode(uiNode, selectedParentNode);\n },\n [copyNode, selectedParentNode],\n );\n\n const onDeleteNode = useCallback(\n (uiNode: UiFileNode | UiFolderNode) => {\n showModal('deleteItem', {\n uiNode,\n onDelete: async closeModal => {\n closeModal();\n\n const i18nKey =\n uiNode.kind === FOLDER\n ? 'notifications.deleteFolderSuccess'\n : 'notifications.fileDeleteSuccess';\n\n const parentNode = getParentNode(uiNode);\n\n await deleteNode(uiNode.driveId, uiNode.id);\n\n setSelectedNode(parentNode);\n\n toast(t(i18nKey), { type: 'connect-deleted' });\n },\n });\n },\n [deleteNode, getParentNode, setSelectedNode, showModal, t],\n );\n\n const onDeleteDrive = useCallback(\n (uiDriveNode: UiDriveNode) => {\n showModal('deleteDriveModal', {\n uiDriveNode,\n onDelete: async closeModal => {\n closeModal();\n await deleteDrive(uiDriveNode.id);\n\n setSelectedNode(driveNodes[0]);\n\n toast(t('notifications.deleteDriveSuccess'), {\n type: 'connect-deleted',\n });\n },\n });\n },\n [deleteDrive, driveNodes, setSelectedNode, showModal, t],\n );\n\n const onAddLocalDrive = useCallback(\n async (data: AddLocalDriveInput) => {\n try {\n const newDrive = await addDrive({\n global: {\n name: data.name,\n id: undefined,\n icon: null,\n slug: null,\n },\n local: {\n availableOffline: data.availableOffline,\n sharingType: data.sharingType.toLowerCase(),\n listeners: [],\n triggers: [],\n },\n });\n\n toast(t('notifications.addDriveSuccess'), {\n type: 'connect-success',\n });\n\n const newDriveNode = await makeUiDriveNode(newDrive);\n\n setSelectedNode(newDriveNode);\n } catch (e) {\n console.error(e);\n }\n },\n [addDrive, makeUiDriveNode, setSelectedNode, t],\n );\n\n const onAddRemoteDrive = useCallback(\n async (data: AddRemoteDriveInput) => {\n try {\n const newDrive = await addRemoteDrive(data.url, {\n sharingType: data.sharingType,\n availableOffline: data.availableOffline,\n listeners: [\n {\n block: true,\n callInfo: {\n data: data.url,\n name: 'switchboard-push',\n transmitterType: 'SwitchboardPush',\n },\n filter: {\n branch: ['main'],\n documentId: ['*'],\n documentType: ['*'],\n scope: ['global'],\n },\n label: 'Switchboard Sync',\n listenerId: '1',\n system: true,\n },\n ],\n triggers: [],\n pullInterval: 3000,\n });\n\n toast(t('notifications.addDriveSuccess'), {\n type: 'connect-success',\n });\n\n const newDriveNode = await makeUiDriveNode(newDrive);\n\n setSelectedNode(newDriveNode);\n } catch (e) {\n console.error(e);\n }\n },\n [addRemoteDrive, makeUiDriveNode, setSelectedNode, t],\n );\n\n const showAddDriveModal = useCallback(\n (groupSharingType: SharingType) => {\n if (groupSharingType === LOCAL) {\n showModal('addLocalDrive', {\n onAddLocalDrive,\n });\n } else {\n showModal('addRemoteDrive', {\n onAddRemoteDrive,\n groupSharingType,\n });\n }\n },\n [onAddLocalDrive, onAddRemoteDrive, showModal],\n );\n\n const onRenameDrive = useCallback(\n async (uiDriveNode: UiDriveNode, newName: string) => {\n await renameDrive(uiDriveNode.id, newName);\n },\n [renameDrive],\n );\n\n const onChangeSharingType = useCallback(\n async (uiDriveNode: UiDriveNode, newSharingType: SharingType) => {\n await setDriveSharingType(uiDriveNode.id, newSharingType);\n },\n [setDriveSharingType],\n );\n\n const onChangeAvailableOffline = useCallback(\n async (uiDriveNode: UiDriveNode, newAvailableOffline: boolean) => {\n await setDriveAvailableOffline(uiDriveNode.id, newAvailableOffline);\n },\n [setDriveAvailableOffline],\n );\n\n const showDriveSettingsModal = useCallback(\n (uiDriveNode: UiDriveNode) => {\n showModal('driveSettings', {\n uiDriveNode,\n onRenameDrive,\n onDeleteDrive,\n onChangeSharingType,\n onChangeAvailableOffline,\n });\n },\n [\n onChangeAvailableOffline,\n onChangeSharingType,\n onDeleteDrive,\n onRenameDrive,\n showModal,\n ],\n );\n\n const onAddAndSelectNewFolder = useCallback(\n async (name: string) => {\n if (!name || !selectedParentNode) return;\n\n const newFolder = await onAddFolder(name, selectedParentNode);\n\n setSelectedNode({\n ...newFolder,\n kind: FOLDER,\n slug: makeNodeSlugFromNodeName(newFolder.name),\n parentFolder: selectedParentNode.id,\n syncStatus: selectedParentNode.syncStatus,\n driveId: selectedParentNode.driveId,\n sharingType: selectedParentNode.sharingType,\n children: [],\n });\n },\n [onAddFolder, selectedParentNode, setSelectedNode],\n );\n\n const onAddTrigger = useCallback(\n async (uiNodeDriveId: string) => {\n const url = window.prompt('url') || '';\n\n const pullResponderTrigger = await registerNewPullResponderTrigger(\n uiNodeDriveId,\n url,\n { pullInterval: 6000 },\n );\n await addTrigger(uiNodeDriveId, pullResponderTrigger);\n },\n [addTrigger, registerNewPullResponderTrigger],\n );\n\n const onRemoveTrigger = useCallback(\n async (uiNodeDriveId: string) => {\n const triggerId = window.prompt('triggerId:');\n\n if (triggerId) {\n await removeTrigger(uiNodeDriveId, triggerId);\n }\n },\n [removeTrigger],\n );\n\n const onAddInvalidTrigger = useCallback(\n async (uiNodeDriveId: string) => {\n const url = window.prompt('url') || '';\n\n await addTrigger(uiNodeDriveId, {\n id: 'some-invalid-id',\n type: 'PullResponder',\n data: {\n interval: '3000',\n listenerId: 'invalid-listener-id',\n url,\n },\n });\n },\n [addTrigger],\n );\n\n const driveNodesBySharingType = useMemo(\n () =>\n driveNodes.reduce<Record<SharingType, UiDriveNode[]>>(\n (acc, driveNode) => {\n acc[driveNode.sharingType].push(driveNode);\n return acc;\n },\n {\n [PUBLIC]: [],\n [CLOUD]: [],\n [LOCAL]: [],\n },\n ),\n [driveNodes],\n );\n\n return useMemo(\n () => ({\n ...documentDriveServer,\n ...uiNodesContext,\n ...userPermissions,\n ...selectedDocumentDrive,\n ...fileNodeDocument,\n nodeOptions,\n driveNodesBySharingType,\n documentModels,\n onAddFolder,\n onAddFile,\n onCopyNode,\n onMoveNode,\n onRenameNode,\n onDuplicateNode,\n onDeleteNode,\n onDeleteDrive,\n makeUiDriveNodes,\n onAddAndSelectNewFolder,\n showAddDriveModal,\n showDriveSettingsModal,\n openSwitchboardLink,\n onAddTrigger,\n onRemoveTrigger,\n onAddInvalidTrigger,\n getDocumentModel,\n }),\n [\n documentDriveServer,\n uiNodesContext,\n userPermissions,\n selectedDocumentDrive,\n fileNodeDocument,\n nodeOptions,\n driveNodesBySharingType,\n documentModels,\n onAddFolder,\n onAddFile,\n onCopyNode,\n onMoveNode,\n onRenameNode,\n onDuplicateNode,\n onDeleteNode,\n onDeleteDrive,\n makeUiDriveNodes,\n onAddAndSelectNewFolder,\n showAddDriveModal,\n showDriveSettingsModal,\n openSwitchboardLink,\n onAddTrigger,\n onRemoveTrigger,\n onAddInvalidTrigger,\n getDocumentModel,\n ],\n );\n}\n\nexport type TUiNodes = ReturnType<typeof useUiNodes>;\n"],"names":["debounceOperations","callback","timeout","timer","operations","operation","index","op","oldOperation","resolve","reject","documentCacheAtom","atom","singletonFileNodeDocumentAtom","fileNodeDocumentAtom","get","set","newValue","currentValue","documentCache","documentToHash","selectedDocumentAtom","_a","document","fileNodeDocument","useFileNodeDocument","props","selectedNode","selectedDriveNode","openFile","addOperations","onStrandUpdate","fetchReadDocument","setFileNodeDocument","useAtom","isReadMode","driveId","documentId","kind","documentType","selectedDocument","setSelectedDocument","fetchDocument","useCallback","id","useEffect","error","logger","strand","addOperationToSelectedDocument","useMemo","FILE","isSelectedDocument","connectDebug","DriveSections","PUBLIC","CLOUD","LOCAL","getSectionConfig","sharingType","connectConfig","getDriveNodeOptions","options","defaultDriveOptions","DELETE","debugNodeOptions","getFileNodeOptions","defaultFileOptions","getFolderNodeOptions","defaultFolderOptions","getNodeOptions","DRIVE","FOLDER","driveSections","section","sectionConfig","useDocumentDriveById","documentDrives","useDocumentDriveServer","drive","pullResponder","trigger","remoteUrl","isRemoteDrive","LZString","f","keyStrBase64","keyStrUriSafe","baseReverseDic","getBaseValue","alphabet","character","i","input","res","a","compressed","uncompressed","buf","TotalLen","current_value","result","c","bitsPerChar","getCharFromInt","value","context_dictionary","context_dictionaryToCreate","context_c","context_wc","context_w","context_enlargeIn","context_dictSize","context_numBits","context_data","context_data_val","context_data_position","ii","length","resetValue","getNextValue","dictionary","enlargeIn","dictSize","numBits","entry","w","bits","resb","maxpower","power","data","module","rwaQuery","accountSnapshot","budgetStatement","getQuery","encodeQuery","query","queryString","getLocalReactorUrl","explorerURLState","getSwitchboardUrl","explorerUrl","openBrowserUrl","url","openUrl","useOpenSwitchboardLink","uiNode","switchboardUrl","useUiNodes","showModal","useModal","t","useTranslation","uiNodesContext","useUiNodesContext","driveNodes","selectedParentNode","setSelectedNode","getParentNode","readModeContext","useReadModeContext","documentDriveServer","addFolder","addFile","renameNode","deleteNode","addDrive","addRemoteDrive","deleteDrive","renameDrive","setDriveAvailableOffline","setDriveSharingType","copyNode","moveNode","getSyncStatus","removeTrigger","addTrigger","registerNewPullResponderTrigger","selectedDocumentDrive","openSwitchboardLink","userPermissions","useUserPermissions","nodeOptions","documentModels","useFilteredDocumentModels","getDocumentModel","useGetDocumentModel","makeUiDriveNode","isReadDrive","name","icon","slug","_sharingType","availableOffline","__sharingType","driveSyncStatus","normalizedDriveSyncStatus","driveNode","nodes","n","node","makeNodeSlugFromNodeName","fileSyncStatus","normalizedFileSyncStatus","parent","SUCCESS","makeUiDriveNodes","onAddFolder","parentNode","onRenameNode","onCopyNode","targetNode","onMoveNode","onAddFile","file","fileName","onDuplicateNode","onDeleteNode","closeModal","i18nKey","toast","onDeleteDrive","uiDriveNode","onAddLocalDrive","newDrive","newDriveNode","e","onAddRemoteDrive","showAddDriveModal","groupSharingType","onRenameDrive","newName","onChangeSharingType","newSharingType","onChangeAvailableOffline","newAvailableOffline","showDriveSettingsModal","onAddAndSelectNewFolder","newFolder","onAddTrigger","uiNodeDriveId","pullResponderTrigger","onRemoveTrigger","triggerId","onAddInvalidTrigger","driveNodesBySharingType","acc"],"mappings":"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","x_google_ignoreList":[3]}
1
+ {"version":3,"file":"useUiNodes-Cf5bUEDX.js","sources":["../../src/store/document-drive.ts","../../src/utils/drive-sections.ts","../../src/hooks/useDocumentDriveById.ts","../../node_modules/lz-string/libs/lz-string.js","../../src/utils/getSwitchboardUrl.ts","../../src/utils/openUrl.ts","../../src/hooks/useOpenSwitchboardLink.ts","../../src/hooks/useUiNodes.ts"],"sourcesContent":["import { FILE, TUiNodesContext } from '@powerhousedao/design-system';\nimport { Document, Operation } from 'document-model/document';\nimport { atom, useAtom } from 'jotai';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { IReadModeContext } from 'src/context/read-mode';\nimport { documentToHash } from 'src/hooks/useDocumentDrives';\nimport { TDocumentDriveServer } from 'src/hooks/useDocumentDriveServer';\nimport { logger } from 'src/services/logger';\n\nfunction debounceOperations(\n callback: (operations: Operation[]) => Promise<Document | undefined>,\n timeout = 50,\n) {\n let timer: number;\n const operations: Operation[] = [];\n return (operation: Operation) => {\n if (timer) {\n clearTimeout(timer);\n }\n const index = operations.findIndex(\n op => op.scope === operation.scope && op.index === operation.index,\n );\n if (index > -1) {\n const oldOperation = operations[index];\n if (\n !(\n oldOperation.type === operation.type &&\n JSON.stringify(operation.input) ===\n JSON.stringify(oldOperation.input)\n )\n ) {\n console.warn(\n 'Two conflicting operations were dispatched:',\n oldOperation,\n operation,\n );\n }\n operations[index] = operation;\n } else {\n operations.push(operation);\n }\n return new Promise<Document | undefined>((resolve, reject) => {\n timer = setTimeout(() => {\n callback(operations).then(resolve).catch(reject);\n }, timeout) as unknown as number;\n });\n };\n}\n\ntype FileNodeDocument =\n | {\n driveId: string;\n documentId: string;\n documentType: string;\n document: Document | undefined;\n status: 'LOADING' | 'ERROR';\n }\n | {\n driveId: string;\n documentId: string;\n documentType: string;\n document: Document;\n status: 'LOADED';\n }\n | undefined;\n\nconst documentCacheAtom = atom(new Map<string, Document>());\n\nconst singletonFileNodeDocumentAtom = atom<FileNodeDocument>(undefined);\nconst fileNodeDocumentAtom = atom(\n get => get(singletonFileNodeDocumentAtom),\n (get, set, newValue: FileNodeDocument) => {\n const currentValue = get(singletonFileNodeDocumentAtom);\n\n // if document will be loaded then sets\n // the cached version while it loads\n const documentCache = get(documentCacheAtom);\n if (!newValue?.document && newValue?.status === 'LOADING') {\n newValue.document = documentCache.get(\n `${newValue.driveId}:${newValue.documentId}`,\n );\n }\n\n // only change if the provided file node is different\n if (\n currentValue?.driveId !== newValue?.driveId ||\n currentValue?.documentId !== newValue?.documentId ||\n currentValue?.documentType !== newValue?.documentType ||\n currentValue?.status !== newValue?.status ||\n !!currentValue?.document !== !!newValue?.document ||\n (currentValue?.document &&\n newValue?.document &&\n documentToHash(currentValue.document) !==\n documentToHash(newValue.document))\n ) {\n // if document has been fetched then updates the cache\n if (newValue?.status === 'LOADED') {\n documentCache.set(\n `${newValue.driveId}:${newValue.documentId}`,\n newValue.document,\n );\n }\n\n set(singletonFileNodeDocumentAtom, newValue);\n return true;\n }\n\n return false;\n },\n);\n\nconst selectedDocumentAtom = atom(\n get => get(fileNodeDocumentAtom)?.document,\n (get, set, document: Document | undefined) => {\n const fileNodeDocument = get(fileNodeDocumentAtom);\n if (!fileNodeDocument) {\n throw new Error('fileNodeDocument is undefined');\n } else if (!document) {\n set(fileNodeDocumentAtom, undefined);\n } else {\n set(fileNodeDocumentAtom, { ...fileNodeDocument, document });\n }\n },\n);\n\nexport function useFileNodeDocument(\n props: TUiNodesContext & TDocumentDriveServer & IReadModeContext,\n) {\n const {\n selectedNode,\n selectedDriveNode,\n openFile,\n addOperations,\n onStrandUpdate,\n fetchDocument: fetchReadDocument,\n } = props;\n const [fileNodeDocument, setFileNodeDocument] =\n useAtom(fileNodeDocumentAtom);\n const isReadMode =\n selectedDriveNode?.sharingType !== 'LOCAL' &&\n selectedDriveNode?.syncStatus === undefined;\n const driveId = selectedNode?.driveId;\n const documentId = selectedNode?.id;\n const kind = selectedNode?.kind;\n const documentType =\n kind === 'FILE' ? selectedNode?.documentType : undefined;\n\n const [selectedDocument, setSelectedDocument] =\n useAtom(selectedDocumentAtom);\n\n const fetchDocument = useCallback(\n async (driveId: string, id: string, documentType: string) => {\n const document = await (isReadMode\n ? fetchReadDocument(driveId, id, documentType)\n : openFile(driveId, id));\n if (document instanceof Error) {\n throw document;\n }\n return document;\n },\n [fetchReadDocument, isReadMode, openFile],\n );\n\n useEffect(() => {\n // if selected node is undefine then clears fileNodeDocument\n if (!driveId || !documentId || !documentType) {\n if (fileNodeDocument) {\n setFileNodeDocument(undefined);\n }\n return;\n }\n\n // if selectedNode changes then fetches fileNodeDocument\n if (\n driveId !== fileNodeDocument?.driveId ||\n documentId !== fileNodeDocument.documentId ||\n documentType !== fileNodeDocument.documentType\n ) {\n const changed = setFileNodeDocument({\n driveId,\n documentId,\n documentType,\n document: undefined,\n status: 'LOADING',\n });\n\n // if the selected file node changed then fetches the new document\n if (changed) {\n fetchDocument(driveId, documentId, documentType)\n .then(document =>\n setFileNodeDocument(\n document\n ? {\n driveId,\n documentId,\n documentType,\n document,\n status: 'LOADED',\n }\n : {\n driveId,\n documentId,\n documentType,\n document,\n status: 'ERROR',\n },\n ),\n )\n .catch(error => {\n logger.error(error);\n setFileNodeDocument({\n driveId,\n documentId,\n documentType,\n document: undefined,\n status: 'ERROR',\n });\n });\n }\n }\n }, [\n selectedNode,\n documentId,\n documentType,\n driveId,\n fetchDocument,\n fileNodeDocument,\n setFileNodeDocument,\n ]);\n\n useEffect(() => {\n if (\n !fileNodeDocument?.driveId ||\n !fileNodeDocument.documentId ||\n !fileNodeDocument.documentType\n ) {\n return;\n }\n\n // watches for strand updates to update the document\n const removeListener = onStrandUpdate(strand => {\n if (\n strand.driveId === fileNodeDocument.driveId &&\n strand.documentId === fileNodeDocument.documentId\n ) {\n fetchDocument(\n fileNodeDocument.driveId,\n fileNodeDocument.documentId,\n fileNodeDocument.documentType,\n )\n .then(setSelectedDocument)\n .catch(logger.error);\n }\n });\n\n return removeListener;\n }, [\n fileNodeDocument?.driveId,\n fileNodeDocument?.documentId,\n fileNodeDocument?.documentType,\n onStrandUpdate,\n fetchDocument,\n setSelectedDocument,\n ]);\n\n const addOperationToSelectedDocument = useMemo(() => {\n if (driveId && documentId && kind === FILE) {\n return debounceOperations(operations =>\n addOperations(driveId, documentId, operations),\n );\n }\n }, [addOperations, driveId, documentId, kind]);\n\n const isSelectedDocument =\n kind === FILE &&\n fileNodeDocument?.driveId === driveId &&\n fileNodeDocument?.documentId === documentId;\n\n return useMemo(\n () => ({\n fileNodeDocument,\n selectedDocument: isSelectedDocument ? selectedDocument : undefined,\n setSelectedDocument,\n addOperationToSelectedDocument,\n }),\n [\n fileNodeDocument,\n isSelectedDocument,\n selectedDocument,\n setSelectedDocument,\n addOperationToSelectedDocument,\n ],\n );\n}\n","import {\n CLOUD,\n debugNodeOptions,\n defaultDriveOptions,\n defaultFileOptions,\n defaultFolderOptions,\n DELETE,\n DRIVE,\n FILE,\n FOLDER,\n LOCAL,\n PUBLIC,\n SharingType,\n} from '@powerhousedao/design-system';\nimport connectConfig from 'connect-config';\nimport { ReactNode } from 'react';\n\n// Enables debug options for the drive\nconst connectDebug = localStorage.getItem('CONNECT_DEBUG') === 'true';\n\nconst DriveSections: {\n sharingType: SharingType;\n label: ReactNode;\n}[] = [\n { sharingType: PUBLIC, label: 'Public Drives' },\n { sharingType: CLOUD, label: 'Secure Cloud Drives' },\n { sharingType: LOCAL, label: 'My Local Drives' },\n] as const;\n\nconst getSectionConfig = (sharingType: SharingType) => {\n return connectConfig.drives.sections[sharingType];\n};\n\nexport function getDriveNodeOptions(sharingType: SharingType) {\n const options = [...defaultDriveOptions];\n\n if (connectConfig.drives.sections[sharingType].allowDelete) {\n options.push(DELETE);\n }\n\n if (connectDebug) {\n options.push(...debugNodeOptions);\n }\n\n return options;\n}\n\nexport function getFileNodeOptions() {\n const options = [...defaultFileOptions];\n\n if (connectDebug) {\n options.push(...debugNodeOptions);\n }\n\n return options;\n}\n\nexport function getFolderNodeOptions() {\n const options = [...defaultFolderOptions];\n\n if (connectDebug) {\n options.push(...debugNodeOptions);\n }\n\n return options;\n}\n\nexport function getNodeOptions() {\n return {\n [LOCAL]: {\n [DRIVE]: getDriveNodeOptions(LOCAL),\n [FOLDER]: getFolderNodeOptions(),\n [FILE]: getFileNodeOptions(),\n },\n [CLOUD]: {\n [DRIVE]: getDriveNodeOptions(CLOUD),\n [FOLDER]: getFolderNodeOptions(),\n [FILE]: getFileNodeOptions(),\n },\n [PUBLIC]: {\n [DRIVE]: getDriveNodeOptions(PUBLIC),\n [FOLDER]: getFolderNodeOptions(),\n [FILE]: getFileNodeOptions(),\n },\n } as const;\n}\n\nexport const driveSections = DriveSections.filter(\n section => getSectionConfig(section.sharingType).enabled,\n).map(section => {\n const sectionConfig = getSectionConfig(section.sharingType);\n\n return {\n ...section,\n disableAddDrives: !sectionConfig.allowAdd,\n };\n});\n","import { DocumentDriveState } from 'document-model-libs/document-drive';\nimport { useDocumentDriveServer } from './useDocumentDriveServer';\n\ntype ExtendedDocumentDriveState = DocumentDriveState & { remoteUrl?: string };\n\nexport function useDocumentDriveById(driveId: string | undefined) {\n const { documentDrives } = useDocumentDriveServer();\n\n if (!driveId) return {\n drive: null,\n remoteUrl: null,\n isRemoteDrive: false,\n };\n\n const drive = documentDrives.find(\n drive => drive.state.global.id === driveId,\n );\n\n const pullResponder = drive?.state.local.triggers.find(\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n trigger => trigger.type === 'PullResponder',\n );\n\n const { remoteUrl } = (drive?.state.global ||\n {}) as ExtendedDocumentDriveState;\n\n const isRemoteDrive = !!remoteUrl || !!pullResponder;\n\n return {\n drive,\n remoteUrl: remoteUrl || pullResponder?.data?.url,\n isRemoteDrive,\n };\n}\n","// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>\n// This work is free. You can redistribute it and/or modify it\n// under the terms of the WTFPL, Version 2\n// For more information see LICENSE.txt or http://www.wtfpl.net/\n//\n// For more information, the home page:\n// http://pieroxy.net/blog/pages/lz-string/testing.html\n//\n// LZ-based compression algorithm, version 1.4.5\nvar LZString = (function() {\n\n// private property\nvar f = String.fromCharCode;\nvar keyStrBase64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nvar keyStrUriSafe = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$\";\nvar baseReverseDic = {};\n\nfunction getBaseValue(alphabet, character) {\n if (!baseReverseDic[alphabet]) {\n baseReverseDic[alphabet] = {};\n for (var i=0 ; i<alphabet.length ; i++) {\n baseReverseDic[alphabet][alphabet.charAt(i)] = i;\n }\n }\n return baseReverseDic[alphabet][character];\n}\n\nvar LZString = {\n compressToBase64 : function (input) {\n if (input == null) return \"\";\n var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);});\n switch (res.length % 4) { // To produce valid Base64\n default: // When could this happen ?\n case 0 : return res;\n case 1 : return res+\"===\";\n case 2 : return res+\"==\";\n case 3 : return res+\"=\";\n }\n },\n\n decompressFromBase64 : function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); });\n },\n\n compressToUTF16 : function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 15, function(a){return f(a+32);}) + \" \";\n },\n\n decompressFromUTF16: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; });\n },\n\n //compress into uint8array (UCS-2 big endian format)\n compressToUint8Array: function (uncompressed) {\n var compressed = LZString.compress(uncompressed);\n var buf=new Uint8Array(compressed.length*2); // 2 bytes per character\n\n for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) {\n var current_value = compressed.charCodeAt(i);\n buf[i*2] = current_value >>> 8;\n buf[i*2+1] = current_value % 256;\n }\n return buf;\n },\n\n //decompress from uint8array (UCS-2 big endian format)\n decompressFromUint8Array:function (compressed) {\n if (compressed===null || compressed===undefined){\n return LZString.decompress(compressed);\n } else {\n var buf=new Array(compressed.length/2); // 2 bytes per character\n for (var i=0, TotalLen=buf.length; i<TotalLen; i++) {\n buf[i]=compressed[i*2]*256+compressed[i*2+1];\n }\n\n var result = [];\n buf.forEach(function (c) {\n result.push(f(c));\n });\n return LZString.decompress(result.join(''));\n\n }\n\n },\n\n\n //compress into a string that is already URI encoded\n compressToEncodedURIComponent: function (input) {\n if (input == null) return \"\";\n return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);});\n },\n\n //decompress from an output of compressToEncodedURIComponent\n decompressFromEncodedURIComponent:function (input) {\n if (input == null) return \"\";\n if (input == \"\") return null;\n input = input.replace(/ /g, \"+\");\n return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); });\n },\n\n compress: function (uncompressed) {\n return LZString._compress(uncompressed, 16, function(a){return f(a);});\n },\n _compress: function (uncompressed, bitsPerChar, getCharFromInt) {\n if (uncompressed == null) return \"\";\n var i, value,\n context_dictionary= {},\n context_dictionaryToCreate= {},\n context_c=\"\",\n context_wc=\"\",\n context_w=\"\",\n context_enlargeIn= 2, // Compensate for the first entry which should not count\n context_dictSize= 3,\n context_numBits= 2,\n context_data=[],\n context_data_val=0,\n context_data_position=0,\n ii;\n\n for (ii = 0; ii < uncompressed.length; ii += 1) {\n context_c = uncompressed.charAt(ii);\n if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) {\n context_dictionary[context_c] = context_dictSize++;\n context_dictionaryToCreate[context_c] = true;\n }\n\n context_wc = context_w + context_c;\n if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) {\n context_w = context_wc;\n } else {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position ==bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n // Add wc to the dictionary.\n context_dictionary[context_wc] = context_dictSize++;\n context_w = String(context_c);\n }\n }\n\n // Output the code for w.\n if (context_w !== \"\") {\n if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) {\n if (context_w.charCodeAt(0)<256) {\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<8 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n } else {\n value = 1;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | value;\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = 0;\n }\n value = context_w.charCodeAt(0);\n for (i=0 ; i<16 ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n delete context_dictionaryToCreate[context_w];\n } else {\n value = context_dictionary[context_w];\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n\n }\n context_enlargeIn--;\n if (context_enlargeIn == 0) {\n context_enlargeIn = Math.pow(2, context_numBits);\n context_numBits++;\n }\n }\n\n // Mark the end of the stream\n value = 2;\n for (i=0 ; i<context_numBits ; i++) {\n context_data_val = (context_data_val << 1) | (value&1);\n if (context_data_position == bitsPerChar-1) {\n context_data_position = 0;\n context_data.push(getCharFromInt(context_data_val));\n context_data_val = 0;\n } else {\n context_data_position++;\n }\n value = value >> 1;\n }\n\n // Flush the last char\n while (true) {\n context_data_val = (context_data_val << 1);\n if (context_data_position == bitsPerChar-1) {\n context_data.push(getCharFromInt(context_data_val));\n break;\n }\n else context_data_position++;\n }\n return context_data.join('');\n },\n\n decompress: function (compressed) {\n if (compressed == null) return \"\";\n if (compressed == \"\") return null;\n return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); });\n },\n\n _decompress: function (length, resetValue, getNextValue) {\n var dictionary = [],\n next,\n enlargeIn = 4,\n dictSize = 4,\n numBits = 3,\n entry = \"\",\n result = [],\n i,\n w,\n bits, resb, maxpower, power,\n c,\n data = {val:getNextValue(0), position:resetValue, index:1};\n\n for (i = 0; i < 3; i += 1) {\n dictionary[i] = i;\n }\n\n bits = 0;\n maxpower = Math.pow(2,2);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (next = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n c = f(bits);\n break;\n case 2:\n return \"\";\n }\n dictionary[3] = c;\n w = c;\n result.push(c);\n while (true) {\n if (data.index > length) {\n return \"\";\n }\n\n bits = 0;\n maxpower = Math.pow(2,numBits);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n switch (c = bits) {\n case 0:\n bits = 0;\n maxpower = Math.pow(2,8);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 1:\n bits = 0;\n maxpower = Math.pow(2,16);\n power=1;\n while (power!=maxpower) {\n resb = data.val & data.position;\n data.position >>= 1;\n if (data.position == 0) {\n data.position = resetValue;\n data.val = getNextValue(data.index++);\n }\n bits |= (resb>0 ? 1 : 0) * power;\n power <<= 1;\n }\n dictionary[dictSize++] = f(bits);\n c = dictSize-1;\n enlargeIn--;\n break;\n case 2:\n return result.join('');\n }\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n if (dictionary[c]) {\n entry = dictionary[c];\n } else {\n if (c === dictSize) {\n entry = w + w.charAt(0);\n } else {\n return null;\n }\n }\n result.push(entry);\n\n // Add w+entry[0] to the dictionary.\n dictionary[dictSize++] = w + entry.charAt(0);\n enlargeIn--;\n\n w = entry;\n\n if (enlargeIn == 0) {\n enlargeIn = Math.pow(2, numBits);\n numBits++;\n }\n\n }\n }\n};\n return LZString;\n})();\n\nif (typeof define === 'function' && define.amd) {\n define(function () { return LZString; });\n} else if( typeof module !== 'undefined' && module != null ) {\n module.exports = LZString\n} else if( typeof angular !== 'undefined' && angular != null ) {\n angular.module('LZString', [])\n .factory('LZString', function () {\n return LZString;\n });\n}\n","import LZString from 'lz-string';\n\nconst rwaQuery = `... on RealWorldAssets {\n state {\n portfolio {\n __typename\n ... on FixedIncome {\n name\n CUSIP\n purchaseDate\n purchasePrice\n purchaseProceeds\n salesProceeds\n totalDiscount\n spvId\n }\n ... on Cash {\n id\n balance\n }\n }\n transactions {\n id\n type\n entryTime\n cashBalanceChange\n fees {\n id\n serviceProviderFeeTypeId\n amount\n }\n txRef\n cashTransaction {\n id\n assetId\n amount\n entryTime\n tradeTime\n settlementTime\n accountId\n counterPartyAccountId\n }\n fixedIncomeTransaction {\n id\n assetId\n amount\n entryTime\n tradeTime\n settlementTime\n accountId\n counterPartyAccountId\n }\n }\n }\n }`;\n\nconst accountSnapshot = `... on AccountSnapshot {\n state {\n id\n ownerId\n ownerType\n period\n start\n end\n actualsComparison {\n month\n reportedActuals\n currency\n netExpenses {\n offChainIncluded {amount difference}\n onChainOnly {amount difference}\n }\n }\n snapshotAccount {\n id\n accountLabel\n accountAddress\n accountType\n groupAccountId\n offChain\n upstreamAccountId\n }\n }\n }`;\n\nconst budgetStatement = `... on BudgetStatement {\n state {\n month\n quoteCurrency\n accounts {\n name\n address\n lineItems {\n actual\n payment\n budgetCap\n }\n }\n ftes {\n value\n }\n }\n }`;\n\nconst getQuery = (\n documentId: string,\n documentType: string,\n encodeQuery = true,\n) => {\n let query = ``;\n\n if (documentType === 'powerhouse/account-snapshot') {\n query = accountSnapshot;\n }\n\n if (documentType === 'powerhouse/budget-statement') {\n query = budgetStatement;\n }\n\n if (documentType === 'makerdao/rwa-portfolio') {\n query = rwaQuery;\n }\n\n const queryString = `query {\n document(id:\"${documentId}\") {\n name\n documentType\n revision\n created\n lastModified\n ${query}\n }\n}`;\n\n if (!encodeQuery) {\n return queryString;\n }\n\n return encodeURIComponent(queryString);\n};\n\nconst getLocalReactorUrl = (\n remoteUrl: string,\n documentType: string,\n documentId: string,\n) => {\n const query = getQuery(documentId, documentType, false);\n\n const explorerURLState = LZString.compressToEncodedURIComponent(\n JSON.stringify({\n document: query.trim(),\n }),\n );\n\n const url = remoteUrl + `?explorerURLState=${explorerURLState}`;\n return url.toString();\n};\n\nexport const getSwitchboardUrl = (\n remoteUrl: string,\n documentType: string,\n documentId: string,\n) => {\n if (remoteUrl.includes('localhost')) {\n return getLocalReactorUrl(remoteUrl, documentType, documentId);\n }\n\n const explorerUrl = remoteUrl.replace(/\\/d\\//, '/graphql/');\n const query = getQuery(documentId, documentType);\n const url = explorerUrl + `?query=${query}`;\n\n return url.toString();\n};\n","const openBrowserUrl = (url: string) => window.open(url, '_blank');\n\nexport const openUrl = window.electronAPI?.openURL ?? openBrowserUrl;\n","import { FILE, UiNode } from '@powerhousedao/design-system';\nimport { getSwitchboardUrl } from 'src/utils/getSwitchboardUrl';\nimport { openUrl } from 'src/utils/openUrl';\nimport { useDocumentDriveById } from './useDocumentDriveById';\n\nexport const useOpenSwitchboardLink = (driveId: string | undefined) => {\n const { isRemoteDrive, remoteUrl } = useDocumentDriveById(driveId);\n\n return async (uiNode?: UiNode | null) => {\n if (uiNode?.kind !== FILE || !remoteUrl || !isRemoteDrive) return;\n\n const url = new URL(remoteUrl);\n const baseUrl = url.origin;\n\n const switchboardUrl = getSwitchboardUrl(\n remoteUrl,\n uiNode.documentType,\n uiNode.id,\n );\n\n await openUrl(switchboardUrl);\n };\n};\n","import {\n AddLocalDriveInput,\n AddRemoteDriveInput,\n CLOUD,\n DRIVE,\n FILE,\n FOLDER,\n LOCAL,\n PUBLIC,\n SharingType,\n SUCCESS,\n toast,\n UiDriveNode,\n UiFileNode,\n UiFolderNode,\n UiNode,\n useUiNodesContext,\n} from '@powerhousedao/design-system';\nimport { ReadDrive } from 'document-drive';\nimport { DocumentDriveDocument } from 'document-model-libs/document-drive';\nimport { useCallback, useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useModal } from 'src/components/modal';\nimport { useReadModeContext } from 'src/context/read-mode';\nimport { useFileNodeDocument } from 'src/store/document-drive';\nimport {\n useFilteredDocumentModels,\n useGetDocumentModel,\n} from 'src/store/document-model';\nimport { getNodeOptions } from 'src/utils/drive-sections';\nimport { makeNodeSlugFromNodeName } from 'src/utils/slug';\nimport { useDocumentDriveById } from './useDocumentDriveById';\nimport { useDocumentDriveServer } from './useDocumentDriveServer';\nimport { useOpenSwitchboardLink } from './useOpenSwitchboardLink';\nimport { useUserPermissions } from './useUserPermissions';\n\nexport function useUiNodes() {\n const { showModal } = useModal();\n const { t } = useTranslation();\n const uiNodesContext = useUiNodesContext();\n const {\n selectedDriveNode,\n driveNodes,\n selectedParentNode,\n setSelectedNode,\n getParentNode,\n } = uiNodesContext;\n const readModeContext = useReadModeContext();\n const documentDriveServer = useDocumentDriveServer();\n const {\n addFolder,\n addFile,\n renameNode,\n deleteNode,\n addDrive,\n addRemoteDrive,\n deleteDrive,\n renameDrive,\n setDriveAvailableOffline,\n setDriveSharingType,\n copyNode,\n moveNode,\n getSyncStatus,\n removeTrigger,\n addTrigger,\n registerNewPullResponderTrigger,\n } = documentDriveServer;\n const selectedDocumentDrive = useDocumentDriveById(selectedDriveNode?.id);\n const openSwitchboardLink = useOpenSwitchboardLink(selectedDriveNode?.id);\n const userPermissions = useUserPermissions();\n const nodeOptions = getNodeOptions();\n const documentModels = useFilteredDocumentModels();\n const getDocumentModel = useGetDocumentModel();\n const fileNodeDocument = useFileNodeDocument({\n ...uiNodesContext,\n ...documentDriveServer,\n ...readModeContext,\n });\n\n const makeUiDriveNode = useCallback(\n async (drive: DocumentDriveDocument | ReadDrive) => {\n const isReadDrive = 'readContext' in drive;\n const { id, name, icon, slug } = drive.state.global;\n const { sharingType: _sharingType, availableOffline } = !isReadDrive\n ? drive.state.local\n : { sharingType: PUBLIC, availableOffline: false };\n const __sharingType = _sharingType?.toUpperCase();\n const sharingType = (\n __sharingType === 'PRIVATE' ? LOCAL : __sharingType\n ) as SharingType;\n const driveSyncStatus = !isReadDrive\n ? await getSyncStatus(id, sharingType)\n : undefined;\n\n // TODO: rempve this after integration in design-system\n const normalizedDriveSyncStatus =\n driveSyncStatus === 'INITIAL_SYNC'\n ? 'SYNCING'\n : driveSyncStatus;\n\n const driveNode: UiDriveNode = {\n id,\n name,\n slug: slug || null,\n kind: DRIVE,\n children: [],\n nodeMap: {},\n sharingType,\n syncStatus: normalizedDriveSyncStatus,\n availableOffline,\n icon,\n parentFolder: null,\n driveId: id,\n };\n\n const nodes = drive.state.global.nodes.map(n => {\n const node = {\n ...n,\n slug: makeNodeSlugFromNodeName(n.name),\n driveId: id,\n parentFolder: n.parentFolder || id,\n kind: n.kind.toUpperCase(),\n syncStatus: normalizedDriveSyncStatus,\n sharingType,\n };\n\n if (node.kind === DRIVE) {\n throw new Error('Drive nodes should not be nested');\n }\n\n if (node.kind === FILE) {\n return node as UiFileNode;\n }\n\n return {\n ...node,\n children: [],\n } as UiFolderNode;\n });\n\n for (const node of nodes) {\n driveNode.nodeMap[node.id] = node;\n }\n\n for await (const node of nodes) {\n if (node.kind === FILE) {\n const fileSyncStatus = !isReadDrive\n ? await getSyncStatus(\n node.synchronizationUnits[0].syncId,\n sharingType,\n )\n : undefined;\n\n // TODO: rempve this after integration in design-system\n const normalizedFileSyncStatus =\n fileSyncStatus === 'INITIAL_SYNC'\n ? 'SYNCING'\n : fileSyncStatus;\n\n node.syncStatus = normalizedFileSyncStatus;\n }\n\n if (node.parentFolder === id) {\n driveNode.children.push(node);\n continue;\n }\n const parent = driveNode.nodeMap[node.parentFolder];\n\n if (parent.kind === FILE) {\n throw new Error(\n `Parent node ${node.parentFolder} is a file, not a folder`,\n );\n }\n\n parent.children.push(node);\n\n if (node.syncStatus !== SUCCESS) {\n parent.syncStatus = node.syncStatus;\n }\n }\n\n return driveNode;\n },\n [getSyncStatus],\n );\n\n const makeUiDriveNodes = useCallback(\n async (documentDrives: DocumentDriveDocument[]) => {\n return Promise.all(documentDrives.map(makeUiDriveNode));\n },\n [makeUiDriveNode],\n );\n\n const onAddFolder = useCallback(\n async (name: string, parentNode: UiNode | null) => {\n if (!parentNode) {\n throw new Error('Parent node is required');\n }\n if (parentNode.kind === FILE) {\n throw new Error('Cannot add folder to a file');\n }\n return await addFolder(parentNode.driveId, name, parentNode.id);\n },\n [addFolder],\n );\n\n const onRenameNode = useCallback(\n async (name: string, uiNode: UiNode) => {\n if (uiNode.kind === DRIVE) {\n throw new Error(\n 'Drive can only be renamed from the drive settings modal',\n );\n }\n return await renameNode(uiNode.driveId, uiNode.id, name);\n },\n [renameNode],\n );\n\n const onCopyNode = useCallback(\n async (uiNode: UiNode, targetNode: UiNode) => {\n if (uiNode.kind === DRIVE) {\n throw new Error('Drive cannot be duplicated');\n }\n\n await copyNode(uiNode, targetNode);\n },\n [copyNode],\n );\n\n const onMoveNode = useCallback(\n async (uiNode: UiNode, targetNode: UiNode) => {\n if (uiNode.kind === DRIVE) {\n throw new Error('Drive cannot be moved');\n }\n\n await moveNode(uiNode, targetNode);\n },\n [moveNode],\n );\n\n const onAddFile = useCallback(\n async (file: File, parentNode: UiNode | null) => {\n if (!parentNode) {\n throw new Error('Parent node is required');\n }\n if (parentNode.kind === FILE) {\n throw new Error('Cannot add file to a file');\n }\n\n const fileName = file.name.replace(/\\.zip$/gim, '');\n\n return await addFile(\n file,\n parentNode.driveId,\n fileName,\n parentNode.id,\n );\n },\n [addFile],\n );\n\n const onDuplicateNode = useCallback(\n async (uiNode: UiNode) => {\n if (!selectedParentNode) return;\n\n if (uiNode.kind === DRIVE) {\n throw new Error('Drive cannot be duplicated');\n }\n\n await copyNode(uiNode, selectedParentNode);\n },\n [copyNode, selectedParentNode],\n );\n\n const onDeleteNode = useCallback(\n (uiNode: UiFileNode | UiFolderNode) => {\n showModal('deleteItem', {\n uiNode,\n onDelete: async closeModal => {\n closeModal();\n\n const i18nKey =\n uiNode.kind === FOLDER\n ? 'notifications.deleteFolderSuccess'\n : 'notifications.fileDeleteSuccess';\n\n const parentNode = getParentNode(uiNode);\n\n await deleteNode(uiNode.driveId, uiNode.id);\n\n setSelectedNode(parentNode);\n\n toast(t(i18nKey), { type: 'connect-deleted' });\n },\n });\n },\n [deleteNode, getParentNode, setSelectedNode, showModal, t],\n );\n\n const onDeleteDrive = useCallback(\n (uiDriveNode: UiDriveNode) => {\n showModal('deleteDriveModal', {\n uiDriveNode,\n onDelete: async closeModal => {\n closeModal();\n await deleteDrive(uiDriveNode.id);\n\n setSelectedNode(driveNodes[0]);\n\n toast(t('notifications.deleteDriveSuccess'), {\n type: 'connect-deleted',\n });\n },\n });\n },\n [deleteDrive, driveNodes, setSelectedNode, showModal, t],\n );\n\n const onAddLocalDrive = useCallback(\n async (data: AddLocalDriveInput) => {\n try {\n const newDrive = await addDrive({\n global: {\n name: data.name,\n id: undefined,\n icon: null,\n slug: null,\n },\n local: {\n availableOffline: data.availableOffline,\n sharingType: data.sharingType.toLowerCase(),\n listeners: [],\n triggers: [],\n },\n });\n\n toast(t('notifications.addDriveSuccess'), {\n type: 'connect-success',\n });\n\n const newDriveNode = await makeUiDriveNode(newDrive);\n\n setSelectedNode(newDriveNode);\n } catch (e) {\n console.error(e);\n }\n },\n [addDrive, makeUiDriveNode, setSelectedNode, t],\n );\n\n const onAddRemoteDrive = useCallback(\n async (data: AddRemoteDriveInput) => {\n try {\n const newDrive = await addRemoteDrive(data.url, {\n sharingType: data.sharingType,\n availableOffline: data.availableOffline,\n listeners: [\n {\n block: true,\n callInfo: {\n data: data.url,\n name: 'switchboard-push',\n transmitterType: 'SwitchboardPush',\n },\n filter: {\n branch: ['main'],\n documentId: ['*'],\n documentType: ['*'],\n scope: ['global'],\n },\n label: 'Switchboard Sync',\n listenerId: '1',\n system: true,\n },\n ],\n triggers: [],\n pullInterval: 3000,\n });\n\n toast(t('notifications.addDriveSuccess'), {\n type: 'connect-success',\n });\n\n const newDriveNode = await makeUiDriveNode(newDrive);\n\n setSelectedNode(newDriveNode);\n } catch (e) {\n console.error(e);\n }\n },\n [addRemoteDrive, makeUiDriveNode, setSelectedNode, t],\n );\n\n const showAddDriveModal = useCallback(\n (groupSharingType: SharingType) => {\n if (groupSharingType === LOCAL) {\n showModal('addLocalDrive', {\n onAddLocalDrive,\n });\n } else {\n showModal('addRemoteDrive', {\n onAddRemoteDrive,\n groupSharingType,\n });\n }\n },\n [onAddLocalDrive, onAddRemoteDrive, showModal],\n );\n\n const onRenameDrive = useCallback(\n async (uiDriveNode: UiDriveNode, newName: string) => {\n await renameDrive(uiDriveNode.id, newName);\n },\n [renameDrive],\n );\n\n const onChangeSharingType = useCallback(\n async (uiDriveNode: UiDriveNode, newSharingType: SharingType) => {\n await setDriveSharingType(uiDriveNode.id, newSharingType);\n },\n [setDriveSharingType],\n );\n\n const onChangeAvailableOffline = useCallback(\n async (uiDriveNode: UiDriveNode, newAvailableOffline: boolean) => {\n await setDriveAvailableOffline(uiDriveNode.id, newAvailableOffline);\n },\n [setDriveAvailableOffline],\n );\n\n const showDriveSettingsModal = useCallback(\n (uiDriveNode: UiDriveNode) => {\n showModal('driveSettings', {\n uiDriveNode,\n onRenameDrive,\n onDeleteDrive,\n onChangeSharingType,\n onChangeAvailableOffline,\n });\n },\n [\n onChangeAvailableOffline,\n onChangeSharingType,\n onDeleteDrive,\n onRenameDrive,\n showModal,\n ],\n );\n\n const onAddAndSelectNewFolder = useCallback(\n async (name: string) => {\n if (!name || !selectedParentNode) return;\n\n const newFolder = await onAddFolder(name, selectedParentNode);\n\n setSelectedNode({\n ...newFolder,\n kind: FOLDER,\n slug: makeNodeSlugFromNodeName(newFolder.name),\n parentFolder: selectedParentNode.id,\n syncStatus: selectedParentNode.syncStatus,\n driveId: selectedParentNode.driveId,\n sharingType: selectedParentNode.sharingType,\n children: [],\n });\n },\n [onAddFolder, selectedParentNode, setSelectedNode],\n );\n\n const onAddTrigger = useCallback(\n async (uiNodeDriveId: string) => {\n const url = window.prompt('url') || '';\n\n const pullResponderTrigger = await registerNewPullResponderTrigger(\n uiNodeDriveId,\n url,\n { pullInterval: 6000 },\n );\n await addTrigger(uiNodeDriveId, pullResponderTrigger);\n },\n [addTrigger, registerNewPullResponderTrigger],\n );\n\n const onRemoveTrigger = useCallback(\n async (uiNodeDriveId: string) => {\n const triggerId = window.prompt('triggerId:');\n\n if (triggerId) {\n await removeTrigger(uiNodeDriveId, triggerId);\n }\n },\n [removeTrigger],\n );\n\n const onAddInvalidTrigger = useCallback(\n async (uiNodeDriveId: string) => {\n const url = window.prompt('url') || '';\n\n await addTrigger(uiNodeDriveId, {\n id: 'some-invalid-id',\n type: 'PullResponder',\n data: {\n interval: '3000',\n listenerId: 'invalid-listener-id',\n url,\n },\n });\n },\n [addTrigger],\n );\n\n const driveNodesBySharingType = useMemo(\n () =>\n driveNodes.reduce<Record<SharingType, UiDriveNode[]>>(\n (acc, driveNode) => {\n acc[driveNode.sharingType].push(driveNode);\n return acc;\n },\n {\n [PUBLIC]: [],\n [CLOUD]: [],\n [LOCAL]: [],\n },\n ),\n [driveNodes],\n );\n\n return useMemo(\n () => ({\n ...documentDriveServer,\n ...uiNodesContext,\n ...userPermissions,\n ...selectedDocumentDrive,\n ...fileNodeDocument,\n nodeOptions,\n driveNodesBySharingType,\n documentModels,\n onAddFolder,\n onAddFile,\n onCopyNode,\n onMoveNode,\n onRenameNode,\n onDuplicateNode,\n onDeleteNode,\n onDeleteDrive,\n makeUiDriveNodes,\n onAddAndSelectNewFolder,\n showAddDriveModal,\n showDriveSettingsModal,\n openSwitchboardLink,\n onAddTrigger,\n onRemoveTrigger,\n onAddInvalidTrigger,\n getDocumentModel,\n }),\n [\n documentDriveServer,\n uiNodesContext,\n userPermissions,\n selectedDocumentDrive,\n fileNodeDocument,\n nodeOptions,\n driveNodesBySharingType,\n documentModels,\n onAddFolder,\n onAddFile,\n onCopyNode,\n onMoveNode,\n onRenameNode,\n onDuplicateNode,\n onDeleteNode,\n onDeleteDrive,\n makeUiDriveNodes,\n onAddAndSelectNewFolder,\n showAddDriveModal,\n showDriveSettingsModal,\n openSwitchboardLink,\n onAddTrigger,\n onRemoveTrigger,\n onAddInvalidTrigger,\n getDocumentModel,\n ],\n );\n}\n\nexport type TUiNodes = ReturnType<typeof useUiNodes>;\n"],"names":["debounceOperations","callback","timeout","timer","operations","operation","index","op","oldOperation","resolve","reject","documentCacheAtom","atom","singletonFileNodeDocumentAtom","fileNodeDocumentAtom","get","set","newValue","currentValue","documentCache","documentToHash","selectedDocumentAtom","_a","document","fileNodeDocument","useFileNodeDocument","props","selectedNode","selectedDriveNode","openFile","addOperations","onStrandUpdate","fetchReadDocument","setFileNodeDocument","useAtom","isReadMode","driveId","documentId","kind","documentType","selectedDocument","setSelectedDocument","fetchDocument","useCallback","id","useEffect","error","logger","strand","addOperationToSelectedDocument","useMemo","FILE","isSelectedDocument","connectDebug","DriveSections","PUBLIC","CLOUD","LOCAL","getSectionConfig","sharingType","connectConfig","getDriveNodeOptions","options","defaultDriveOptions","DELETE","debugNodeOptions","getFileNodeOptions","defaultFileOptions","getFolderNodeOptions","defaultFolderOptions","getNodeOptions","DRIVE","FOLDER","driveSections","section","sectionConfig","useDocumentDriveById","documentDrives","useDocumentDriveServer","drive","pullResponder","trigger","remoteUrl","isRemoteDrive","LZString","f","keyStrBase64","keyStrUriSafe","baseReverseDic","getBaseValue","alphabet","character","i","input","res","a","compressed","uncompressed","buf","TotalLen","current_value","result","c","bitsPerChar","getCharFromInt","value","context_dictionary","context_dictionaryToCreate","context_c","context_wc","context_w","context_enlargeIn","context_dictSize","context_numBits","context_data","context_data_val","context_data_position","ii","length","resetValue","getNextValue","dictionary","enlargeIn","dictSize","numBits","entry","w","bits","resb","maxpower","power","data","module","rwaQuery","accountSnapshot","budgetStatement","getQuery","encodeQuery","query","queryString","getLocalReactorUrl","explorerURLState","getSwitchboardUrl","explorerUrl","openBrowserUrl","url","openUrl","useOpenSwitchboardLink","uiNode","switchboardUrl","useUiNodes","showModal","useModal","t","useTranslation","uiNodesContext","useUiNodesContext","driveNodes","selectedParentNode","setSelectedNode","getParentNode","readModeContext","useReadModeContext","documentDriveServer","addFolder","addFile","renameNode","deleteNode","addDrive","addRemoteDrive","deleteDrive","renameDrive","setDriveAvailableOffline","setDriveSharingType","copyNode","moveNode","getSyncStatus","removeTrigger","addTrigger","registerNewPullResponderTrigger","selectedDocumentDrive","openSwitchboardLink","userPermissions","useUserPermissions","nodeOptions","documentModels","useFilteredDocumentModels","getDocumentModel","useGetDocumentModel","makeUiDriveNode","isReadDrive","name","icon","slug","_sharingType","availableOffline","__sharingType","driveSyncStatus","normalizedDriveSyncStatus","driveNode","nodes","n","node","makeNodeSlugFromNodeName","fileSyncStatus","normalizedFileSyncStatus","parent","SUCCESS","makeUiDriveNodes","onAddFolder","parentNode","onRenameNode","onCopyNode","targetNode","onMoveNode","onAddFile","file","fileName","onDuplicateNode","onDeleteNode","closeModal","i18nKey","toast","onDeleteDrive","uiDriveNode","onAddLocalDrive","newDrive","newDriveNode","e","onAddRemoteDrive","showAddDriveModal","groupSharingType","onRenameDrive","newName","onChangeSharingType","newSharingType","onChangeAvailableOffline","newAvailableOffline","showDriveSettingsModal","onAddAndSelectNewFolder","newFolder","onAddTrigger","uiNodeDriveId","pullResponderTrigger","onRemoveTrigger","triggerId","onAddInvalidTrigger","driveNodesBySharingType","acc"],"mappings":"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","x_google_ignoreList":[3]}
package/dist/index.html CHANGED
@@ -5,9 +5,9 @@
5
5
  "MODE": "InByb2R1Y3Rpb24i",
6
6
  "DEV": "ZmFsc2U=",
7
7
  "PROD": "dHJ1ZQ==",
8
- "APP_VERSION": "IjEuMC4wLWRldi4xOTEi",
8
+ "APP_VERSION": "IjEuMC4wLWRldi4xOTMi",
9
9
  "REQUIRES_HARD_REFRESH": "dHJ1ZQ==",
10
- "SENTRY_RELEASE": "IjEuMC4wLWRldi4xOTEi",
10
+ "SENTRY_RELEASE": "IjEuMC4wLWRldi4xOTMi",
11
11
  "BASE_PATH": "Ii8i",
12
12
  "BASE_HREF": "Ii4vIg==",
13
13
  "PH_CONNECT_APP_REQUIRES_HARD_REFRESH": "InRydWUi",
@@ -56,4 +56,4 @@
56
56
  );
57
57
  });
58
58
  window.__VITE_ENVS = env;
59
- </script><script type="module" crossorigin="" src="/assets/main.CuhK_teW.js"></script></head><body><div id="app"></div></body></html>
59
+ </script><script type="module" crossorigin="" src="/assets/main.Dn_g_SSw.js"></script></head><body><div id="app"></div></body></html>
@@ -1,2 +1,2 @@
1
- const c=self,i="1.0.0-dev.191",r=!0,l="version-cache",o="app-version";c.addEventListener("install",()=>{c.skipWaiting().catch(console.error)});c.addEventListener("activate",e=>{e.waitUntil(c.clients.claim()),p(i,r).catch(console.error)});function E(e,n){return e.postMessage(n)}async function p(e,n){try{const t=await caches.open(l),s=await t.match(o);let a="";s&&(a=await s.text()),a===""?await t.put(o,new Response(e)):a!==e&&(console.log("Current version:",a),console.log("New version:",e),await t.put(o,new Response(e)),await h(e,n))}catch(t){console.error("Error checking version:",t)}}async function h(e,n){await c.clients.claim(),(await c.clients.matchAll()).forEach(s=>{E(s,{type:"NEW_VERSION_AVAILABLE",version:e,requiresHardRefresh:n})})}
1
+ const c=self,i="1.0.0-dev.193",r=!0,l="version-cache",o="app-version";c.addEventListener("install",()=>{c.skipWaiting().catch(console.error)});c.addEventListener("activate",e=>{e.waitUntil(c.clients.claim()),p(i,r).catch(console.error)});function E(e,n){return e.postMessage(n)}async function p(e,n){try{const t=await caches.open(l),s=await t.match(o);let a="";s&&(a=await s.text()),a===""?await t.put(o,new Response(e)):a!==e&&(console.log("Current version:",a),console.log("New version:",e),await t.put(o,new Response(e)),await h(e,n))}catch(t){console.error("Error checking version:",t)}}async function h(e,n){await c.clients.claim(),(await c.clients.matchAll()).forEach(s=>{E(s,{type:"NEW_VERSION_AVAILABLE",version:e,requiresHardRefresh:n})})}
2
2
  //# sourceMappingURL=service-worker.js.map
@@ -6,9 +6,11 @@ export type Project = {
6
6
  export type ConnectStudioOptions = {
7
7
  port?: string;
8
8
  host?: boolean;
9
+ https?: boolean;
9
10
  configFile?: string;
10
11
  localEditors?: string;
11
12
  localDocuments?: string;
13
+ open?: boolean;
12
14
  };
13
15
  export declare function generateImportSctipt(outputPath: string, projects: Project[]): void;
14
16
  export declare function startConnectStudio(options: ConnectStudioOptions): Promise<void> | undefined;
@@ -4,6 +4,7 @@ import fs4 from "node:fs";
4
4
  import { dirname, isAbsolute, join as join3, resolve } from "node:path";
5
5
 
6
6
  // studio/server.ts
7
+ import basicSsl from "@vitejs/plugin-basic-ssl";
7
8
  import { exec } from "node:child_process";
8
9
  import fs3 from "node:fs";
9
10
  import { join as join2 } from "node:path";
@@ -353,7 +354,7 @@ async function startServer(options = {}) {
353
354
  backupIndexHtml(true);
354
355
  const PORT = process.env.PORT ? parseInt(process.env.PORT) : 3e3;
355
356
  const HOST = process.env.HOST ? process.env.HOST : "0.0.0.0";
356
- const OPEN_BROWSER = typeof process.env.OPEN_BROWSER === "string" ? process.env.OPEN_BROWSER === "true" : true;
357
+ const OPEN_BROWSER = typeof process.env.OPEN_BROWSER === "string" ? process.env.OPEN_BROWSER === "true" : false;
357
358
  const studioConfig = getStudioConfig();
358
359
  if (!fs3.existsSync(join2(appPath2, "src"))) {
359
360
  fs3.mkdirSync(join2(appPath2, "src"));
@@ -365,7 +366,7 @@ async function startServer(options = {}) {
365
366
  root: appPath2,
366
367
  server: {
367
368
  port: PORT,
368
- open: OPEN_BROWSER,
369
+ open: options.open ?? OPEN_BROWSER,
369
370
  host: HOST
370
371
  },
371
372
  resolve: {
@@ -411,7 +412,10 @@ async function startServer(options = {}) {
411
412
  declarationFile: join2(studioDirname2, "../.env"),
412
413
  computedEnv: studioConfig
413
414
  }),
414
- runShellScriptPlugin(viteEnvsScript)
415
+ runShellScriptPlugin(viteEnvsScript),
416
+ options.https && basicSsl({
417
+ name: "Powerhouse Connect Studio"
418
+ })
415
419
  ],
416
420
  build: {
417
421
  rollupOptions: {
@@ -491,6 +495,9 @@ function startConnectStudio(options) {
491
495
  if (options.host) {
492
496
  process.env.HOST = options.host.toString();
493
497
  }
498
+ if (typeof options.open === "boolean") {
499
+ serverOptions.open = options.open;
500
+ }
494
501
  if (options.configFile) {
495
502
  const config = readJsonFile(options.configFile);
496
503
  if (!config) return;
@@ -499,13 +506,14 @@ function startConnectStudio(options) {
499
506
  const packages = mapProjects(config.packages);
500
507
  generateImportSctipt(configFileDir, packages);
501
508
  process.env.LOAD_EXTERNAL_PROJECTS = "true";
502
- serverOptions = {
503
- enableExternalProjects: true,
504
- projectsImportPath: resolve(configFileDir, IMPORT_SCRIPT_FILE)
505
- };
509
+ serverOptions.enableExternalProjects = true;
510
+ serverOptions.projectsImportPath = resolve(
511
+ configFileDir,
512
+ IMPORT_SCRIPT_FILE
513
+ );
506
514
  } else {
507
515
  process.env.LOAD_EXTERNAL_PROJECTS = "false";
508
- serverOptions = { enableExternalProjects: false };
516
+ serverOptions.enableExternalProjects = false;
509
517
  }
510
518
  if (config.documentModelsDir) {
511
519
  process.env.LOCAL_DOCUMENT_MODELS = isAbsolute(
@@ -526,7 +534,7 @@ function startConnectStudio(options) {
526
534
  }
527
535
  } else {
528
536
  process.env.LOAD_EXTERNAL_PROJECTS = "false";
529
- serverOptions = { enableExternalProjects: false };
537
+ serverOptions.enableExternalProjects = false;
530
538
  }
531
539
  if (options.localEditors) {
532
540
  process.env.LOCAL_DOCUMENT_EDITORS = options.localEditors;
@@ -534,12 +542,15 @@ function startConnectStudio(options) {
534
542
  if (options.localDocuments) {
535
543
  process.env.LOCAL_DOCUMENT_MODELS = options.localDocuments;
536
544
  }
545
+ if (options.https) {
546
+ serverOptions.https = options.https;
547
+ }
537
548
  return startServer(serverOptions).catch((error) => {
538
549
  throw error;
539
550
  });
540
551
  }
541
552
  var program = new Command();
542
- program.name("Connect Studio").description("Connect Studio CLI").option("-p, --port <port>", "Port to run the server on", "3000").option("-h, --host", "Expose the server to the network").option(
553
+ program.name("Connect Studio").description("Connect Studio CLI").option("-p, --port <port>", "Port to run the server on", "3000").option("-h, --host", "Expose the server to the network").option("--https", "Enable HTTPS").option("--open", "Open the browser on start").option(
543
554
  "--config-file <configFile>",
544
555
  "Path to the powerhouse.config.js file"
545
556
  ).option(
@@ -1,5 +1,7 @@
1
1
  export type StartServerOptions = {
2
2
  projectsImportPath?: string;
3
3
  enableExternalProjects?: boolean;
4
+ https?: boolean;
5
+ open?: boolean;
4
6
  };
5
7
  export declare function startServer(options?: StartServerOptions): Promise<void>;
package/dist/swEnv.js CHANGED
@@ -10,9 +10,9 @@ const envWithValuesInBase64 = {
10
10
  "MODE": "InByb2R1Y3Rpb24i",
11
11
  "DEV": "ZmFsc2U=",
12
12
  "PROD": "dHJ1ZQ==",
13
- "APP_VERSION": "IjEuMC4wLWRldi4xOTEi",
13
+ "APP_VERSION": "IjEuMC4wLWRldi4xOTMi",
14
14
  "REQUIRES_HARD_REFRESH": "dHJ1ZQ==",
15
- "SENTRY_RELEASE": "IjEuMC4wLWRldi4xOTEi",
15
+ "SENTRY_RELEASE": "IjEuMC4wLWRldi4xOTMi",
16
16
  "BASE_PATH": "Ii8i",
17
17
  "BASE_HREF": "Ii4vIg==",
18
18
  "PH_CONNECT_APP_REQUIRES_HARD_REFRESH": "InRydWUi",
package/dist/vite-envs.sh CHANGED
@@ -11,7 +11,7 @@ replaceAll() {
11
11
  }'
12
12
  }
13
13
 
14
- html=$(echo "PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiPjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj48dGl0bGU+UG93ZXJob3VzZSBDb25uZWN0PC90aXRsZT48YmFzZSBocmVmPSIvIj48IS0tIHZpdGUtZW52cyBzY3JpcHQgcGxhY2Vob2xkZXIgeEtzUG1MczMwc3dLc2RJc1Z4IC0tPjwvaGVhZD48Ym9keT4lVklURV9JTVBPUlRfUkVBQ1RfU0NSSVBUJTxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj0iIiBzcmM9Ii9hc3NldHMvbWFpbi5DdWhLX3RlVy5qcyI+PC9zY3JpcHQ+PGRpdiBpZD0iYXBwIj48L2Rpdj48L2JvZHk+PC9odG1sPg==" | base64 -d)
14
+ html=$(echo "PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0iVVRGLTgiPjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj48dGl0bGU+UG93ZXJob3VzZSBDb25uZWN0PC90aXRsZT48YmFzZSBocmVmPSIvIj48IS0tIHZpdGUtZW52cyBzY3JpcHQgcGxhY2Vob2xkZXIgeEtzUG1MczMwc3dLc2RJc1Z4IC0tPjwvaGVhZD48Ym9keT4lVklURV9JTVBPUlRfUkVBQ1RfU0NSSVBUJTxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj0iIiBzcmM9Ii9hc3NldHMvbWFpbi5Ebl9nX1NTdy5qcyI+PC9zY3JpcHQ+PGRpdiBpZD0iYXBwIj48L2Rpdj48L2JvZHk+PC9odG1sPg==" | base64 -d)
15
15
 
16
16
  VITE_IMPORT_REACT_SCRIPT_base64="eEFwV2RSclg5OWtQclZnZ0UiIgo="
17
17
  VITE_IMPORT_REACT_SCRIPT=$(echo "Cg==" | base64 -d)
@@ -23,12 +23,12 @@ DEV_base64="eEFwV2RSclg5OWtQclZnZ0VmYWxzZQo="
23
23
  DEV=$(echo "ZmFsc2UK" | base64 -d)
24
24
  PROD_base64="eEFwV2RSclg5OWtQclZnZ0V0cnVlCg=="
25
25
  PROD=$(echo "dHJ1ZQo=" | base64 -d)
26
- APP_VERSION_base64="eEFwV2RSclg5OWtQclZnZ0UiMS4wLjAtZGV2LjE5MSIK"
27
- APP_VERSION=$(echo "MS4wLjAtZGV2LjE5MQo=" | base64 -d)
26
+ APP_VERSION_base64="eEFwV2RSclg5OWtQclZnZ0UiMS4wLjAtZGV2LjE5MyIK"
27
+ APP_VERSION=$(echo "MS4wLjAtZGV2LjE5Mwo=" | base64 -d)
28
28
  REQUIRES_HARD_REFRESH_base64="eEFwV2RSclg5OWtQclZnZ0V0cnVlCg=="
29
29
  REQUIRES_HARD_REFRESH=$(echo "dHJ1ZQo=" | base64 -d)
30
- SENTRY_RELEASE_base64="eEFwV2RSclg5OWtQclZnZ0UiMS4wLjAtZGV2LjE5MSIK"
31
- SENTRY_RELEASE=$(echo "MS4wLjAtZGV2LjE5MQo=" | base64 -d)
30
+ SENTRY_RELEASE_base64="eEFwV2RSclg5OWtQclZnZ0UiMS4wLjAtZGV2LjE5MyIK"
31
+ SENTRY_RELEASE=$(echo "MS4wLjAtZGV2LjE5Mwo=" | base64 -d)
32
32
  if printenv BASE_PATH &> /dev/null; then
33
33
  BASE_PATH_base64=$(printenv BASE_PATH | base64)
34
34
  else