import { memo, useMemo, useRef, useState } from "react"; import useCurrentUser from "@/hooks/useCurrentUser"; import { useUser } from "@/hooks/useUserQueries"; import { cn } from "@/lib/utils"; import { State } from "@/types/proto/api/v1/common_pb"; import { isSuperUser } from "@/utils/user"; import MemoEditor from "../MemoEditor"; import PreviewImageDialog from "../PreviewImageDialog"; import { MemoBody, MemoHeader } from "./components"; import { MEMO_CARD_BASE_CLASSES } from "./constants"; import { useImagePreview, useMemoActions, useMemoHandlers } from "./hooks"; import { MemoViewContext } from "./MemoViewContext"; import type { MemoViewProps } from "./types"; const MemoView: React.FC = (props: MemoViewProps) => { const { memo: memoData, className, parentPage: parentPageProp } = props; const cardRef = useRef(null); const [showEditor, setShowEditor] = useState(false); const currentUser = useCurrentUser(); const creator = useUser(memoData.creator).data; const isArchived = memoData.state === State.ARCHIVED; const readonly = memoData.creator !== currentUser?.name && !isSuperUser(currentUser); const parentPage = parentPageProp || "/"; // NSFW content management: always blur content tagged with NSFW (case-insensitive) const [showNSFWContent, setShowNSFWContent] = useState(false); const nsfw = memoData.tags?.some((tag) => tag.toUpperCase() === "NSFW") ?? false; const toggleNsfwVisibility = () => setShowNSFWContent((prev) => !prev); const { previewState, openPreview, setPreviewOpen } = useImagePreview(); const { unpinMemo } = useMemoActions(memoData, isArchived); const closeEditor = () => setShowEditor(false); const openEditor = () => setShowEditor(true); const { handleGotoMemoDetailPage, handleMemoContentClick, handleMemoContentDoubleClick } = useMemoHandlers({ memoName: memoData.name, parentPage, readonly, openEditor, openPreview, }); const contextValue = useMemo( () => ({ memo: memoData, creator, currentUser, parentPage, isArchived, readonly, showNSFWContent, nsfw, }), [memoData, creator, currentUser, parentPage, isArchived, readonly, showNSFWContent, nsfw], ); if (showEditor) { return ( ); } return (
); }; export default memo(MemoView);