diff --git a/desktop/flipper-ui-core/src/sandy-chrome/LeftRail.tsx b/desktop/flipper-ui-core/src/sandy-chrome/LeftRail.tsx index 32aeb954d..c56c98104 100644 --- a/desktop/flipper-ui-core/src/sandy-chrome/LeftRail.tsx +++ b/desktop/flipper-ui-core/src/sandy-chrome/LeftRail.tsx @@ -8,8 +8,8 @@ */ import React, {cloneElement, useState, useCallback} from 'react'; -import {Button, Divider, Badge, Tooltip, Menu, Modal} from 'antd'; -import {SettingOutlined, BugOutlined} from '@ant-design/icons'; +import {Button, Divider, Badge, Tooltip, Menu} from 'antd'; +import {SettingOutlined} from '@ant-design/icons'; import {useStore} from '../utils/useStore'; import { theme, @@ -20,7 +20,6 @@ import { } from 'flipper-plugin'; import SettingsSheet from '../chrome/SettingsSheet'; import WelcomeScreen from './WelcomeScreen'; -import config from '../fb-stubs/config'; import styled from '@emotion/styled'; import {setStaticView} from '../reducers/connections'; import {SandyRatingButton} from '../chrome/RatingButton'; @@ -29,17 +28,14 @@ import constants from '../fb-stubs/constants'; import { canFileExport, canOpenDialog, - exportEverythingEverywhereAllAtOnce, showOpenDialog, startFileExport, startLinkExport, - ExportEverythingEverywhereAllAtOnceStatus, } from '../utils/exportData'; import {openDeeplinkDialog} from '../deeplink'; import {css} from '@emotion/css'; import {getRenderHostInstance} from 'flipper-frontend-core'; import {StyleGuide} from './StyleGuide'; -import {useEffect} from 'react'; const LeftRailButtonElem = styled(Button)<{kind?: 'small'}>(({kind}) => ({ width: kind === 'small' ? 32 : 36, @@ -129,7 +125,6 @@ export const LeftRail = withTrackingScope(function LeftRail() { - @@ -257,139 +252,3 @@ function ExtrasMenu() { ); } - -function ExportEverythingEverywhereAllAtOnceStatusModal({ - status, - setStatus, -}: { - status: ExportEverythingEverywhereAllAtOnceStatus | undefined; - setStatus: ( - newStatus: ExportEverythingEverywhereAllAtOnceStatus | undefined, - ) => void; -}) { - const [statusMessage, setStatusMessage] = useState(); - - useEffect(() => { - switch (status?.[0]) { - case 'logs': { - setStatusMessage(

Exporting Flipper logs...

); - return; - } - case 'files': { - let sheepCount = 0; - const setFileExportMessage = () => { - setStatusMessage( - <> -

Exporting Flipper debug files from all devices...

-

It could take a long time!

-

Let's count sheep while we wait: {sheepCount++}.

-

We'll skip it automatically if it exceeds 3 minutes.

- , - ); - }; - - setFileExportMessage(); - - const interval = setInterval(setFileExportMessage, 3000); - return () => clearInterval(interval); - } - case 'state': { - let dinosaursCount = 0; - const setStateExportMessage = () => { - setStatusMessage( - <> -

Exporting Flipper state...

-

It also could take a long time!

-

This time we could count dinosaurs: {dinosaursCount++}.

-

We'll skip it automatically if it exceeds 2 minutes.

- , - ); - }; - - setStateExportMessage(); - - const interval = setInterval(setStateExportMessage, 2000); - return () => clearInterval(interval); - } - case 'archive': { - setStatusMessage(

Creating an archive...

); - return; - } - case 'upload': { - setStatusMessage(

Uploading the archive...

); - return; - } - case 'support': { - setStatusMessage(

Creating a support request...

); - return; - } - case 'error': { - setStatusMessage( - <> -

Oops! Something went wrong.

-

{status[1]}

- , - ); - return; - } - case 'done': { - setStatusMessage(

Done!

); - return; - } - case 'cancelled': { - setStatusMessage(

Cancelled! Why? 😱🤯👏

); - return; - } - } - }, [status]); - - return ( - { - setStatus(undefined); - }} - title="Exporting everything everywhere all at once" - footer={null}> - {statusMessage} - - ); -} - -function ExportEverythingEverywhereAllAtOnceButton() { - const store = useStore(); - const [status, setStatus] = useState< - ExportEverythingEverywhereAllAtOnceStatus | undefined - >(); - - const exportEverythingEverywhereAllAtOnceTracked = useTrackedCallback( - 'Debug data export', - () => - exportEverythingEverywhereAllAtOnce( - store, - (...args) => setStatus(args), - config.isFBBuild, - ), - [store, setStatus], - ); - - return ( - <> - - - } - title="Export Flipper debug data" - onClick={() => { - exportEverythingEverywhereAllAtOnceTracked(); - }} - small - /> - - - ); -} diff --git a/desktop/flipper-ui-core/src/sandy-chrome/Navbar.tsx b/desktop/flipper-ui-core/src/sandy-chrome/Navbar.tsx index af468f436..af23b3adb 100644 --- a/desktop/flipper-ui-core/src/sandy-chrome/Navbar.tsx +++ b/desktop/flipper-ui-core/src/sandy-chrome/Navbar.tsx @@ -10,23 +10,32 @@ import { Dialog, Layout, + NUX, styled, theme, useMemoize, + useTrackedCallback, useValue, withTrackingScope, } from 'flipper-plugin'; import {getRenderHostInstance} from 'flipper-frontend-core'; -import React, {cloneElement, useCallback, useMemo, useState} from 'react'; +import React, { + cloneElement, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; import {useDispatch, useStore} from '../utils/useStore'; import config from '../fb-stubs/config'; import {isConnected, currentUser, logoutUser} from '../fb-stubs/user'; import {showLoginDialog} from '../chrome/fb-stubs/SignInSheet'; -import {Avatar, Badge, Button, Popover, Tooltip} from 'antd'; +import {Avatar, Badge, Button, Modal, Popover, Tooltip} from 'antd'; import { ApiOutlined, AppstoreAddOutlined, BellOutlined, + BugOutlined, CameraOutlined, EllipsisOutlined, FileExclamationOutlined, @@ -52,6 +61,10 @@ import FpsGraph from '../chrome/FpsGraph'; import NetworkGraph from '../chrome/NetworkGraph'; import {errorCounterAtom} from '../chrome/ConsoleLogs'; import {filterNotifications} from './notification/notificationUtils'; +import { + exportEverythingEverywhereAllAtOnce, + ExportEverythingEverywhereAllAtOnceStatus, +} from '../utils/exportData'; import {css} from '@emotion/css'; export const Navbar = withTrackingScope(function Navbar({ @@ -114,6 +127,7 @@ export const Navbar = withTrackingScope(function Navbar({ setToplevelSelection={setToplevelSelection} /> + @@ -123,6 +137,140 @@ export const Navbar = withTrackingScope(function Navbar({ ); }); +function ExportEverythingEverywhereAllAtOnceButton() { + const store = useStore(); + const [status, setStatus] = useState< + ExportEverythingEverywhereAllAtOnceStatus | undefined + >(); + + const exportEverythingEverywhereAllAtOnceTracked = useTrackedCallback( + 'Debug data export', + () => + exportEverythingEverywhereAllAtOnce( + store, + (...args) => setStatus(args), + config.isFBBuild, + ), + [store, setStatus], + ); + + return ( + <> + + + { + exportEverythingEverywhereAllAtOnceTracked(); + }} + /> + + + ); +} +function ExportEverythingEverywhereAllAtOnceStatusModal({ + status, + setStatus, +}: { + status: ExportEverythingEverywhereAllAtOnceStatus | undefined; + setStatus: ( + newStatus: ExportEverythingEverywhereAllAtOnceStatus | undefined, + ) => void; +}) { + const [statusMessage, setStatusMessage] = useState(); + + useEffect(() => { + switch (status?.[0]) { + case 'logs': { + setStatusMessage(

Exporting Flipper logs...

); + return; + } + case 'files': { + let sheepCount = 0; + const setFileExportMessage = () => { + setStatusMessage( + <> +

Exporting Flipper debug files from all devices...

+

It could take a long time!

+

Let's count sheep while we wait: {sheepCount++}.

+

We'll skip it automatically if it exceeds 3 minutes.

+ , + ); + }; + + setFileExportMessage(); + + const interval = setInterval(setFileExportMessage, 3000); + return () => clearInterval(interval); + } + case 'state': { + let dinosaursCount = 0; + const setStateExportMessage = () => { + setStatusMessage( + <> +

Exporting Flipper state...

+

It also could take a long time!

+

This time we could count dinosaurs: {dinosaursCount++}.

+

We'll skip it automatically if it exceeds 2 minutes.

+ , + ); + }; + + setStateExportMessage(); + + const interval = setInterval(setStateExportMessage, 2000); + return () => clearInterval(interval); + } + case 'archive': { + setStatusMessage(

Creating an archive...

); + return; + } + case 'upload': { + setStatusMessage(

Uploading the archive...

); + return; + } + case 'support': { + setStatusMessage(

Creating a support request...

); + return; + } + case 'error': { + setStatusMessage( + <> +

Oops! Something went wrong.

+

{status[1]}

+ , + ); + return; + } + case 'done': { + setStatusMessage(

Done!

); + return; + } + case 'cancelled': { + setStatusMessage(

Cancelled! Why? 😱🤯👏

); + return; + } + } + }, [status]); + + return ( + { + setStatus(undefined); + }} + title="Exporting everything everywhere all at once" + footer={null}> + {statusMessage} + + ); +} + function ConnectionTroubleshootButton({ toplevelSelection, setToplevelSelection, @@ -130,7 +278,7 @@ function ConnectionTroubleshootButton({ return ( { setToplevelSelection('connectivity');