import { h } from 'preact'; import { useEffect, useRef, useState } from 'preact/hooks'; import { useAsyncMemo } from 'vibin-hooks'; import { query, QUERY_MESSAGES } from './Graph'; import { Message, Contact, Conversation } from 'common/graph/type'; import ConversationMessage from './ConversationMessage'; import { mergeClasses } from './Util'; interface Props { accountId: string; contacts: Contact[]; conversation: Conversation; } export default function ConversationView({ accountId, conversation, contacts }: Props) { const scrollRef = useRef(null); const [ bottom, setBottom ] = useState(false); useEffect(() => { let elem = scrollRef.current!; let scrolled = true; const callback = () => scrolled = true; elem.addEventListener('scroll', callback); window.addEventListener('resize', callback); const test = () => { if (!scrolled) return; setBottom(elem.scrollHeight <= elem.offsetHeight || elem.scrollTop + elem.offsetHeight >= elem.scrollHeight); scrolled = false; }; test(); let interval = window.setInterval(test, 100); return () => { elem.removeEventListener('scroll', callback); window.removeEventListener('resize', callback); window.clearInterval(interval); }; }, []); const messages = useAsyncMemo(async () => { let res = (await query(QUERY_MESSAGES, { account: accountId, ids: conversation.messages })).messages!; window.requestAnimationFrame(() => scrollRef.current!.scrollTo({ top: scrollRef.current!.scrollHeight })); return res; }, [ conversation.lastMessage, accountId ]); return (
    {(messages ?? []).map(message => )}

Send a message...

); }