import { Component } from 'react'; import { Tooltip as ReactTooltip } from 'react-tooltip'; import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl'; import { inject, observer } from 'mobx-react'; import { mdiBell, mdiBellOff, mdiCheckAll, mdiChevronDown, mdiChevronRight, mdiCog, mdiLock, mdiMenu, mdiPlusBox, mdiViewGrid, mdiViewSplitVertical, mdiDownload, } from '@mdi/js'; import Tabbar from '../services/tabs/Tabbar'; import { addNewServiceShortcutKey, downloadsShortcutKey, lockFerdiumShortcutKey, muteFerdiumShortcutKey, settingsShortcutKey, splitModeToggleShortcutKey, todosToggleShortcutKey, workspaceToggleShortcutKey, } from '../../environment'; import { todosStore } from '../../features/todos'; import { todoActions } from '../../features/todos/actions'; import globalMessages from '../../i18n/globalMessages'; import Icon from '../ui/icon'; import { Actions } from '../../actions/lib/actions'; import { RealStores } from '../../stores'; import Service from '../../models/Service'; const messages = defineMessages({ addNewService: { id: 'sidebar.addNewService', defaultMessage: 'Add new service', }, splitModeToggle: { id: 'sidebar.splitModeToggle', defaultMessage: 'Split Mode Toggle', }, mute: { id: 'sidebar.muteApp', defaultMessage: 'Disable notifications & audio', }, unmute: { id: 'sidebar.unmuteApp', defaultMessage: 'Enable notifications & audio', }, openWorkspaceDrawer: { id: 'sidebar.openWorkspaceDrawer', defaultMessage: 'Open workspace drawer', }, closeWorkspaceDrawer: { id: 'sidebar.closeWorkspaceDrawer', defaultMessage: 'Close workspace drawer', }, openTodosDrawer: { id: 'sidebar.openTodosDrawer', defaultMessage: 'Open Ferdium Todos', }, closeTodosDrawer: { id: 'sidebar.closeTodosDrawer', defaultMessage: 'Close Ferdium Todos', }, lockFerdium: { id: 'sidebar.lockFerdium', defaultMessage: 'Lock Ferdium', }, }); interface IProps extends WrappedComponentProps { services: Service[]; showServicesUpdatedInfoBar: boolean; showMessageBadgeWhenMutedSetting: boolean; showServiceNameSetting: boolean; showMessageBadgesEvenWhenMuted: boolean; isAppMuted: boolean; // eslint-disable-next-line react/no-unused-prop-types isMenuCollapsed: boolean; isWorkspaceDrawerOpen: boolean; isTodosServiceActive: boolean; actions?: Actions; stores?: RealStores; toggleMuteApp: () => void; toggleCollapseMenu: () => void; toggleWorkspaceDrawer: () => void; openSettings: (args: { path: string }) => void; openDownloads: (args: { path: string }) => void; // eslint-disable-next-line react/no-unused-prop-types closeSettings: () => void; setActive: (args: { serviceId: string }) => void; reorder: (args: { oldIndex: number; newIndex: number }) => void; reload: (args: { serviceId: string }) => void; toggleNotifications: (args: { serviceId: string }) => void; toggleAudio: (args: { serviceId: string }) => void; toggleDarkMode: (args: { serviceId: string }) => void; deleteService: (args: { serviceId: string }) => void; clearCache: (args: { serviceId: string }) => void; hibernateService: (args: { serviceId: string }) => void; wakeUpService: (args: { serviceId: string }) => void; updateService: (args: { serviceId: string; serviceData: { isEnabled: boolean; isMediaPlaying: boolean }; redirect: boolean; }) => void; } interface IState { tooltipEnabled: boolean; } @inject('stores', 'actions') @observer class Sidebar extends Component { constructor(props) { super(props); this.state = { tooltipEnabled: true, }; } enableToolTip() { this.setState({ tooltipEnabled: true }); } disableToolTip() { this.setState({ tooltipEnabled: false }); } updateToolTip() { this.disableToolTip(); setTimeout(this.enableToolTip.bind(this)); } render() { const { openSettings, openDownloads, toggleMuteApp, toggleCollapseMenu, isAppMuted, isWorkspaceDrawerOpen, toggleWorkspaceDrawer, stores, actions, isTodosServiceActive, } = this.props; const { hideCollapseButton, hideRecipesButton, hideWorkspacesButton, hideNotificationsButton, hideSettingsButton, hideDownloadButton, hideSplitModeButton, useHorizontalStyle, splitMode, } = stores!.settings.app; const { intl } = this.props; const todosToggleMessage = todosStore.isTodosPanelVisible ? messages.closeTodosDrawer : messages.openTodosDrawer; const workspaceToggleMessage = isWorkspaceDrawerOpen ? messages.closeWorkspaceDrawer : messages.openWorkspaceDrawer; const numberActiveButtons = [ !hideRecipesButton, !hideWorkspacesButton, !hideNotificationsButton, !hideSettingsButton, !hideSplitModeButton, todosStore.isFeatureEnabledByUser, ].filter(Boolean).length; const { isMenuCollapsed } = stores!.settings.all.app; const { isDownloading, justFinishedDownloading } = stores!.app; return (
this.enableToolTip()} disableToolTip={() => this.disableToolTip()} reorder={this.props.reorder} reload={this.props.reload} toggleNotifications={this.props.toggleNotifications} toggleAudio={this.props.toggleAudio} toggleDarkMode={this.props.toggleDarkMode} deleteService={this.props.deleteService} updateService={this.props.updateService} clearCache={this.props.clearCache} hibernateService={this.props.hibernateService} wakeUpService={this.props.wakeUpService} /> {numberActiveButtons <= 1 || hideCollapseButton ? null : ( )} {!hideRecipesButton && !isMenuCollapsed ? ( ) : null} {!hideSplitModeButton && !isMenuCollapsed ? ( ) : null} {!hideWorkspacesButton && !isMenuCollapsed ? ( ) : null} {!hideNotificationsButton && !isMenuCollapsed ? ( ) : null} {todosStore.isFeatureEnabledByUser && !isMenuCollapsed ? ( ) : null} {stores!.settings.all.app.isLockingFeatureEnabled ? ( ) : null} {this.state.tooltipEnabled && ( )} {!hideDownloadButton && !isMenuCollapsed ? ( ) : null} {!hideSettingsButton && !isMenuCollapsed ? ( ) : null}
); } } export default injectIntl(Sidebar);