From c87b679f410f118d724c93a3d78a8f9f44d41ad7 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 19 Oct 2023 21:26:38 +0800 Subject: [PATCH] chore: add memo relation list --- web/src/components/Memo.tsx | 6 +- .../MemoEditor/RelationListView.tsx | 39 ++++----- web/src/components/MemoRelationListView.tsx | 83 ++++++++++++++----- web/src/components/MemoResourceListView.tsx | 2 +- web/src/pages/MemoDetail.tsx | 11 +-- 5 files changed, 83 insertions(+), 58 deletions(-) diff --git a/web/src/components/Memo.tsx b/web/src/components/Memo.tsx index b799d7e4d..b0f74ef3f 100644 --- a/web/src/components/Memo.tsx +++ b/web/src/components/Memo.tsx @@ -44,9 +44,7 @@ const Memo: React.FC = (props: Props) => { const memoContainerRef = useRef(null); const readonly = memo.creatorUsername !== user?.username; const creator = userV1Store.getUserByUsername(memo.creatorUsername); - const referenceRelations = memo.relationList.filter( - (relation) => relation.memoId === memo.id && relation.relatedMemoId !== memo.id && relation.type === "REFERENCE" - ); + const referenceRelations = memo.relationList.filter((relation) => relation.type === "REFERENCE"); const commentRelations = memo.relationList.filter((relation) => relation.relatedMemoId === memo.id && relation.type === "COMMENT"); // Prepare memo creator. @@ -286,7 +284,7 @@ const Memo: React.FC = (props: Props) => { onMemoContentDoubleClick={handleMemoContentDoubleClick} /> - +
{creator && ( diff --git a/web/src/components/MemoEditor/RelationListView.tsx b/web/src/components/MemoEditor/RelationListView.tsx index 87383bb7a..5dc9e78c4 100644 --- a/web/src/components/MemoEditor/RelationListView.tsx +++ b/web/src/components/MemoEditor/RelationListView.tsx @@ -7,51 +7,44 @@ interface Props { setRelationList: (relationList: MemoRelation[]) => void; } -interface FormatedMemoRelation extends MemoRelation { - relatedMemo: Memo; -} - const RelationListView = (props: Props) => { const { relationList, setRelationList } = props; const memoCacheStore = useMemoCacheStore(); - const [formatedMemoRelationList, setFormatedMemoRelationList] = useState([]); + const [referencingMemoList, setReferencingMemoList] = useState([]); useEffect(() => { (async () => { const requests = relationList .filter((relation) => relation.type === "REFERENCE") .map(async (relation) => { - const relatedMemo = await memoCacheStore.getOrFetchMemoById(relation.relatedMemoId); - return { - ...relation, - relatedMemo, - }; + return await memoCacheStore.getOrFetchMemoById(relation.relatedMemoId); }); const list = await Promise.all(requests); - setFormatedMemoRelationList(list); + setReferencingMemoList(list); })(); }, [relationList]); - const handleDeleteRelation = async (memoRelation: FormatedMemoRelation) => { - const newRelationList = relationList.filter((relation) => relation.relatedMemoId !== memoRelation.relatedMemoId); - setRelationList(newRelationList); + const handleDeleteRelation = async (memo: Memo) => { + setRelationList(relationList.filter((relation) => relation.relatedMemoId !== memo.id)); }; + console.log("referencingMemoList", referencingMemoList); + return ( <> - {formatedMemoRelationList.length > 0 && ( + {referencingMemoList.length > 0 && (
- {formatedMemoRelationList.map((memoRelation) => { + {referencingMemoList.map((memo) => { return (
handleDeleteRelation(memo)} > - - - {memoRelation.relatedMemo.content} - - handleDeleteRelation(memoRelation)} /> + + #{memo.id} + {memo.content} +
); })} diff --git a/web/src/components/MemoRelationListView.tsx b/web/src/components/MemoRelationListView.tsx index dc660264a..f9701494e 100644 --- a/web/src/components/MemoRelationListView.tsx +++ b/web/src/components/MemoRelationListView.tsx @@ -1,44 +1,81 @@ +import { Tooltip } from "@mui/joy"; import { useEffect, useState } from "react"; +import { Link } from "react-router-dom"; import { useMemoCacheStore } from "@/store/v1"; import Icon from "./Icon"; interface Props { + memo: Memo; relationList: MemoRelation[]; } const MemoRelationListView = (props: Props) => { + const { memo, relationList } = props; const memoCacheStore = useMemoCacheStore(); - const [relatedMemoList, setRelatedMemoList] = useState([]); + const [referencingMemoList, setReferencingMemoList] = useState([]); + const [referencedMemoList, setReferencedMemoList] = useState([]); useEffect(() => { (async () => { - const memoList = await Promise.all(props.relationList.map((relation) => memoCacheStore.getOrFetchMemoById(relation.relatedMemoId))); - setRelatedMemoList(memoList); + const referencingMemoList = await Promise.all( + relationList + .filter((relation) => relation.memoId === memo.id && relation.relatedMemoId !== memo.id) + .map((relation) => memoCacheStore.getOrFetchMemoById(relation.relatedMemoId)) + ); + setReferencingMemoList(referencingMemoList); + const referencedMemoList = await Promise.all( + relationList + .filter((relation) => relation.memoId !== memo.id && relation.relatedMemoId === memo.id) + .map((relation) => memoCacheStore.getOrFetchMemoById(relation.memoId)) + ); + setReferencedMemoList(referencedMemoList); })(); - }, [props.relationList]); - - const handleGotoMemoDetail = (memo: Memo) => { - window.open(`/m/${memo.id}`, "_blank"); - }; + }, [memo, relationList]); return ( <> - {relatedMemoList.length > 0 && ( -
- {relatedMemoList.map((memo) => { - return ( -
handleGotoMemoDetail(memo)} - > -
- + {referencingMemoList.length > 0 && ( +
+ + + +
+ {referencingMemoList.map((memo) => { + return ( +
+ + #{memo.id} + {memo.content} + +
+ ); + })} +
+
+ )} + {referencedMemoList.length > 0 && ( +
+ + + +
+ {referencedMemoList.map((memo) => { + return ( +
+ + #{memo.id} + {memo.content} +
- {memo.content} -
- ); - })} + ); + })} +
)} diff --git a/web/src/components/MemoResourceListView.tsx b/web/src/components/MemoResourceListView.tsx index 3843a58b8..538f0ac36 100644 --- a/web/src/components/MemoResourceListView.tsx +++ b/web/src/components/MemoResourceListView.tsx @@ -78,7 +78,7 @@ const MemoResourceListView: React.FC = (props: Props) => {
{videoResourceList.length > 0 && ( -
+
{videoResourceList.map((resource) => { const url = getResourceUrl(resource); return ( diff --git a/web/src/pages/MemoDetail.tsx b/web/src/pages/MemoDetail.tsx index 6ddf02063..04f401d09 100644 --- a/web/src/pages/MemoDetail.tsx +++ b/web/src/pages/MemoDetail.tsx @@ -36,10 +36,7 @@ const MemoDetail = () => { const memoId = Number(params.memoId); const memo = memoStore.state.memos.find((memo) => memo.id === memoId); const allowEdit = memo?.creatorUsername === currentUser?.username; - const referenceRelations = - memo?.relationList.filter( - (relation) => relation.memoId === memo?.id && relation.relatedMemoId !== memo?.id && relation.type === "REFERENCE" - ) || []; + const referenceRelations = memo?.relationList.filter((relation) => relation.type === "REFERENCE") || []; const commentRelations = memo?.relationList.filter((relation) => relation.relatedMemoId === memo.id && relation.type === "COMMENT") || []; const comments = commentRelations .map((relation) => memoStore.state.memos.find((memo) => memo.id === relation.memoId)) @@ -113,9 +110,9 @@ const MemoDetail = () => {
{memo.parent && ( -
+
@@ -129,7 +126,7 @@ const MemoDetail = () => {
- +