mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-03 23:18:11 +08:00
Fix frontend HMR so the page doesn't break upon saving TS files and restructure frontend architecture (#3871)
* Clean up component setup/tear-down side effects * Clean up more component setup/tear-down side effects * Remove nonfunctional debouncer * Clean up even more component setup/tear-down side effects * Reuse backend state * Fix HMR for IO Managers and for State Providers * Rename IO Managers -> Managers and State Providers -> Stores * Restructure and partially flatten managers/stores * Code review fixes * Review fixes
This commit is contained in:
@@ -47,6 +47,8 @@
|
||||
let reactiveEntries = entries;
|
||||
let highlighted: MenuListEntry | undefined = activeEntry;
|
||||
let virtualScrollingEntriesStart = 0;
|
||||
let keydownListenerAdded = false;
|
||||
let destroyed = false;
|
||||
|
||||
// `watchOpen` is called only when `open` is changed from outside this component
|
||||
$: watchOpen(open);
|
||||
@@ -67,11 +69,15 @@
|
||||
// TODO: The current approach is hacky and blocks the allowances for shortcuts like the key to open the browser's dev tools.
|
||||
onMount(async () => {
|
||||
await tick();
|
||||
if (open && !inNestedMenuList()) addEventListener("keydown", keydown);
|
||||
if (!destroyed && open && !inNestedMenuList() && !keydownListenerAdded) {
|
||||
addEventListener("keydown", keydown);
|
||||
keydownListenerAdded = true;
|
||||
}
|
||||
});
|
||||
onDestroy(async () => {
|
||||
await tick();
|
||||
if (!inNestedMenuList()) removeEventListener("keydown", keydown);
|
||||
onDestroy(() => {
|
||||
removeEventListener("keydown", keydown);
|
||||
// Set the destroyed status in the closure kept by the awaited `tick()` in `onMount` in case that delayed run occurs after the component is destroyed
|
||||
destroyed = true;
|
||||
});
|
||||
|
||||
function inNestedMenuList(): boolean {
|
||||
@@ -129,8 +135,13 @@
|
||||
}
|
||||
|
||||
function watchOpen(open: boolean) {
|
||||
if (open && !inNestedMenuList()) addEventListener("keydown", keydown);
|
||||
else if (!inNestedMenuList()) removeEventListener("keydown", keydown);
|
||||
if (open && !inNestedMenuList() && !keydownListenerAdded) {
|
||||
addEventListener("keydown", keydown);
|
||||
keydownListenerAdded = true;
|
||||
} else if (!open && !inNestedMenuList() && keydownListenerAdded) {
|
||||
removeEventListener("keydown", keydown);
|
||||
keydownListenerAdded = false;
|
||||
}
|
||||
|
||||
highlighted = activeEntry;
|
||||
dispatch("open", open);
|
||||
|
||||
Reference in New Issue
Block a user