diff --git a/Changelog.md b/Changelog.md index 462e8d608..1bbe5e984 100644 --- a/Changelog.md +++ b/Changelog.md @@ -39,6 +39,7 @@ - 日志页面支持按时间倒序 - 增加「重新激活订阅」的全局快捷键 - WebView2 Runtime 修复构建升级到 133.0.3065.92 +- 侧边栏右键新增「恢复默认排序」 diff --git a/src/locales/ar/layout.json b/src/locales/ar/layout.json index fba5415b1..03187e6dd 100644 --- a/src/locales/ar/layout.json +++ b/src/locales/ar/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/de/layout.json b/src/locales/de/layout.json index b3026730c..c9971651b 100644 --- a/src/locales/de/layout.json +++ b/src/locales/de/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/en/layout.json b/src/locales/en/layout.json index 7fafd7526..5bf8c8402 100644 --- a/src/locales/en/layout.json +++ b/src/locales/en/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/es/layout.json b/src/locales/es/layout.json index 217d6d706..f2e6849df 100644 --- a/src/locales/es/layout.json +++ b/src/locales/es/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/fa/layout.json b/src/locales/fa/layout.json index 5a7239845..26731f4bd 100644 --- a/src/locales/fa/layout.json +++ b/src/locales/fa/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/id/layout.json b/src/locales/id/layout.json index 8840853ca..0da0c35c2 100644 --- a/src/locales/id/layout.json +++ b/src/locales/id/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/jp/layout.json b/src/locales/jp/layout.json index 8e8a87981..100538d94 100644 --- a/src/locales/jp/layout.json +++ b/src/locales/jp/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/ko/layout.json b/src/locales/ko/layout.json index ffc3ccb27..10e9f628b 100644 --- a/src/locales/ko/layout.json +++ b/src/locales/ko/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "메뉴 재정렬 모드", + "restoreDefaultOrder": "Restore default order", "unlock": "메뉴 순서 잠금 해제", "lock": "메뉴 순서 잠금" } diff --git a/src/locales/ru/layout.json b/src/locales/ru/layout.json index ed99badae..2b59d36e4 100644 --- a/src/locales/ru/layout.json +++ b/src/locales/ru/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/tr/layout.json b/src/locales/tr/layout.json index 839bc6e83..23f2da7bd 100644 --- a/src/locales/tr/layout.json +++ b/src/locales/tr/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/tt/layout.json b/src/locales/tt/layout.json index 140644bb8..474dc3eb2 100644 --- a/src/locales/tt/layout.json +++ b/src/locales/tt/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "Menu reorder mode", + "restoreDefaultOrder": "Restore default order", "unlock": "Unlock menu order", "lock": "Lock menu order" } diff --git a/src/locales/zh/layout.json b/src/locales/zh/layout.json index 4ecfb4c4f..0a2b2cbc8 100644 --- a/src/locales/zh/layout.json +++ b/src/locales/zh/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "菜单排序模式", + "restoreDefaultOrder": "恢复默认排序", "unlock": "解锁菜单排序", "lock": "锁定菜单排序" } diff --git a/src/locales/zhtw/layout.json b/src/locales/zhtw/layout.json index 820056d0e..635992f63 100644 --- a/src/locales/zhtw/layout.json +++ b/src/locales/zhtw/layout.json @@ -13,6 +13,7 @@ }, "menu": { "reorderMode": "選單排序模式", + "restoreDefaultOrder": "恢復預設排序", "unlock": "解鎖選單排序", "lock": "鎖定選單排序" } diff --git a/src/pages/_layout.tsx b/src/pages/_layout.tsx index 1184f72f3..a5ea23ccd 100644 --- a/src/pages/_layout.tsx +++ b/src/pages/_layout.tsx @@ -154,7 +154,13 @@ const Layout = () => { [patchVerge], ); - const { menuOrder, navItemMap, handleMenuDragEnd } = useNavMenuOrder({ + const { + menuOrder, + navItemMap, + handleMenuDragEnd, + isDefaultOrder, + resetMenuOrder, + } = useNavMenuOrder({ enabled: menuUnlocked, items: navItems, storedOrder: verge?.menu_order, @@ -175,6 +181,11 @@ const Layout = () => { setMenuContextPosition(null); }, []); + const handleResetMenuOrder = useCallback(() => { + setMenuContextPosition(null); + void resetMenuOrder(); + }, [resetMenuOrder]); + const handleUnlockMenu = useCallback(() => { setMenuUnlocked(true); setMenuContextPosition(null); @@ -427,6 +438,13 @@ const Layout = () => { ? t("layout.components.navigation.menu.lock") : t("layout.components.navigation.menu.unlock")} + + {t("layout.components.navigation.menu.restoreDefaultOrder")} +
diff --git a/src/pages/_layout/hooks/use-nav-menu-order.ts b/src/pages/_layout/hooks/use-nav-menu-order.ts index 40b84a277..cac00ca43 100644 --- a/src/pages/_layout/hooks/use-nav-menu-order.ts +++ b/src/pages/_layout/hooks/use-nav-menu-order.ts @@ -82,6 +82,11 @@ export const useNavMenuOrder = ({ dispatchMenuOrder({ type: "sync", payload: configMenuOrder }); }, [configMenuOrder]); + const isDefaultOrder = useMemo( + () => areOrdersEqual(menuOrder, defaultOrder), + [menuOrder, defaultOrder], + ); + const handleMenuDragEnd = useCallback( async (event: DragEndEvent) => { if (!enabled) { @@ -120,9 +125,31 @@ export const useNavMenuOrder = ({ [enabled, menuOrder, onOptimisticUpdate, onPersist], ); + const resetMenuOrder = useCallback(async () => { + if (isDefaultOrder) { + return; + } + + const previousOrder = [...menuOrder]; + const nextOrder = [...defaultOrder]; + + dispatchMenuOrder({ type: "sync", payload: nextOrder }); + onOptimisticUpdate?.(nextOrder); + + try { + await onPersist(nextOrder); + } catch (error) { + console.error("Failed to reset menu order:", error); + dispatchMenuOrder({ type: "sync", payload: previousOrder }); + onOptimisticUpdate?.(previousOrder); + } + }, [defaultOrder, isDefaultOrder, menuOrder, onOptimisticUpdate, onPersist]); + return { menuOrder, navItemMap, handleMenuDragEnd, + isDefaultOrder, + resetMenuOrder, }; }; diff --git a/src/types/generated/i18n-keys.ts b/src/types/generated/i18n-keys.ts index 822e7dd5b..4d0fdad7f 100644 --- a/src/types/generated/i18n-keys.ts +++ b/src/types/generated/i18n-keys.ts @@ -105,6 +105,7 @@ export const translationKeys = [ "layout.components.navigation.tabs.unlock", "layout.components.navigation.tabs.settings", "layout.components.navigation.menu.reorderMode", + "layout.components.navigation.menu.restoreDefaultOrder", "layout.components.navigation.menu.unlock", "layout.components.navigation.menu.lock", "logs.page.title", diff --git a/src/types/generated/i18n-resources.ts b/src/types/generated/i18n-resources.ts index 5f079697b..2700b138c 100644 --- a/src/types/generated/i18n-resources.ts +++ b/src/types/generated/i18n-resources.ts @@ -181,6 +181,7 @@ export interface TranslationResources { menu: { lock: string; reorderMode: string; + restoreDefaultOrder: string; unlock: string; }; tabs: {