refactor: use local state for quick settings menu
This commit is contained in:
@@ -22,7 +22,6 @@ import { DesktopManager } from '../Device/DesktopManager'
|
|||||||
import { MomentsService } from '@/Controllers/Moments/MomentsService'
|
import { MomentsService } from '@/Controllers/Moments/MomentsService'
|
||||||
import { PersistenceService } from '@/Controllers/Abstract/PersistenceService'
|
import { PersistenceService } from '@/Controllers/Abstract/PersistenceService'
|
||||||
import { FilePreviewModalController } from '@/Controllers/FilePreviewModalController'
|
import { FilePreviewModalController } from '@/Controllers/FilePreviewModalController'
|
||||||
import { QuickSettingsController } from '@/Controllers/QuickSettingsController'
|
|
||||||
import { PaneController } from '@/Controllers/PaneController/PaneController'
|
import { PaneController } from '@/Controllers/PaneController/PaneController'
|
||||||
import { PreferencesController } from '@/Controllers/PreferencesController'
|
import { PreferencesController } from '@/Controllers/PreferencesController'
|
||||||
import { FeaturesController } from '@/Controllers/FeaturesController'
|
import { FeaturesController } from '@/Controllers/FeaturesController'
|
||||||
@@ -172,10 +171,6 @@ export class WebDependencies extends DependencyContainer {
|
|||||||
return new FilePreviewModalController(application.items)
|
return new FilePreviewModalController(application.items)
|
||||||
})
|
})
|
||||||
|
|
||||||
this.bind(Web_TYPES.QuickSettingsController, () => {
|
|
||||||
return new QuickSettingsController(application.events)
|
|
||||||
})
|
|
||||||
|
|
||||||
this.bind(Web_TYPES.PaneController, () => {
|
this.bind(Web_TYPES.PaneController, () => {
|
||||||
return new PaneController(
|
return new PaneController(
|
||||||
application.preferences,
|
application.preferences,
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ import { HistoryModalController } from '@/Controllers/NoteHistory/HistoryModalCo
|
|||||||
import { NavigationController } from '@/Controllers/Navigation/NavigationController'
|
import { NavigationController } from '@/Controllers/Navigation/NavigationController'
|
||||||
import { FilePreviewModalController } from '@/Controllers/FilePreviewModalController'
|
import { FilePreviewModalController } from '@/Controllers/FilePreviewModalController'
|
||||||
import { OpenSubscriptionDashboard } from './UseCase/OpenSubscriptionDashboard'
|
import { OpenSubscriptionDashboard } from './UseCase/OpenSubscriptionDashboard'
|
||||||
import { QuickSettingsController } from '@/Controllers/QuickSettingsController'
|
|
||||||
import { ItemGroupController } from '@/Components/NoteView/Controller/ItemGroupController'
|
import { ItemGroupController } from '@/Components/NoteView/Controller/ItemGroupController'
|
||||||
import { NoAccountWarningController } from '@/Controllers/NoAccountWarningController'
|
import { NoAccountWarningController } from '@/Controllers/NoAccountWarningController'
|
||||||
import { SearchOptionsController } from '@/Controllers/SearchOptionsController'
|
import { SearchOptionsController } from '@/Controllers/SearchOptionsController'
|
||||||
@@ -617,10 +616,6 @@ export class WebApplication extends SNApplication implements WebApplicationInter
|
|||||||
return this.deps.get<PurchaseFlowController>(Web_TYPES.PurchaseFlowController)
|
return this.deps.get<PurchaseFlowController>(Web_TYPES.PurchaseFlowController)
|
||||||
}
|
}
|
||||||
|
|
||||||
get quickSettingsMenuController(): QuickSettingsController {
|
|
||||||
return this.deps.get<QuickSettingsController>(Web_TYPES.QuickSettingsController)
|
|
||||||
}
|
|
||||||
|
|
||||||
get persistence(): PersistenceService {
|
get persistence(): PersistenceService {
|
||||||
return this.deps.get<PersistenceService>(Web_TYPES.PersistenceService)
|
return this.deps.get<PersistenceService>(Web_TYPES.PersistenceService)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ type State = {
|
|||||||
showSyncResolution: boolean
|
showSyncResolution: boolean
|
||||||
newUpdateAvailable: boolean
|
newUpdateAvailable: boolean
|
||||||
showAccountMenu: boolean
|
showAccountMenu: boolean
|
||||||
showQuickSettingsMenu: boolean
|
|
||||||
offline: boolean
|
offline: boolean
|
||||||
hasError: boolean
|
hasError: boolean
|
||||||
arbitraryStatusMessage?: string
|
arbitraryStatusMessage?: string
|
||||||
@@ -64,7 +63,6 @@ class Footer extends AbstractComponent<Props, State> {
|
|||||||
showSyncResolution: false,
|
showSyncResolution: false,
|
||||||
newUpdateAvailable: false,
|
newUpdateAvailable: false,
|
||||||
showAccountMenu: false,
|
showAccountMenu: false,
|
||||||
showQuickSettingsMenu: false,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.webEventListenerDestroyer = props.application.addWebEventObserver((event, data) => {
|
this.webEventListenerDestroyer = props.application.addWebEventObserver((event, data) => {
|
||||||
@@ -125,7 +123,6 @@ class Footer extends AbstractComponent<Props, State> {
|
|||||||
this.autorun(() => {
|
this.autorun(() => {
|
||||||
this.setState({
|
this.setState({
|
||||||
showAccountMenu: this.application.accountMenuController.show,
|
showAccountMenu: this.application.accountMenuController.show,
|
||||||
showQuickSettingsMenu: this.application.quickSettingsMenuController.open,
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -293,10 +290,6 @@ class Footer extends AbstractComponent<Props, State> {
|
|||||||
this.application.accountMenuController.toggleShow()
|
this.application.accountMenuController.toggleShow()
|
||||||
}
|
}
|
||||||
|
|
||||||
quickSettingsClickHandler = () => {
|
|
||||||
this.application.quickSettingsMenuController.toggle()
|
|
||||||
}
|
|
||||||
|
|
||||||
syncResolutionClickHandler = () => {
|
syncResolutionClickHandler = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
showSyncResolution: !this.state.showSyncResolution,
|
showSyncResolution: !this.state.showSyncResolution,
|
||||||
@@ -336,12 +329,7 @@ class Footer extends AbstractComponent<Props, State> {
|
|||||||
this.application.accountMenuController.closeAccountMenu()
|
this.application.accountMenuController.closeAccountMenu()
|
||||||
}
|
}
|
||||||
|
|
||||||
clickOutsideQuickSettingsMenu = () => {
|
|
||||||
this.application.quickSettingsMenuController.closeQuickSettingsMenu()
|
|
||||||
}
|
|
||||||
|
|
||||||
openPreferences = (openWhatsNew: boolean) => {
|
openPreferences = (openWhatsNew: boolean) => {
|
||||||
this.clickOutsideQuickSettingsMenu()
|
|
||||||
if (openWhatsNew) {
|
if (openWhatsNew) {
|
||||||
this.application.preferencesController.setCurrentPane('whats-new')
|
this.application.preferencesController.setCurrentPane('whats-new')
|
||||||
}
|
}
|
||||||
@@ -372,12 +360,7 @@ class Footer extends AbstractComponent<Props, State> {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="relative z-footer-bar-item select-none">
|
<div className="relative z-footer-bar-item select-none">
|
||||||
<QuickSettingsButton
|
<QuickSettingsButton application={this.application} />
|
||||||
isOpen={this.state.showQuickSettingsMenu}
|
|
||||||
toggleMenu={this.quickSettingsClickHandler}
|
|
||||||
application={this.application}
|
|
||||||
quickSettingsMenuController={this.application.quickSettingsMenuController}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="relative z-footer-bar-item ml-1.5 select-none">
|
<div className="relative z-footer-bar-item ml-1.5 select-none">
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import { WebApplication } from '@/Application/WebApplication'
|
import { WebApplication } from '@/Application/WebApplication'
|
||||||
import { QuickSettingsController } from '@/Controllers/QuickSettingsController'
|
|
||||||
import { UIFeature, GetDarkThemeFeature } from '@standardnotes/snjs'
|
import { UIFeature, GetDarkThemeFeature } from '@standardnotes/snjs'
|
||||||
import { TOGGLE_DARK_MODE_COMMAND } from '@standardnotes/ui-services'
|
import { TOGGLE_DARK_MODE_COMMAND } from '@standardnotes/ui-services'
|
||||||
import { classNames } from '@standardnotes/utils'
|
import { classNames } from '@standardnotes/utils'
|
||||||
import { useEffect, useRef } from 'react'
|
import { useEffect, useRef, useState } from 'react'
|
||||||
import { useCommandService } from '../CommandProvider'
|
import { useCommandService } from '../CommandProvider'
|
||||||
import Icon from '../Icon/Icon'
|
import Icon from '../Icon/Icon'
|
||||||
import Popover from '../Popover/Popover'
|
import Popover from '../Popover/Popover'
|
||||||
@@ -11,16 +10,16 @@ import QuickSettingsMenu from '../QuickSettingsMenu/QuickSettingsMenu'
|
|||||||
import StyledTooltip from '../StyledTooltip/StyledTooltip'
|
import StyledTooltip from '../StyledTooltip/StyledTooltip'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
isOpen: boolean
|
|
||||||
toggleMenu: () => void
|
|
||||||
application: WebApplication
|
application: WebApplication
|
||||||
quickSettingsMenuController: QuickSettingsController
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const QuickSettingsButton = ({ application, isOpen, toggleMenu, quickSettingsMenuController }: Props) => {
|
const QuickSettingsButton = ({ application }: Props) => {
|
||||||
const buttonRef = useRef<HTMLButtonElement>(null)
|
const buttonRef = useRef<HTMLButtonElement>(null)
|
||||||
const commandService = useCommandService()
|
const commandService = useCommandService()
|
||||||
|
|
||||||
|
const [isOpen, setIsOpen] = useState(false)
|
||||||
|
const toggleMenu = () => setIsOpen(!isOpen)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
return commandService.addCommandHandler({
|
return commandService.addCommandHandler({
|
||||||
command: TOGGLE_DARK_MODE_COMMAND,
|
command: TOGGLE_DARK_MODE_COMMAND,
|
||||||
@@ -52,7 +51,7 @@ const QuickSettingsButton = ({ application, isOpen, toggleMenu, quickSettingsMen
|
|||||||
align="start"
|
align="start"
|
||||||
className="py-2"
|
className="py-2"
|
||||||
>
|
>
|
||||||
<QuickSettingsMenu quickSettingsMenuController={quickSettingsMenuController} />
|
<QuickSettingsMenu closeMenu={toggleMenu} />
|
||||||
</Popover>
|
</Popover>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import Icon from '@/Components/Icon/Icon'
|
|||||||
import FocusModeSwitch from './FocusModeSwitch'
|
import FocusModeSwitch from './FocusModeSwitch'
|
||||||
import ThemesMenuButton from './ThemesMenuButton'
|
import ThemesMenuButton from './ThemesMenuButton'
|
||||||
import { sortThemes } from '@/Utils/SortThemes'
|
import { sortThemes } from '@/Utils/SortThemes'
|
||||||
import { QuickSettingsController } from '@/Controllers/QuickSettingsController'
|
|
||||||
import PanelSettingsSection from './PanelSettingsSection'
|
import PanelSettingsSection from './PanelSettingsSection'
|
||||||
import Menu from '../Menu/Menu'
|
import Menu from '../Menu/Menu'
|
||||||
import MenuSwitchButtonItem from '../Menu/MenuSwitchButtonItem'
|
import MenuSwitchButtonItem from '../Menu/MenuSwitchButtonItem'
|
||||||
@@ -23,14 +22,13 @@ import { GetAllThemesUseCase } from '@standardnotes/ui-services'
|
|||||||
import MenuItemSeparator from '../Menu/MenuItemSeparator'
|
import MenuItemSeparator from '../Menu/MenuItemSeparator'
|
||||||
|
|
||||||
type MenuProps = {
|
type MenuProps = {
|
||||||
quickSettingsMenuController: QuickSettingsController
|
closeMenu: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
const QuickSettingsMenu: FunctionComponent<MenuProps> = ({ quickSettingsMenuController }) => {
|
const QuickSettingsMenu: FunctionComponent<MenuProps> = ({ closeMenu }) => {
|
||||||
const application = useApplication()
|
const application = useApplication()
|
||||||
|
|
||||||
const { focusModeEnabled, setFocusModeEnabled } = application.paneController
|
const { focusModeEnabled, setFocusModeEnabled } = application.paneController
|
||||||
const { closeQuickSettingsMenu } = quickSettingsMenuController
|
|
||||||
const [themes, setThemes] = useState<UIFeature<ThemeFeatureDescription>[]>([])
|
const [themes, setThemes] = useState<UIFeature<ThemeFeatureDescription>[]>([])
|
||||||
const [editorStackComponents, setEditorStackComponents] = useState<ComponentInterface[]>([])
|
const [editorStackComponents, setEditorStackComponents] = useState<ComponentInterface[]>([])
|
||||||
|
|
||||||
@@ -147,7 +145,7 @@ const QuickSettingsMenu: FunctionComponent<MenuProps> = ({ quickSettingsMenuCont
|
|||||||
<FocusModeSwitch
|
<FocusModeSwitch
|
||||||
application={application}
|
application={application}
|
||||||
onToggle={setFocusModeEnabled}
|
onToggle={setFocusModeEnabled}
|
||||||
onClose={closeQuickSettingsMenu}
|
onClose={closeMenu}
|
||||||
isEnabled={focusModeEnabled}
|
isEnabled={focusModeEnabled}
|
||||||
/>
|
/>
|
||||||
<PanelSettingsSection />
|
<PanelSettingsSection />
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
import { InternalEventBusInterface } from '@standardnotes/snjs'
|
|
||||||
import { action, makeObservable, observable } from 'mobx'
|
|
||||||
import { AbstractViewController } from './Abstract/AbstractViewController'
|
|
||||||
|
|
||||||
export class QuickSettingsController extends AbstractViewController {
|
|
||||||
open = false
|
|
||||||
shouldAnimateCloseMenu = false
|
|
||||||
|
|
||||||
constructor(eventBus: InternalEventBusInterface) {
|
|
||||||
super(eventBus)
|
|
||||||
|
|
||||||
makeObservable(this, {
|
|
||||||
open: observable,
|
|
||||||
shouldAnimateCloseMenu: observable,
|
|
||||||
|
|
||||||
setOpen: action,
|
|
||||||
setShouldAnimateCloseMenu: action,
|
|
||||||
toggle: action,
|
|
||||||
closeQuickSettingsMenu: action,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
setOpen = (open: boolean): void => {
|
|
||||||
this.open = open
|
|
||||||
}
|
|
||||||
|
|
||||||
setShouldAnimateCloseMenu = (shouldAnimate: boolean): void => {
|
|
||||||
this.shouldAnimateCloseMenu = shouldAnimate
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle = (): void => {
|
|
||||||
if (this.open) {
|
|
||||||
this.closeQuickSettingsMenu()
|
|
||||||
} else {
|
|
||||||
this.setOpen(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
closeQuickSettingsMenu = (): void => {
|
|
||||||
this.setShouldAnimateCloseMenu(true)
|
|
||||||
setTimeout(() => {
|
|
||||||
this.setOpen(false)
|
|
||||||
this.setShouldAnimateCloseMenu(false)
|
|
||||||
}, 150)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user