From 70e37c0119f4ba95ccf6549f0df4aac770f1bb8f Mon Sep 17 00:00:00 2001 From: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com> Date: Thu, 11 Apr 2024 14:33:03 -0700 Subject: [PATCH] Use desktop colors for mobile autocomplete modals (#2577) * Use desktop colors for mobile autocomplete modals * Release notes * Color updates * Color updates * Update close button * Fix typecheck * Rename to ModalCloseButton * Update ModalTitle --- .../src/components/FatalError.tsx | 2 +- .../src/components/MobileWebMessage.tsx | 4 +- .../autocomplete/AccountAutocomplete.tsx | 3 ++ .../autocomplete/CategoryAutocomplete.tsx | 7 +--- .../components/autocomplete/ItemHeader.tsx | 1 - .../autocomplete/PayeeAutocomplete.tsx | 4 -- .../src/components/common/Modal.tsx | 37 +++++++++++++------ .../components/gocardless/GoCardlessLink.tsx | 2 +- .../components/mobile/transactions/Option.jsx | 2 +- .../modals/AccountAutocompleteModal.tsx | 22 +++++++---- .../modals/CategoryAutocompleteModal.tsx | 22 +++++++---- .../src/components/modals/EditField.jsx | 7 +--- .../modals/PayeeAutocompleteModal.tsx | 20 +++++++--- .../desktop-client/src/style/themes/dark.ts | 2 - .../src/style/themes/development.ts | 2 - .../desktop-client/src/style/themes/light.ts | 2 - .../src/style/themes/midnight.ts | 2 - upcoming-release-notes/2577.md | 6 +++ 18 files changed, 86 insertions(+), 61 deletions(-) create mode 100644 upcoming-release-notes/2577.md diff --git a/packages/desktop-client/src/components/FatalError.tsx b/packages/desktop-client/src/components/FatalError.tsx index 6613cd536..ec92d7546 100644 --- a/packages/desktop-client/src/components/FatalError.tsx +++ b/packages/desktop-client/src/components/FatalError.tsx @@ -167,7 +167,7 @@ export function FatalError({ buttonText, error }: FatalErrorProps) { const showSimpleRender = 'type' in error && error.type === 'app-init-failure'; return ( - <Modal isCurrent={true} showClose={false} title="Fatal Error"> + <Modal isCurrent={true} CloseButton={undefined} title="Fatal Error"> <View style={{ maxWidth: 500, diff --git a/packages/desktop-client/src/components/MobileWebMessage.tsx b/packages/desktop-client/src/components/MobileWebMessage.tsx index c54da6eed..ae4b17eba 100644 --- a/packages/desktop-client/src/components/MobileWebMessage.tsx +++ b/packages/desktop-client/src/components/MobileWebMessage.tsx @@ -50,8 +50,8 @@ export function MobileWebMessage() { bottom: 0, left: 0, right: 0, - backgroundColor: theme.mobileModalBackground, - color: theme.mobileModalText, + backgroundColor: theme.menuAutoCompleteBackground, + color: theme.menuAutoCompleteText, padding: 10, margin: 10, borderRadius: 6, diff --git a/packages/desktop-client/src/components/autocomplete/AccountAutocomplete.tsx b/packages/desktop-client/src/components/autocomplete/AccountAutocomplete.tsx index bc053ed99..210eebaf0 100644 --- a/packages/desktop-client/src/components/autocomplete/AccountAutocomplete.tsx +++ b/packages/desktop-client/src/components/autocomplete/AccountAutocomplete.tsx @@ -212,6 +212,9 @@ function AccountItem({ backgroundColor: highlighted ? theme.menuAutoCompleteBackgroundHover : 'transparent', + color: highlighted + ? theme.menuAutoCompleteItemTextHover + : theme.menuAutoCompleteItemText, padding: 4, paddingLeft: 20, borderRadius: embedded ? 4 : 0, diff --git a/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx b/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx index ec9b40b2b..419467e2a 100644 --- a/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx +++ b/packages/desktop-client/src/components/autocomplete/CategoryAutocomplete.tsx @@ -299,8 +299,7 @@ type CategoryItemProps = { embedded?: boolean; }; -// eslint-disable-next-line import/no-unused-modules -export function CategoryItem({ +function CategoryItem({ item, className, style, @@ -312,7 +311,6 @@ export function CategoryItem({ const narrowStyle = isNarrowWidth ? { ...styles.mobileMenuItem, - color: theme.menuAutoCompleteText, borderRadius: 0, borderTop: `1px solid ${theme.pillBorder}`, } @@ -331,9 +329,6 @@ export function CategoryItem({ color: highlighted ? theme.menuAutoCompleteItemTextHover : theme.menuAutoCompleteItemText, - ':hover': { - color: theme.menuAutoCompleteItemTextHover, - }, padding: 4, paddingLeft: 20, borderRadius: embedded ? 4 : 0, diff --git a/packages/desktop-client/src/components/autocomplete/ItemHeader.tsx b/packages/desktop-client/src/components/autocomplete/ItemHeader.tsx index 0bdc87ba8..2b0004faa 100644 --- a/packages/desktop-client/src/components/autocomplete/ItemHeader.tsx +++ b/packages/desktop-client/src/components/autocomplete/ItemHeader.tsx @@ -15,7 +15,6 @@ export function ItemHeader({ title, style, type, ...props }: ItemHeaderProps) { const narrowStyle = isNarrowWidth ? { ...styles.largeText, - color: theme.menuItemTextHeader, paddingTop: 10, paddingBottom: 10, } diff --git a/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx b/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx index ae676abee..daa8294c2 100644 --- a/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx +++ b/packages/desktop-client/src/components/autocomplete/PayeeAutocomplete.tsx @@ -484,7 +484,6 @@ function PayeeItem({ const narrowStyle = isNarrowWidth ? { ...styles.mobileMenuItem, - color: theme.menuAutoCompleteText, borderRadius: 0, borderTop: `1px solid ${theme.pillBorder}`, } @@ -522,9 +521,6 @@ function PayeeItem({ color: highlighted ? theme.menuAutoCompleteItemTextHover : theme.menuAutoCompleteItemText, - ':hover': { - color: theme.menuAutoCompleteItemTextHover, - }, borderRadius: embedded ? 4 : 0, padding: 4, paddingLeft: 20, diff --git a/packages/desktop-client/src/components/common/Modal.tsx b/packages/desktop-client/src/components/common/Modal.tsx index 8435bdbed..830eecb0f 100644 --- a/packages/desktop-client/src/components/common/Modal.tsx +++ b/packages/desktop-client/src/components/common/Modal.tsx @@ -5,6 +5,9 @@ import React, { useLayoutEffect, type ReactNode, useState, + type ComponentProps, + type ComponentType, + type ComponentPropsWithRef, } from 'react'; import { useHotkeysContext } from 'react-hotkeys-hook'; import ReactModal from 'react-modal'; @@ -30,8 +33,9 @@ export type ModalProps = { padding?: CSSProperties['padding']; showHeader?: boolean; leftHeaderContent?: ReactNode; + CloseButton?: ComponentType<ComponentPropsWithRef<typeof ModalCloseButton>>; showTitle?: boolean; - showClose?: boolean; + editableTitle?: boolean; showOverlay?: boolean; loading?: boolean; noAnimation?: boolean; @@ -52,8 +56,8 @@ export const Modal = ({ padding = 20, showHeader = true, leftHeaderContent, + CloseButton: CloseButtonComponent = ModalCloseButton, showTitle = true, - showClose = true, showOverlay = true, loading = false, noAnimation = false, @@ -200,16 +204,7 @@ export const Modal = ({ marginLeft: !isNarrowWidth ? 5 : undefined, }} > - {showClose && ( - <Button - type="bare" - onClick={onClose} - style={{ padding: 10 }} - aria-label="Close" - > - <SvgDelete width={10} style={{ color: 'inherit' }} /> - </Button> - )} + <CloseButtonComponent onClick={onClose} /> </View> </View> )} @@ -462,3 +457,21 @@ export function ModalTitle({ </Text> ); } + +type ModalCloseButtonProps = { + onClick: ComponentProps<typeof Button>['onClick']; + style?: CSSProperties; +}; + +export function ModalCloseButton({ onClick, style }: ModalCloseButtonProps) { + return ( + <Button + type="bare" + onClick={onClick} + style={{ padding: '10px 10px' }} + aria-label="Close" + > + <SvgDelete width={10} style={style} /> + </Button> + ); +} diff --git a/packages/desktop-client/src/components/gocardless/GoCardlessLink.tsx b/packages/desktop-client/src/components/gocardless/GoCardlessLink.tsx index 9a3e3d656..297763f0d 100644 --- a/packages/desktop-client/src/components/gocardless/GoCardlessLink.tsx +++ b/packages/desktop-client/src/components/gocardless/GoCardlessLink.tsx @@ -8,7 +8,7 @@ export function GoCardlessLink() { window.close(); return ( - <Modal isCurrent={true} showClose={false} title="Account sync"> + <Modal isCurrent={true} CloseButton={undefined} title="Account sync"> {() => ( <View style={{ maxWidth: 500 }}> <Paragraph>Please wait...</Paragraph> diff --git a/packages/desktop-client/src/components/mobile/transactions/Option.jsx b/packages/desktop-client/src/components/mobile/transactions/Option.jsx index 8fc46836e..f8711105c 100644 --- a/packages/desktop-client/src/components/mobile/transactions/Option.jsx +++ b/packages/desktop-client/src/components/mobile/transactions/Option.jsx @@ -22,7 +22,7 @@ export function Option({ isLast, item, state }) { background: isSelected ? theme.tableRowBackgroundHighlight : theme.tableBackground, - color: isSelected ? theme.mobileModalText : null, + color: isSelected ? theme.tableText : null, outline: isFocusVisible ? '2px solid orange' : 'none', ...(!isLast && { borderBottom: `1px solid ${theme.tableBorder}` }), }} diff --git a/packages/desktop-client/src/components/modals/AccountAutocompleteModal.tsx b/packages/desktop-client/src/components/modals/AccountAutocompleteModal.tsx index 5ec7911be..15026d0d8 100644 --- a/packages/desktop-client/src/components/modals/AccountAutocompleteModal.tsx +++ b/packages/desktop-client/src/components/modals/AccountAutocompleteModal.tsx @@ -3,7 +3,7 @@ import React, { type ComponentPropsWithoutRef } from 'react'; import { useResponsive } from '../../ResponsiveProvider'; import { theme } from '../../style'; import { AccountAutocomplete } from '../autocomplete/AccountAutocomplete'; -import { Modal } from '../common/Modal'; +import { ModalCloseButton, Modal, ModalTitle } from '../common/Modal'; import { View } from '../common/View'; import { SectionLabel } from '../forms'; import { type CommonModalProps } from '../Modals'; @@ -31,7 +31,12 @@ export function AccountAutocompleteModal({ return ( <Modal - title="Account" + title={ + <ModalTitle + title="Account" + getStyle={() => ({ color: theme.menuAutoCompleteText })} + /> + } noAnimation={!isNarrowWidth} showHeader={isNarrowWidth} focusAfterClose={false} @@ -43,11 +48,14 @@ export function AccountAutocompleteModal({ height: isNarrowWidth ? '85vh' : 275, padding: '15px 10px', borderRadius: '6px', - ...(!isNarrowWidth && { - backgroundColor: theme.mobileModalBackground, - color: theme.mobileModalText, - }), + backgroundColor: theme.menuAutoCompleteBackground, }} + CloseButton={props => ( + <ModalCloseButton + {...props} + style={{ color: theme.menuAutoCompleteText }} + /> + )} > {() => ( <View> @@ -56,7 +64,7 @@ export function AccountAutocompleteModal({ title="Account" style={{ alignSelf: 'center', - color: theme.mobileModalText, + color: theme.menuAutoCompleteText, marginBottom: 10, }} /> diff --git a/packages/desktop-client/src/components/modals/CategoryAutocompleteModal.tsx b/packages/desktop-client/src/components/modals/CategoryAutocompleteModal.tsx index 6d5c9f972..971269655 100644 --- a/packages/desktop-client/src/components/modals/CategoryAutocompleteModal.tsx +++ b/packages/desktop-client/src/components/modals/CategoryAutocompleteModal.tsx @@ -3,7 +3,7 @@ import React, { type ComponentPropsWithoutRef } from 'react'; import { useResponsive } from '../../ResponsiveProvider'; import { theme } from '../../style'; import { CategoryAutocomplete } from '../autocomplete/CategoryAutocomplete'; -import { Modal } from '../common/Modal'; +import { ModalCloseButton, Modal, ModalTitle } from '../common/Modal'; import { View } from '../common/View'; import { SectionLabel } from '../forms'; import { type CommonModalProps } from '../Modals'; @@ -32,7 +32,12 @@ export function CategoryAutocompleteModal({ return ( <Modal - title="Category" + title={ + <ModalTitle + title="Category" + getStyle={() => ({ color: theme.menuAutoCompleteText })} + /> + } noAnimation={!isNarrowWidth} showHeader={isNarrowWidth} focusAfterClose={false} @@ -44,11 +49,14 @@ export function CategoryAutocompleteModal({ height: isNarrowWidth ? '85vh' : 275, padding: '15px 10px', borderRadius: '6px', - ...(!isNarrowWidth && { - backgroundColor: theme.mobileModalBackground, - color: theme.mobileModalText, - }), + backgroundColor: theme.menuAutoCompleteBackground, }} + CloseButton={props => ( + <ModalCloseButton + {...props} + style={{ color: theme.menuAutoCompleteText }} + /> + )} > {() => ( <View> @@ -57,7 +65,7 @@ export function CategoryAutocompleteModal({ title="Category" style={{ alignSelf: 'center', - color: theme.mobileModalText, + color: theme.menuAutoCompleteText, marginBottom: 10, }} /> diff --git a/packages/desktop-client/src/components/modals/EditField.jsx b/packages/desktop-client/src/components/modals/EditField.jsx index a4822faf3..4d0b06465 100644 --- a/packages/desktop-client/src/components/modals/EditField.jsx +++ b/packages/desktop-client/src/components/modals/EditField.jsx @@ -278,10 +278,7 @@ export function EditField({ modalProps, name, onSubmit, onClose }) { padding: '15px 10px', borderRadius: '6px', ...(minWidth && { minWidth }), - ...(!isNarrowWidth && { - backgroundColor: theme.mobileModalBackground, - color: theme.mobileModalText, - }), + backgroundColor: theme.menuAutoCompleteBackground, }} > {() => ( @@ -291,7 +288,7 @@ export function EditField({ modalProps, name, onSubmit, onClose }) { title={label} style={{ alignSelf: 'center', - color: theme.mobileModalText, + color: theme.menuAutoCompleteText, marginBottom: 10, }} /> diff --git a/packages/desktop-client/src/components/modals/PayeeAutocompleteModal.tsx b/packages/desktop-client/src/components/modals/PayeeAutocompleteModal.tsx index 6eaf1a5a5..3d26dc45d 100644 --- a/packages/desktop-client/src/components/modals/PayeeAutocompleteModal.tsx +++ b/packages/desktop-client/src/components/modals/PayeeAutocompleteModal.tsx @@ -5,7 +5,7 @@ import { usePayees } from '../../hooks/usePayees'; import { useResponsive } from '../../ResponsiveProvider'; import { theme } from '../../style'; import { PayeeAutocomplete } from '../autocomplete/PayeeAutocomplete'; -import { Modal } from '../common/Modal'; +import { ModalCloseButton, Modal, ModalTitle } from '../common/Modal'; import { type CommonModalProps } from '../Modals'; type PayeeAutocompleteModalProps = { @@ -34,7 +34,12 @@ export function PayeeAutocompleteModal({ return ( <Modal - title="Payee" + title={ + <ModalTitle + title="Payee" + getStyle={() => ({ color: theme.menuAutoCompleteText })} + /> + } noAnimation={!isNarrowWidth} showHeader={isNarrowWidth} focusAfterClose={false} @@ -46,11 +51,14 @@ export function PayeeAutocompleteModal({ height: isNarrowWidth ? '85vh' : 275, padding: '15px 10px', borderRadius: '6px', - ...(!isNarrowWidth && { - backgroundColor: theme.mobileModalBackground, - color: theme.mobileModalText, - }), + backgroundColor: theme.menuAutoCompleteBackground, }} + CloseButton={props => ( + <ModalCloseButton + {...props} + style={{ color: theme.menuAutoCompleteText }} + /> + )} > {() => ( <PayeeAutocomplete diff --git a/packages/desktop-client/src/style/themes/dark.ts b/packages/desktop-client/src/style/themes/dark.ts index 45e8dca03..81b756b8d 100644 --- a/packages/desktop-client/src/style/themes/dark.ts +++ b/packages/desktop-client/src/style/themes/dark.ts @@ -75,8 +75,6 @@ export const mobileNavItem = colorPalette.navy150; export const mobileNavItemSelected = colorPalette.purple400; export const mobileAccountShadow = cardShadow; export const mobileAccountText = colorPalette.blue800; -export const mobileModalBackground = colorPalette.navy900; -export const mobileModalText = colorPalette.white; // Mobile view themes (for the top bar) export const mobileViewTheme = mobileHeaderBackground; diff --git a/packages/desktop-client/src/style/themes/development.ts b/packages/desktop-client/src/style/themes/development.ts index e90f8de73..c8a47c85e 100644 --- a/packages/desktop-client/src/style/themes/development.ts +++ b/packages/desktop-client/src/style/themes/development.ts @@ -75,8 +75,6 @@ export const mobileNavItem = colorPalette.gray300; export const mobileNavItemSelected = colorPalette.purple500; export const mobileAccountShadow = colorPalette.navy300; export const mobileAccountText = colorPalette.blue800; -export const mobileModalBackground = colorPalette.navy900; -export const mobileModalText = colorPalette.white; // Mobile view themes (for the top bar) export const mobileViewTheme = mobileHeaderBackground; diff --git a/packages/desktop-client/src/style/themes/light.ts b/packages/desktop-client/src/style/themes/light.ts index 1696f5fd0..37549803d 100644 --- a/packages/desktop-client/src/style/themes/light.ts +++ b/packages/desktop-client/src/style/themes/light.ts @@ -77,8 +77,6 @@ export const mobileNavItem = colorPalette.gray300; export const mobileNavItemSelected = colorPalette.purple500; export const mobileAccountShadow = colorPalette.navy300; export const mobileAccountText = colorPalette.blue800; -export const mobileModalBackground = colorPalette.navy900; -export const mobileModalText = colorPalette.white; // Mobile view themes (for the top bar) export const mobileViewTheme = mobileHeaderBackground; diff --git a/packages/desktop-client/src/style/themes/midnight.ts b/packages/desktop-client/src/style/themes/midnight.ts index 1d07595a9..cb6a41e72 100644 --- a/packages/desktop-client/src/style/themes/midnight.ts +++ b/packages/desktop-client/src/style/themes/midnight.ts @@ -76,8 +76,6 @@ export const mobileNavItem = colorPalette.gray150; export const mobileNavItemSelected = colorPalette.purple200; export const mobileAccountShadow = cardShadow; export const mobileAccountText = colorPalette.blue800; -export const mobileModalBackground = menuAutoCompleteBackground; -export const mobileModalText = colorPalette.white; // Mobile view themes (for the top bar) export const mobileViewTheme = mobileHeaderBackground; diff --git a/upcoming-release-notes/2577.md b/upcoming-release-notes/2577.md new file mode 100644 index 000000000..a1def19a8 --- /dev/null +++ b/upcoming-release-notes/2577.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [joel-jeremy] +--- + +Use desktop colors for mobile autocomplete modals. -- GitLab