diff --git a/packages/app/src/Element/Deck/Articles.tsx b/packages/app/src/Element/Deck/Articles.tsx
index 8c7eff25..7ada5d01 100644
--- a/packages/app/src/Element/Deck/Articles.tsx
+++ b/packages/app/src/Element/Deck/Articles.tsx
@@ -1,15 +1,21 @@
import { NostrLink } from "@snort/system";
+import { useReactions } from "@snort/system-react";
+
import { useArticles } from "Feed/ArticlesFeed";
import { orderDescending } from "SnortUtils";
import Note from "../Event/Note";
-import { useReactions } from "Feed/Reactions";
import { useContext } from "react";
import { DeckContext } from "Pages/DeckLayout";
export default function Articles() {
const data = useArticles();
const deck = useContext(DeckContext);
- const related = useReactions("articles:reactions", data.data?.map(v => NostrLink.fromEvent(v)) ?? []);
+ const related = useReactions(
+ "articles:reactions",
+ data.data?.map(v => NostrLink.fromEvent(v)) ?? [],
+ undefined,
+ true,
+ );
return (
<>
diff --git a/packages/app/src/Element/Event/NostrFileHeader.tsx b/packages/app/src/Element/Event/NostrFileHeader.tsx
index 94d634fe..30656d0b 100644
--- a/packages/app/src/Element/Event/NostrFileHeader.tsx
+++ b/packages/app/src/Element/Event/NostrFileHeader.tsx
@@ -1,8 +1,8 @@
import { FormattedMessage } from "react-intl";
import { NostrEvent, NostrLink } from "@snort/system";
+import { useEventFeed } from "@snort/system-react";
import { findTag } from "SnortUtils";
-import { useEventFeed } from "Feed/EventFeed";
import PageSpinner from "Element/PageSpinner";
import Reveal from "Element/Event/Reveal";
import { MediaElement } from "Element/Embed/MediaElement";
diff --git a/packages/app/src/Element/Event/NoteQuote.tsx b/packages/app/src/Element/Event/NoteQuote.tsx
index cba78dcb..e2d7c418 100644
--- a/packages/app/src/Element/Event/NoteQuote.tsx
+++ b/packages/app/src/Element/Event/NoteQuote.tsx
@@ -1,5 +1,6 @@
-import { useEventFeed } from "Feed/EventFeed";
import { NostrLink } from "@snort/system";
+import { useEventFeed } from "@snort/system-react";
+
import Note from "Element/Event/Note";
import PageSpinner from "Element/PageSpinner";
diff --git a/packages/app/src/Element/Feed/Timeline.tsx b/packages/app/src/Element/Feed/Timeline.tsx
index c8c52d08..28dae201 100644
--- a/packages/app/src/Element/Feed/Timeline.tsx
+++ b/packages/app/src/Element/Feed/Timeline.tsx
@@ -1,16 +1,13 @@
import "./Timeline.css";
import { FormattedMessage } from "react-intl";
import { useCallback, useMemo } from "react";
-import { useInView } from "react-intersection-observer";
-import { TaggedNostrEvent, EventKind, u256 } from "@snort/system";
+import { TaggedNostrEvent, EventKind } from "@snort/system";
-import Icon from "Icons/Icon";
import { dedupeByPubkey, findTag } from "SnortUtils";
-import ProfileImage from "Element/User/ProfileImage";
import useTimelineFeed, { TimelineFeed, TimelineSubject } from "Feed/TimelineFeed";
-import Note from "Element/Event/Note";
import useModeration from "Hooks/useModeration";
import { LiveStreams } from "Element/LiveStreams";
+import { TimelineRenderer } from "./TimelineFragment";
export interface TimelineProps {
postsOnly: boolean;
@@ -37,8 +34,6 @@ const Timeline = (props: TimelineProps) => {
const feed: TimelineFeed = useTimelineFeed(props.subject, feedOptions);
const { muted, isMuted } = useModeration();
- const { ref, inView } = useInView();
-
const filterPosts = useCallback(
(nts: readonly TaggedNostrEvent[]) => {
const a = [...nts.filter(a => a.kind !== EventKind.LiveEvent)];
@@ -56,12 +51,6 @@ const Timeline = (props: TimelineProps) => {
const latestFeed = useMemo(() => {
return filterPosts(feed.latest ?? []).filter(a => !mainFeed.some(b => b.id === a.id));
}, [feed, filterPosts]);
- const relatedFeed = useCallback(
- (id: u256) => {
- return (feed.related ?? []).filter(a => findTag(a, "e") === id);
- },
- [feed.related],
- );
const liveStreams = useMemo(() => {
return (feed.main ?? []).filter(a => a.kind === EventKind.LiveEvent && findTag(a, "status") === "live");
}, [feed]);
@@ -80,42 +69,12 @@ const Timeline = (props: TimelineProps) => {
return (
<>
- {latestFeed.length > 0 && (
- <>
-
onShowLatest()} ref={ref}>
- {latestAuthors.slice(0, 3).map(p => {
- return
;
- })}
-
-
-
- {!inView && (
- onShowLatest(true)}>
- {latestAuthors.slice(0, 3).map(p => {
- return
;
- })}
-
-
-
- )}
- >
- )}
- {mainFeed.map(e => (
-
- ))}
+ onShowLatest(t)}
+ />
{(props.loadMore === undefined || props.loadMore === true) && (