Skip to content

Commit 6b9b4e1

Browse files
fix: update insets and frame on window resize on web
1 parent ae0e83f commit 6b9b4e1

4 files changed

Lines changed: 406 additions & 5 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,14 @@
7575
"clang-format": "^1.8.0",
7676
"commitlint": "^19.3.0",
7777
"eslint": "^8.57.0",
78+
"eslint-config-prettier": "^9.1.0",
7879
"eslint-plugin-ft-flow": "^3.0.11",
7980
"eslint-plugin-jest": "^28.6.0",
80-
"eslint-config-prettier": "^9.1.0",
8181
"eslint-plugin-prettier": "^5.1.3",
8282
"eslint-plugin-testing-library": "^7.5.4",
8383
"husky": "^9.0.11",
8484
"jest": "^29.2.1",
85+
"jest-environment-jsdom": "^29.7.0",
8586
"prettier": "^3.3.2",
8687
"react": "19.2.3",
8788
"react-dom": "19.2.3",

src/NativeSafeAreaProvider.web.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,12 @@ export function NativeSafeAreaProvider({
5353
onInsetsChange({ nativeEvent: { insets, frame } });
5454
};
5555
element.addEventListener(getSupportedTransitionEvent(), onEnd);
56+
window.addEventListener('resize', onEnd);
5657
onEnd();
5758
return () => {
5859
document.body.removeChild(element);
5960
element.removeEventListener(getSupportedTransitionEvent(), onEnd);
61+
window.removeEventListener('resize', onEnd);
6062
};
6163
}, [onInsetsChange]);
6264

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* @jest-environment jsdom
3+
*/
4+
5+
import { describe, expect, it, jest } from '@jest/globals';
6+
import { act, render } from '@testing-library/react-native';
7+
import * as React from 'react';
8+
import { NativeSafeAreaProvider } from '../NativeSafeAreaProvider.web';
9+
import type { InsetChangeNativeCallback } from '../SafeArea.types';
10+
11+
const setDocumentDimensions = (width: number, height: number) => {
12+
Object.defineProperty(document.documentElement, 'offsetWidth', {
13+
configurable: true,
14+
value: width,
15+
});
16+
Object.defineProperty(document.documentElement, 'offsetHeight', {
17+
configurable: true,
18+
value: height,
19+
});
20+
};
21+
22+
const mockComputedPadding = (padding: {
23+
paddingTop: string;
24+
paddingBottom: string;
25+
paddingLeft: string;
26+
paddingRight: string;
27+
}) => {
28+
jest
29+
.spyOn(window, 'getComputedStyle')
30+
.mockReturnValue(padding as unknown as CSSStyleDeclaration);
31+
};
32+
33+
describe('NativeSafeAreaProvider.web', () => {
34+
it('updates insets and frame on window resize', () => {
35+
setDocumentDimensions(800, 600);
36+
mockComputedPadding({
37+
paddingTop: '20px',
38+
paddingBottom: '10px',
39+
paddingLeft: '0px',
40+
paddingRight: '0px',
41+
});
42+
const onInsetsChange = jest.fn<InsetChangeNativeCallback>();
43+
render(<NativeSafeAreaProvider onInsetsChange={onInsetsChange} />);
44+
expect(onInsetsChange).toHaveBeenCalledWith({
45+
nativeEvent: {
46+
insets: { top: 20, bottom: 10, left: 0, right: 0 },
47+
frame: { x: 0, y: 0, width: 800, height: 600 },
48+
},
49+
});
50+
51+
onInsetsChange.mockClear();
52+
setDocumentDimensions(1024, 768);
53+
mockComputedPadding({
54+
paddingTop: '40px',
55+
paddingBottom: '10px',
56+
paddingLeft: '0px',
57+
paddingRight: '0px',
58+
});
59+
act(() => {
60+
window.dispatchEvent(new Event('resize'));
61+
});
62+
expect(onInsetsChange).toHaveBeenCalledWith({
63+
nativeEvent: {
64+
insets: { top: 40, bottom: 10, left: 0, right: 0 },
65+
frame: { x: 0, y: 0, width: 1024, height: 768 },
66+
},
67+
});
68+
});
69+
});

0 commit comments

Comments
 (0)