Skip to content

Commit 4058560

Browse files
committed
refactor: streamline MemoView component and related hooks, removing unused code and integrating user data
1 parent 64ae138 commit 4058560

File tree

9 files changed

+26
-99
lines changed

9 files changed

+26
-99
lines changed

web/src/components/MemoView/MemoView.tsx

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,13 @@
11
import { memo, useMemo, useRef, useState } from "react";
2+
import { useUser } from "@/hooks/useUserQueries";
23
import { cn } from "@/lib/utils";
3-
import type { Memo } from "@/types/proto/api/v1/memo_service_pb";
44
import MemoEditor from "../MemoEditor";
55
import PreviewImageDialog from "../PreviewImageDialog";
66
import { MemoBody, MemoHeader } from "./components";
77
import { MEMO_CARD_BASE_CLASSES } from "./constants";
8-
import {
9-
useImagePreview,
10-
useKeyboardShortcuts,
11-
useMemoActions,
12-
useMemoCreator,
13-
useMemoEditor,
14-
useMemoHandlers,
15-
useMemoViewDerivedState,
16-
useNsfwContent,
17-
} from "./hooks";
8+
import { useImagePreview, useKeyboardShortcuts, useMemoActions, useMemoHandlers, useMemoViewDerivedState, useNsfwContent } from "./hooks";
189
import { MemoViewContext } from "./MemoViewContext";
19-
20-
interface Props {
21-
memo: Memo;
22-
compact?: boolean;
23-
showCreator?: boolean;
24-
showVisibility?: boolean;
25-
showPinned?: boolean;
26-
showNsfwContent?: boolean;
27-
className?: string;
28-
parentPage?: string;
29-
}
10+
import type { MemoViewProps } from "./types";
3011

3112
/**
3213
* MemoView component displays a memo card with all its content, metadata, and interactive elements.
@@ -49,17 +30,22 @@ interface Props {
4930
* />
5031
* ```
5132
*/
52-
const MemoView: React.FC<Props> = (props: Props) => {
33+
const MemoView: React.FC<MemoViewProps> = (props: MemoViewProps) => {
5334
const { memo: memoData, className } = props;
5435
const cardRef = useRef<HTMLDivElement>(null);
5536
const [reactionSelectorOpen, setReactionSelectorOpen] = useState(false);
37+
const [showEditor, setShowEditor] = useState(false);
5638

57-
const creator = useMemoCreator(memoData.creator);
39+
const creator = useUser(memoData.creator).data;
5840
const { isArchived, readonly, parentPage } = useMemoViewDerivedState(memoData, props.parentPage);
59-
const { showNSFWContent, toggleNsfwVisibility } = useNsfwContent(memoData, props.showNsfwContent);
41+
const { nsfw, showNSFWContent, toggleNsfwVisibility } = useNsfwContent(memoData, props.showNsfwContent);
6042
const { previewState, openPreview, setPreviewOpen } = useImagePreview();
61-
const { showEditor, openEditor, handleEditorConfirm, handleEditorCancel } = useMemoEditor();
62-
const { archiveMemo, unpinMemo } = useMemoActions(memoData);
43+
const { archiveMemo, unpinMemo } = useMemoActions(memoData, isArchived);
44+
45+
const handleEditorConfirm = () => setShowEditor(false);
46+
const handleEditorCancel = () => setShowEditor(false);
47+
const openEditor = () => setShowEditor(true);
48+
6349
const { handleGotoMemoDetailPage, handleMemoContentClick, handleMemoContentDoubleClick } = useMemoHandlers({
6450
memoName: memoData.name,
6551
parentPage,
@@ -76,15 +62,15 @@ const MemoView: React.FC<Props> = (props: Props) => {
7662
onArchive: archiveMemo,
7763
});
7864

79-
// Minimal essential context - only non-derivable data
8065
const contextValue = useMemo(
8166
() => ({
8267
memo: memoData,
8368
creator,
8469
parentPage,
8570
showNSFWContent,
71+
nsfw,
8672
}),
87-
[memoData, creator, parentPage, showNSFWContent],
73+
[memoData, creator, parentPage, showNSFWContent, nsfw],
8874
);
8975

9076
if (showEditor) {

web/src/components/MemoView/MemoViewContext.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import type { User } from "@/types/proto/api/v1/user_service_pb";
99
import { isSuperUser } from "@/utils/user";
1010
import { RELATIVE_TIME_THRESHOLD_MS } from "./constants";
1111

12-
// Minimal essential context - only data that cannot be easily derived
1312
export interface MemoViewContextValue {
1413
memo: Memo;
1514
creator: User | undefined;
1615
parentPage: string;
1716
showNSFWContent: boolean;
17+
nsfw: boolean;
1818
}
1919

2020
export const MemoViewContext = createContext<MemoViewContextValue | null>(null);
@@ -27,7 +27,6 @@ export const useMemoViewContext = (): MemoViewContextValue => {
2727
return context;
2828
};
2929

30-
// Utility hooks to derive common values from context
3130
export const useMemoViewDerived = () => {
3231
const { memo } = useMemoViewContext();
3332
const location = useLocation();
@@ -45,14 +44,11 @@ export const useMemoViewDerived = () => {
4544
const relativeTimeFormat: "datetime" | "auto" =
4645
displayTime && Date.now() - displayTime.getTime() > RELATIVE_TIME_THRESHOLD_MS ? "datetime" : "auto";
4746

48-
const nsfw = memo.tags.some((tag) => tag.toLowerCase() === "nsfw");
49-
5047
return {
5148
isArchived,
5249
readonly,
5350
isInMemoDetailPage,
5451
commentAmount,
5552
relativeTimeFormat,
56-
nsfw,
5753
};
5854
};

web/src/components/MemoView/components/MemoBody.tsx

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,13 @@ import { useTranslate } from "@/utils/i18n";
44
import MemoContent from "../../MemoContent";
55
import { MemoReactionListView } from "../../MemoReactionListView";
66
import { AttachmentList, LocationDisplay, RelationList } from "../../memo-metadata";
7-
import { useMemoViewContext, useMemoViewDerived } from "../MemoViewContext";
7+
import { useMemoViewContext } from "../MemoViewContext";
8+
import type { MemoBodyProps } from "../types";
89

9-
interface Props {
10-
compact?: boolean;
11-
onContentClick: (e: React.MouseEvent) => void;
12-
onContentDoubleClick: (e: React.MouseEvent) => void;
13-
onToggleNsfwVisibility: () => void;
14-
}
15-
16-
const MemoBody: React.FC<Props> = ({ compact, onContentClick, onContentDoubleClick, onToggleNsfwVisibility }) => {
10+
const MemoBody: React.FC<MemoBodyProps> = ({ compact, onContentClick, onContentDoubleClick, onToggleNsfwVisibility }) => {
1711
const t = useTranslate();
1812

19-
// Get essential context and derive other values
20-
const { memo, parentPage, showNSFWContent } = useMemoViewContext();
21-
const { nsfw } = useMemoViewDerived();
13+
const { memo, parentPage, showNSFWContent, nsfw } = useMemoViewContext();
2214

2315
const referencedMemos = memo.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE);
2416

web/src/components/MemoView/components/MemoHeader.tsx

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,9 @@ import { ReactionSelector } from "../../MemoReactionListView";
1313
import UserAvatar from "../../UserAvatar";
1414
import VisibilityIcon from "../../VisibilityIcon";
1515
import { useMemoViewContext, useMemoViewDerived } from "../MemoViewContext";
16+
import type { MemoHeaderProps } from "../types";
1617

17-
interface Props {
18-
showCreator?: boolean;
19-
showVisibility?: boolean;
20-
showPinned?: boolean;
21-
onEdit: () => void;
22-
onGotoDetail: () => void;
23-
onUnpin: () => void;
24-
onToggleNsfwVisibility?: () => void;
25-
reactionSelectorOpen: boolean;
26-
onReactionSelectorOpenChange: (open: boolean) => void;
27-
}
28-
29-
const MemoHeader: React.FC<Props> = ({
18+
const MemoHeader: React.FC<MemoHeaderProps> = ({
3019
showCreator,
3120
showVisibility,
3221
showPinned,
@@ -39,9 +28,8 @@ const MemoHeader: React.FC<Props> = ({
3928
}) => {
4029
const t = useTranslate();
4130

42-
// Get essential context and derive other values
43-
const { memo, creator, parentPage, showNSFWContent } = useMemoViewContext();
44-
const { isArchived, readonly, isInMemoDetailPage, commentAmount, relativeTimeFormat, nsfw } = useMemoViewDerived();
31+
const { memo, creator, parentPage, showNSFWContent, nsfw } = useMemoViewContext();
32+
const { isArchived, readonly, isInMemoDetailPage, commentAmount, relativeTimeFormat } = useMemoViewDerived();
4533

4634
const displayTime = isArchived ? (
4735
(memo.displayTime ? timestampDate(memo.displayTime) : undefined)?.toLocaleString(i18n.language)
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
export { useImagePreview } from "./useImagePreview";
22
export { useKeyboardShortcuts } from "./useKeyboardShortcuts";
33
export { useMemoActions } from "./useMemoActions";
4-
export { useMemoCreator } from "./useMemoCreator";
5-
export { useMemoEditor } from "./useMemoEditor";
64
export { useMemoHandlers } from "./useMemoHandlers";
75
export { useMemoViewDerivedState } from "./useMemoViewDerivedState";
86
export { useNsfwContent } from "./useNsfwContent";

web/src/components/MemoView/hooks/useMemoActions.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import { State } from "@/types/proto/api/v1/common_pb";
55
import type { Memo } from "@/types/proto/api/v1/memo_service_pb";
66
import { useTranslate } from "@/utils/i18n";
77

8-
export const useMemoActions = (memo: Memo) => {
8+
export const useMemoActions = (memo: Memo, isArchived: boolean) => {
99
const t = useTranslate();
1010
const { mutateAsync: updateMemo } = useUpdateMemo();
11-
const isArchived = memo.state === State.ARCHIVED;
1211

1312
const archiveMemo = async () => {
1413
if (isArchived) return;

web/src/components/MemoView/hooks/useMemoCreator.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

web/src/components/MemoView/hooks/useMemoEditor.ts

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,16 @@
1-
import { timestampDate } from "@bufbuild/protobuf/wkt";
21
import { useLocation } from "react-router-dom";
32
import useCurrentUser from "@/hooks/useCurrentUser";
43
import { State } from "@/types/proto/api/v1/common_pb";
54
import type { Memo } from "@/types/proto/api/v1/memo_service_pb";
6-
import { MemoRelation_Type } from "@/types/proto/api/v1/memo_service_pb";
75
import { isSuperUser } from "@/utils/user";
8-
import { RELATIVE_TIME_THRESHOLD_MS } from "../constants";
96

107
export const useMemoViewDerivedState = (memo: Memo, parentPageProp?: string) => {
118
const location = useLocation();
129
const user = useCurrentUser();
1310

14-
const commentAmount = memo.relations.filter(
15-
(relation) => relation.type === MemoRelation_Type.COMMENT && relation.relatedMemo?.name === memo.name,
16-
).length;
17-
18-
const displayTime = memo.displayTime ? timestampDate(memo.displayTime) : undefined;
19-
const relativeTimeFormat: "datetime" | "auto" =
20-
displayTime && Date.now() - displayTime.getTime() > RELATIVE_TIME_THRESHOLD_MS ? "datetime" : "auto";
21-
2211
const isArchived = memo.state === State.ARCHIVED;
2312
const readonly = memo.creator !== user?.name && !isSuperUser(user);
24-
const isInMemoDetailPage = location.pathname.startsWith(`/${memo.name}`);
2513
const parentPage = parentPageProp || location.pathname;
2614

27-
return { commentAmount, relativeTimeFormat, isArchived, readonly, isInMemoDetailPage, parentPage };
15+
return { isArchived, readonly, parentPage };
2816
};

0 commit comments

Comments
 (0)