chore: handle tag click

This commit is contained in:
Steven 2024-01-15 08:15:34 +08:00
parent 7ae4299df2
commit 5ebbed9115
4 changed files with 33 additions and 21 deletions

View File

@ -1,10 +1,32 @@
import { useContext } from "react";
import { useFilterStore } from "@/store/module";
import { RendererContext } from "./types";
interface Props { interface Props {
content: string; content: string;
} }
const Tag: React.FC<Props> = ({ content }: Props) => { const Tag: React.FC<Props> = ({ content }: Props) => {
const context = useContext(RendererContext);
const filterStore = useFilterStore();
const handleTagClick = () => {
if (context.readonly) {
return;
}
const currTagQuery = filterStore.getState().tag;
if (currTagQuery === content) {
filterStore.setTagFilter(undefined);
} else {
filterStore.setTagFilter(content);
}
};
return ( return (
<span className="tag-container cursor-pointer inline-block w-auto text-blue-600 dark:text-blue-400 hover:opacity-80">#{content}</span> <span className="cursor-pointer inline-block w-auto text-blue-600 dark:text-blue-400 hover:opacity-80" onClick={handleTagClick}>
#{content}
</span>
); );
}; };

View File

@ -10,19 +10,19 @@ interface Props {
memoId?: number; memoId?: number;
readonly?: boolean; readonly?: boolean;
className?: string; className?: string;
onMemoContentClick?: (e: React.MouseEvent) => void; onClick?: (e: React.MouseEvent) => void;
} }
const MemoContent: React.FC<Props> = (props: Props) => { const MemoContent: React.FC<Props> = (props: Props) => {
const { className, memoId, nodes, onMemoContentClick } = props; const { className, memoId, nodes, onClick } = props;
const currentUser = useCurrentUser(); const currentUser = useCurrentUser();
const memoStore = useMemoStore(); const memoStore = useMemoStore();
const memoContentContainerRef = useRef<HTMLDivElement>(null); const memoContentContainerRef = useRef<HTMLDivElement>(null);
const allowEdit = !props.readonly && memoId && currentUser?.id === memoStore.getMemoById(memoId)?.creatorId; const allowEdit = !props.readonly && memoId && currentUser?.id === memoStore.getMemoById(memoId)?.creatorId;
const handleMemoContentClick = async (e: React.MouseEvent) => { const handleMemoContentClick = async (e: React.MouseEvent) => {
if (onMemoContentClick) { if (onClick) {
onMemoContentClick(e); onClick(e);
} }
}; };

View File

@ -8,7 +8,6 @@ import { UNKNOWN_ID } from "@/helpers/consts";
import { getRelativeTimeString, getTimeStampByDate } from "@/helpers/datetime"; import { getRelativeTimeString, getTimeStampByDate } from "@/helpers/datetime";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import useNavigateTo from "@/hooks/useNavigateTo"; import useNavigateTo from "@/hooks/useNavigateTo";
import { useFilterStore } from "@/store/module";
import { useUserStore, extractUsernameFromName, useMemoStore } from "@/store/v1"; import { useUserStore, extractUsernameFromName, useMemoStore } from "@/store/v1";
import { RowStatus } from "@/types/proto/api/v2/common"; import { RowStatus } from "@/types/proto/api/v2/common";
import { MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service"; import { MemoRelation_Type } from "@/types/proto/api/v2/memo_relation_service";
@ -41,7 +40,6 @@ const MemoView: React.FC<Props> = (props: Props) => {
const t = useTranslate(); const t = useTranslate();
const navigateTo = useNavigateTo(); const navigateTo = useNavigateTo();
const { i18n } = useTranslation(); const { i18n } = useTranslation();
const filterStore = useFilterStore();
const memoStore = useMemoStore(); const memoStore = useMemoStore();
const userStore = useUserStore(); const userStore = useUserStore();
const user = useCurrentUser(); const user = useCurrentUser();
@ -157,15 +155,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
const handleMemoContentClick = async (e: React.MouseEvent) => { const handleMemoContentClick = async (e: React.MouseEvent) => {
const targetEl = e.target as HTMLElement; const targetEl = e.target as HTMLElement;
if (targetEl.classList.contains("tag-container")) { if (targetEl.tagName === "IMG") {
const tagName = targetEl.innerText.slice(1);
const currTagQuery = filterStore.getState().tag;
if (currTagQuery === tagName) {
filterStore.setTagFilter(undefined);
} else {
filterStore.setTagFilter(tagName);
}
} else if (targetEl.tagName === "IMG") {
const imgUrl = targetEl.getAttribute("src"); const imgUrl = targetEl.getAttribute("src");
if (imgUrl) { if (imgUrl) {
showPreviewImageDialog([imgUrl], 0); showPreviewImageDialog([imgUrl], 0);
@ -263,7 +253,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
)} )}
</div> </div>
</div> </div>
<MemoContent memoId={memo.id} nodes={memo.nodes} onMemoContentClick={handleMemoContentClick} /> <MemoContent memoId={memo.id} nodes={memo.nodes} readonly={readonly} onClick={handleMemoContentClick} />
<MemoResourceListView resourceList={memo.resources} /> <MemoResourceListView resourceList={memo.resources} />
<MemoRelationListView memo={memo} relationList={referenceRelations} /> <MemoRelationListView memo={memo} relationList={referenceRelations} />
</div> </div>

View File

@ -35,12 +35,12 @@ const MemoDetail = () => {
const [creator, setCreator] = useState<User>(); const [creator, setCreator] = useState<User>();
const memoId = Number(params.memoId); const memoId = Number(params.memoId);
const memo = memoStore.getMemoById(memoId); const memo = memoStore.getMemoById(memoId);
const allowEdit = memo?.creatorId === currentUser?.id;
const [parentMemo, setParentMemo] = useState<Memo | undefined>(undefined); const [parentMemo, setParentMemo] = useState<Memo | undefined>(undefined);
const referenceRelations = memo?.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE) || []; const referenceRelations = memo?.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE) || [];
const commentRelations = const commentRelations =
memo?.relations.filter((relation) => relation.relatedMemoId === memo?.id && relation.type === MemoRelation_Type.COMMENT) || []; memo?.relations.filter((relation) => relation.relatedMemoId === memo?.id && relation.type === MemoRelation_Type.COMMENT) || [];
const comments = commentRelations.map((relation) => memoStore.getMemoById(relation.memoId)).filter((memo) => memo) as any as Memo[]; const comments = commentRelations.map((relation) => memoStore.getMemoById(relation.memoId)).filter((memo) => memo) as any as Memo[];
const readonly = memo?.creatorId !== currentUser?.id;
// Prepare memo. // Prepare memo.
useEffect(() => { useEffect(() => {
@ -136,12 +136,12 @@ const MemoDetail = () => {
</Link> </Link>
</div> </div>
)} )}
<MemoContent memoId={memo.id} nodes={memo.nodes} readonly={true} /> <MemoContent memoId={memo.id} nodes={memo.nodes} readonly={readonly} />
<MemoResourceListView resourceList={memo.resources} /> <MemoResourceListView resourceList={memo.resources} />
<MemoRelationListView memo={memo} relationList={referenceRelations} /> <MemoRelationListView memo={memo} relationList={referenceRelations} />
<div className="w-full mt-3 flex flex-row justify-between items-center gap-2"> <div className="w-full mt-3 flex flex-row justify-between items-center gap-2">
<div className="flex flex-row justify-start items-center"> <div className="flex flex-row justify-start items-center">
{allowEdit && ( {!readonly && (
<Select <Select
className="w-auto text-sm" className="w-auto text-sm"
variant="plain" variant="plain"
@ -162,7 +162,7 @@ const MemoDetail = () => {
)} )}
</div> </div>
<div className="flex flex-row sm:justify-end items-center"> <div className="flex flex-row sm:justify-end items-center">
{allowEdit && ( {!readonly && (
<Tooltip title={"Edit"} placement="top"> <Tooltip title={"Edit"} placement="top">
<IconButton size="sm" onClick={handleEditMemoClick}> <IconButton size="sm" onClick={handleEditMemoClick}>
<Icon.Edit3 className="w-4 h-auto text-gray-600 dark:text-gray-400" /> <Icon.Edit3 className="w-4 h-auto text-gray-600 dark:text-gray-400" />