From 25ecdceea977dc496698e6a371cbdf6a0dc32be5 Mon Sep 17 00:00:00 2001 From: Mo Date: Tue, 1 Nov 2022 15:58:12 -0500 Subject: [PATCH] refactor: remove reliance on viewport height in favor of body (#1926) --- packages/web/src/javascripts/App.tsx | 27 +---- .../javascripts/Application/Application.ts | 8 +- .../ApplicationGroupView.tsx | 6 +- .../ApplicationView/ApplicationView.tsx | 2 +- .../ContentListView/ContentListView.tsx | 2 +- .../MultipleSelectedFiles.tsx | 2 +- .../MultipleSelectedNotes.tsx | 2 +- .../NoteGroupView/NoteGroupView.tsx | 5 +- .../Components/NoteView/NoteView.tsx | 6 +- .../Popover/PositionedPopoverContent.tsx | 5 +- .../Preferences/PreferencesView.tsx | 2 +- .../HistoryModalDialog.tsx | 6 +- .../Components/Tags/Navigation.tsx | 104 ++++++++++-------- .../setViewportHeightWithFallback.tsx | 21 +--- packages/web/src/stylesheets/_main.scss | 8 +- packages/web/src/stylesheets/_modals.scss | 2 +- packages/web/tailwind.config.js | 5 - 17 files changed, 89 insertions(+), 124 deletions(-) diff --git a/packages/web/src/javascripts/App.tsx b/packages/web/src/javascripts/App.tsx index 3e8e7b92a..683da6357 100644 --- a/packages/web/src/javascripts/App.tsx +++ b/packages/web/src/javascripts/App.tsx @@ -25,7 +25,7 @@ declare global { import { disableIosTextFieldZoom } from '@/Utils' import { IsWebPlatform, WebAppVersion } from '@/Constants/Version' -import { DesktopManagerInterface, Environment, SNLog } from '@standardnotes/snjs' +import { DesktopManagerInterface, SNLog } from '@standardnotes/snjs' import ApplicationGroupView from './Components/ApplicationGroupView/ApplicationGroupView' import { WebDevice } from './Application/Device/WebDevice' import { StartApplication } from './Application/Device/StartApplication' @@ -34,8 +34,6 @@ import { WebOrDesktopDevice } from './Application/Device/WebOrDesktopDevice' import { WebApplication } from './Application/Application' import { createRoot, Root } from 'react-dom/client' import { ElementIds } from './Constants/ElementIDs' -import { MediaQueryBreakpoints } from './Hooks/useMediaQuery' -import { setViewportHeightWithFallback } from './setViewportHeightWithFallback' import { setDefaultMonospaceFont } from './setDefaultMonospaceFont' let keyCount = 0 @@ -54,27 +52,7 @@ const startApplication: StartApplication = async function startApplication( SNLog.onError = console.error let root: Root - const isDesktop = - device.environment === Environment.Desktop || - (matchMedia(MediaQueryBreakpoints.md).matches && matchMedia(MediaQueryBreakpoints.pointerFine)) - - const setupViewportHeightListeners = () => { - if (!isDesktop) { - setViewportHeightWithFallback() - window.addEventListener('orientationchange', setViewportHeightWithFallback) - window.addEventListener('resize', setViewportHeightWithFallback) - } - } - - const removeViewportHeightListeners = () => { - if (!isDesktop) { - window.removeEventListener('orientationchange', setViewportHeightWithFallback) - window.removeEventListener('resize', setViewportHeightWithFallback) - } - } - const onDestroy = () => { - removeViewportHeightListeners() const rootElement = document.getElementById(ElementIds.RootId) as HTMLElement root.unmount() rootElement.remove() @@ -84,13 +62,12 @@ const startApplication: StartApplication = async function startApplication( const renderApp = () => { const rootElement = document.createElement('div') rootElement.id = ElementIds.RootId + rootElement.className = 'h-full' const appendedRootNode = document.body.appendChild(rootElement) root = createRoot(appendedRootNode) disableIosTextFieldZoom() - setupViewportHeightListeners() - setDefaultMonospaceFont(device.platform) root.render( diff --git a/packages/web/src/javascripts/Application/Application.ts b/packages/web/src/javascripts/Application/Application.ts index 63224ca56..cf202ad79 100644 --- a/packages/web/src/javascripts/Application/Application.ts +++ b/packages/web/src/javascripts/Application/Application.ts @@ -38,7 +38,7 @@ import { import { MobileWebReceiver, NativeMobileEventListener } from '../NativeMobileWeb/MobileWebReceiver' import { AndroidBackHandler } from '@/NativeMobileWeb/AndroidBackHandler' import { PrefDefaults } from '@/Constants/PrefDefaults' -import { setCustomViewportHeight, setViewportHeightWithFallback } from '@/setViewportHeightWithFallback' +import { setCustomViewportHeight } from '@/setViewportHeightWithFallback' import { WebServices } from './WebServices' export type WebEventObserver = (event: WebAppEvent, data?: unknown) => void @@ -258,7 +258,7 @@ export class WebApplication extends SNApplication implements WebApplicationInter } async handleMobileGainingFocusEvent(): Promise { - setViewportHeightWithFallback() + /** Optional override */ } handleInitialMobileScreenshotPrivacy(): void { @@ -285,8 +285,6 @@ export class WebApplication extends SNApplication implements WebApplicationInter if (this.protections.getMobileScreenshotPrivacyEnabled()) { this.mobileDevice().hideMobileInterfaceFromScreenshots() } - - setViewportHeightWithFallback() } handleMobileColorSchemeChangeEvent() { @@ -294,7 +292,7 @@ export class WebApplication extends SNApplication implements WebApplicationInter } handleMobileKeyboardWillChangeFrameEvent(frame: { height: number; contentHeight: number }): void { - setCustomViewportHeight(String(frame.contentHeight), 'px', true) + setCustomViewportHeight(frame.contentHeight, 'px', true) this.notifyWebEvent(WebAppEvent.MobileKeyboardWillChangeFrame, frame) } diff --git a/packages/web/src/javascripts/Components/ApplicationGroupView/ApplicationGroupView.tsx b/packages/web/src/javascripts/Components/ApplicationGroupView/ApplicationGroupView.tsx index 5f1ffd969..894b22734 100644 --- a/packages/web/src/javascripts/Components/ApplicationGroupView/ApplicationGroupView.tsx +++ b/packages/web/src/javascripts/Components/ApplicationGroupView/ApplicationGroupView.tsx @@ -113,7 +113,11 @@ class ApplicationGroupView extends Component { } return ( -
+
= ({ application, mainApplicatio -
+
= ({
-
+

{count} selected files

Actions will be performed on all selected files.

diff --git a/packages/web/src/javascripts/Components/MultipleSelectedNotes/MultipleSelectedNotes.tsx b/packages/web/src/javascripts/Components/MultipleSelectedNotes/MultipleSelectedNotes.tsx index 9a0221457..9dcde7f9d 100644 --- a/packages/web/src/javascripts/Components/MultipleSelectedNotes/MultipleSelectedNotes.tsx +++ b/packages/web/src/javascripts/Components/MultipleSelectedNotes/MultipleSelectedNotes.tsx @@ -51,7 +51,7 @@ const MultipleSelectedNotes = ({ />
-
+

{count} selected notes

Actions will be performed on all selected notes.

diff --git a/packages/web/src/javascripts/Components/NoteGroupView/NoteGroupView.tsx b/packages/web/src/javascripts/Components/NoteGroupView/NoteGroupView.tsx index 872bca94e..7b17b2387 100644 --- a/packages/web/src/javascripts/Components/NoteGroupView/NoteGroupView.tsx +++ b/packages/web/src/javascripts/Components/NoteGroupView/NoteGroupView.tsx @@ -98,10 +98,7 @@ class NoteGroupView extends AbstractComponent { const canRenderEditorView = this.state.selectedPane === AppPaneId.Editor || !this.state.isInMobileView return ( -
+
{this.state.showMultipleSelectedNotes && ( { const renderHeaderOptions = isMobileScreen() ? !this.state.plaintextEditorFocused : true return ( -
+
{this.note && ( { popoverElement.scrollTop = 0 - }) + }, 10) } }, [popoverElement]) @@ -70,7 +70,8 @@ const PositionedPopoverContent = ({
= ({ return (
{ >
{children}
diff --git a/packages/web/src/javascripts/Components/Tags/Navigation.tsx b/packages/web/src/javascripts/Components/Tags/Navigation.tsx index 9fbab4237..0e51f5a12 100644 --- a/packages/web/src/javascripts/Components/Tags/Navigation.tsx +++ b/packages/web/src/javascripts/Components/Tags/Navigation.tsx @@ -10,7 +10,6 @@ import ResponsivePaneContent from '@/Components/ResponsivePane/ResponsivePaneCon import { AppPaneId } from '@/Components/ResponsivePane/AppPaneMetadata' import { classNames } from '@/Utils/ConcatenateClassNames' import { useResponsiveAppPane } from '../ResponsivePane/ResponsivePaneProvider' -import { isIOS } from '@/Utils' import UpgradeNow from '../Footer/UpgradeNow' import RoundIconButton from '../Button/RoundIconButton' @@ -54,16 +53,70 @@ const Navigation: FunctionComponent = ({ application }) => { [application], ) + const NavigationFooter = useMemo(() => { + return ( +
+ { + toggleAppPane(AppPaneId.Items) + }} + label="Go to items list" + icon="chevron-left" + /> + + { + viewControllerManager.accountMenuController.toggleShow() + }} + label="Go to account menu" + icon="account-circle" + /> + {hasPasscode && ( + application.lock()} + label="Locks application and wipes unencrypted data from memory." + className="ml-2.5 bg-default" + icon="lock-filled" + /> + )} + { + viewControllerManager.preferencesController.openPreferences() + }} + label="Go to preferences" + icon="tune" + /> + { + viewControllerManager.quickSettingsMenuController.toggle() + }} + label="Go to quick settings menu" + icon="themes" + /> +
+ ) + }, [hasPasscode, application, viewControllerManager, toggleAppPane]) + return ( -
- { - toggleAppPane(AppPaneId.Items) - }} - label="Go to items list" - icon="chevron-left" - /> - - { - viewControllerManager.accountMenuController.toggleShow() - }} - label="Go to account menu" - icon="account-circle" - /> - {hasPasscode && ( - application.lock()} - label="Locks application and wipes unencrypted data from memory." - className="ml-2.5 bg-default" - icon="lock-filled" - /> - )} - { - viewControllerManager.preferencesController.openPreferences() - }} - label="Go to preferences" - icon="tune" - /> - { - viewControllerManager.quickSettingsMenuController.toggle() - }} - label="Go to quick settings menu" - icon="themes" - /> -
+ {NavigationFooter} {panelElement && ( { - const newValue = visualViewport && visualViewport.height > 0 ? visualViewport.height : window.innerHeight - - if (!newValue) { - setCustomViewportHeight('100', 'vh') - return - } - - setCustomViewportHeight(String(newValue), 'px') -} - /** * @param forceTriggerResizeEvent On iPad at least, setProperty(ViewportHeightKey) does not trigger a resize event */ -export const setCustomViewportHeight = (height: string, suffix: 'px' | 'vh', forceTriggerResizeEvent = false) => { - log(LoggingDomain.Viewport, `setCustomViewportHeight: ${height}`) +export const setCustomViewportHeight = (height: number, suffix: 'px' | 'vh', forceTriggerResizeEvent = false) => { + const value = `${height}${suffix}` - document.documentElement.style.setProperty(ViewportHeightKey, `${height}${suffix}`) + log(LoggingDomain.Viewport, `setCustomViewportHeight: ${value}`) + + document.body.style.height = value if (forceTriggerResizeEvent) { window.dispatchEvent(new Event('resize')) diff --git a/packages/web/src/stylesheets/_main.scss b/packages/web/src/stylesheets/_main.scss index 50e273218..b10dceb76 100644 --- a/packages/web/src/stylesheets/_main.scss +++ b/packages/web/src/stylesheets/_main.scss @@ -121,7 +121,7 @@ p { html, body, .main-ui-view { - height: max-content; + height: 100%; min-height: 0; max-height: none; @@ -139,8 +139,6 @@ body, background-color: var(--editor-header-bar-background-color); } -$footer-height: 2rem; - #resizer-overlay { position: absolute; width: 100%; @@ -157,10 +155,6 @@ $footer-height: 2rem; vertical-align: top; width: 100%; - @media screen and (min-width: 768px) { - height: calc(var(--viewport-height, 100vh) - #{$footer-height}); - } - .section { position: relative; overflow: hidden; diff --git a/packages/web/src/stylesheets/_modals.scss b/packages/web/src/stylesheets/_modals.scss index 34dbdf5d0..1e269aadc 100644 --- a/packages/web/src/stylesheets/_modals.scss +++ b/packages/web/src/stylesheets/_modals.scss @@ -45,7 +45,7 @@ bottom: 0; z-index: var(--z-index-modal); width: 100%; - height: var(--viewport-height, 100vh); + height: 100vh; padding-left: 1rem; padding-right: 1rem; diff --git a/packages/web/tailwind.config.js b/packages/web/tailwind.config.js index 0b3112324..ab7a7f5ab 100644 --- a/packages/web/tailwind.config.js +++ b/packages/web/tailwind.config.js @@ -53,17 +53,12 @@ module.exports = { 89: '22.25rem', 125: '31.25rem', }, - height: { - screen: 'var(--viewport-height, 100vh)', - }, minHeight: { 1: '0.25rem', 2: '0.5rem', - screen: 'var(--viewport-height, 100vh)', }, maxHeight: { 110: '27.5rem', - screen: 'var(--viewport-height, 100vh)', }, zIndex: { 'editor-content': 'var(--z-index-editor-content)',