import "@ethersproject/shims"; import React, { useEffect, useState } from "react"; import "./App.css"; import { Waku } from "js-waku"; import { KeyPair, PublicKeyMessageEncryptionKey } from "./crypto"; import { Message } from "./messaging/Messages"; import "fontsource-roboto"; import { AppBar, IconButton, Toolbar, Typography } from "@material-ui/core"; import KeyPairHandling from "./key_pair_handling/KeyPairHandling"; import { createMuiTheme, ThemeProvider, makeStyles, } from "@material-ui/core/styles"; import { teal, purple, green } 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 ConnectWallet from "./ConnectWallet"; const theme = createMuiTheme({ palette: { primary: { main: purple[500], }, secondary: { main: teal[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 [provider, setProvider] = useState(); const [encryptionKeyPair, setEncryptionKeyPair] = useState< KeyPair | undefined >(); 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.addDecryptionKey(PublicKeyMessageEncryptionKey); waku.relay.addObserver(observerPublicKeyMessage, [PublicKeyContentTopic]); return function cleanUp() { if (!waku) return; waku.relay.deleteDecryptionKey(PublicKeyMessageEncryptionKey); waku.relay.deleteObserver(observerPublicKeyMessage, [ PublicKeyContentTopic, ]); }; }, [waku, address]); useEffect(() => { if (!waku) return; if (!encryptionKeyPair) return; waku.relay.addDecryptionKey(encryptionKeyPair.privateKey); return function cleanUp() { if (!waku) return; if (!encryptionKeyPair) return; waku.relay.deleteDecryptionKey(encryptionKeyPair.privateKey); }; }, [waku, encryptionKeyPair]); useEffect(() => { if (!waku) return; if (!encryptionKeyPair) return; if (!address) return; const observerPrivateMessage = handlePrivateMessage.bind( {}, setMessages, address ); waku.relay.addObserver(observerPrivateMessage, [ PrivateMessageContentTopic, ]); return function cleanUp() { if (!waku) return; if (!observerPrivateMessage) return; waku.relay.deleteObserver(observerPrivateMessage, [ PrivateMessageContentTopic, ]); }; }, [waku, address, encryptionKeyPair]); useEffect(() => { if (!waku) return; const interval = setInterval(async () => { let lightPushPeers = 0; // eslint-disable-next-line @typescript-eslint/no-unused-vars for await (const _peer of waku.store.peers) { lightPushPeers++; } setPeerStats({ relayPeers: waku.relay.getPeers().size, lightPushPeers, }); }, 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 {addressDisplay}
Wallet
Encryption Key Pair
Messaging
); } export default App;