mirror of
https://github.com/usememos/memos.git
synced 2025-02-22 06:07:51 +01:00
chore: handle tag click
This commit is contained in:
parent
7ae4299df2
commit
5ebbed9115
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user