diff --git a/src/components/generric-note-timeline.tsx b/src/components/generric-note-timeline.tsx
new file mode 100644
index 000000000..f91f49ad3
--- /dev/null
+++ b/src/components/generric-note-timeline.tsx
@@ -0,0 +1,23 @@
+import React from "react";
+import useSubject from "../hooks/use-subject";
+import { TimelineLoader } from "../classes/timeline-loader";
+import RepostNote from "./repost-note";
+import { Note } from "./note";
+
+const GenericNoteTimeline = React.memo(({ timeline }: { timeline: TimelineLoader }) => {
+ const notes = useSubject(timeline.timeline);
+
+ return (
+ <>
+ {notes.map((note) =>
+ note.kind === 6 ? (
+
+ ) : (
+
+ )
+ )}
+ >
+ );
+});
+
+export default GenericNoteTimeline;
diff --git a/src/views/hashtag/index.tsx b/src/views/hashtag/index.tsx
index 510e77743..63ee43ff3 100644
--- a/src/views/hashtag/index.tsx
+++ b/src/views/hashtag/index.tsx
@@ -19,7 +19,6 @@ import { useAppTitle } from "../../hooks/use-app-title";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { useTimelineLoader } from "../../hooks/use-timeline-loader";
import { isReply } from "../../helpers/nostr-event";
-import { Note } from "../../components/note";
import { CheckIcon, EditIcon, RelayIcon } from "../../components/icons";
import { useCallback, useEffect, useRef, useState } from "react";
import RelaySelectionModal from "./relay-selection-modal";
@@ -27,7 +26,7 @@ import { NostrEvent } from "../../types/nostr-event";
import TimelineActionAndStatus from "../../components/timeline-action-and-status";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import useSubject from "../../hooks/use-subject";
+import GenericNoteTimeline from "../../components/generric-note-timeline";
function EditableControls() {
const { isEditing, getSubmitButtonProps, getCancelButtonProps, getEditButtonProps } = useEditableControls();
@@ -69,8 +68,6 @@ export default function HashTagView() {
{ eventFilter }
);
- const events = useSubject(timeline.timeline);
-
const scrollBox = useRef(null);
const callback = useTimelineCurserIntersectionCallback(timeline);
@@ -118,10 +115,8 @@ export default function HashTagView() {
- {events.map((event) => (
-
- ))}
+
diff --git a/src/views/home/following-tab.tsx b/src/views/home/following-tab.tsx
index 76f129e50..78f7985fd 100644
--- a/src/views/home/following-tab.tsx
+++ b/src/views/home/following-tab.tsx
@@ -1,6 +1,5 @@
import { Button, Flex, FormControl, FormLabel, Switch } from "@chakra-ui/react";
import { useSearchParams } from "react-router-dom";
-import { Note } from "../../components/note";
import { isReply, truncatedId } from "../../helpers/nostr-event";
import { useTimelineLoader } from "../../hooks/use-timeline-loader";
import { useUserContacts } from "../../hooks/use-user-contacts";
@@ -9,13 +8,12 @@ import { useCallback, useContext, useRef } from "react";
import { PostModalContext } from "../../providers/post-modal-provider";
import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { useCurrentAccount } from "../../hooks/use-current-account";
-import RepostNote from "../../components/repost-note";
import RequireCurrentAccount from "../../providers/require-current-account";
import { NostrEvent } from "../../types/nostr-event";
import TimelineActionAndStatus from "../../components/timeline-action-and-status";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-import useSubject from "../../hooks/use-subject";
+import GenericNoteTimeline from "../../components/generric-note-timeline";
function FollowingTabBody() {
const account = useCurrentAccount()!;
@@ -44,8 +42,6 @@ function FollowingTabBody() {
{ enabled: following.length > 0, eventFilter }
);
- const events = useSubject(timeline.timeline);
-
const scrollBox = useRef(null);
const callback = useTimelineCurserIntersectionCallback(timeline);
@@ -67,13 +63,8 @@ function FollowingTabBody() {
- {events.map((event) =>
- event.kind === 6 ? (
-
- ) : (
-
- )
- )}
+
+
diff --git a/src/views/home/global-tab.tsx b/src/views/home/global-tab.tsx
index 39bb7334b..257e893fa 100644
--- a/src/views/home/global-tab.tsx
+++ b/src/views/home/global-tab.tsx
@@ -1,7 +1,6 @@
import { useCallback, useRef } from "react";
import { Flex, FormControl, FormLabel, Select, Switch, useDisclosure } from "@chakra-ui/react";
import { useSearchParams } from "react-router-dom";
-import { Note } from "../../components/note";
import { unique } from "../../helpers/array";
import { isReply } from "../../helpers/nostr-event";
import { useAppTitle } from "../../hooks/use-app-title";
@@ -9,9 +8,9 @@ import { useReadRelayUrls } from "../../hooks/use-client-relays";
import { useTimelineLoader } from "../../hooks/use-timeline-loader";
import { NostrEvent } from "../../types/nostr-event";
import TimelineActionAndStatus from "../../components/timeline-action-and-status";
-import useSubject from "../../hooks/use-subject";
import IntersectionObserverProvider from "../../providers/intersection-observer";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
+import GenericNoteTimeline from "../../components/generric-note-timeline";
export default function GlobalTab() {
useAppTitle("global");
@@ -42,8 +41,6 @@ export default function GlobalTab() {
{ eventFilter }
);
- const events = useSubject(timeline.timeline);
-
const scrollBox = useRef(null);
const callback = useTimelineCurserIntersectionCallback(timeline);
@@ -72,10 +69,8 @@ export default function GlobalTab() {
- {events.map((event) => (
-
- ))}
+
diff --git a/src/views/user/notes.tsx b/src/views/user/notes.tsx
index 378a0dee2..afecfc459 100644
--- a/src/views/user/notes.tsx
+++ b/src/views/user/notes.tsx
@@ -14,22 +14,7 @@ import TimelineActionAndStatus from "../../components/timeline-action-and-status
import IntersectionObserverProvider from "../../providers/intersection-observer";
import { TimelineLoader } from "../../classes/timeline-loader";
import { useTimelineCurserIntersectionCallback } from "../../hooks/use-timeline-cursor-intersection-callback";
-
-const NoteTimeline = React.memo(({ timeline }: { timeline: TimelineLoader }) => {
- const notes = useSubject(timeline.timeline);
-
- return (
- <>
- {notes.map((note) =>
- note.kind === 6 ? (
-
- ) : (
-
- )
- )}
- >
- );
-});
+import GenericNoteTimeline from "../../components/generric-note-timeline";
const UserNotesTab = () => {
const { pubkey } = useOutletContext() as { pubkey: string };
@@ -76,8 +61,7 @@ const UserNotesTab = () => {
-
-
+