Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit 512c17e

Browse files
Better recognition of touch devices (#1653)
* Change breakpoint when desktop mode will be enabled for ResponsiveWrapper * Use media hover to better determine touch devices * Fix incorrect type * Use real touch device for pickers visual regression * Change touch device media to (hover: fine) * Remove unused import
1 parent b223777 commit 512c17e

File tree

8 files changed

+41
-38
lines changed

8 files changed

+41
-38
lines changed

docs/prop-types.json

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

e2e/integration/VisualRegression.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('Visual Regression', () => {
1212
{
1313
url: '/demo/datepicker',
1414
name: 'DatePicker demo',
15-
hardResponsive: true,
15+
withRealTouchDevice: true,
1616
withDarkTheme: true,
1717
scenarios: {
1818
'Opened datepicker': () => {
@@ -26,7 +26,7 @@ describe('Visual Regression', () => {
2626
{
2727
url: '/demo/timepicker',
2828
name: 'TimePicker demo',
29-
responsive: true,
29+
withRealTouchDevice: true,
3030
withDarkTheme: true,
3131
scenarios: {
3232
'Opened timepicker': () => {
@@ -40,7 +40,7 @@ describe('Visual Regression', () => {
4040
{
4141
url: '/demo/datetime-picker',
4242
name: 'DateTimePicker demo',
43-
responsive: true,
43+
withRealTouchDevice: true,
4444
withDarkTheme: true,
4545
scenarios: {
4646
'Opened datetimepicker': () => {
@@ -88,7 +88,7 @@ describe('Visual Regression', () => {
8888
}
8989

9090
if (page.scenarios) {
91-
const defaultWidthForScenarios = page.hardResponsive ? [1280] : [1280, 375];
91+
const defaultWidthForScenarios = page.withRealTouchDevice ? [1280] : [1280, 375];
9292

9393
Object.entries(page.scenarios).forEach(([name, execute]) => {
9494
if (!execute || typeof execute !== 'function') {
@@ -101,7 +101,7 @@ describe('Visual Regression', () => {
101101
cy.percySnapshot(`${page.name}: ${name}`, { widths: defaultWidthForScenarios });
102102
});
103103

104-
if (page.hardResponsive) {
104+
if (page.withRealTouchDevice) {
105105
it(`${page.name} scenario: ${name} on mobile`, () => {
106106
cy.viewport('iphone-x');
107107

@@ -119,7 +119,7 @@ describe('Visual Regression', () => {
119119
});
120120
}
121121

122-
if (page.withDarkTheme && page.hardResponsive) {
122+
if (page.withDarkTheme && page.withRealTouchDevice) {
123123
it(`${page.name} scenario: ${name} on mobile in dark theme`, () => {
124124
cy.viewport('iphone-x');
125125
cy.toggleTheme();

lib/src/DateRangePicker/DateRangePicker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import { parsePickerInputValue } from '../_helpers/date-utils';
77
import { usePickerState } from '../_shared/hooks/usePickerState';
88
import { AllSharedPickerProps } from '../Picker/SharedPickerProps';
99
import { DateRange as DateRangeType, RangeInput } from './RangeTypes';
10-
import { ResponsivePopperWrapper } from '../wrappers/ResponsiveWrapper';
1110
import { DesktopPopperWrapper } from '../wrappers/DesktopPopperWrapper';
1211
import { MuiPickersAdapter, useUtils } from '../_shared/hooks/useUtils';
1312
import { makeWrapperComponent } from '../wrappers/makeWrapperComponent';
13+
import { ResponsivePopperWrapper } from '../wrappers/ResponsiveWrapper';
1414
import { SomeWrapper, ExtendWrapper, StaticWrapper } from '../wrappers/Wrapper';
1515
import { DateRangePickerView, ExportedDateRangePickerViewProps } from './DateRangePickerView';
1616
import { DateRangePickerInput, ExportedDateRangePickerInputProps } from './DateRangePickerInput';

lib/src/__tests__/DatePicker.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe('e2e - DatePicker default year format', () => {
2020
<DatePicker
2121
DialogProps={{}}
2222
PopoverProps={{}}
23-
desktopModeBreakpoint="xs"
23+
desktopModeMediaQuery="(min-width:720px)"
2424
value={utilsToUse.date('2018-01-01T00:00:00.000')}
2525
onChange={onChangeMock}
2626
views={['year']}

lib/src/constants/dimensions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ export const VIEW_HEIGHT = 358;
77
export const DAY_SIZE = 36;
88

99
export const DAY_MARGIN = 2;
10+
11+
export const IS_TOUCH_DEVICE_MEDIA = '@media (pointer: fine)';

lib/src/wrappers/DesktopPopperWrapper.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { makeStyles } from '@material-ui/core/styles';
1111
import { InnerMobileWrapperProps } from './MobileWrapper';
1212
import { InnerDesktopWrapperProps } from './DesktopWrapper';
1313
import { WrapperVariantContext } from './WrapperVariantContext';
14+
import { IS_TOUCH_DEVICE_MEDIA } from '../constants/dimensions';
1415
import { KeyboardDateInput } from '../_shared/KeyboardDateInput';
1516
import { useGlobalKeyDown, keycode } from '../_shared/hooks/useKeyDown';
1617
import { TransitionProps } from '@material-ui/core/transitions/transition';
@@ -36,7 +37,7 @@ const useStyles = makeStyles(theme => ({
3637
transformOrigin: 'top center',
3738
'&:focus': {
3839
outline: 'auto',
39-
'@media (pointer:coarse)': {
40+
[IS_TOUCH_DEVICE_MEDIA]: {
4041
outline: 0,
4142
},
4243
},

lib/src/wrappers/DesktopWrapper.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { StaticWrapperProps } from './StaticWrapper';
77
import { makeStyles } from '@material-ui/core/styles';
88
import { InnerMobileWrapperProps } from './MobileWrapper';
99
import { WrapperVariantContext } from './WrapperVariantContext';
10+
import { IS_TOUCH_DEVICE_MEDIA } from '../constants/dimensions';
1011
import { InnerDesktopPopperWrapperProps } from './DesktopPopperWrapper';
1112

1213
export interface InnerDesktopWrapperProps {
@@ -23,7 +24,7 @@ const useStyles = makeStyles({
2324
popover: {
2425
'&:focus': {
2526
outline: 'auto',
26-
'@media (pointer:coarse)': {
27+
[IS_TOUCH_DEVICE_MEDIA]: {
2728
outline: 0,
2829
},
2930
},

lib/src/wrappers/ResponsiveWrapper.tsx

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
import * as React from 'react';
22
import useMediaQuery from '@material-ui/core/useMediaQuery';
3-
import { useTheme } from '@material-ui/core/styles';
3+
import { IS_TOUCH_DEVICE_MEDIA } from '../constants/dimensions';
44
import { MobileWrapperProps, MobileWrapper } from './MobileWrapper';
55
import { DesktopWrapperProps, DesktopWrapper } from './DesktopWrapper';
6-
import { Breakpoint } from '@material-ui/core/styles/createBreakpoints';
76
import { DesktopPopperWrapperProps, DesktopPopperWrapper } from './DesktopPopperWrapper';
87

98
export interface ResponsiveWrapperProps
109
extends DesktopWrapperProps,
1110
DesktopPopperWrapperProps,
1211
MobileWrapperProps {
13-
/** Breakpoint when `Desktop` mode will be changed to `Mobile`
14-
* @default 'md'
12+
/** Css media query when `Mobile` mode will be changed to `Desktop`
13+
* @default "@media (pointer: fine)"
14+
* @example "@media (min-width: 720px)" or theme.breakpoints.up("sm")
1515
*/
16-
desktopModeBreakpoint?: Breakpoint;
16+
desktopModeMediaQuery?: string;
1717
}
1818

1919
export const makeResponsiveWrapper = (
2020
DesktopWrapperComponent: React.FC<DesktopWrapperProps | DesktopPopperWrapperProps>,
2121
MobileWrapperComponent: React.FC<MobileWrapperProps>
2222
) => {
2323
const ResponsiveWrapper: React.FC<ResponsiveWrapperProps> = ({
24-
desktopModeBreakpoint = 'md',
24+
desktopModeMediaQuery = IS_TOUCH_DEVICE_MEDIA,
2525
okLabel,
2626
cancelLabel,
2727
clearLabel,
@@ -35,8 +35,7 @@ export const makeResponsiveWrapper = (
3535
displayStaticWrapperAs,
3636
...other
3737
}) => {
38-
const theme = useTheme();
39-
const isDesktop = useMediaQuery(theme.breakpoints.up(desktopModeBreakpoint));
38+
const isDesktop = useMediaQuery(desktopModeMediaQuery);
4039

4140
return isDesktop ? (
4241
<DesktopWrapperComponent

0 commit comments

Comments
 (0)