Skip to content

Commit

Permalink
feat: support file references anywhere
Browse files Browse the repository at this point in the history
  • Loading branch information
solvedDev committed Aug 15, 2022
1 parent 2ed861d commit 2479446
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 24 deletions.
13 changes: 6 additions & 7 deletions src/components/Editors/IframeTab/API/IframeApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { IframeApi } from '../../IframeApi'
import { GenericRequest } from '../GenericRequest'
import { App } from '/@/App'
import { resolveFileReference } from './ResolveFileReference'

export class ReadFileRequest extends GenericRequest<string, Uint8Array> {
constructor(api: IframeApi) {
super('fs.readFile', api)
}

async handle(filePath: string, origin: string): Promise<Uint8Array> {
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())
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { IframeApi } from '../../IframeApi'
import { GenericRequest } from '../GenericRequest'
import { App } from '/@/App'
import { resolveFileReference } from './ResolveFileReference'

export class ReadTextFileRequest extends GenericRequest<string, string> {
constructor(api: IframeApi) {
super('fs.readTextFile', api)
}

async handle(filePath: string, origin: string): Promise<string> {
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()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import { IframeApi } from '../../IframeApi'
import { GenericRequest } from '../GenericRequest'
import { resolveFileReference } from './ResolveFileReference'
import { App } from '/@/App'

export interface IWriteFilePayload {
filePath: string
data: Uint8Array | string
}

export const openedFileReferenceName = '~bridge://OPENED-FILE'

export class WriteFileRequest extends GenericRequest<IWriteFilePayload, void> {
constructor(api: IframeApi) {
super('fs.writeFile', api)
Expand All @@ -20,15 +19,8 @@ export class WriteFileRequest extends GenericRequest<IWriteFilePayload, void> {
): Promise<void> {
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)
}
}

0 comments on commit 2479446

Please sign in to comment.