diff --git a/src/components/nostr/ChatView.tsx b/src/components/nostr/ChatView.tsx index 0e97a3c..9badf81 100644 --- a/src/components/nostr/ChatView.tsx +++ b/src/components/nostr/ChatView.tsx @@ -91,9 +91,10 @@ export function ChatView({ events, className }: ChatViewProps) { } function ChatMessage({ event }: { event: NostrEvent }) { - const threadRefs = useMemo(() => getNip10References(event), [event]); + // Both helpers cache internally, no useMemo needed + const threadRefs = getNip10References(event); const replyToId = threadRefs.reply?.e?.id; - const qTagValue = useMemo(() => getTagValue(event, "q"), [event]); + const qTagValue = getTagValue(event, "q"); return (
diff --git a/src/components/nostr/kinds/ArticleRenderer.tsx b/src/components/nostr/kinds/ArticleRenderer.tsx index 7467b8c..f13c057 100644 --- a/src/components/nostr/kinds/ArticleRenderer.tsx +++ b/src/components/nostr/kinds/ArticleRenderer.tsx @@ -1,4 +1,3 @@ -import { useMemo } from "react"; import { BaseEventContainer, BaseEventProps, @@ -12,10 +11,11 @@ import { /** * Renderer for Kind 30023 - Long-form Article * Displays article title and summary in feed + * Note: getArticleTitle and getArticleSummary cache internally, no useMemo needed */ export function Kind30023Renderer({ event }: BaseEventProps) { - const title = useMemo(() => getArticleTitle(event), [event]); - const summary = useMemo(() => getArticleSummary(event), [event]); + const title = getArticleTitle(event); + const summary = getArticleSummary(event); return ( diff --git a/src/components/nostr/kinds/CodeSnippetDetailRenderer.tsx b/src/components/nostr/kinds/CodeSnippetDetailRenderer.tsx index f118784..daada5d 100644 --- a/src/components/nostr/kinds/CodeSnippetDetailRenderer.tsx +++ b/src/components/nostr/kinds/CodeSnippetDetailRenderer.tsx @@ -29,19 +29,21 @@ interface Kind1337DetailRendererProps { /** * Detail renderer for Kind 1337 - Code Snippet (NIP-C0) * Full view with all metadata and complete code + * Note: NIP-C0 helpers wrap getTagValue which caches internally */ export function Kind1337DetailRenderer({ event }: Kind1337DetailRendererProps) { const { addWindow } = useGrimoire(); const { copy, copied } = useCopy(); - const name = useMemo(() => getCodeName(event), [event]); - const language = useMemo(() => getCodeLanguage(event), [event]); - const extension = useMemo(() => getCodeExtension(event), [event]); - const description = useMemo(() => getCodeDescription(event), [event]); - const runtime = useMemo(() => getCodeRuntime(event), [event]); - const licenses = useMemo(() => getCodeLicenses(event), [event]); - const dependencies = useMemo(() => getCodeDependencies(event), [event]); - const repo = useMemo(() => getCodeRepo(event), [event]); + // All these helpers wrap getTagValue, which caches internally + const name = getCodeName(event); + const language = getCodeLanguage(event); + const extension = getCodeExtension(event); + const description = getCodeDescription(event); + const runtime = getCodeRuntime(event); + const licenses = getCodeLicenses(event); + const dependencies = getCodeDependencies(event); + const repo = getCodeRepo(event); // Parse NIP-34 repository address if present const repoPointer = useMemo(() => { diff --git a/src/components/nostr/kinds/HighlightDetailRenderer.tsx b/src/components/nostr/kinds/HighlightDetailRenderer.tsx index e9b7379..86f71ca 100644 --- a/src/components/nostr/kinds/HighlightDetailRenderer.tsx +++ b/src/components/nostr/kinds/HighlightDetailRenderer.tsx @@ -1,4 +1,3 @@ -import { useMemo } from "react"; import { ExternalLink } from "lucide-react"; import type { NostrEvent } from "@/types/nostr"; import { @@ -16,23 +15,18 @@ import { useGrimoire } from "@/core/state"; /** * Detail renderer for Kind 9802 - Highlight * Shows highlighted text, comment, context, and embedded source event + * Note: All applesauce helpers cache internally, no useMemo needed */ export function Kind9802DetailRenderer({ event }: { event: NostrEvent }) { const { addWindow } = useGrimoire(); - const highlightText = useMemo(() => getHighlightText(event), [event]); - const comment = useMemo(() => getHighlightComment(event), [event]); - const context = useMemo(() => getHighlightContext(event), [event]); - const sourceUrl = useMemo(() => getHighlightSourceUrl(event), [event]); + const highlightText = getHighlightText(event); + const comment = getHighlightComment(event); + const context = getHighlightContext(event); + const sourceUrl = getHighlightSourceUrl(event); // Get source event pointer (e tag) or address pointer (a tag) - const eventPointer = useMemo( - () => getHighlightSourceEventPointer(event), - [event], - ); - const addressPointer = useMemo( - () => getHighlightSourceAddressPointer(event), - [event], - ); + const eventPointer = getHighlightSourceEventPointer(event); + const addressPointer = getHighlightSourceAddressPointer(event); // Format created date const createdDate = new Date(event.created_at * 1000).toLocaleDateString( diff --git a/src/components/nostr/kinds/HighlightRenderer.tsx b/src/components/nostr/kinds/HighlightRenderer.tsx index 3b4a412..94f89f1 100644 --- a/src/components/nostr/kinds/HighlightRenderer.tsx +++ b/src/components/nostr/kinds/HighlightRenderer.tsx @@ -1,4 +1,3 @@ -import { useMemo } from "react"; import { BaseEventContainer, BaseEventProps } from "./BaseEventRenderer"; import { ExternalLink } from "lucide-react"; import { @@ -18,36 +17,28 @@ import { KindBadge } from "@/components/KindBadge"; /** * Renderer for Kind 9802 - Highlight * Displays highlighted text with optional comment, compact source event preview, and source URL + * Note: All applesauce helpers cache internally, no useMemo needed */ export function Kind9802Renderer({ event }: BaseEventProps) { const { addWindow } = useGrimoire(); - const highlightText = useMemo(() => getHighlightText(event), [event]); - const sourceUrl = useMemo(() => getHighlightSourceUrl(event), [event]); - const comment = useMemo(() => getHighlightComment(event), [event]); + const highlightText = getHighlightText(event); + const sourceUrl = getHighlightSourceUrl(event); + const comment = getHighlightComment(event); // Get source event pointer (e tag) or address pointer (a tag) for Nostr event references - const eventPointer = useMemo( - () => getHighlightSourceEventPointer(event), - [event], - ); - const addressPointer = useMemo( - () => getHighlightSourceAddressPointer(event), - [event], - ); + const eventPointer = getHighlightSourceEventPointer(event); + const addressPointer = getHighlightSourceAddressPointer(event); // Load the source event for preview const sourceEvent = useNostrEvent(eventPointer || addressPointer); - // Extract title or content preview from source event - const sourcePreview = useMemo(() => { + // Extract title or content preview from source event (getArticleTitle caches internally) + const sourcePreview = (() => { if (!sourceEvent) return null; - const title = getArticleTitle(sourceEvent); if (title) return title; - - // Fall back to content return sourceEvent.content || null; - }, [sourceEvent]); + })(); // Handle click to open source event const handleOpenEvent = () => {