From f14a2fd05cfb2d7fc140f1f59e1fd580c25b6a27 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Wed, 22 May 2019 18:44:43 -0700 Subject: [PATCH] Use @reach tooltips for TabBar, cleanup supports-profiling subscription --- src/devtools/store.js | 3 +- src/devtools/views/DevTools.js | 44 +++++++----------- src/devtools/views/TabBar.js | 83 ++++++++++++++++++++-------------- 3 files changed, 66 insertions(+), 64 deletions(-) diff --git a/src/devtools/store.js b/src/devtools/store.js index 86654bfe68..5058aad35e 100644 --- a/src/devtools/store.js +++ b/src/devtools/store.js @@ -865,8 +865,9 @@ export default class Store extends EventEmitter { if (hasOwnerMetadata) { this._hasOwnerMetadata = true; } - if (supportsProfiling) { + if (!this._supportsProfiling && supportsProfiling) { this._supportsProfiling = true; + this.emit('supportsProfiling'); } } ); diff --git a/src/devtools/views/DevTools.js b/src/devtools/views/DevTools.js index 1efc67a707..766ddd82ed 100644 --- a/src/devtools/views/DevTools.js +++ b/src/devtools/views/DevTools.js @@ -5,7 +5,7 @@ import '@reach/menu-button/styles.css'; import '@reach/tooltip/styles.css'; -import React, { useEffect, useState } from 'react'; +import React, { useMemo, useState } from 'react'; import Store from '../store'; import { BridgeContext, StoreContext } from './context'; import Components from './Components/Components'; @@ -18,6 +18,7 @@ import ViewElementSourceContext from './Components/ViewElementSourceContext'; import { ProfilerContextController } from './Profiler/ProfilerContext'; import { ModalDialogContextController } from './ModalDialog'; import ReactLogo from './ReactLogo'; +import { useSubscription } from './hooks'; import styles from './DevTools.css'; @@ -71,8 +72,7 @@ const settingsTab = { title: 'React Settings', }; -const tabsWithProfiler = [componentsTab, profilerTab, settingsTab]; -const tabsWithoutProfiler = [componentsTab, settingsTab]; +const tabs = [componentsTab, profilerTab, settingsTab]; export default function DevTools({ bridge, @@ -92,27 +92,19 @@ export default function DevTools({ setTab(overrideTab); } - const [supportsProfiling, setSupportsProfiling] = useState( - store.supportsProfiling + const supportsProfilingSubscription = useMemo( + () => ({ + getCurrentValue: () => store.supportsProfiling, + subscribe: (callback: Function) => { + store.addListener('supportsProfiling', callback); + return () => store.removeListener('supportsProfiling', callback); + }, + }), + [store] + ); + const supportsProfiling = useSubscription( + supportsProfilingSubscription ); - - // Show/hide the "Profiler" button depending on if profiling is supported. - useEffect(() => { - if (supportsProfiling !== store.supportsProfiling) { - setSupportsProfiling(store.supportsProfiling); - } - - const handleRoots = () => { - if (supportsProfiling !== store.supportsProfiling) { - setSupportsProfiling(store.supportsProfiling); - } - }; - - store.addListener('roots', handleRoots); - return () => { - store.removeListener('roots', handleRoots); - }; - }, [store, supportsProfiling]); return ( @@ -140,11 +132,7 @@ export default function DevTools({ id="DevTools" selectTab={setTab} size="large" - tabs={ - supportsProfiling - ? tabsWithProfiler - : tabsWithoutProfiler - } + tabs={tabs} /> )} diff --git a/src/devtools/views/TabBar.js b/src/devtools/views/TabBar.js index 87031f7e2c..f75d464abb 100644 --- a/src/devtools/views/TabBar.js +++ b/src/devtools/views/TabBar.js @@ -2,9 +2,11 @@ import classNames from 'classnames'; import React, { Fragment, useCallback } from 'react'; +import Tooltip from '@reach/tooltip'; import Icon from './Icon'; import styles from './TabBar.css'; +import tooltipStyles from './Tooltip.css'; import type { IconType } from './Icon'; @@ -59,42 +61,53 @@ export default function TabBar({ return ( - {tabs.map(({ icon, id, label, title }) => ( - - ))} + + + + {label} + + + ); + + if (title) { + button = ( + + {button} + + ); + } + + return button; + })} ); }