import React, { useState } from 'react'; import type { IHTTPConnection, Protobuf, Types, } from '@meshtastic/meshtasticjs'; import type { LanguageEnum, languageTemplate } from './App'; import ChatMessage from './components/ChatMessage'; import MessageBox from './components/MessageBox'; import Sidebar from './components/Sidebar'; interface MainProps { connection: IHTTPConnection; myNodeInfo: Protobuf.MyNodeInfo; nodes: Types.NodeInfoPacket[]; channels: Protobuf.Channel[]; isReady: boolean; preferences: Protobuf.RadioConfig_UserPreferences; language: LanguageEnum; setLanguage: React.Dispatch>; translations: languageTemplate; darkmode: boolean; setDarkmode: React.Dispatch>; } const Main = (props: MainProps) => { const [messages, setMessages] = React.useState< { message: Types.TextPacket; ack: boolean }[] >([]); const [sidebarOpen, setSidebarOpen] = useState(false); React.useEffect(() => { const textPacketEvent = props.connection.onTextPacketEvent.subscribe( (message) => { setMessages((messages) => [ ...messages, { message: message, ack: false }, ]); }, ); return () => textPacketEvent.unsubscribe(); }, [props.connection]); React.useEffect(() => { const routingPacketEvent = props.connection.onRoutingPacketEvent.subscribe( (routingPacket) => { setMessages( messages.map((message) => { return routingPacket.packet.payloadVariant.oneofKind === 'decoded' && message.message.packet.id === routingPacket.packet.payloadVariant.decoded.requestId ? { ack: true, message: message.message, } : message; }), ); }, ); return () => routingPacketEvent.unsubscribe(); }, [props.connection, messages]); return (
{messages.length ? ( messages.map((message, Main) => ( )) ) : (
{props.translations.no_messages_message}
)}
); }; export default Main;