From fd6d83655c54c74ba9ac9eeddd6f9fc27a3baa3d Mon Sep 17 00:00:00 2001 From: Mo Date: Wed, 27 Oct 2021 10:19:42 -0500 Subject: [PATCH] feat: Component toggleability and add toggleable components to quick settings menu (#707) * feat: toggleable extensions * fix: return all themes for quick settings * chore: bump snjs deps * feat: Use Switch component for toggle in Quick Settings Menu * feat: Add toggleableComponents to footer_view * refactor: Change "components" to "toggleableComponents" * feat: Add checked state to component toggle in quick settings menu --- .../components/QuickSettingsMenu.tsx | 55 +++++++++++++- .../preferences/PreferencesMenu.ts | 75 ++++++++++++------- .../preferences/components/Content.tsx | 4 + .../preferences/panes/Extensions.tsx | 2 +- .../extensions-segments/ExtensionItem.tsx | 27 +++---- .../ui_models/app_state/preferences_state.ts | 6 +- .../javascripts/views/footer/footer_view.ts | 28 +++++-- package.json | 4 +- yarn.lock | 8 +- 9 files changed, 151 insertions(+), 58 deletions(-) diff --git a/app/assets/javascripts/components/QuickSettingsMenu.tsx b/app/assets/javascripts/components/QuickSettingsMenu.tsx index b13a355b9..cf2ba591a 100644 --- a/app/assets/javascripts/components/QuickSettingsMenu.tsx +++ b/app/assets/javascripts/components/QuickSettingsMenu.tsx @@ -5,12 +5,18 @@ import { DisclosureButton, DisclosurePanel, } from '@reach/disclosure'; -import { ContentType, SNTheme } from '@standardnotes/snjs'; +import { + ContentType, + SNTheme, + ComponentArea, + SNComponent, +} from '@standardnotes/snjs'; import { observer } from 'mobx-react-lite'; import { FunctionComponent } from 'preact'; import { useCallback, useEffect, useRef, useState } from 'preact/hooks'; import { JSXInternal } from 'preact/src/jsx'; import { Icon } from './Icon'; +import { Switch } from './Switch'; import { toDirective, useCloseOnBlur } from './utils'; const MENU_CLASSNAME = @@ -75,6 +81,9 @@ const QuickSettingsMenu: FunctionComponent = observer( const { closeQuickSettingsMenu, shouldAnimateCloseMenu } = appState.quickSettingsMenu; const [themes, setThemes] = useState([]); + const [toggleableComponents, setToggleableComponents] = useState< + SNComponent[] + >([]); const [themesMenuOpen, setThemesMenuOpen] = useState(false); const [themesMenuPosition, setThemesMenuPosition] = useState({}); const [defaultThemeOn, setDefaultThemeOn] = useState(false); @@ -113,10 +122,29 @@ const QuickSettingsMenu: FunctionComponent = observer( }); }, [application]); + const reloadToggleableComponents = useCallback(() => { + application.streamItems(ContentType.Component, () => { + const toggleableComponents = ( + application.getDisplayableItems( + ContentType.Component + ) as SNComponent[] + ).filter((component) => + [ComponentArea.EditorStack, ComponentArea.TagsList].includes( + component.area + ) + ); + setToggleableComponents(toggleableComponents); + }); + }, [application]); + useEffect(() => { reloadThemes(); }, [reloadThemes]); + useEffect(() => { + reloadToggleableComponents(); + }, [reloadToggleableComponents]); + useEffect(() => { if (themesMenuOpen) { defaultThemeButtonRef.current!.focus(); @@ -127,7 +155,10 @@ const QuickSettingsMenu: FunctionComponent = observer( prefsButtonRef.current!.focus(); }, []); - const [closeOnBlur] = useCloseOnBlur(themesMenuRef as any, setThemesMenuOpen); + const [closeOnBlur] = useCloseOnBlur( + themesMenuRef as any, + setThemesMenuOpen + ); const toggleThemesMenu = () => { if (!themesMenuOpen) { @@ -149,6 +180,10 @@ const QuickSettingsMenu: FunctionComponent = observer( appState.preferences.openPreferences(); }; + const toggleComponent = (component: SNComponent) => { + application.toggleComponent(component); + }; + const handleBtnKeyDown: React.KeyboardEventHandler = ( event ) => { @@ -296,6 +331,22 @@ const QuickSettingsMenu: FunctionComponent = observer( ))} + + {toggleableComponents.map((component) => ( + { + toggleComponent(component); + }} + > +
+ + {component.name} +
+
+ ))} +