@@ -48,6 +48,14 @@ const UIStrings = {
4848 *@description Label of the FB-only 'send feedback' action button in the toolbar
4949 */
5050 sendFeedback : '[FB-only] Send feedback' ,
51+ /**
52+ *@description Tooltip of the connection status toolbar button while disconnected
53+ */
54+ connectionStatusDisconnectedTooltip : 'Debugging connection was closed' ,
55+ /**
56+ *@description Button label of the connection status toolbar button while disconnected
57+ */
58+ connectionStatusDisconnectedLabel : 'Reconnect DevTools' ,
5159} ;
5260const str_ = i18n . i18n . registerUIStrings ( 'entrypoints/rn_fusebox/rn_fusebox.ts' , UIStrings ) ;
5361const i18nLazyString = i18n . i18n . getLazilyComputedLocalizedString . bind ( undefined , str_ ) ;
@@ -171,4 +179,47 @@ if (globalThis.FB_ONLY__reactNativeFeedbackLink) {
171179 } ) ;
172180}
173181
182+ class ConnectionStatusToolbarItemProvider extends SDK . TargetManager . Observer implements UI . Toolbar . Provider {
183+ #button = new UI . Toolbar . ToolbarButton ( '' ) ;
184+
185+ constructor ( ) {
186+ super ( ) ;
187+ this . #button. setVisible ( false ) ;
188+ this . #button. element . classList . add ( 'fusebox-connection-status' ) ;
189+ this . #button. addEventListener ( UI . Toolbar . ToolbarButton . Events . Click , this . onClick . bind ( this ) ) ;
190+
191+ SDK . TargetManager . TargetManager . instance ( ) . observeTargets ( this , { scoped : true } ) ;
192+ }
193+
194+ override targetAdded ( _target : SDK . Target . Target ) : void {
195+ this . #updateRootTarget( ) ;
196+ }
197+ override targetRemoved ( _target : SDK . Target . Target ) : void {
198+ this . #updateRootTarget( ) ;
199+ }
200+
201+ #updateRootTarget( ) : void {
202+ const rootTarget = SDK . TargetManager . TargetManager . instance ( ) . rootTarget ( ) ;
203+ this . #button. setTitle ( i18nLazyString ( UIStrings . connectionStatusDisconnectedTooltip ) ( ) ) ;
204+ this . #button. setText ( i18nLazyString ( UIStrings . connectionStatusDisconnectedLabel ) ( ) ) ;
205+ this . #button. setVisible ( ! rootTarget ) ;
206+ }
207+
208+ onClick ( ) : void {
209+ window . location . reload ( ) ;
210+ }
211+
212+ item ( ) : UI . Toolbar . ToolbarItem {
213+ return this . #button;
214+ }
215+ }
216+
217+ const connectionStatusToolbarItemProvider = new ConnectionStatusToolbarItemProvider ( ) ;
218+ UI . Toolbar . registerToolbarItem ( {
219+ location : UI . Toolbar . ToolbarItemLocation . MAIN_TOOLBAR_RIGHT ,
220+ loadItem : async ( ) => {
221+ return connectionStatusToolbarItemProvider ;
222+ } ,
223+ } ) ;
224+
174225Host . rnPerfMetrics . entryPointLoadingFinished ( 'rn_fusebox' ) ;
0 commit comments