import "@ethersproject/shims"; import React, { useEffect, useState } from "react"; import "./App.css"; import { Waku } from "js-waku"; 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 [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(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 with Wallet Encryption {addressDisplay}
Wallet
Encryption Keys
Messaging
); } export default App;