From ca796b9c95596f7b719bdd058f3f2712a41a445a Mon Sep 17 00:00:00 2001 From: Zef Hemel Date: Mon, 1 Aug 2022 15:06:32 +0200 Subject: [PATCH] Fixed a bunch of bugs around page navigation and renaming --- .../plugos-silverbullet-syscall/editor.ts | 8 ++++++-- packages/plugs/core/page.ts | 4 +++- packages/web/components/page_navigator.tsx | 8 +++++--- packages/web/editor.tsx | 4 ++-- packages/web/navigator.ts | 20 +++++++++++++------ packages/web/reducer.ts | 8 ++++++++ packages/web/syscalls/editor.ts | 9 +++++++-- 7 files changed, 45 insertions(+), 16 deletions(-) diff --git a/packages/plugos-silverbullet-syscall/editor.ts b/packages/plugos-silverbullet-syscall/editor.ts index d944ad2..1943893 100644 --- a/packages/plugos-silverbullet-syscall/editor.ts +++ b/packages/plugos-silverbullet-syscall/editor.ts @@ -29,8 +29,12 @@ export function save(): Promise { return syscall("editor.save"); } -export function navigate(name: string, pos?: number): Promise { - return syscall("editor.navigate", name, pos); +export function navigate( + name: string, + pos?: number, + replaceState = false +): Promise { + return syscall("editor.navigate", name, pos, replaceState); } export function reloadPage(): Promise { diff --git a/packages/plugs/core/page.ts b/packages/plugs/core/page.ts index 6b51bfc..335961d 100644 --- a/packages/plugs/core/page.ts +++ b/packages/plugs/core/page.ts @@ -12,6 +12,7 @@ import { set as storeSet } from "@plugos/plugos-syscall/store"; import { flashNotification, getCurrentPage, + getCursor, getText, matchBefore, navigate, @@ -107,6 +108,7 @@ export async function deletePage() { export async function renamePage() { const oldName = await getCurrentPage(); + const cursor = await getCursor(); console.log("Old name is", oldName); const newName = await prompt(`Rename ${oldName} to:`, oldName); if (!newName) { @@ -125,7 +127,7 @@ export async function renamePage() { console.log("Writing new page to space"); await writePage(newName, text); console.log("Navigating to new page"); - await navigate(newName); + await navigate(newName, cursor, true); console.log("Deleting page from space"); await deletePageSyscall(oldName); diff --git a/packages/web/components/page_navigator.tsx b/packages/web/components/page_navigator.tsx index 0b5191b..6614e56 100644 --- a/packages/web/components/page_navigator.tsx +++ b/packages/web/components/page_navigator.tsx @@ -12,15 +12,17 @@ export function PageNavigator({ }) { let options: FilterOption[] = []; for (let pageMeta of allPages) { - if (currentPage && currentPage === pageMeta.name) { - continue; - } // Order by last modified date in descending order let orderId = -pageMeta.lastModified; // Unless it was opened in this session if (pageMeta.lastOpened) { orderId = -pageMeta.lastOpened; } + // Or it's the currently open page + if (currentPage && currentPage === pageMeta.name) { + // ... then we put it all the way to the end + orderId = Infinity; + } options.push({ ...pageMeta, orderId: orderId, diff --git a/packages/web/editor.tsx b/packages/web/editor.tsx index 3312ebd..1a4d16d 100644 --- a/packages/web/editor.tsx +++ b/packages/web/editor.tsx @@ -557,8 +557,8 @@ export class Editor { this.editorView!.focus(); } - async navigate(name: string, pos?: number) { - await this.pageNavigator.navigate(name, pos); + async navigate(name: string, pos?: number, replaceState = false) { + await this.pageNavigator.navigate(name, pos, replaceState); } async loadPage(pageName: string) { diff --git a/packages/web/navigator.ts b/packages/web/navigator.ts index e7785b5..220150b 100644 --- a/packages/web/navigator.ts +++ b/packages/web/navigator.ts @@ -13,12 +13,20 @@ export class PathPageNavigator { constructor(readonly root: string = "") {} - async navigate(page: string, pos?: number) { - window.history.pushState( - { page, pos }, - page, - `${this.root}/${encodePageUrl(page)}` - ); + async navigate(page: string, pos?: number, replaceState = false) { + if (replaceState) { + window.history.replaceState( + { page, pos }, + page, + `${this.root}/${encodePageUrl(page)}` + ); + } else { + window.history.pushState( + { page, pos }, + page, + `${this.root}/${encodePageUrl(page)}` + ); + } window.dispatchEvent( new PopStateEvent("popstate", { state: { page, pos }, diff --git a/packages/web/reducer.ts b/packages/web/reducer.ts index 8182774..95b6c81 100644 --- a/packages/web/reducer.ts +++ b/packages/web/reducer.ts @@ -43,6 +43,14 @@ export default function reducer( showPageNavigator: false, }; case "pages-listed": + // Let's move over any "lastOpened" times to the "allPages" list + let oldPageMeta = new Map([...state.allPages].map((pm) => [pm.name, pm])); + for (let pageMeta of action.pages) { + let oldPageMetaItem = oldPageMeta.get(pageMeta.name); + if (oldPageMetaItem && oldPageMetaItem.lastOpened) { + pageMeta.lastOpened = oldPageMetaItem.lastOpened; + } + } return { ...state, allPages: action.pages, diff --git a/packages/web/syscalls/editor.ts b/packages/web/syscalls/editor.ts index 0008a10..5770807 100644 --- a/packages/web/syscalls/editor.ts +++ b/packages/web/syscalls/editor.ts @@ -43,8 +43,13 @@ export function editorSyscalls(editor: Editor): SysCallMapping { "editor.save": async () => { return editor.save(true); }, - "editor.navigate": async (ctx, name: string, pos: number) => { - await editor.navigate(name, pos); + "editor.navigate": async ( + ctx, + name: string, + pos: number, + replaceState = false + ) => { + await editor.navigate(name, pos, replaceState); }, "editor.reloadPage": async (ctx) => { await editor.reloadPage();