@@ -14,11 +14,14 @@ import Dialog from '@mui/material/Dialog';
14
14
import DialogHeader from '../../../../core/ui/dialog/DialogHeader' ;
15
15
import { DialogContent } from '../../../../core/ui/dialog/deprecated' ;
16
16
import WrapperMarkdown from '../../../../core/ui/markdown/WrapperMarkdown' ;
17
- import { Text } from '../../../../core/ui/typography' ;
17
+ import { Caption , Text } from '../../../../core/ui/typography' ;
18
18
import { formatTimeElapsed } from '../../../shared/utils/formatTimeElapsed' ;
19
19
import { Button , DialogActions } from '@mui/material' ;
20
20
import { useTranslation } from 'react-i18next' ;
21
21
import { LoadingButton } from '@mui/lab' ;
22
+ import useOnlineStatus from '../../../../core/utils/onlineStatus' ;
23
+ import Reconnectable from '../../../../core/utils/reconnectable' ;
24
+ import { useTick } from '../../../../core/utils/time/tick' ;
22
25
23
26
const useActorWhiteboardStyles = makeStyles ( theme => ( {
24
27
container : {
@@ -61,6 +64,8 @@ export interface WhiteboardWhiteboardProps {
61
64
62
65
const WINDOW_SCROLL_HANDLER_DEBOUNCE_INTERVAL = 100 ;
63
66
67
+ const useReconnectable = Reconnectable ( ) ;
68
+
64
69
const CollaborativeExcalidrawWrapper = ( { entities, actions, options, collabApiRef } : WhiteboardWhiteboardProps ) => {
65
70
const { whiteboard, filesManager, lastSavedDate } = entities ;
66
71
@@ -138,6 +143,9 @@ const CollaborativeExcalidrawWrapper = ({ entities, actions, options, collabApiR
138
143
} ,
139
144
onCloseConnection : ( ) => {
140
145
setCollaborationStoppedNoticeOpen ( true ) ;
146
+ if ( isOnline ) {
147
+ setupReconnectTimeout ( ) ;
148
+ }
141
149
} ,
142
150
onInitialize : collabApi => {
143
151
combinedCollabApiRef . current = collabApi ;
@@ -153,10 +161,24 @@ const CollaborativeExcalidrawWrapper = ({ entities, actions, options, collabApiR
153
161
154
162
const [ collaborationStartTime , setCollaborationStartTime ] = useState < number | null > ( Date . now ( ) ) ;
155
163
164
+ const [ collaborationStoppedNoticeOpen , setCollaborationStoppedNoticeOpen ] = useState ( false ) ;
165
+
166
+ const isOnline = useOnlineStatus ( ) ;
167
+
156
168
const restartCollaboration = ( ) => {
157
169
setCollaborationStartTime ( Date . now ( ) ) ;
158
170
} ;
159
171
172
+ const { autoReconnectTime, setupReconnectTimeout } = useReconnectable ( {
173
+ isOnline,
174
+ reconnect : restartCollaboration ,
175
+ skip : ! collaborationStoppedNoticeOpen || collaborating ,
176
+ } ) ;
177
+
178
+ const time = useTick ( {
179
+ skip : autoReconnectTime === null ,
180
+ } ) ;
181
+
160
182
useEffect ( ( ) => {
161
183
if ( ! connecting && collaborating ) {
162
184
setCollaborationStoppedNoticeOpen ( false ) ;
@@ -180,23 +202,8 @@ const CollaborativeExcalidrawWrapper = ({ entities, actions, options, collabApiR
180
202
[ actions . onInitApi ]
181
203
) ;
182
204
183
- const [ collaborationStoppedNoticeOpen , setCollaborationStoppedNoticeOpen ] = useState ( false ) ;
184
-
185
205
const { t } = useTranslation ( ) ;
186
206
187
- const [ isOnline , setIsOnline ] = useState ( navigator . onLine ) ;
188
-
189
- useEffect ( ( ) => {
190
- const handleOnlineChange = ( ) => setIsOnline ( navigator . onLine ) ;
191
- window . addEventListener ( 'online' , handleOnlineChange ) ;
192
- window . addEventListener ( 'offline' , handleOnlineChange ) ;
193
- setIsOnline ( navigator . onLine ) ;
194
- return ( ) => {
195
- window . removeEventListener ( 'online' , handleOnlineChange ) ;
196
- window . removeEventListener ( 'offline' , handleOnlineChange ) ;
197
- } ;
198
- } , [ ] ) ;
199
-
200
207
return (
201
208
< >
202
209
< div className = { styles . container } >
@@ -237,6 +244,11 @@ const CollaborativeExcalidrawWrapper = ({ entities, actions, options, collabApiR
237
244
< DialogActions >
238
245
< LoadingButton onClick = { restartCollaboration } disabled = { ! isOnline } loading = { connecting } >
239
246
Reconnect
247
+ < Caption textTransform = "none" >
248
+ { autoReconnectTime !== null &&
249
+ autoReconnectTime - time > 0 &&
250
+ ` (${ Math . ceil ( ( autoReconnectTime - time ) / 1000 ) } s)` }
251
+ </ Caption >
240
252
</ LoadingButton >
241
253
< Button onClick = { ( ) => setCollaborationStoppedNoticeOpen ( false ) } > { t ( 'buttons.ok' ) } </ Button >
242
254
</ DialogActions >
0 commit comments