Skip to content

Commit 673f781

Browse files
authored
fix: apply awsui-visual-refresh class only to dynamic VR mode (#3365)
1 parent 56e154c commit 673f781

File tree

4 files changed

+69
-22
lines changed

4 files changed

+69
-22
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
import React, { useRef } from 'react';
4+
5+
import { usePortalModeClasses } from '../../../../../lib/components/internal/hooks/use-portal-mode-classes';
6+
7+
export function RenderTest({ refClasses }: { refClasses: string }) {
8+
const ref = useRef(null);
9+
const classes = usePortalModeClasses(ref);
10+
return (
11+
<div>
12+
<div ref={ref} className={refClasses} />
13+
<div data-testid="subject" className={classes} />
14+
</div>
15+
);
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
import React from 'react';
4+
import { render, screen } from '@testing-library/react';
5+
6+
import { RenderTest } from './helpers';
7+
8+
jest.mock('../../../../../lib/components/internal/environment', () => ({
9+
...jest.requireActual('../../../../../lib/components/internal/environment'),
10+
ALWAYS_VISUAL_REFRESH: true,
11+
}));
12+
13+
const globalWithFlags = globalThis as any;
14+
15+
describe('usePortalModeClasses (vr-only mode)', () => {
16+
test('should not add any classes by default', () => {
17+
render(<RenderTest refClasses="" />);
18+
expect(screen.getByTestId('subject')).toHaveClass('', { exact: true });
19+
});
20+
21+
test('should detect dark mode', () => {
22+
render(<RenderTest refClasses="awsui-polaris-dark-mode" />);
23+
expect(screen.getByTestId('subject')).toHaveClass('awsui-polaris-dark-mode awsui-dark-mode', { exact: true });
24+
});
25+
26+
test('should not render awsui-visual-refresh class', () => {
27+
globalWithFlags[Symbol.for('awsui-visual-refresh-flag')] = () => true;
28+
29+
render(<RenderTest refClasses="" />);
30+
expect(document.body).not.toHaveClass('awsui-visual-refresh', { exact: true });
31+
expect(screen.getByTestId('subject')).not.toHaveClass('awsui-visual-refresh', { exact: true });
32+
});
33+
});

src/internal/hooks/use-portal-mode-classes/__tests__/use-portal-mode-classes.test.tsx

+15-22
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,20 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
import React, { useRef } from 'react';
3+
import React from 'react';
44
import { render, screen } from '@testing-library/react';
55

6+
import { clearVisualRefreshState } from '@cloudscape-design/component-toolkit/internal/testing';
7+
68
import VisualContext from '../../../../../lib/components/internal/components/visual-context';
7-
import { usePortalModeClasses } from '../../../../../lib/components/internal/hooks/use-portal-mode-classes';
8-
import { useVisualRefresh } from '../../../../../lib/components/internal/hooks/use-visual-mode';
9+
import { RenderTest } from './helpers';
910

10-
jest.mock('../../../../../lib/components/internal/hooks/use-visual-mode', () => {
11-
const original = jest.requireActual('../../../../../lib/components/internal/hooks/use-visual-mode');
12-
return { ...original, useVisualRefresh: jest.fn() };
13-
});
14-
15-
afterEach(() => {
16-
(useVisualRefresh as jest.Mock).mockReset();
17-
});
11+
const globalWithFlags = globalThis as any;
1812

1913
describe('usePortalModeClasses', () => {
20-
function RenderTest({ refClasses }: { refClasses: string }) {
21-
const ref = useRef(null);
22-
const classes = usePortalModeClasses(ref);
23-
return (
24-
<div>
25-
<div ref={ref} className={refClasses} />
26-
<div data-testid="subject" className={classes} />
27-
</div>
28-
);
29-
}
30-
3114
afterEach(() => {
3215
jest.clearAllMocks();
16+
delete globalWithFlags[Symbol.for('awsui-visual-refresh-flag')];
17+
clearVisualRefreshState();
3318
});
3419

3520
test('should not add any classes by default', () => {
@@ -49,6 +34,14 @@ describe('usePortalModeClasses', () => {
4934
expect(screen.getByTestId('subject')).toHaveClass('awsui-polaris-compact-mode awsui-compact-mode', { exact: true });
5035
});
5136

37+
test('should detect visual refresh mode', () => {
38+
globalWithFlags[Symbol.for('awsui-visual-refresh-flag')] = () => true;
39+
40+
render(<RenderTest refClasses="" />);
41+
expect(document.body).toHaveClass('awsui-visual-refresh', { exact: true });
42+
expect(screen.getByTestId('subject')).toHaveClass('awsui-visual-refresh', { exact: true });
43+
});
44+
5245
test('should detect contexts', () => {
5346
render(
5447
<VisualContext contextName="content-header">

src/internal/hooks/use-portal-mode-classes/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ import clsx from 'clsx';
66
import { useCurrentMode, useDensityMode } from '@cloudscape-design/component-toolkit/internal';
77

88
import { useVisualContext } from '../../components/visual-context';
9+
import { ALWAYS_VISUAL_REFRESH } from '../../environment';
10+
import { useVisualRefresh } from '../use-visual-mode';
911

1012
export function usePortalModeClasses(ref: React.RefObject<HTMLElement>) {
1113
const colorMode = useCurrentMode(ref);
1214
const densityMode = useDensityMode(ref);
1315
const context = useVisualContext(ref);
16+
const visualRefreshWithClass = useVisualRefresh() && !ALWAYS_VISUAL_REFRESH;
17+
1418
return clsx({
1519
'awsui-polaris-dark-mode awsui-dark-mode': colorMode === 'dark',
1620
'awsui-polaris-compact-mode awsui-compact-mode': densityMode === 'compact',
21+
'awsui-visual-refresh': visualRefreshWithClass,
1722
[`awsui-context-${context}`]: context,
1823
});
1924
}

0 commit comments

Comments
 (0)