import "./ChatPage.css"; import { KeyboardEvent, useEffect, useMemo, useRef, useState } from "react"; import { useSelector } from "react-redux"; import { useParams } from "react-router-dom"; import { useInView } from 'react-intersection-observer'; import ProfileImage from "../element/ProfileImage"; import { bech32ToHex } from "../Util"; import useEventPublisher from "../feed/EventPublisher"; import DM from "../element/DM"; import { RawEvent } from "../nostr"; import { dmsInChat, isToSelf } from "./MessagesPage"; import NoteToSelf from "../element/NoteToSelf"; type RouterParams = { id: string } export default function ChatPage() { const params = useParams(); const publisher = useEventPublisher(); const id = bech32ToHex(params.id ?? ""); const pubKey = useSelector(s => s.login.publicKey); const dms = useSelector(s => filterDms(s.login.dms)); const [content, setContent] = useState(); const { ref, inView, entry } = useInView(); const dmListRef = useRef(null); function filterDms(dms: RawEvent[]) { return dmsInChat(id === pubKey ? dms.filter(d => isToSelf(d, pubKey)) : dms, id); } const sortedDms = useMemo(() => { return [...dms].sort((a, b) => a.created_at - b.created_at) }, [dms]); useEffect(() => { if (inView && dmListRef.current) { dmListRef.current.scroll(0, dmListRef.current.scrollHeight); } }, [inView, dmListRef, sortedDms]); async function sendDm() { if (content) { let ev = await publisher.sendDm(content, id); console.debug(ev); publisher.broadcast(ev); setContent(""); } } async function onEnter(e: KeyboardEvent) { let isEnter = e.code === "Enter"; if (isEnter && !e.shiftKey) { await sendDm(); } } return ( <> {id === pubKey && ( ) || ( )}
{sortedDms.map(a => )}
sendDm()}>Send
) }