import { multiaddr } from 'multiaddr'; import PeerId from 'peer-id'; import React, { useEffect, useState } from 'react'; import './App.css'; import { ChatMessage } from 'waku-chat/chat_message'; import { WakuMessage } from 'waku/waku_message'; import { RelayDefaultTopic } from 'waku/waku_relay'; import handleCommand from './command'; import Room from './Room'; import Waku from 'waku/waku'; import { WakuContext } from './WakuContext'; import { generate } from 'server-name-generator'; export const ChatContentTopic = 'dingpu'; export default function App() { let [stateMessages, setMessages] = useState([]); let [stateWaku, setWaku] = useState(undefined); let [nick, setNick] = useState(generate()); useEffect(() => { const handleNewMessages = (event: { data: Uint8Array }) => { const chatMsg = decodeWakuMessage(event.data); if (chatMsg) { copyAndReplace([chatMsg], stateMessages, setMessages); } }; if (!stateWaku) { initWaku(setWaku) .then(() => console.log('Waku init done')) .catch((e) => console.log('Waku init failed ', e)); } else { stateWaku.libp2p.pubsub.on(RelayDefaultTopic, handleNewMessages); // To clean up listener when component unmounts return () => { stateWaku?.libp2p.pubsub.removeListener( RelayDefaultTopic, handleNewMessages ); }; } }, [stateWaku, stateMessages]); return (
{ const { command, response } = handleCommand( input, stateWaku, setNick ); const commandMessages = response.map((msg) => { return new ChatMessage(new Date(), command, msg); }); copyAndReplace(commandMessages, stateMessages, setMessages); }} />
); } async function initWaku(setter: (waku: Waku) => void) { try { const waku = await Waku.create({ config: { pubsub: { enabled: true, emitSelf: true, }, }, }); setter(waku); // FIXME: Connect to a go-waku instance by default, temporary hack until // we have a go-waku instance in the fleet waku.libp2p.peerStore.addressBook.add( PeerId.createFromB58String( '16Uiu2HAmVVi6Q4j7MAKVibquW8aA27UNrA4Q8Wkz9EetGViu8ZF1' ), [multiaddr('/ip4/134.209.113.86/tcp/9001/ws')] ); } catch (e) { console.log('Issue starting waku ', e); } } function decodeWakuMessage(data: Uint8Array): null | ChatMessage { const wakuMsg = WakuMessage.decode(data); if (!wakuMsg.payload) { return null; } return ChatMessage.decode(wakuMsg.payload); } function copyAndReplace( newValues: Array, currentValues: Array, setter: (val: Array) => void ) { const copy = currentValues.slice(); setter(copy.concat(newValues)); }