From 1fbc6bfb96116f808c5ce44db54153c7cfdb5436 Mon Sep 17 00:00:00 2001 From: hzrd149 Date: Fri, 30 Jun 2023 07:22:18 -0500 Subject: [PATCH] improve timeline render performance --- src/components/generric-note-timeline.tsx | 23 +++++++++++++++++++++++ src/views/hashtag/index.tsx | 9 ++------- src/views/home/following-tab.tsx | 15 +++------------ src/views/home/global-tab.tsx | 9 ++------- src/views/user/notes.tsx | 20 ++------------------ 5 files changed, 32 insertions(+), 44 deletions(-) create mode 100644 src/components/generric-note-timeline.tsx 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 = () => { - - +