From b506137655c7136a19f6ad0288675af9432390d5 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Wed, 10 May 2023 15:59:45 +0530 Subject: [PATCH] refactor: safe area inset fallback (#2329) --- .../javascripts/Components/Modal/Modal.tsx | 10 ++++--- .../Components/Modal/ModalDialogButtons.tsx | 28 +++++++++++-------- .../Preferences/PreferencesMenuView.tsx | 6 ++-- .../Preferences/PreferencesView.tsx | 6 ++-- .../Components/Tags/Navigation.tsx | 6 ++-- .../javascripts/Hooks/useSafeAreaPadding.ts | 15 ++++++++++ 6 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 packages/web/src/javascripts/Hooks/useSafeAreaPadding.ts diff --git a/packages/web/src/javascripts/Components/Modal/Modal.tsx b/packages/web/src/javascripts/Components/Modal/Modal.tsx index 5f8dfd322..6f7a9f201 100644 --- a/packages/web/src/javascripts/Components/Modal/Modal.tsx +++ b/packages/web/src/javascripts/Components/Modal/Modal.tsx @@ -1,5 +1,5 @@ import { useMediaQuery, MutuallyExclusiveMediaQueryBreakpoints } from '@/Hooks/useMediaQuery' -import { isIOS } from '@/Utils' +import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding' import { classNames } from '@standardnotes/snjs' import { ReactNode, useMemo, useRef, useState } from 'react' import Button from '../Button/Button' @@ -92,6 +92,8 @@ const Modal = ({ const [showAdvanced, setShowAdvanced] = useState(false) const advancedOptionRef = useRef(null) + const { hasTopInset, hasBottomInset } = useAvailableSafeAreaPadding() + return ( <> @@ -112,8 +114,8 @@ const Modal = ({ ) : (
@@ -200,7 +202,7 @@ const Modal = ({
{sortedActions.map((action, index) => ( diff --git a/packages/web/src/javascripts/Components/Modal/ModalDialogButtons.tsx b/packages/web/src/javascripts/Components/Modal/ModalDialogButtons.tsx index fc686091b..d48261393 100644 --- a/packages/web/src/javascripts/Components/Modal/ModalDialogButtons.tsx +++ b/packages/web/src/javascripts/Components/Modal/ModalDialogButtons.tsx @@ -1,4 +1,4 @@ -import { isIOS } from '@/Utils' +import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding' import { classNames } from '@standardnotes/utils' import { FunctionComponent, ReactNode } from 'react' @@ -7,16 +7,20 @@ type Props = { children?: ReactNode } -const ModalDialogButtons: FunctionComponent = ({ children, className }) => ( -
- {children} -
-) +const ModalDialogButtons: FunctionComponent = ({ children, className }) => { + const { hasBottomInset } = useAvailableSafeAreaPadding() + + return ( +
+ {children} +
+ ) +} export default ModalDialogButtons diff --git a/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx b/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx index d2c3dad3e..0cd6bc972 100644 --- a/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx +++ b/packages/web/src/javascripts/Components/Preferences/PreferencesMenuView.tsx @@ -6,7 +6,7 @@ import PreferencesMenuItem from './PreferencesComponents/MenuItem' import { PreferencesMenu } from './PreferencesMenu' import { PreferenceId } from '@standardnotes/ui-services' import { classNames } from '@standardnotes/snjs' -import { isIOS } from '@/Utils' +import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding' type Props = { menu: PreferencesMenu @@ -25,11 +25,13 @@ const PreferencesMenuView: FunctionComponent = ({ menu }) => { [menuItems], ) + const { hasBottomInset } = useAvailableSafeAreaPadding() + return (
diff --git a/packages/web/src/javascripts/Components/Preferences/PreferencesView.tsx b/packages/web/src/javascripts/Components/Preferences/PreferencesView.tsx index 44b9ca91a..b41099558 100644 --- a/packages/web/src/javascripts/Components/Preferences/PreferencesView.tsx +++ b/packages/web/src/javascripts/Components/Preferences/PreferencesView.tsx @@ -8,9 +8,9 @@ import { useDisableBodyScrollOnMobile } from '@/Hooks/useDisableBodyScrollOnMobi import { useAndroidBackHandler } from '@/NativeMobileWeb/useAndroidBackHandler' import Modal from '../Modal/Modal' import { classNames } from '@standardnotes/snjs' -import { isIOS } from '@/Utils' import { useCommandService } from '../CommandProvider' import { ESCAPE_COMMAND } from '@standardnotes/ui-services' +import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding' const PreferencesView: FunctionComponent = ({ application, @@ -56,6 +56,8 @@ const PreferencesView: FunctionComponent = ({ }) }, [commandService, closePreferences]) + const { hasTopInset } = useAvailableSafeAreaPadding() + return ( = ({
diff --git a/packages/web/src/javascripts/Components/Tags/Navigation.tsx b/packages/web/src/javascripts/Components/Tags/Navigation.tsx index 024376330..19ff8ba2b 100644 --- a/packages/web/src/javascripts/Components/Tags/Navigation.tsx +++ b/packages/web/src/javascripts/Components/Tags/Navigation.tsx @@ -8,12 +8,12 @@ import { classNames } from '@standardnotes/utils' import { useResponsiveAppPane } from '../Panes/ResponsivePaneProvider' import UpgradeNow from '../Footer/UpgradeNow' import RoundIconButton from '../Button/RoundIconButton' -import { isIOS } from '@/Utils' import { PanelResizedData } from '@/Types/PanelResizedData' import { PANEL_NAME_NAVIGATION } from '@/Constants/Constants' import { PaneLayout } from '@/Controllers/PaneController/PaneLayout' import { usePaneSwipeGesture } from '../Panes/usePaneGesture' import { mergeRefs } from '@/Hooks/mergeRefs' +import { useAvailableSafeAreaPadding } from '@/Hooks/useSafeAreaPadding' type Props = { application: WebApplication @@ -55,6 +55,8 @@ const Navigation = forwardRef(({ application, className, 'swipe', ) + const { hasBottomInset } = useAvailableSafeAreaPadding() + return (
(({ application, className, className={classNames( 'fixed bottom-0 flex min-h-[50px] w-full items-center border-t border-border bg-contrast', 'px-3.5 pt-2.5 md:hidden', - isIOS() ? 'pb-safe-bottom' : 'pb-2.5', + hasBottomInset ? 'pb-safe-bottom' : 'pb-2.5', )} > { + const documentStyle = getComputedStyle(document.documentElement) + + const top = parseInt(documentStyle.getPropertyValue('--safe-area-inset-top')) + const right = parseInt(documentStyle.getPropertyValue('--safe-area-inset-right')) + const bottom = parseInt(documentStyle.getPropertyValue('--safe-area-inset-bottom')) + const left = parseInt(documentStyle.getPropertyValue('--safe-area-inset-left')) + + return { + hasTopInset: !!top, + hasRightInset: !!right, + hasBottomInset: !!bottom, + hasLeftInset: !!left, + } +}