From 8dc0c2837722b41b100a7a82b504756c7b19509f Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Wed, 6 Dec 2023 11:29:14 +0200 Subject: [PATCH] spotlight media & thread modals --- .../app/src/Element/Feed/TimelineRenderer.tsx | 14 ++++- packages/app/src/Element/Modal.tsx | 3 +- .../src/Element/Spotlight/SpotlightMedia.css | 46 --------------- .../src/Element/Spotlight/SpotlightMedia.tsx | 22 +++++--- .../Spotlight/SpotlightThreadModal.tsx | 12 ++-- packages/app/src/Pages/Deck.css | 56 ------------------- 6 files changed, 36 insertions(+), 117 deletions(-) delete mode 100644 packages/app/src/Element/Spotlight/SpotlightMedia.css diff --git a/packages/app/src/Element/Feed/TimelineRenderer.tsx b/packages/app/src/Element/Feed/TimelineRenderer.tsx index ce64671b..62ca60c5 100644 --- a/packages/app/src/Element/Feed/TimelineRenderer.tsx +++ b/packages/app/src/Element/Feed/TimelineRenderer.tsx @@ -3,12 +3,13 @@ import ProfileImage from "@/Element/User/ProfileImage"; import { FormattedMessage } from "react-intl"; import Icon from "@/Icons/Icon"; import { NostrLink, TaggedNostrEvent } from "@snort/system"; -import { ReactNode } from "react"; +import { ReactNode, useState } from "react"; import { TimelineFragment } from "@/Element/Feed/TimelineFragment"; import { transformTextCached } from "@/Hooks/useTextTransformCache"; import useImgProxy from "@/Hooks/useImgProxy"; import { Link } from "react-router-dom"; import { DisplayAs } from "@/Element/Feed/DisplayAsSelector"; +import { SpotlightThreadModal } from "@/Element/Spotlight/SpotlightThreadModal"; export interface TimelineRendererProps { frags: Array; @@ -27,6 +28,7 @@ export interface TimelineRendererProps { export function TimelineRenderer(props: TimelineRendererProps) { const { ref, inView } = useInView(); const { proxy } = useImgProxy(); + const [modalThread, setModalThread] = useState(undefined); const renderNotes = () => { return props.frags.map(frag => ( @@ -57,6 +59,9 @@ export function TimelineRenderer(props: TimelineRendererProps) { if (props.noteOnClick) { props.noteOnClick(e); clickEvent.preventDefault(); + } else if (window.innerWidth >= 768) { + setModalThread(NostrLink.fromEvent(e)); + clickEvent.preventDefault(); } }; @@ -118,6 +123,13 @@ export function TimelineRenderer(props: TimelineRendererProps) { )} {props.displayAs === "grid" ? renderGrid() : renderNotes()} + {modalThread && ( + setModalThread(undefined)} + onBack={() => setModalThread(undefined)} + /> + )} ); } diff --git a/packages/app/src/Element/Modal.tsx b/packages/app/src/Element/Modal.tsx index c3744dda..a2bf6f8b 100644 --- a/packages/app/src/Element/Modal.tsx +++ b/packages/app/src/Element/Modal.tsx @@ -5,6 +5,7 @@ import { ReactNode, useEffect } from "react"; export interface ModalProps { id: string; className?: string; + bodyClassName?: string; onClose?: (e: React.MouseEvent | KeyboardEvent) => void; onClick?: (e: React.MouseEvent) => void; children: ReactNode; @@ -60,7 +61,7 @@ export default function Modal(props: ModalProps) { return createPortal(
-
+
{ e.stopPropagation(); diff --git a/packages/app/src/Element/Spotlight/SpotlightMedia.css b/packages/app/src/Element/Spotlight/SpotlightMedia.css deleted file mode 100644 index ed19150a..00000000 --- a/packages/app/src/Element/Spotlight/SpotlightMedia.css +++ /dev/null @@ -1,46 +0,0 @@ -.modal.spotlight .modal-body { - border: none; - border-radius: unset; - width: unset; - height: unset; - padding: 0; - display: flex; - align-items: center; - justify-content: center; - background: transparent; -} - -.spotlight img, -.spotlight video { - max-width: 100vw !important; - max-height: 99vh !important; - aspect-ratio: unset !important; - width: unset !important; -} - -.spotlight .details { - text-align: right; - position: absolute; - top: 28px; - right: 28px; - gap: 18px; - display: flex; - font-size: 15px; - font-weight: 400; - line-height: 24px; - align-items: center; - user-select: none; -} - -.spotlight .left { - position: absolute; - left: 24px; - top: 50vh; - transform: rotate(180deg); -} - -.spotlight .right { - position: absolute; - right: 24px; - top: 50vh; -} diff --git a/packages/app/src/Element/Spotlight/SpotlightMedia.tsx b/packages/app/src/Element/Spotlight/SpotlightMedia.tsx index 258e154c..567b4d78 100644 --- a/packages/app/src/Element/Spotlight/SpotlightMedia.tsx +++ b/packages/app/src/Element/Spotlight/SpotlightMedia.tsx @@ -1,4 +1,3 @@ -import "./SpotlightMedia.css"; import { useEffect, useMemo, useState } from "react"; import Modal from "@/Element/Modal"; import Icon from "@/Icons/Icon"; @@ -60,16 +59,16 @@ export function SpotlightMedia(props: SpotlightMediaProps) { } return ( -
- -
- {props.images.length > 1 && `${idx + 1}/${props.images.length}`} + <> + +
+ {props.images.length > 1 && `${idx + 1}/${props.images.length}`}
{props.images.length > 1 && ( <> { @@ -78,7 +77,7 @@ export function SpotlightMedia(props: SpotlightMediaProps) { }} /> { @@ -88,13 +87,18 @@ export function SpotlightMedia(props: SpotlightMediaProps) { /> )} -
+ ); } export function SpotlightMediaModal(props: SpotlightMediaProps) { return ( - + ); diff --git a/packages/app/src/Element/Spotlight/SpotlightThreadModal.tsx b/packages/app/src/Element/Spotlight/SpotlightThreadModal.tsx index 705250d9..e7586704 100644 --- a/packages/app/src/Element/Spotlight/SpotlightThreadModal.tsx +++ b/packages/app/src/Element/Spotlight/SpotlightThreadModal.tsx @@ -11,11 +11,15 @@ export function SpotlightThreadModal(props: { thread: NostrLink; onClose?: () => const onBack = () => props.onBack?.(); return ( - + - -
- +
+
+ +
+
+ +
diff --git a/packages/app/src/Pages/Deck.css b/packages/app/src/Pages/Deck.css index 8d2481eb..5143a3db 100644 --- a/packages/app/src/Pages/Deck.css +++ b/packages/app/src/Pages/Deck.css @@ -36,59 +36,3 @@ .deck-layout .deck-cols > div > div:not(:first-of-type) { overflow-y: scroll; } - -.modal.thread-overlay > .modal-body { - background-color: unset; - padding: 0; - width: 100vw; - height: 100vh; - --border-color: #3a3a3a; -} - -.modal.thread-overlay > .modal-body > div { - display: flex; - flex-direction: row; - border-radius: unset; - justify-content: center; - gap: 16px; -} - -.modal.thread-overlay.thread > .modal-body > div > div:last-of-type { - width: 550px; - min-width: 550px; - height: 100vh; - overflow-y: auto; - background-color: var(--gray-superdark); -} - -.modal.thread-overlay.long-form > .modal-body > div > div:last-of-type { - width: 660px; - height: calc(100vh - 48px); - padding: 48px 56px 0 56px; - overflow-y: auto; - background-color: var(--gray-superdark); -} - -.thread-overlay .spotlight { - flex-grow: 1; - margin: auto; - text-align: center; -} - -.thread-overlay .spotlight .details { - right: calc(28px + 550px + 16px); -} - -.thread-overlay .spotlight .right { - right: calc(24px + 550px + 16px); -} - -.thread-overlay .spotlight img, -.thread-overlay .spotlight video { - max-width: calc(100vw - 550px - 16px); -} - -.thread-overlay .main-content { - border: 0; - border-bottom: 1px solid var(--border-color); -}