diff --git a/icons/mgc/line_cute_re.svg b/icons/mgc/line_cute_re.svg
new file mode 100644
index 000000000..1878e76c1
--- /dev/null
+++ b/icons/mgc/line_cute_re.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/renderer/src/lib/route-builder.test.ts b/src/renderer/src/lib/route-builder.test.ts
index b3c61a373..875c4129a 100644
--- a/src/renderer/src/lib/route-builder.test.ts
+++ b/src/renderer/src/lib/route-builder.test.ts
@@ -10,8 +10,8 @@ describe("test route builder", () => {
"./pages/(external)/layout.tsx": fakePromise,
"./pages/(external)/(with-layout)/index.tsx": fakePromise,
"./pages/(external)/(with-layout)/layout.tsx": fakePromise,
- "./pages/(external)/(with-layout)/feed/[:id]/index.tsx": fakePromise,
- "./pages/(external)/(with-layout)/feed/[:id]/layout.tsx": fakePromise,
+ "./pages/(external)/(with-layout)/feed/[id]/index.tsx": fakePromise,
+ "./pages/(external)/(with-layout)/feed/[id]/layout.tsx": fakePromise,
"./pages/(main)/layout.tsx": fakePromise,
"./pages/(main)/(context)/layout.tsx": fakePromise,
diff --git a/src/renderer/src/lib/route-builder.ts b/src/renderer/src/lib/route-builder.ts
index 659893e14..4595f3677 100644
--- a/src/renderer/src/lib/route-builder.ts
+++ b/src/renderer/src/lib/route-builder.ts
@@ -189,7 +189,7 @@ const normalizePathKey = (key: string) => {
return ""
}
- if (key.startsWith("[:") && key.endsWith("]")) {
+ if (key.startsWith("[") && key.endsWith("]")) {
return `:${key.slice(2, -1)}`
}
return key
diff --git a/src/renderer/src/modules/feed-column/item.tsx b/src/renderer/src/modules/feed-column/item.tsx
index 5e1392473..04bb8de5c 100644
--- a/src/renderer/src/modules/feed-column/item.tsx
+++ b/src/renderer/src/modules/feed-column/item.tsx
@@ -21,6 +21,7 @@ import {
useUnreadStore,
} from "@renderer/store"
import { useMutation } from "@tanstack/react-query"
+import { useNavigate } from "react-router-dom"
import { toast } from "sonner"
import { FeedForm } from "../discover/feed-form"
@@ -97,6 +98,7 @@ export function FeedItem({
const feedUnread = useUnreadStore((state) => state.data[feed.feedId] || 0)
const { present } = useModalStack()
+ const navigate = useNavigate()
return (
{
e.stopPropagation()
setFeedActive(feed)
+ navigate(`/feeds/${feed.feedId}`)
}}
onDoubleClick={() => {
window.open(
diff --git a/src/renderer/src/pages/(external)/(with-layout)/feed/[:id]/index.tsx b/src/renderer/src/pages/(external)/(with-layout)/feed/[id]/index.tsx
similarity index 100%
rename from src/renderer/src/pages/(external)/(with-layout)/feed/[:id]/index.tsx
rename to src/renderer/src/pages/(external)/(with-layout)/feed/[id]/index.tsx
diff --git a/src/renderer/src/pages/(external)/(with-layout)/feed/[:id]/layout.tsx b/src/renderer/src/pages/(external)/(with-layout)/feed/[id]/layout.tsx
similarity index 100%
rename from src/renderer/src/pages/(external)/(with-layout)/feed/[:id]/layout.tsx
rename to src/renderer/src/pages/(external)/(with-layout)/feed/[id]/layout.tsx
diff --git a/src/renderer/src/pages/(main)/(context)/layout.tsx b/src/renderer/src/pages/(main)/(context)/layout.tsx
deleted file mode 100644
index 0341d292e..000000000
--- a/src/renderer/src/pages/(main)/(context)/layout.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { setMainContainerElement } from "@renderer/atoms"
-import { FeedColumn } from "@renderer/modules/feed-column"
-import { Outlet } from "react-router-dom"
-
-export function Component() {
- return (
-
-
-
-
- {/* NOTE: tabIndex for main element can get by `document.activeElement` */}
-
-
-
-
- )
-}
diff --git a/src/renderer/src/pages/(main)/(context)/(nonhome)/discover/index.tsx b/src/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx
similarity index 100%
rename from src/renderer/src/pages/(main)/(context)/(nonhome)/discover/index.tsx
rename to src/renderer/src/pages/(main)/(layer)/(subview)/discover/index.tsx
diff --git a/src/renderer/src/pages/(main)/(context)/(nonhome)/discover/layout.tsx b/src/renderer/src/pages/(main)/(layer)/(subview)/discover/layout.tsx
similarity index 100%
rename from src/renderer/src/pages/(main)/(context)/(nonhome)/discover/layout.tsx
rename to src/renderer/src/pages/(main)/(layer)/(subview)/discover/layout.tsx
diff --git a/src/renderer/src/pages/(main)/(context)/(nonhome)/layout.tsx b/src/renderer/src/pages/(main)/(layer)/(subview)/layout.tsx
similarity index 100%
rename from src/renderer/src/pages/(main)/(context)/(nonhome)/layout.tsx
rename to src/renderer/src/pages/(main)/(layer)/(subview)/layout.tsx
diff --git a/src/renderer/src/pages/(main)/(context)/(nonhome)/profile/index.tsx b/src/renderer/src/pages/(main)/(layer)/(subview)/profile/index.tsx
similarity index 100%
rename from src/renderer/src/pages/(main)/(context)/(nonhome)/profile/index.tsx
rename to src/renderer/src/pages/(main)/(layer)/(subview)/profile/index.tsx
diff --git a/src/renderer/src/pages/(main)/(context)/(nonhome)/profile/layout.tsx b/src/renderer/src/pages/(main)/(layer)/(subview)/profile/layout.tsx
similarity index 100%
rename from src/renderer/src/pages/(main)/(context)/(nonhome)/profile/layout.tsx
rename to src/renderer/src/pages/(main)/(layer)/(subview)/profile/layout.tsx
diff --git a/src/renderer/src/pages/(main)/(context)/index.tsx b/src/renderer/src/pages/(main)/(layer)/feeds/[feedId]/index.tsx
similarity index 91%
rename from src/renderer/src/pages/(main)/(context)/index.tsx
rename to src/renderer/src/pages/(main)/(layer)/feeds/[feedId]/index.tsx
index 33298a4e8..ab859c9c1 100644
--- a/src/renderer/src/pages/(main)/(context)/index.tsx
+++ b/src/renderer/src/pages/(main)/(layer)/feeds/[feedId]/index.tsx
@@ -3,13 +3,12 @@ import { cn } from "@renderer/lib/utils"
import { EntryColumn } from "@renderer/modules/entry-column"
import { EntryContent } from "@renderer/modules/entry-content"
import {
- feedActions,
uiActions,
useFeedStore,
useUIStore,
} from "@renderer/store"
import { AnimatePresence } from "framer-motion"
-import { useEffect, useMemo, useRef } from "react"
+import { useMemo, useRef } from "react"
import { useResizable } from "react-resizable-layout"
import { useShallow } from "zustand/react/shallow"
@@ -20,10 +19,7 @@ export function Component() {
activeEntry: state.activeEntryId,
})),
)
- const { setActiveEntry } = feedActions
- useEffect(() => {
- setActiveEntry(null)
- }, [activeList?.id])
+
const containerRef = useRef
(null)
// Memo this initial value to avoid re-render
diff --git a/src/renderer/src/pages/(main)/(layer)/layout.tsx b/src/renderer/src/pages/(main)/(layer)/layout.tsx
new file mode 100644
index 000000000..0cb99dba7
--- /dev/null
+++ b/src/renderer/src/pages/(main)/(layer)/layout.tsx
@@ -0,0 +1 @@
+export { Outlet as Component } from "react-router-dom"
diff --git a/src/renderer/src/pages/(main)/index.tsx b/src/renderer/src/pages/(main)/index.tsx
new file mode 100644
index 000000000..ab859c9c1
--- /dev/null
+++ b/src/renderer/src/pages/(main)/index.tsx
@@ -0,0 +1,70 @@
+import { views } from "@renderer/lib/constants"
+import { cn } from "@renderer/lib/utils"
+import { EntryColumn } from "@renderer/modules/entry-column"
+import { EntryContent } from "@renderer/modules/entry-content"
+import {
+ uiActions,
+ useFeedStore,
+ useUIStore,
+} from "@renderer/store"
+import { AnimatePresence } from "framer-motion"
+import { useMemo, useRef } from "react"
+import { useResizable } from "react-resizable-layout"
+import { useShallow } from "zustand/react/shallow"
+
+export function Component() {
+ const { activeEntry, activeList } = useFeedStore(
+ useShallow((state) => ({
+ activeList: state.activeList,
+ activeEntry: state.activeEntryId,
+ })),
+ )
+
+ const containerRef = useRef(null)
+
+ // Memo this initial value to avoid re-render
+ // eslint-disable-next-line react-compiler/react-compiler
+ const entryColWidth = useMemo(() => useUIStore.getState().entryColWidth, [])
+
+ const { position, separatorProps } = useResizable({
+ axis: "x",
+ min: 300,
+ max: 450,
+ initial: entryColWidth,
+ containerRef,
+ onResizeEnd({ position }) {
+ uiActions.setEntryColWidth(position)
+ },
+ })
+
+ const inWideMode = activeList && views[activeList.view].wideMode
+ return (
+
+
+
+
+ {!inWideMode && (
+
+ )}
+
+ {!inWideMode && (
+
+
+
+ )}
+
+
+ )
+}
diff --git a/src/renderer/src/pages/(main)/layout.tsx b/src/renderer/src/pages/(main)/layout.tsx
index 6702108cd..0341d292e 100644
--- a/src/renderer/src/pages/(main)/layout.tsx
+++ b/src/renderer/src/pages/(main)/layout.tsx
@@ -1,22 +1,17 @@
-import { feedActions, useFeedStore } from "@renderer/store"
-import { useEffect } from "react"
-import { Outlet, useNavigate } from "react-router-dom"
+import { setMainContainerElement } from "@renderer/atoms"
+import { FeedColumn } from "@renderer/modules/feed-column"
+import { Outlet } from "react-router-dom"
-function MainLayout() {
- const navigate = useNavigate()
-
- const changed = useFeedStore(
- (state) => `${state.activeList?.view}-${state.activeList?.id}`,
+export function Component() {
+ return (
+
+
+
+
+ {/* NOTE: tabIndex for main element can get by `document.activeElement` */}
+
+
+
+
)
-
- useEffect(() => {
- feedActions.setActiveEntry(null)
- if (changed) {
- navigate("/")
- }
- }, [changed])
-
- return
}
-
-export { MainLayout as Component }
diff --git a/src/renderer/src/router.tsx b/src/renderer/src/router.tsx
index 23e7f7386..ed417bc4d 100644
--- a/src/renderer/src/router.tsx
+++ b/src/renderer/src/router.tsx
@@ -5,7 +5,6 @@ import { buildGlobRoutes } from "./lib/route-builder"
const globTree = import.meta.glob("./pages/**/*.tsx")
const tree = buildGlobRoutes(globTree)
-// console.log(tree)
export const router = createBrowserRouter([
{