From 7ee210da16a369897e2f48b88a0275ee4615cb40 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Fri, 12 Jan 2024 14:00:40 +0200 Subject: [PATCH] open reactions modal from note footer zappers list --- .../Event/Note/NoteFooter/FooterZapButton.tsx | 5 +++-- .../Event/Note/NoteFooter/NoteFooter.tsx | 7 +++++-- .../src/Components/Event/Note/NoteHeader.tsx | 2 +- .../Components/Event/Note/ReactionsModal.tsx | 18 +++++------------- .../app/src/Components/Event/ZapsSummary.tsx | 14 ++++++++++---- packages/app/src/Components/Modal/Modal.tsx | 13 +++++++++++-- .../app/src/Components/User/AvatarGroup.tsx | 4 ++-- 7 files changed, 37 insertions(+), 26 deletions(-) diff --git a/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx b/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx index 57d54225..f624cccc 100644 --- a/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx +++ b/packages/app/src/Components/Event/Note/NoteFooter/FooterZapButton.tsx @@ -20,9 +20,10 @@ import { useWallet } from "@/Wallet"; export interface ZapIconProps { ev: TaggedNostrEvent; zaps: Array; + onClickZappers?: () => void; } -export const FooterZapButton = ({ ev, zaps }: ZapIconProps) => { +export const FooterZapButton = ({ ev, zaps, onClickZappers }: ZapIconProps) => { const { publicKey, readonly, @@ -142,7 +143,7 @@ export const FooterZapButton = ({ ev, zaps }: ZapIconProps) => { value={zapTotal} onClick={fastZap} /> - + {showZapModal && ( NostrLink.fromEvent(ev), [ev.id]); const ids = useMemo(() => [link], [link]); + const [showReactions, setShowReactions] = useState(false); const related = useReactions("note:reactions", ids, undefined, false); const { reactions, zaps, reposts } = useEventReactions(link, related); @@ -35,7 +37,8 @@ export default function NoteFooter(props: NoteFooterProps) { {!readonly && } {prefs.enableReactions && } {CONFIG.showPowIcon && } - + setShowReactions(true)} /> + {showReactions && setShowReactions(false)} event={ev} />} ); } diff --git a/packages/app/src/Components/Event/Note/NoteHeader.tsx b/packages/app/src/Components/Event/Note/NoteHeader.tsx index 888267b0..0a20c963 100644 --- a/packages/app/src/Components/Event/Note/NoteHeader.tsx +++ b/packages/app/src/Components/Event/Note/NoteHeader.tsx @@ -84,7 +84,7 @@ export default function NoteHeader(props: { /> )} - + {showReactions && setShowReactions(false)} event={ev} />} ); } diff --git a/packages/app/src/Components/Event/Note/ReactionsModal.tsx b/packages/app/src/Components/Event/Note/ReactionsModal.tsx index 26451e74..77feaf94 100644 --- a/packages/app/src/Components/Event/Note/ReactionsModal.tsx +++ b/packages/app/src/Components/Event/Note/ReactionsModal.tsx @@ -2,7 +2,7 @@ import "./ReactionsModal.css"; import { NostrLink, socialGraphInstance, TaggedNostrEvent } from "@snort/system"; import { useEventReactions, useReactions } from "@snort/system-react"; -import { useEffect, useMemo, useState } from "react"; +import { useMemo, useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import CloseButton from "@/Components/Button/CloseButton"; @@ -15,14 +15,12 @@ import { formatShort } from "@/Utils/Number"; import messages from "../../messages"; interface ReactionsModalProps { - show: boolean; - setShow(b: boolean): void; + onClose(): void; event: TaggedNostrEvent; } -const ReactionsModal = ({ show, setShow, event }: ReactionsModalProps) => { +const ReactionsModal = ({ onClose, event }: ReactionsModalProps) => { const { formatMessage } = useIntl(); - const onClose = () => setShow(false); const link = NostrLink.fromEvent(event); @@ -59,12 +57,6 @@ const ReactionsModal = ({ show, setShow, event }: ReactionsModalProps) => { const [tab, setTab] = useState(tabs[0]); - useEffect(() => { - if (!show) { - setTab(tabs[0]); - } - }, [show, tabs]); - const renderReactionItem = (ev, icon, size) => (
@@ -74,7 +66,7 @@ const ReactionsModal = ({ show, setShow, event }: ReactionsModalProps) => {
); - return show ? ( + return (
@@ -110,7 +102,7 @@ const ReactionsModal = ({ show, setShow, event }: ReactionsModalProps) => { {tab.value === 3 && dislikes.map(ev => renderReactionItem(ev, "dislike"))}
- ) : null; + ); }; export default ReactionsModal; diff --git a/packages/app/src/Components/Event/ZapsSummary.tsx b/packages/app/src/Components/Event/ZapsSummary.tsx index 95c58da1..e2ea8c9c 100644 --- a/packages/app/src/Components/Event/ZapsSummary.tsx +++ b/packages/app/src/Components/Event/ZapsSummary.tsx @@ -1,13 +1,14 @@ import { ParsedZap } from "@snort/system"; -import { useMemo } from "react"; +import React, { useMemo } from "react"; import { AvatarGroup } from "@/Components/User/AvatarGroup"; import { dedupe } from "@/Utils"; interface ZapsSummaryProps { zaps: ParsedZap[]; + onClick: () => void; } -export const ZapsSummary = ({ zaps }: ZapsSummaryProps) => { +export const ZapsSummary = ({ zaps, onClick }: ZapsSummaryProps) => { const sortedZappers = useMemo(() => { const pub = [...zaps.filter(z => z.sender && z.valid)]; const priv = [...zaps.filter(z => !z.sender && z.valid)]; @@ -19,11 +20,16 @@ export const ZapsSummary = ({ zaps }: ZapsSummaryProps) => { return null; } + const myOnClick = (e: React.MouseEvent) => { + e.stopPropagation(); + onClick(); + }; + return ( -
+
- + {}} /> {zaps.length > 3 &&
+{zaps.length - 3}
}
diff --git a/packages/app/src/Components/Modal/Modal.tsx b/packages/app/src/Components/Modal/Modal.tsx index 9c2bbf98..4e44b00d 100644 --- a/packages/app/src/Components/Modal/Modal.tsx +++ b/packages/app/src/Components/Modal/Modal.tsx @@ -1,6 +1,6 @@ import "./Modal.css"; -import { ReactNode, useEffect } from "react"; +import React, { ReactNode, useEffect } from "react"; import { createPortal } from "react-dom"; export interface ModalProps { @@ -60,12 +60,21 @@ export default function Modal(props: ModalProps) { }; }, []); + const handleBackdropClick = (e: React.MouseEvent) => { + e.stopPropagation(); + props.onClose?.(e); + }; + return createPortal(
+ onMouseDown={handleBackdropClick} + onClick={e => { + e.stopPropagation(); + }}>
e.stopPropagation()} onClick={e => { e.stopPropagation(); props.onClick?.(e); diff --git a/packages/app/src/Components/User/AvatarGroup.tsx b/packages/app/src/Components/User/AvatarGroup.tsx index ce0f63bb..8c8f5b91 100644 --- a/packages/app/src/Components/User/AvatarGroup.tsx +++ b/packages/app/src/Components/User/AvatarGroup.tsx @@ -3,10 +3,10 @@ import React from "react"; import ProfileImage from "@/Components/User/ProfileImage"; -export function AvatarGroup({ ids }: { ids: HexKey[] }) { +export function AvatarGroup({ ids, onClick }: { ids: HexKey[]; onClick?: () => void }) { return ids.map((a, index) => (
0 ? "-ml-5" : ""}`} key={a} style={{ zIndex: ids.length - index }}> - +
)); }