From 1a93e5c493d56d6b14e0222c3509da327c4adb5f Mon Sep 17 00:00:00 2001 From: Dmitry Vasilev Date: Thu, 22 Jun 2023 15:56:14 +0300 Subject: [PATCH] do not lose setting on file access revoked --- src/cmd.js | 43 +++++++++++++++++++++++++--------------- src/editor/files.js | 13 ++---------- src/index.js | 37 +++++++++++++++++++++++----------- test/self_hosted_test.js | 3 ++- test/utils.js | 11 ++++++---- 5 files changed, 63 insertions(+), 44 deletions(-) diff --git a/src/cmd.js b/src/cmd.js index 31c4ab0..c3659e8 100644 --- a/src/cmd.js +++ b/src/cmd.js @@ -824,10 +824,31 @@ const do_load_dir = (state, dir) => { } } -const load_dir = (state, dir) => { +const apply_entrypoint_settings = (state, entrypoint_settings) => { + const blank_if_not_exists = key => + state.files[entrypoint_settings[key]] == null + ? '' + : entrypoint_settings[key] + + const entrypoint = blank_if_not_exists('entrypoint') + const current_module = blank_if_not_exists('current_module') + const html_file = blank_if_not_exists('html_file') + + return { + ...state, + entrypoint, + current_module, + html_file, + } +} + +const load_dir = (state, dir, entrypoint_settings) => { // Clear parse cache and rerun code return run_code({ - ...do_load_dir(state, dir), + ...apply_entrypoint_settings( + do_load_dir(state, dir), + entrypoint_settings, + ), // remove cache. We have to clear cache because imports of modules that are // not available because project_dir is not available have errors and the // errors are cached @@ -851,26 +872,16 @@ const open_run_window = (state, globals) => { }) } -const get_initial_state = state => { +const get_initial_state = (state, entrypoint_settings) => { const with_files = state.project_dir == null ? state : do_load_dir(state, state.project_dir) - const blank_if_not_exists = key => - with_files.files[with_files[key]] == null - ? '' - : with_files[key] - - const entrypoint = blank_if_not_exists('entrypoint') - const current_module = blank_if_not_exists('current_module') - const html_file = blank_if_not_exists('html_file') + const with_settings = apply_entrypoint_settings(with_files, entrypoint_settings) return { - ...with_files, - entrypoint, - current_module, - html_file, - cursor_position_by_file: {[current_module]: 0}, + ...with_settings, + cursor_position_by_file: {[with_settings.current_module]: 0}, } } diff --git a/src/editor/files.js b/src/editor/files.js index d7f6ae0..776fe39 100644 --- a/src/editor/files.js +++ b/src/editor/files.js @@ -1,7 +1,7 @@ import {el} from './domutils.js' import {map_find} from '../utils.js' import {load_dir, create_file} from '../filesystem.js' -import {exec, get_state} from '../index.js' +import {exec, get_state, open_directory} from '../index.js' export class Files { constructor(ui) { @@ -10,15 +10,6 @@ export class Files { this.render(get_state()) } - open_directory() { - if(globalThis.showDirectoryPicker == null) { - throw new Error('Your browser is not supporting File System Access API') - } - load_dir(true).then(dir => { - exec('load_dir', dir) - }) - } - render(state) { if(state.project_dir == null) { this.el.innerHTML = '' @@ -26,7 +17,7 @@ export class Files { el('div', 'allow_file_access', el('a', { href: 'javascript:void(0)', - click: this.open_directory.bind(this), + click: open_directory, }, `Allow access to local project folder`, ), diff --git a/src/index.js b/src/index.js index 44089da..72cef82 100644 --- a/src/index.js +++ b/src/index.js @@ -126,28 +126,37 @@ export const reload_run_window = state => { const read_modules = async () => { const default_module = {'': localStorage.code || EXAMPLE} - const current = { - // TODO fix when there are no such modules anymore - current_module: localStorage.current_module ?? '', - entrypoint: localStorage.entrypoint ?? '', - html_file: localStorage.html_file ?? '', - } const project_dir = await load_dir(false) if(project_dir == null) { // Single anonymous module return { - ...current, files: default_module, } } else { return { - ...current, project_dir, files: default_module, } } } +const get_entrypoint_settings = () => ({ + current_module: localStorage.current_module ?? '', + entrypoint: localStorage.entrypoint ?? '', + html_file: localStorage.html_file ?? '', +}) + + +export const open_directory = () => { + if(globalThis.showDirectoryPicker == null) { + throw new Error('Your browser is not supporting File System Access API') + } + load_dir(true).then(dir => { + exec('load_dir', dir, get_entrypoint_settings()) + }) +} + + let COMMANDS let ui let state @@ -159,10 +168,14 @@ export const init = (container, _COMMANDS) => { read_modules().then(initial_state => { - state = COMMANDS.get_initial_state({ - ...initial_state, - on_deferred_call: (...args) => exec('on_deferred_call', ...args) - }) + state = COMMANDS.get_initial_state( + { + ...initial_state, + on_deferred_call: (...args) => exec('on_deferred_call', ...args) + }, + + get_entrypoint_settings(), + ) // Expose state for debugging globalThis.__state = state diff --git a/test/self_hosted_test.js b/test/self_hosted_test.js index c46e546..19aca18 100644 --- a/test/self_hosted_test.js +++ b/test/self_hosted_test.js @@ -69,7 +69,8 @@ console.time('run') const i = test_initial_state( {}, // files - {project_dir: dir, entrypoint: 'test/run.js'} + {entrypoint: 'test/run.js'}, + {project_dir: dir} ) assert_equal(i.loading_external_imports_state != null, true) diff --git a/test/utils.js b/test/utils.js index 94f1a62..6e49e01 100644 --- a/test/utils.js +++ b/test/utils.js @@ -98,15 +98,18 @@ export const assert_code_error_async = async (codestring, error) => { assert_equal(result.error, error) } -export const test_initial_state = (code, state) => { +export const test_initial_state = (code, entrypoint_settings, other) => { return COMMANDS.open_run_window( COMMANDS.get_initial_state( { files: typeof(code) == 'object' ? code : { '' : code}, + ...other + }, + { entrypoint: '', current_module: '', - ...state, - }, + ...entrypoint_settings, + } ), new Set(Object.getOwnPropertyNames(globalThis.run_window)) ) @@ -150,7 +153,7 @@ export const test_deferred_calls_state = code => { } `))() - const state = test_initial_state(code, { on_deferred_call }) + const state = test_initial_state(code, null, { on_deferred_call }) return { state,