diff --git a/web/src/components/TimelineSidebar/TimelineSidebar.tsx b/web/src/components/TimelineSidebar/TimelineSidebar.tsx index 90c4de49..eb6bd1a8 100644 --- a/web/src/components/TimelineSidebar/TimelineSidebar.tsx +++ b/web/src/components/TimelineSidebar/TimelineSidebar.tsx @@ -1,12 +1,16 @@ import clsx from "clsx"; +import useCurrentUser from "@/hooks/useCurrentUser"; import TagsSection from "../HomeSidebar/TagsSection"; import SearchBar from "../SearchBar"; +import UserStatisticsView from "../UserStatisticsView"; interface Props { className?: string; } const TimelineSidebar = (props: Props) => { + const currentUser = useCurrentUser(); + return ( ); diff --git a/web/src/components/UserStatisticsView.tsx b/web/src/components/UserStatisticsView.tsx index b17aa3b5..d6b4663f 100644 --- a/web/src/components/UserStatisticsView.tsx +++ b/web/src/components/UserStatisticsView.tsx @@ -29,10 +29,6 @@ const UserStatisticsView = (props: Props) => { const memos = Object.values(memoStore.getState().memoMapByName); useEffect(() => { - if (memos.length === 0) { - return; - } - (async () => { setIsRequesting(true); const { properties } = await memoServiceClient.listMemoProperties({ diff --git a/web/src/pages/Home.tsx b/web/src/pages/Home.tsx index 60b1e227..95dbb97c 100644 --- a/web/src/pages/Home.tsx +++ b/web/src/pages/Home.tsx @@ -1,6 +1,7 @@ import { Button } from "@mui/joy"; import clsx from "clsx"; import { useEffect, useState } from "react"; +import { useLocalStorage } from "react-use"; import Empty from "@/components/Empty"; import { HomeSidebar, HomeSidebarDrawer } from "@/components/HomeSidebar"; import Icon from "@/components/Icon"; @@ -13,6 +14,7 @@ import { getTimeStampByDate } from "@/helpers/datetime"; import useCurrentUser from "@/hooks/useCurrentUser"; import useFilterWithUrlParams from "@/hooks/useFilterWithUrlParams"; import useResponsiveWidth from "@/hooks/useResponsiveWidth"; +import { Routes } from "@/router"; import { useMemoList, useMemoStore } from "@/store/v1"; import { RowStatus } from "@/types/proto/api/v1/common"; import { useTranslate } from "@/utils/i18n"; @@ -23,6 +25,7 @@ const Home = () => { const user = useCurrentUser(); const memoStore = useMemoStore(); const memoList = useMemoList(); + const [, setLastVisited] = useLocalStorage("lastVisited", Routes.HOME); const [isRequesting, setIsRequesting] = useState(true); const [nextPageToken, setNextPageToken] = useState(""); const filter = useFilterWithUrlParams(); @@ -31,6 +34,10 @@ const Home = () => { .sort((a, b) => getTimeStampByDate(b.displayTime) - getTimeStampByDate(a.displayTime)) .sort((a, b) => Number(b.pinned) - Number(a.pinned)); + useEffect(() => { + setLastVisited(Routes.HOME); + }, []); + useEffect(() => { memoList.reset(); fetchMemos(""); diff --git a/web/src/pages/RootRedirector.tsx b/web/src/pages/RootRedirector.tsx new file mode 100644 index 00000000..d1632b50 --- /dev/null +++ b/web/src/pages/RootRedirector.tsx @@ -0,0 +1,20 @@ +import { useEffect } from "react"; +import useLocalStorage from "react-use/lib/useLocalStorage"; +import useNavigateTo from "@/hooks/useNavigateTo"; + +const RootRedirector: React.FC = () => { + const [lastVisited] = useLocalStorage("lastVisited", "/home"); + const navigateTo = useNavigateTo(); + + useEffect(() => { + if (lastVisited === "/home" || lastVisited === "/timeline") { + navigateTo(lastVisited); + } else { + navigateTo("/home"); + } + }, []); + + return <>; +}; + +export default RootRedirector; diff --git a/web/src/pages/Timeline.tsx b/web/src/pages/Timeline.tsx index 432028f2..d986e8f5 100644 --- a/web/src/pages/Timeline.tsx +++ b/web/src/pages/Timeline.tsx @@ -2,6 +2,7 @@ import { Button, IconButton } from "@mui/joy"; import clsx from "clsx"; import dayjs from "dayjs"; import { useEffect, useState } from "react"; +import { useLocalStorage } from "react-use"; import ActivityCalendar from "@/components/ActivityCalendar"; import Empty from "@/components/Empty"; import Icon from "@/components/Icon"; @@ -17,6 +18,7 @@ import useCurrentUser from "@/hooks/useCurrentUser"; import useFilterWithUrlParams from "@/hooks/useFilterWithUrlParams"; import useResponsiveWidth from "@/hooks/useResponsiveWidth"; import i18n from "@/i18n"; +import { Routes } from "@/router"; import { useMemoList, useMemoStore } from "@/store/v1"; import { useTranslate } from "@/utils/i18n"; @@ -26,6 +28,7 @@ const Timeline = () => { const user = useCurrentUser(); const memoStore = useMemoStore(); const memoList = useMemoList(); + const [, setLastVisited] = useLocalStorage("lastVisited", Routes.TIMELINE); const { tag: tagQuery, text: textQuery } = useFilterWithUrlParams(); const [activityStats, setActivityStats] = useState>({}); const [selectedDateString, setSelectedDateString] = useState(new Date().toDateString()); @@ -34,6 +37,10 @@ const Timeline = () => { const sortedMemos = memoList.value.sort((a, b) => getTimeStampByDate(a.displayTime) - getTimeStampByDate(b.displayTime)); const monthString = dayjs(selectedDateString).format("YYYY-MM"); + useEffect(() => { + setLastVisited(Routes.TIMELINE); + }, []); + useEffect(() => { memoList.reset(); fetchMemos(""); diff --git a/web/src/router/index.tsx b/web/src/router/index.tsx index 168aa5b3..58bc443b 100644 --- a/web/src/router/index.tsx +++ b/web/src/router/index.tsx @@ -12,6 +12,7 @@ import MemoDetail from "@/pages/MemoDetail"; import NotFound from "@/pages/NotFound"; import PermissionDenied from "@/pages/PermissionDenied"; import Resources from "@/pages/Resources"; +import RootRedirector from "@/pages/RootRedirector"; import Setting from "@/pages/Setting"; import SignIn from "@/pages/SignIn"; import SignUp from "@/pages/SignUp"; @@ -19,7 +20,8 @@ import Timeline from "@/pages/Timeline"; import UserProfile from "@/pages/UserProfile"; export enum Routes { - HOME = "/", + ROOT = "/", + HOME = "/home", TIMELINE = "/timeline", RESOURCES = "/resources", INBOX = "/inbox", @@ -57,6 +59,10 @@ const router = createBrowserRouter([ path: "/", element: , children: [ + { + path: Routes.ROOT, + element: , + }, { path: Routes.HOME, element: ,