diff --git a/package.json b/package.json
index 3bdb62e..f4e3239 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
"@types/react": "^18.0.28",
"@types/react-dom": "^18.0.11",
"debug": "^4.3.4",
+ "file-system-access": "^1.0.4",
"monaco-editor": "^0.36.1",
"primeflex": "^3.3.1",
"primeicons": "^6.0.1",
diff --git a/src/components/App.tsx b/src/components/App.tsx
index bfbe2b2..d5629c7 100644
--- a/src/components/App.tsx
+++ b/src/components/App.tsx
@@ -1,35 +1,37 @@
// Portions of this file are Copyright 2021 Google LLC, and licensed under GPL2+. See COPYING.
import React, { CSSProperties, useEffect, useState } from 'react';
-import {MultiLayoutComponentId, State, StatePersister} from '../state/app-state'
+import { MultiLayoutComponentId, State, StatePersister } from '../state/app-state'
import { Model } from '../state/model';
import EditorPanel from './EditorPanel';
import ViewerPanel from './ViewerPanel';
import Footer from './Footer';
-import { ModelContext, FSContext } from './contexts';
+import { ModelContext, FSContext, FileSystemContext } from './contexts';
import PanelSwitcher from './PanelSwitcher';
import { ConfirmDialog } from 'primereact/confirmdialog';
import CustomizerPanel from './CustomizerPanel';
+import { BaseFileSystem, DummyFileSystem, LocalStorage } from '../fs/base-filesystem';
// import "primereact/resources/themes/lara-light-indigo/theme.css";
// import "primereact/resources/primereact.min.css";
// import "primeicons/primeicons.css";
-export function App({initialState, statePersister, fs}: {initialState: State, statePersister: StatePersister, fs: FS}) {
+export function App({ initialState, statePersister, fs }: { initialState: State, statePersister: StatePersister, fs: FS }) {
const [state, setState] = useState(initialState);
-
- const model = new Model(fs, state, setState, statePersister);
+ const [fileSystem, setFileSystem] = useState(new LocalStorage() as BaseFileSystem);
+
+ const model = new Model(fs, fileSystem, state, setState, statePersister);
useEffect(() => model.init());
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === 'F5') {
event.preventDefault();
- model.render({isPreview: true, now: true})
+ model.render({ isPreview: true, now: true })
} else if (event.key === 'F6') {
event.preventDefault();
- model.render({isPreview: false, now: true})
+ model.render({ isPreview: false, now: true })
}
};
window.addEventListener('keydown', handleKeyDown);
@@ -63,7 +65,7 @@ export function App({initialState, statePersister, fs}: {initialState: State, st
const itemCount = (layout.editor ? 1 : 0) + (layout.viewer ? 1 : 0) + (layout.customizer ? 1 : 0)
return {
flex: 1,
- maxWidth: Math.floor(100/itemCount) + '%',
+ maxWidth: Math.floor(100 / itemCount) + '%',
display: (state.view.layout as any)[id] ? 'flex' : 'none'
}
} else {
@@ -74,37 +76,40 @@ export function App({initialState, statePersister, fs}: {initialState: State, st
}
}
+
return (
-
+
+
+
+
);
diff --git a/src/components/EditorPanel.tsx b/src/components/EditorPanel.tsx
index 62daeba..c131df7 100644
--- a/src/components/EditorPanel.tsx
+++ b/src/components/EditorPanel.tsx
@@ -10,8 +10,9 @@ import { MenuItem } from 'primereact/menuitem';
import { Menu } from 'primereact/menu';
import { buildUrlForStateParams } from '../state/fragment-state';
import { blankProjectState, defaultSourcePath } from '../state/initial-state';
-import { ModelContext, FSContext } from './contexts';
-import FilePicker, { } from './FilePicker';
+import { ModelContext, FSContext, FileSystemContext } from './contexts';
+import FilePicker, { } from './FilePicker';
+import { DummyFileSystem, LocalFileSystem } from '../fs/base-filesystem';
// const isMonacoSupported = false;
const isMonacoSupported = (() => {
@@ -25,11 +26,13 @@ if (isMonacoSupported) {
loader.init().then(mi => monacoInstance = mi);
}
-export default function EditorPanel({className, style}: {className?: string, style?: CSSProperties}) {
+export default function EditorPanel({ className, style }: { className?: string, style?: CSSProperties }) {
const model = useContext(ModelContext);
if (!model) throw new Error('No model');
+ const fileSystemState = useContext(FileSystemContext);
+
const menu = useRef