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
310import { MqttClient , connect } from 'mqtt-browser' ;
411import 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