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 = () => {