Skip to content

Commit 10bfdac

Browse files
committed
fix: looping on mqtt connect
1 parent f636314 commit 10bfdac

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

src/WorkflowManager.tsx

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';
1+
import React, {
2+
FC,
3+
useCallback,
4+
useEffect,
5+
useMemo,
6+
useRef,
7+
useState,
8+
} from 'react';
29

310
import { MqttClient, connect } from 'mqtt-browser';
411
import invariant from 'tiny-warning';
@@ -13,22 +20,25 @@ export const WorkflowManager: FC<WorkflowManagerProps> = ({
1320
options,
1421
children,
1522
}) => {
23+
const connectionOpen = useRef(false);
24+
1625
const [client, setClient] = useState<MqttClient | null>(null);
1726
const [status, setStatus] = useState<IMqttContext['status']>('offline');
1827
const [error, setError] = useState<IMqttContext['error']>(null);
1928

2029
const init = useCallback(() => {
21-
if (!client) {
30+
if (!client && !connectionOpen.current) {
31+
connectionOpen.current = true;
32+
2233
try {
2334
const mqttInstance = connect(brokerUrl, options);
2435

2536
mqttInstance.on('connect', () => {
2637
if (status !== 'connected') setStatus('connected');
27-
setStatus('connected');
2838
});
2939

3040
mqttInstance.on('end', () => {
31-
setStatus('offline');
41+
if (status !== 'offline') setStatus('offline');
3242
});
3343

3444
mqttInstance.on('offline', () => {
@@ -37,12 +47,12 @@ export const WorkflowManager: FC<WorkflowManagerProps> = ({
3747

3848
mqttInstance.on('error', () => {
3949
if (status !== 'error') setStatus('error');
50+
setError(new Error(ERROR_MESSAGES.ERROR_OCURRED));
4051
invariant(false, ERROR_MESSAGES.ERROR_OCURRED);
4152
});
4253

4354
mqttInstance.on('reconnect', () => {
4455
if (status !== 'reconnecting') setStatus('reconnecting');
45-
setStatus('reconnecting');
4656
});
4757

4858
setClient(mqttInstance);
@@ -59,6 +69,17 @@ export const WorkflowManager: FC<WorkflowManagerProps> = ({
5969
init();
6070
}, [init]);
6171

72+
useEffect(() => {
73+
return () => {
74+
if (client) {
75+
client.end();
76+
setClient(null);
77+
78+
connectionOpen.current = false;
79+
}
80+
};
81+
}, [client]);
82+
6283
const providerValue = useMemo(() => {
6384
return { client, status, error };
6485
}, [client, status, error]);

0 commit comments

Comments
 (0)