From c4273b9bdf4710d9ff912fac37819aa858d0fa91 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Tue, 28 Nov 2023 20:57:19 +0200 Subject: [PATCH] image grid --- .../app/src/Element/Feed/TimelineRenderer.tsx | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/packages/app/src/Element/Feed/TimelineRenderer.tsx b/packages/app/src/Element/Feed/TimelineRenderer.tsx index f71f08a8..df6676c3 100644 --- a/packages/app/src/Element/Feed/TimelineRenderer.tsx +++ b/packages/app/src/Element/Feed/TimelineRenderer.tsx @@ -2,9 +2,11 @@ import { useInView } from "react-intersection-observer"; import ProfileImage from "@/Element/User/ProfileImage"; import { FormattedMessage } from "react-intl"; import Icon from "@/Icons/Icon"; -import { TaggedNostrEvent } from "@snort/system"; +import {TaggedNostrEvent} from "@snort/system"; import { ReactNode } from "react"; import { TimelineFragment } from "@/Element/Feed/TimelineFragment"; +import {transformTextCached} from "@/Hooks/useTextTransformCache"; +import useImgProxy from "@/Hooks/useImgProxy"; export interface TimelineRendererProps { frags: Array; @@ -17,10 +19,49 @@ export interface TimelineRendererProps { noteRenderer?: (ev: TaggedNostrEvent) => ReactNode; noteOnClick?: (ev: TaggedNostrEvent) => void; noteContext?: (ev: TaggedNostrEvent) => ReactNode; + displayAs?: "grid" | "feed"; } export function TimelineRenderer(props: TimelineRendererProps) { const { ref, inView } = useInView(); + const { proxy } = useImgProxy(); + + const renderNotes = () => { + return props.frags.map(frag => ( + + )); + }; + + const renderGrid = () => { + const noteImageRenderer = (e: TaggedNostrEvent) => { + const parsed = transformTextCached(e.id, e.content, e.tags); + const images = parsed.filter(a => a.type === "media" && a.mimeType?.startsWith("image/")); + if (images.length === 0) return null; + + return ( +
props.noteOnClick?.(e)} + >
+ ); + }; + + const noteRenderer = props.noteRenderer || noteImageRenderer; + + return props.frags.map(frag => ( +
+ {frag.events.map(event => noteRenderer(event))} +
+ )); + }; return ( <> @@ -54,15 +95,7 @@ export function TimelineRenderer(props: TimelineRendererProps) { )} )} - {props.frags.map(f => ( - - ))} + {props.displayAs === "grid" ? renderGrid() : renderNotes()} ); }