import { ReactNode, useCallback } from "react"; import { FormattedMessage } from "react-intl"; import { useInView } from "react-intersection-observer"; import { TaggedNostrEvent } from "@snort/system"; import Note from "@/Element/Event/Note"; import ProfileImage from "@/Element/User/ProfileImage"; import Icon from "@/Icons/Icon"; import { findTag } from "@/SnortUtils"; export interface TimelineFragment { events: Array; refTime: number; title?: ReactNode; } export interface TimelineRendererProps { frags: Array; related: Array; /** * List of pubkeys who have posted recently */ latest: Array; showLatest: (toTop: boolean) => void; noteRenderer?: (ev: TaggedNostrEvent) => ReactNode; noteOnClick?: (ev: TaggedNostrEvent) => void; noteContext?: (ev: TaggedNostrEvent) => ReactNode; } export function TimelineRenderer(props: TimelineRendererProps) { const { ref, inView } = useInView(); return ( <> {props.latest.length > 0 && ( <>
props.showLatest(false)} ref={ref}> {props.latest.slice(0, 3).map(p => { return ; })}
{!inView && (
props.showLatest(true)}> {props.latest.slice(0, 3).map(p => { return ; })}
)} )} {props.frags.map(f => ( ))} ); } export interface TimelineFragProps { frag: TimelineFragment; related: Array; noteRenderer?: (ev: TaggedNostrEvent) => ReactNode; noteOnClick?: (ev: TaggedNostrEvent) => void; noteContext?: (ev: TaggedNostrEvent) => ReactNode; } export function TimelineFragment(props: TimelineFragProps) { const relatedFeed = useCallback( (id: string) => { return props.related.filter(a => findTag(a, "e") === id); }, [props.related], ); return ( <> {props.frag.title} {props.frag.events.map( e => props.noteRenderer?.(e) ?? ( ), )} ); }