From 247944633f68ba474b64af9ccec148eb18f98b4d Mon Sep 17 00:00:00 2001 From: solvedDev Date: Mon, 15 Aug 2022 22:38:56 +0200 Subject: [PATCH] feat: support file references anywhere --- .../Editors/IframeTab/API/IframeApi.ts | 13 ++++++------- .../API/Requests/FileSystem/ReadFile.ts | 6 +++--- .../API/Requests/FileSystem/ReadTextFile.ts | 6 +++--- .../FileSystem/ResolveFileReference.ts | 18 ++++++++++++++++++ .../API/Requests/FileSystem/WriteFile.ts | 14 +++----------- 5 files changed, 33 insertions(+), 24 deletions(-) create mode 100644 src/components/Editors/IframeTab/API/Requests/FileSystem/ResolveFileReference.ts diff --git a/src/components/Editors/IframeTab/API/IframeApi.ts b/src/components/Editors/IframeTab/API/IframeApi.ts index 27163cd8c..3f5e36932 100644 --- a/src/components/Editors/IframeTab/API/IframeApi.ts +++ b/src/components/Editors/IframeTab/API/IframeApi.ts @@ -7,13 +7,11 @@ import { Signal } from '/@/components/Common/Event/Signal' import { IDisposable } from '/@/types/disposable' import { isNightly as isNightlyBuild } from '/@/utils/app/isNightly' import { version as appVersion } from '/@/utils/app/version' -import { - openedFileReferenceName, - WriteFileRequest, -} from './Requests/FileSystem/WriteFile' +import { WriteFileRequest } from './Requests/FileSystem/WriteFile' import { ReadTextFileRequest } from './Requests/FileSystem/ReadTextFile' import { IframeTab } from '../IframeTab' import { OpenFileEvent } from './Events/Tab/OpenFile' +import { openedFileReferenceName } from './Requests/FileSystem/ResolveFileReference' export class IframeApi { didSetup = false @@ -45,15 +43,16 @@ export class IframeApi { }) } + get app() { + return this.tab.project.app + } + get openWithPayload() { const payload = this.tab.getOptions().openWithPayload ?? {} return { filePath: payload.filePath, fileReference: openedFileReferenceName, - data: this.openedFileHandle - ?.getFile() - ?.then((file) => file.arrayBuffer()), isReadOnly: payload.isReadOnly ?? false, } } diff --git a/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadFile.ts b/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadFile.ts index b3b157261..f13750c2e 100644 --- a/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadFile.ts +++ b/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadFile.ts @@ -1,6 +1,6 @@ import { IframeApi } from '../../IframeApi' import { GenericRequest } from '../GenericRequest' -import { App } from '/@/App' +import { resolveFileReference } from './ResolveFileReference' export class ReadFileRequest extends GenericRequest { constructor(api: IframeApi) { @@ -8,8 +8,8 @@ export class ReadFileRequest extends GenericRequest { } async handle(filePath: string, origin: string): Promise { - const app = await App.getApp() - const file = await app.fileSystem.readFile(filePath) + const fileHandle = await resolveFileReference(filePath, this.api) + const file = await fileHandle.getFile() return new Uint8Array(await file.arrayBuffer()) } diff --git a/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadTextFile.ts b/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadTextFile.ts index 00a1eb967..dbb412c82 100644 --- a/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadTextFile.ts +++ b/src/components/Editors/IframeTab/API/Requests/FileSystem/ReadTextFile.ts @@ -1,6 +1,6 @@ import { IframeApi } from '../../IframeApi' import { GenericRequest } from '../GenericRequest' -import { App } from '/@/App' +import { resolveFileReference } from './ResolveFileReference' export class ReadTextFileRequest extends GenericRequest { constructor(api: IframeApi) { @@ -8,8 +8,8 @@ export class ReadTextFileRequest extends GenericRequest { } async handle(filePath: string, origin: string): Promise { - const app = await App.getApp() - const file = await app.fileSystem.readFile(filePath) + const fileHandle = await resolveFileReference(filePath, this.api) + const file = await fileHandle.getFile() return await file.text() } diff --git a/src/components/Editors/IframeTab/API/Requests/FileSystem/ResolveFileReference.ts b/src/components/Editors/IframeTab/API/Requests/FileSystem/ResolveFileReference.ts new file mode 100644 index 000000000..00724f803 --- /dev/null +++ b/src/components/Editors/IframeTab/API/Requests/FileSystem/ResolveFileReference.ts @@ -0,0 +1,18 @@ +import { IframeApi } from '../../IframeApi' + +export const openedFileReferenceName = '~bridge://OPENED-FILE' + +export async function resolveFileReference( + fileReference: string, + api: IframeApi +) { + if (fileReference === openedFileReferenceName) { + const fileHandle = api.openedFileHandle + + if (!fileHandle) throw new Error(`No opened file to write to!`) + + return fileHandle + } + + return await api.app.fileSystem.getFileHandle(fileReference) +} diff --git a/src/components/Editors/IframeTab/API/Requests/FileSystem/WriteFile.ts b/src/components/Editors/IframeTab/API/Requests/FileSystem/WriteFile.ts index 182f19ab4..43a5262e1 100644 --- a/src/components/Editors/IframeTab/API/Requests/FileSystem/WriteFile.ts +++ b/src/components/Editors/IframeTab/API/Requests/FileSystem/WriteFile.ts @@ -1,5 +1,6 @@ import { IframeApi } from '../../IframeApi' import { GenericRequest } from '../GenericRequest' +import { resolveFileReference } from './ResolveFileReference' import { App } from '/@/App' export interface IWriteFilePayload { @@ -7,8 +8,6 @@ export interface IWriteFilePayload { data: Uint8Array | string } -export const openedFileReferenceName = '~bridge://OPENED-FILE' - export class WriteFileRequest extends GenericRequest { constructor(api: IframeApi) { super('fs.writeFile', api) @@ -20,15 +19,8 @@ export class WriteFileRequest extends GenericRequest { ): Promise { const app = await App.getApp() - if (filePath === openedFileReferenceName) { - const fileHandle = this.api.openedFileHandle - - if (!fileHandle) throw new Error(`No opened file to write to!`) - await app.fileSystem.write(fileHandle, data) - - return - } + const fileHandle = await resolveFileReference(filePath, this.api) - await app.fileSystem.writeFile(filePath, data) + await app.fileSystem.write(fileHandle, data) } }