import '@ethersproject/shims'; import React, { useEffect, useState } from 'react'; import './App.css'; import { Waku } from 'js-waku'; import { Signer } from '@ethersproject/abstract-signer'; import { Message } from './messaging/Messages'; import 'fontsource-roboto'; import { AppBar, IconButton, Toolbar, Typography } from '@material-ui/core'; import { createMuiTheme, ThemeProvider, makeStyles, } from '@material-ui/core/styles'; import { lightBlue, orange, teal } from '@material-ui/core/colors'; import WifiIcon from '@material-ui/icons/Wifi'; import BroadcastPublicKey from './BroadcastPublicKey'; import Messaging from './messaging/Messaging'; import { PrivateMessageContentTopic, handlePrivateMessage, handlePublicKeyMessage, initWaku, PublicKeyContentTopic, } from './waku'; import { Web3Provider } from '@ethersproject/providers/src.ts/web3-provider'; import GetEncryptionPublicKey from './GetEncryptionPublicKey'; import ConnectWallet from './ConnectWallet'; const theme = createMuiTheme({ palette: { primary: { main: orange[500], }, secondary: { main: lightBlue[600], }, }, }); const useStyles = makeStyles({ root: { textAlign: 'center', display: 'flex', flexDirection: 'column', minHeight: '100vh', }, appBar: { // height: '200p', }, container: { display: 'flex', flex: 1, }, main: { flex: 1, margin: '10px', }, wakuStatus: { marginRight: theme.spacing(2), }, title: { flexGrow: 1, }, peers: {}, }); function App() { const [waku, setWaku] = useState(); const [signer, setSigner] = useState(); const [provider, setProvider] = useState(); const [encPublicKey, setEncPublicKey] = useState(); const [publicKeys, setPublicKeys] = useState>( new Map() ); const [messages, setMessages] = useState([]); const [address, setAddress] = useState(); const [peerStats, setPeerStats] = useState<{ relayPeers: number; lightPushPeers: number; }>({ relayPeers: 0, lightPushPeers: 0, }); const classes = useStyles(); // Waku initialization useEffect(() => { if (waku) return; initWaku() .then((_waku) => { console.log('waku: ready'); setWaku(_waku); }) .catch((e) => { console.error('Failed to initiate Waku', e); }); }, [waku]); useEffect(() => { if (!waku) return; const observerPublicKeyMessage = handlePublicKeyMessage.bind( {}, address, setPublicKeys ); waku.relay.addObserver(observerPublicKeyMessage, [PublicKeyContentTopic]); return function cleanUp() { if (!waku) return; waku.relay.deleteObserver(observerPublicKeyMessage, [ PublicKeyContentTopic, ]); }; }, [waku, address]); useEffect(() => { if (!waku) return; if (!address) return; if (!provider?.provider?.request) return; const observerPrivateMessage = handlePrivateMessage.bind( {}, setMessages, address, provider.provider.request ); waku.relay.addObserver(observerPrivateMessage, [ PrivateMessageContentTopic, ]); return function cleanUp() { if (!waku) return; if (!observerPrivateMessage) return; waku.relay.deleteObserver(observerPrivateMessage, [ PrivateMessageContentTopic, ]); }; }, [waku, address, provider?.provider?.request]); useEffect(() => { if (!waku) return; const interval = setInterval(() => { setPeerStats({ relayPeers: waku.relay.getPeers().size, lightPushPeers: waku.lightPush.peers.length, }); }, 1000); return () => clearInterval(interval); }, [waku]); let addressDisplay = ''; if (address) { addressDisplay = address.substr(0, 6) + '...' + address.substr(address.length - 4, 4); } return (
Peers: {peerStats.relayPeers} relay, {peerStats.lightPushPeers}{' '} light push Ethereum Private Message with Wallet Encryption {addressDisplay}
Wallet
Encryption Keys
Messaging
); } export default App;