1- import React , { useState , useEffect , useRef } from 'react' ;
1+ import React , { useState , useEffect , useRef , useCallback } from 'react' ;
22import PropTypes from 'prop-types' ;
33
44/**
@@ -27,77 +27,10 @@ const RealTimeFeedback = ({
2727
2828 const intervalRef = useRef ( null ) ;
2929 const retryTimeoutRef = useRef ( null ) ;
30- const wsRef = useRef ( null ) ;
31-
32- // Simulate WebSocket connection
33- useEffect ( ( ) => {
34- if ( ! transactionId && ! networkEndpoint ) return ;
35-
36- const connect = ( ) => {
37- setConnectionStatus ( 'connecting' ) ;
38-
39- // Simulate connection delay
40- setTimeout ( ( ) => {
41- setConnectionStatus ( 'connected' ) ;
42- setRetryCount ( 0 ) ;
43- startPolling ( ) ;
44- } , 500 ) ;
45- } ;
46-
47- const disconnect = ( ) => {
48- setConnectionStatus ( 'disconnected' ) ;
49- stopPolling ( ) ;
50- } ;
51-
52- const reconnect = ( ) => {
53- if ( retryCount < maxRetries ) {
54- setConnectionStatus ( 'reconnecting' ) ;
55- setRetryCount ( prev => prev + 1 ) ;
56-
57- retryTimeoutRef . current = setTimeout ( ( ) => {
58- connect ( ) ;
59- } , retryDelay * Math . pow ( 2 , retryCount ) ) ; // Exponential backoff
60- } else {
61- setConnectionStatus ( 'failed' ) ;
62- }
63- } ;
64-
65- connect ( ) ;
66-
67- return ( ) => {
68- disconnect ( ) ;
69- if ( retryTimeoutRef . current ) {
70- clearTimeout ( retryTimeoutRef . current ) ;
71- }
72- } ;
73- } , [ transactionId , networkEndpoint , maxRetries , retryDelay , retryCount ] ) ;
74-
75- // Polling simulation for real-time updates
76- const startPolling = ( ) => {
77- if ( intervalRef . current ) return ;
78-
79- intervalRef . current = setInterval ( ( ) => {
80- // Simulate network status updates
81- updateNetworkStatus ( ) ;
82-
83- // Simulate transaction updates if tracking a transaction
84- if ( transactionId ) {
85- updateTransactionStatus ( ) ;
86- }
87-
88- setLastUpdate ( new Date ( ) . toISOString ( ) ) ;
89- } , updateInterval ) ;
90- } ;
91-
92- const stopPolling = ( ) => {
93- if ( intervalRef . current ) {
94- clearInterval ( intervalRef . current ) ;
95- intervalRef . current = null ;
96- }
97- } ;
30+ const retryCountRef = useRef ( 0 ) ;
9831
9932 // Simulate network status updates
100- const updateNetworkStatus = ( ) => {
33+ const updateNetworkStatus = useCallback ( ( ) => {
10134 const newNetworkStatus = {
10235 health : Math . max ( 85 , Math . min ( 100 , networkStatus . health + ( Math . random ( ) - 0.5 ) * 10 ) ) ,
10336 latency : Math . max ( 10 , Math . min ( 500 , networkStatus . latency + ( Math . random ( ) - 0.5 ) * 50 ) ) ,
@@ -110,10 +43,10 @@ const RealTimeFeedback = ({
11043 if ( onNetworkChange ) {
11144 onNetworkChange ( newNetworkStatus ) ;
11245 }
113- } ;
46+ } , [ networkStatus . health , networkStatus . latency , onNetworkChange ] ) ;
11447
11548 // Simulate transaction status updates
116- const updateTransactionStatus = ( ) => {
49+ const updateTransactionStatus = useCallback ( ( ) => {
11750 const statuses = [ 'submitted' , 'pending' , 'confirming' , 'confirmed' , 'finalized' ] ;
11851 const currentIndex = transactionStatus ? statuses . indexOf ( transactionStatus . status ) : - 1 ;
11952
@@ -156,7 +89,76 @@ const RealTimeFeedback = ({
15689 sendPushNotification ( newStatus ) ;
15790 }
15891 }
159- } ;
92+ } , [ transactionStatus , networkStatus . blockHeight , queuePosition , onStatusUpdate , enableSound , enablePushNotifications ] ) ;
93+
94+ // Polling simulation for real-time updates
95+ const startPolling = useCallback ( ( ) => {
96+ if ( intervalRef . current ) return ;
97+
98+ intervalRef . current = setInterval ( ( ) => {
99+ // Simulate network status updates
100+ updateNetworkStatus ( ) ;
101+
102+ // Simulate transaction updates if tracking a transaction
103+ if ( transactionId ) {
104+ updateTransactionStatus ( ) ;
105+ }
106+
107+ setLastUpdate ( new Date ( ) . toISOString ( ) ) ;
108+ } , updateInterval ) ;
109+ } , [ updateInterval , transactionId , updateNetworkStatus , updateTransactionStatus ] ) ;
110+
111+ const stopPolling = useCallback ( ( ) => {
112+ if ( intervalRef . current ) {
113+ clearInterval ( intervalRef . current ) ;
114+ intervalRef . current = null ;
115+ }
116+ } , [ ] ) ;
117+
118+ // Simulate WebSocket connection
119+ useEffect ( ( ) => {
120+ if ( ! transactionId && ! networkEndpoint ) return ;
121+
122+ const connect = ( ) => {
123+ setConnectionStatus ( 'connecting' ) ;
124+
125+ // Simulate connection delay
126+ setTimeout ( ( ) => {
127+ setConnectionStatus ( 'connected' ) ;
128+ retryCountRef . current = 0 ;
129+ setRetryCount ( 0 ) ;
130+ startPolling ( ) ;
131+ } , 500 ) ;
132+ } ;
133+
134+ const disconnect = ( ) => {
135+ setConnectionStatus ( 'disconnected' ) ;
136+ stopPolling ( ) ;
137+ } ;
138+
139+ const reconnect = ( ) => {
140+ if ( retryCountRef . current < maxRetries ) {
141+ setConnectionStatus ( 'reconnecting' ) ;
142+ retryCountRef . current += 1 ;
143+ setRetryCount ( retryCountRef . current ) ;
144+
145+ retryTimeoutRef . current = setTimeout ( ( ) => {
146+ connect ( ) ;
147+ } , retryDelay * Math . pow ( 2 , retryCountRef . current - 1 ) ) ; // Exponential backoff
148+ } else {
149+ setConnectionStatus ( 'failed' ) ;
150+ }
151+ } ;
152+
153+ connect ( ) ;
154+
155+ return ( ) => {
156+ disconnect ( ) ;
157+ if ( retryTimeoutRef . current ) {
158+ clearTimeout ( retryTimeoutRef . current ) ;
159+ }
160+ } ;
161+ } , [ transactionId , networkEndpoint , maxRetries , retryDelay , startPolling , stopPolling ] ) ;
160162
161163 // Play notification sound
162164 const playNotificationSound = ( ) => {
0 commit comments