diff --git a/web/src/components/MemoContent/Tag.tsx b/web/src/components/MemoContent/Tag.tsx index 2534a815..ca87d0e4 100644 --- a/web/src/components/MemoContent/Tag.tsx +++ b/web/src/components/MemoContent/Tag.tsx @@ -3,7 +3,9 @@ interface Props { } const Tag: React.FC = ({ content }: Props) => { - return #{content}; + return ( + #{content} + ); }; export default Tag; diff --git a/web/src/components/MemoFilter.tsx b/web/src/components/MemoFilter.tsx index fdeadd5c..cc22e536 100644 --- a/web/src/components/MemoFilter.tsx +++ b/web/src/components/MemoFilter.tsx @@ -1,6 +1,5 @@ import { useEffect } from "react"; import { useLocation } from "react-router-dom"; -import { getDateString } from "@/helpers/datetime"; import { useFilterStore } from "@/store/module"; import { useTranslate } from "@/utils/i18n"; import Icon from "./Icon"; @@ -10,8 +9,8 @@ const MemoFilter = () => { const location = useLocation(); const filterStore = useFilterStore(); const filter = filterStore.state; - const { tag: tagQuery, duration, text: textQuery, visibility } = filter; - const showFilter = Boolean(tagQuery || (duration && duration.from < duration.to) || textQuery || visibility); + const { tag: tagQuery, text: textQuery, visibility } = filter; + const showFilter = Boolean(tagQuery || textQuery || visibility); useEffect(() => { filterStore.clearFilter(); @@ -48,22 +47,6 @@ const MemoFilter = () => { {visibility} - {duration && duration.from < duration.to ? ( -
{ - filterStore.setFromAndToFilter(); - }} - > - - {t("common.filter-period", { - from: getDateString(duration.from), - to: getDateString(duration.to), - interpolation: { escapeValue: false }, - })} - -
- ) : null}
= (props: Props) => { const handleMemoContentClick = async (e: React.MouseEvent) => { const targetEl = e.target as HTMLElement; - if (targetEl.className === "tag-span") { + if (targetEl.classList.contains("tag-container")) { const tagName = targetEl.innerText.slice(1); const currTagQuery = filterStore.getState().tag; if (currTagQuery === tagName) { diff --git a/web/src/components/UsageHeatMap.tsx b/web/src/components/UsageHeatMap.tsx index e3aa9275..be4a1cbb 100644 --- a/web/src/components/UsageHeatMap.tsx +++ b/web/src/components/UsageHeatMap.tsx @@ -4,10 +4,10 @@ import { DAILY_TIMESTAMP } from "@/helpers/consts"; import { getDateStampByDate, getDateString, getTimeStampByDate } from "@/helpers/datetime"; import * as utils from "@/helpers/utils"; import useCurrentUser from "@/hooks/useCurrentUser"; +import useNavigateTo from "@/hooks/useNavigateTo"; import { useGlobalStore } from "@/store/module"; import { useUserV1Store, extractUsernameFromName, useMemoV1Store } from "@/store/v1"; import { useTranslate, Translations } from "@/utils/i18n"; -import { useFilterStore } from "../store/module"; import "@/less/usage-heat-map.less"; const tableConfig = { @@ -33,7 +33,7 @@ interface DailyUsageStat { const UsageHeatMap = () => { const t = useTranslate(); - const filterStore = useFilterStore(); + const navigateTo = useNavigateTo(); const userV1Store = useUserV1Store(); const user = useCurrentUser(); const memoStore = useMemoV1Store(); @@ -48,7 +48,6 @@ const UsageHeatMap = () => { const [memoAmount, setMemoAmount] = useState(0); const [createdDays, setCreatedDays] = useState(0); const [allStat, setAllStat] = useState(getInitialUsageStat(usedDaysAmount, beginDayTimestamp)); - const [currentStat, setCurrentStat] = useState(null); const containerElRef = useRef(null); const memos = Array.from(memoStore.getState().memoById.values()); @@ -108,13 +107,7 @@ const UsageHeatMap = () => { }, []); const handleUsageStatItemClick = useCallback((item: DailyUsageStat) => { - if (filterStore.getState().duration?.from === item.timestamp) { - filterStore.setFromAndToFilter(); - setCurrentStat(null); - } else if (item.count > 0) { - filterStore.setFromAndToFilter(item.timestamp, item.timestamp + DAILY_TIMESTAMP); - setCurrentStat(item); - } + navigateTo(`/timeline?timestamp=${item.timestamp}`); }, []); // This interpolation is not being used because of the current styling, @@ -146,11 +139,7 @@ const UsageHeatMap = () => { onMouseLeave={handleUsageStatItemMouseLeave} onClick={() => handleUsageStatItemClick(v)} > - +
); })} diff --git a/web/src/pages/Timeline.tsx b/web/src/pages/Timeline.tsx index 7dbdf277..7e52ee79 100644 --- a/web/src/pages/Timeline.tsx +++ b/web/src/pages/Timeline.tsx @@ -1,5 +1,6 @@ import { Button } from "@mui/joy"; import { useEffect, useState } from "react"; +import { useSearchParams } from "react-router-dom"; import useToggle from "react-use/lib/useToggle"; import Empty from "@/components/Empty"; import Icon from "@/components/Icon"; @@ -15,15 +16,22 @@ import { useTranslate } from "@/utils/i18n"; const Timeline = () => { const t = useTranslate(); + const [searchParams, setSearchParams] = useSearchParams(); const user = useCurrentUser(); const memoStore = useMemoV1Store(); const memoList = useMemoList(); const currentDateStamp = getDateStampByDate(getNormalizedDateString()) as number; - const [selectedDateStamp, setSelectedDateStamp] = useState(currentDateStamp as number); + const [selectedDateStamp, setSelectedDateStamp] = useState( + (searchParams.get("timestamp") ? Number(searchParams.get("timestamp")) : currentDateStamp) as number + ); const [isRequesting, setIsRequesting] = useState(true); const [showDatePicker, toggleShowDatePicker] = useToggle(false); const sortedMemos = memoList.value.sort((a, b) => getTimeStampByDate(a.createTime) - getTimeStampByDate(b.createTime)); + useEffect(() => { + setSearchParams(); + }, []); + useEffect(() => { memoList.reset(); fetchMemos(); diff --git a/web/src/pages/UserProfile.tsx b/web/src/pages/UserProfile.tsx index fd6f4b2a..1aadeae3 100644 --- a/web/src/pages/UserProfile.tsx +++ b/web/src/pages/UserProfile.tsx @@ -48,16 +48,16 @@ const UserProfile = () => { }, [params.username]); useEffect(() => { - memoList.reset(); - fetchMemos(); - }, [tagQuery, textQuery]); - - const fetchMemos = async () => { if (!user) { return; } - const filters = [`creator == "${user.name}"`, `row_status == "NORMAL"`]; + memoList.reset(); + fetchMemos(); + }, [user, tagQuery, textQuery]); + + const fetchMemos = async () => { + const filters = [`creator == "${user!.name}"`, `row_status == "NORMAL"`, `order_by_pinned == true`]; const contentSearch: string[] = []; if (tagQuery) { contentSearch.push(`"#${tagQuery}"`); diff --git a/web/src/store/module/filter.ts b/web/src/store/module/filter.ts index 4f2c14e1..14939ec1 100644 --- a/web/src/store/module/filter.ts +++ b/web/src/store/module/filter.ts @@ -16,7 +16,6 @@ export const useFilterStore = () => { store.dispatch( setFilter({ tag: undefined, - duration: undefined, text: undefined, visibility: undefined, }) @@ -36,20 +35,6 @@ export const useFilterStore = () => { }) ); }, - setFromAndToFilter: (from?: number, to?: number) => { - let duration = undefined; - if (from && to && from < to) { - duration = { - from, - to, - }; - } - store.dispatch( - setFilter({ - duration, - }) - ); - }, setMemoVisibilityFilter: (visibility?: Visibility) => { store.dispatch( setFilter({ diff --git a/web/src/store/reducer/filter.ts b/web/src/store/reducer/filter.ts index e7291d82..bb4ab3e9 100644 --- a/web/src/store/reducer/filter.ts +++ b/web/src/store/reducer/filter.ts @@ -1,13 +1,7 @@ import { createSlice, PayloadAction } from "@reduxjs/toolkit"; -interface Duration { - from: number; - to: number; -} - interface State { tag?: string; - duration?: Duration; text?: string; visibility?: Visibility; }