mirror of
https://github.com/leporello-js/leporello-js
synced 2026-01-13 13:04:30 -08:00
do not lose setting on file access revoked
This commit is contained in:
43
src/cmd.js
43
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},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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`,
|
||||
),
|
||||
|
||||
37
src/index.js
37
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
|
||||
|
||||
Reference in New Issue
Block a user