import clsx from "clsx"; import { DotIcon, LinkIcon, MilestoneIcon } from "lucide-react"; import { memo, useState } from "react"; import { Link } from "react-router-dom"; import useAsyncEffect from "@/hooks/useAsyncEffect"; import { useMemoStore } from "@/store/v1"; import { MemoRelation } from "@/types/proto/api/v1/memo_relation_service"; import { Memo } from "@/types/proto/api/v1/memo_service"; interface Props { memo: Memo; relations: MemoRelation[]; } const MemoRelationListView = (props: Props) => { const { memo, relations: relationList } = props; const memoStore = useMemoStore(); const [referencingMemoList, setReferencingMemoList] = useState([]); const [referencedMemoList, setReferencedMemoList] = useState([]); const [selectedTab, setSelectedTab] = useState<"referencing" | "referenced">("referencing"); useAsyncEffect(async () => { const referencingMemoList = await Promise.all( relationList .filter((relation) => relation.memo === memo.name && relation.relatedMemo !== memo.name) .map((relation) => memoStore.getOrFetchMemoByName(relation.relatedMemo, { skipStore: true })), ); setReferencingMemoList(referencingMemoList); const referencedMemoList = await Promise.all( relationList .filter((relation) => relation.memo !== memo.name && relation.relatedMemo === memo.name) .map((relation) => memoStore.getOrFetchMemoByName(relation.memo, { skipStore: true })), ); setReferencedMemoList(referencedMemoList); if (referencingMemoList.length === 0) { setSelectedTab("referenced"); } else { setSelectedTab("referencing"); } }, [memo.name, relationList]); if (referencingMemoList.length + referencedMemoList.length === 0) { return null; } return (
{referencingMemoList.length > 0 && ( )} {referencedMemoList.length > 0 && ( )}
{selectedTab === "referencing" && referencingMemoList.length > 0 && (
{referencingMemoList.map((memo) => { return ( {memo.snippet} ); })}
)} {selectedTab === "referenced" && referencedMemoList.length > 0 && (
{referencedMemoList.map((memo) => { return ( {memo.snippet} ); })}
)}
); }; export default memo(MemoRelationListView);