diff --git a/app/src/mobile/menu/getRecentDocs.ts b/app/src/mobile/menu/getRecentDocs.ts
new file mode 100644
index 000000000..33a6a9d42
--- /dev/null
+++ b/app/src/mobile/menu/getRecentDocs.ts
@@ -0,0 +1,32 @@
+import {fetchPost} from "../../util/fetch";
+import {unicode2Emoji} from "../../emoji";
+import {Constants} from "../../constants";
+import {escapeHtml} from "../../util/escape";
+import {hasClosestByClassName} from "../../protyle/util/hasClosest";
+import {openModel} from "./model";
+import {openMobileFileById} from "../editor";
+
+export const getRecentDocs = () => {
+ fetchPost("/api/storage/getRecentDocs", {}, (response) => {
+ let html = "";
+ response.data.forEach((item: any, index: number) => {
+ html += `
+${unicode2Emoji(item.icon || Constants.SIYUAN_IMAGE_FILE, false, "b3-list-item__graphic", true)}
+${escapeHtml(item.title)}
+`;
+ });
+ openModel({
+ title: window.siyuan.languages.recentDocs,
+ icon: "iconList",
+ html: ``,
+ bindEvent(element: HTMLElement) {
+ element.addEventListener("click", (event) => {
+ const liElement = hasClosestByClassName(event.target as HTMLElement, "b3-list-item");
+ if (liElement) {
+ openMobileFileById(liElement.dataset.nodeId, [Constants.CB_GET_SCROLL])
+ }
+ });
+ }
+ })
+ });
+}
diff --git a/app/src/mobile/util/menu.ts b/app/src/mobile/menu/index.ts
similarity index 94%
rename from app/src/mobile/util/menu.ts
rename to app/src/mobile/menu/index.ts
index c6aae01df..491327961 100644
--- a/app/src/mobile/util/menu.ts
+++ b/app/src/mobile/menu/index.ts
@@ -1,18 +1,19 @@
import {popSearch} from "./search";
import {initAppearance} from "../settings/appearance";
-import {closePanel} from "./closePanel";
+import {closePanel} from "../util/closePanel";
import {mountHelp, newDailyNote, newNotebook} from "../../util/mount";
import {repos} from "../../config/repos";
import {exitSiYuan, lockScreen, processSync} from "../../dialog/processSystem";
import {openHistory} from "../../history/history";
import {syncGuide} from "../../sync/syncGuide";
import {openCard} from "../../card/openCard";
-import {activeBlur, hideKeyboardToolbar} from "./keyboardToolbar";
+import {activeBlur, hideKeyboardToolbar} from "../util/keyboardToolbar";
import {initAI} from "../settings/ai";
import {initRiffCard} from "../settings/riffCard";
import {login, showAccountInfo} from "../settings/account";
import {openModel} from "./model";
import {initAbout} from "../settings/about";
+import {getRecentDocs} from "./getRecentDocs";
export const popMenu = () => {
activeBlur();
@@ -39,6 +40,9 @@ export const popMenu = () => {
${accountHTML}
+
@@ -104,6 +108,11 @@ ${accountHTML}
event.preventDefault();
event.stopPropagation();
break;
+ } else if (target.id === "menuRecent") {
+ getRecentDocs();
+ event.preventDefault();
+ event.stopPropagation();
+ break;
} else if (target.id === "menuAppearance") {
initAppearance();
event.preventDefault();
diff --git a/app/src/mobile/util/model.ts b/app/src/mobile/menu/model.ts
similarity index 100%
rename from app/src/mobile/util/model.ts
rename to app/src/mobile/menu/model.ts
diff --git a/app/src/mobile/util/search.ts b/app/src/mobile/menu/search.ts
similarity index 98%
rename from app/src/mobile/util/search.ts
rename to app/src/mobile/menu/search.ts
index 1ebd06d5a..c7fca3acf 100644
--- a/app/src/mobile/util/search.ts
+++ b/app/src/mobile/menu/search.ts
@@ -1,4 +1,4 @@
-import {closePanel} from "./closePanel";
+import {closePanel} from "../util/closePanel";
import {openMobileFileById} from "../editor";
import {Constants} from "../../constants";
import {fetchPost} from "../../util/fetch";
diff --git a/app/src/mobile/settings/about.ts b/app/src/mobile/settings/about.ts
index 57ae45437..d9460126c 100644
--- a/app/src/mobile/settings/about.ts
+++ b/app/src/mobile/settings/about.ts
@@ -7,7 +7,7 @@ import {showMessage} from "../../dialog/message";
import {openByMobile, writeText} from "../../protyle/util/compatibility";
import {exitSiYuan, processSync} from "../../dialog/processSystem";
import {pathPosix} from "../../util/pathName";
-import {openModel} from "../util/model";
+import {openModel} from "../menu/model";
export const initAbout = () => {
if (!window.siyuan.config.localIPs || window.siyuan.config.localIPs.length === 0 ||
diff --git a/app/src/mobile/settings/account.ts b/app/src/mobile/settings/account.ts
index e0c477375..7781f5ca9 100644
--- a/app/src/mobile/settings/account.ts
+++ b/app/src/mobile/settings/account.ts
@@ -1,4 +1,4 @@
-import {openModel} from "../util/model";
+import {openModel} from "../menu/model";
import {getEventName} from "../../protyle/util/compatibility";
import {fetchPost} from "../../util/fetch";
import {closePanel} from "../util/closePanel";
diff --git a/app/src/mobile/settings/ai.ts b/app/src/mobile/settings/ai.ts
index 7037b045d..9b9cebe80 100644
--- a/app/src/mobile/settings/ai.ts
+++ b/app/src/mobile/settings/ai.ts
@@ -1,4 +1,4 @@
-import {openModel} from "../util/model";
+import {openModel} from "../menu/model";
import {ai} from "../../config/ai";
export const initAI = () => {
diff --git a/app/src/mobile/settings/appearance.ts b/app/src/mobile/settings/appearance.ts
index acded9881..13059270a 100644
--- a/app/src/mobile/settings/appearance.ts
+++ b/app/src/mobile/settings/appearance.ts
@@ -2,7 +2,7 @@ import {fetchPost} from "../../util/fetch";
import {setInlineStyle} from "../../util/assets";
import {genOptions} from "../../util/genOptions";
import {reloadProtyle} from "../../protyle/util/reload";
-import {openModel} from "../util/model";
+import {openModel} from "../menu/model";
export const initAppearance = () => {
openModel({
diff --git a/app/src/mobile/settings/riffCard.ts b/app/src/mobile/settings/riffCard.ts
index 13679101e..6f325a5cb 100644
--- a/app/src/mobile/settings/riffCard.ts
+++ b/app/src/mobile/settings/riffCard.ts
@@ -1,4 +1,4 @@
-import {openModel} from "../util/model";
+import {openModel} from "../menu/model";
import {flashcard} from "../../config/flashcard";
export const initRiffCard = () => {
diff --git a/app/src/mobile/util/MobileTags.ts b/app/src/mobile/util/MobileTags.ts
index 355109844..3201e91dd 100644
--- a/app/src/mobile/util/MobileTags.ts
+++ b/app/src/mobile/util/MobileTags.ts
@@ -5,7 +5,7 @@ import {MenuItem} from "../../menus/Menu";
import {Dialog} from "../../dialog";
import {confirmDialog} from "../../dialog/confirmDialog";
import {escapeHtml} from "../../util/escape";
-import {popSearch, toolbarSearchEvent} from "./search";
+import {popSearch, toolbarSearchEvent} from "../menu/search";
export class MobileTags {
public element: HTMLElement;
diff --git a/app/src/mobile/util/initFramework.ts b/app/src/mobile/util/initFramework.ts
index 7fa2d3721..a786f1a60 100644
--- a/app/src/mobile/util/initFramework.ts
+++ b/app/src/mobile/util/initFramework.ts
@@ -8,7 +8,7 @@ import {setInlineStyle} from "../../util/assets";
import {renderSnippet} from "../../config/util/snippets";
import {setEmpty} from "./setEmpty";
import {getOpenNotebookCount} from "../../util/pathName";
-import {popMenu} from "./menu";
+import {popMenu} from "../menu";
import {MobileFiles} from "./MobileFiles";
import {MobileOutline} from "./MobileOutline";
import {hasTopClosestByTag} from "../../protyle/util/hasClosest";