import { h, Fragment } from 'preact'; import { useAsyncMemo } from 'vibin-hooks'; import { useState, useLayoutEffect, useMemo } from 'preact/hooks'; import { query, QUERY_ACCOUNT, QUERY_ACCOUNTS } from './Graph'; import { ID, Contact, Conversation, AccountMeta } from 'common/graph/type'; import AccountSidebar from './AccountSidebar'; import ConversationView from './ConversationView'; import ConversationsSidebar from './ConversationsSidebar'; export default function App() { const [ activeAccount, setActiveAccount ] = useState(''); const [ contacts, setContacts ] = useState>({}); const [ conversations, setConversations ] = useState>({}); const [ activeConversation, setActiveConversation ] = useState(''); const accounts = useAsyncMemo(async () => { let accounts = (await query(QUERY_ACCOUNTS)).accounts!; setActiveAccount(accounts[0]?.id ?? ''); return accounts; }, []); const account = useMemo(() => (accounts ?? []).filter(a => a.id === activeAccount)[0], [ activeAccount, accounts === undefined ]); const conversation = useMemo(() => conversations[account?.id ?? '']?.filter(m => m.id === activeConversation)[0], [ activeConversation, account?.id ]); useLayoutEffect(() => { if (!account) return; query(QUERY_ACCOUNT, { account: account.id }).then(({ account }) => { if (!account) throw 'Missing account!'; setContacts({ ...contacts, [account.id]: account.contacts }); setConversations({ ...conversations, [account.id]: account.conversations }); setActiveConversation(account.conversations[account.conversations.length - 1].id); }); }, [ account ]); const handleSelectAccount = (id: ID) => { setActiveAccount(id); setActiveConversation(conversations[id] ? conversations[id][conversations[id].length - 1].id : ''); }; const handleSelectConversation = (id: ID) => { setActiveConversation(id); }; return (

Aether

{account &&

{account.name}

{conversation && conversation.title}

{conversation && }
}
); }