diff --git a/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx b/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx index f77efe681..19b4eaf3c 100644 --- a/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx +++ b/desktop/flipper-ui-core/src/sandy-chrome/appinspect/LaunchEmulator.tsx @@ -8,12 +8,12 @@ */ import React, {useEffect, useState} from 'react'; -import {Modal, Button, message, Alert, Menu, Dropdown} from 'antd'; +import {Modal, Button, message, Alert, Menu, Dropdown, Typography} from 'antd'; import { - AppleOutlined, PoweroffOutlined, MoreOutlined, - AndroidOutlined, + HeartOutlined, + HeartFilled, } from '@ant-design/icons'; import {Store} from '../../reducers'; import {useStore} from '../../utils/useStore'; @@ -22,12 +22,16 @@ import { Spinner, renderReactRoot, withTrackingScope, + useLocalStorageState, + theme, } from 'flipper-plugin'; import {Provider} from 'react-redux'; import {IOSDeviceParams} from 'flipper-common'; import {getRenderHostInstance} from 'flipper-frontend-core'; import SettingsSheet from '../../chrome/SettingsSheet'; import {Link} from '../../ui'; +import {chain, uniq, without} from 'lodash'; +import {ReactNode} from 'react-markdown'; const COLD_BOOT = 'cold-boot'; @@ -90,6 +94,17 @@ export const LaunchEmulatorDialog = withTrackingScope( const [waitingForAndroid, setWaitingForAndroid] = useState(androidEnabled); const waitingForResults = waitingForIos || waitingForAndroid; + const [favoriteVirtualDevices, setFavoriteVirtualDevices] = + useLocalStorageState('favourite-virtual-devices', []); + + const addToFavorites = (deviceName: string) => { + setFavoriteVirtualDevices(uniq([deviceName, ...favoriteVirtualDevices])); + }; + + const removeFromFavorites = (deviceName: string) => { + setFavoriteVirtualDevices(without(favoriteVirtualDevices, deviceName)); + }; + useEffect(() => { if (!iosEnabled) { return; @@ -131,70 +146,105 @@ export const LaunchEmulatorDialog = withTrackingScope( } const items = [ - ...(androidEmulators.length > 0 - ? [] - : []), - ...androidEmulators.map((name) => { - const launch = (coldBoot: boolean) => { - getRenderHostInstance() - .flipperServer.exec('android-launch-emulator', name, coldBoot) - .then(onClose) - .catch((e) => { - console.error('Failed to start emulator: ', e); - message.error('Failed to start emulator: ' + e); - }); - }; - const menu = ( - { - switch (key) { - case COLD_BOOT: { - launch(true); - break; - } - } - }}> - }> - Cold Boot - - - ); - return ( - } - onClick={() => launch(false)}> - {name} - - ); - }), - ...(iosEmulators.length > 0 ? [] : []), - ...iosEmulators.map((device) => ( -