rsnext/examples/with-mqtt-js/pages/index.js
Sebastian König 5fc8d48732
Added with-mqtt-js example (#17939)
* Added with-mqtt-js example

* Fixed eslint/prettier errors

* Update README.md

* Updated with-mqtt-js to latest next/react versions, WIP: Refactoring useMqtt()

* A2PC

* Working example, unrefactored

* A2PC

* Ran prettier

* Used NEXT_PUBLIC_ prefix instead of keys as props

* Updated readme and added .env.local.example

Co-authored-by: Sebastian König <sebastian_koenig@cotyinc.com>
Co-authored-by: Luis Alvarez D <luis@vercel.com>
2021-01-06 12:06:56 -05:00

62 lines
1.7 KiB
JavaScript

import { useState, useRef } from 'react'
import useMqtt from '../lib/useMqtt'
export default function Home() {
const [incommingMessages, setIncommingMessages] = useState([])
const addMessage = (message) => {
setIncommingMessages((incommingMessages) => [...incommingMessages, message])
}
const clearMessages = () => {
setIncommingMessages(() => [])
}
const incommingMessageHandlers = useRef([
{
topic: 'topic1',
handler: (msg) => {
addMessage(msg)
},
},
])
const mqttClientRef = useRef(null)
const setMqttClient = (client) => {
mqttClientRef.current = client
}
useMqtt({
uri: process.env.NEXT_PUBLIC_MQTT_URI,
options: {
username: process.env.NEXT_PUBLIC_MQTT_USERNAME,
password: process.env.NEXT_PUBLIC_MQTT_PASSWORD,
clientId: process.env.NEXT_PUBLIC_MQTT_CLIENTID,
},
topicHandlers: incommingMessageHandlers.current,
onConnectedHandler: (client) => setMqttClient(client),
})
const publishMessages = (client) => {
if (!client) {
console.log('(publishMessages) Cannot publish, mqttClient: ', client)
return
}
client.publish('topic1', '1st message from component')
}
return (
<div>
<h2>Subscribed Topics</h2>
{incommingMessageHandlers.current.map((i) => (
<p key={Math.random()}>{i.topic}</p>
))}
<h2>Incomming Messages:</h2>
{incommingMessages.map((m) => (
<p key={Math.random()}>{m.payload.toString()}</p>
))}
<button onClick={() => publishMessages(mqttClientRef.current)}>
Publish Test Messages
</button>
<button onClick={() => clearMessages()}>Clear Test Messages</button>
</div>
)
}