import React, { useState } from 'react'; import type { IBLEConnection, IHTTPConnection, ISerialConnection, Protobuf, Types, } from '@meshtastic/meshtasticjs'; import ChatMessage from './components/ChatMessage'; import MessageBox from './components/MessageBox'; import Sidebar from './components/Sidebar'; import { useTranslationsContextValue } from './hooks/useTranslationsContextValue'; import { TranslationsContext } from './translations/TranslationsContext'; interface MainProps { connection: ISerialConnection | IHTTPConnection | IBLEConnection; myNodeInfo: Protobuf.MyNodeInfo; isReady: boolean; darkmode: boolean; setDarkmode: React.Dispatch>; } const Main = (props: MainProps): JSX.Element => { const translationsContextValue = useTranslationsContextValue(); const { translations } = React.useContext(TranslationsContext); 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) => ( )) ) : (
{translations.no_messages_message}
)}
); }; export default Main;