import './App.css'; import { Waku } from 'js-waku'; import * as React from 'react'; import protons from 'protons'; const ContentTopic = '/toy-chat/2/huilong/proto'; const proto = protons(` message ChatMessage { uint64 timestamp = 1; string nick = 2; bytes text = 3; } `); function App() { const [waku, setWaku] = React.useState(undefined); const [wakuStatus, setWakuStatus] = React.useState('None'); const [messages, setMessages] = React.useState([]); React.useEffect(() => { if (wakuStatus !== 'None') return; setWakuStatus('Starting'); Waku.create({ bootstrap: true }).then((waku) => { setWaku(waku); setWakuStatus('Connecting'); }); }, [waku, wakuStatus]); React.useEffect(() => { if (!waku) return; // We do not handle disconnection/re-connection in this example if (wakuStatus === 'Connected') return; waku.waitForConnectedPeer().then(() => { // We are now connected to a store node setWakuStatus('Connected'); }); }, [waku, wakuStatus]); React.useEffect(() => { if (wakuStatus !== 'Connected') return; const processMessages = (retrievedMessages) => { const messages = retrievedMessages.map(decodeMessage).filter(Boolean); setMessages((currentMessages) => { return currentMessages.concat(messages.reverse()); }); }; waku.store .queryHistory([ContentTopic], { callback: processMessages }) .catch((e) => { console.log('Failed to retrieve messages', e); }); }, [waku, wakuStatus]); return (

{wakuStatus}

Messages

); } export default App; function decodeMessage(wakuMessage) { if (!wakuMessage.payload) return; const { timestamp, nick, text } = proto.ChatMessage.decode( wakuMessage.payload ); if (!timestamp || !text || !nick) return; const time = new Date(); time.setTime(timestamp); const utf8Text = Buffer.from(text).toString('utf-8'); return { text: utf8Text, timestamp: time, nick }; } function Messages(props) { return props.messages.map(({ text, timestamp, nick }) => { return (
  • ({formatDate(timestamp)}) {nick}: {text}
  • ); }); } function formatDate(timestamp) { return timestamp.toLocaleString([], { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit', second: '2-digit', hour12: false, }); }