Skip to content

Commit f328a75

Browse files
authored
Merge pull request #79 from microcmsio/fix/react-strict-mode
Supported React Strict Mode
2 parents 8c7153a + de15276 commit f328a75

File tree

6 files changed

+50
-56
lines changed

6 files changed

+50
-56
lines changed

examples/src/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,8 @@ const App = () => {
6565
};
6666

6767
const root = createRoot(document.getElementById('root')!);
68-
root.render(<App />);
68+
root.render(
69+
<React.StrictMode>
70+
<App />
71+
</React.StrictMode>
72+
);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
},
2929
"dependencies": {
3030
"body-scroll-lock": "^4.0.0-beta.0",
31-
"focus-trap": "^7.2.0"
31+
"focus-trap-react": "^10.0.2"
3232
},
3333
"devDependencies": {
3434
"@types/body-scroll-lock": "^3.1.0",

src/components/Modal.tsx

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { Options as FocusTrapOptions } from 'focus-trap';
2+
import FocusTrap from 'focus-trap-react';
23
import React, { useMemo, useRef } from 'react';
34
import { createPortal } from 'react-dom';
45
import { ModalProps, OverlayProps, WrapperProps } from '..';
56

67
import { useBodyScrollLock } from '../hooks/useBodyScrollLock';
7-
import { useFocusTrap } from '../hooks/useFocusTrap';
88

99
interface ModalWrapperProps<T extends Record<string, unknown>> {
1010
children: React.ReactNode;
1111
isOpen: boolean;
12+
open: () => void;
1213
close: () => void;
1314
elementId: 'root' | string;
1415
title?: React.ReactNode;
@@ -26,6 +27,7 @@ interface ModalWrapperProps<T extends Record<string, unknown>> {
2627
export const ModalWrapper = <T extends Record<string, unknown>>({
2728
children,
2829
isOpen,
30+
open,
2931
close,
3032
elementId = 'root',
3133
title,
@@ -36,15 +38,24 @@ export const ModalWrapper = <T extends Record<string, unknown>>({
3638
additionalProps,
3739
}: ModalWrapperProps<T>): React.ReactElement | null => {
3840
const dialogRef = useRef<HTMLDivElement>(null);
39-
const _focusTrapOptions = useMemo(
41+
const _focusTrapOptions: FocusTrapOptions = useMemo(
4042
() => ({
41-
onDeactivate: close,
42-
clickOutsideDeactivates: true,
4343
...focusTrapOptions,
44+
onActivate: () => {
45+
open();
46+
focusTrapOptions.onActivate?.();
47+
},
48+
onDeactivate: () => {
49+
close();
50+
focusTrapOptions.onDeactivate?.();
51+
},
52+
clickOutsideDeactivates: focusTrapOptions.clickOutsideDeactivates ?? true,
53+
fallbackFocus:
54+
focusTrapOptions.fallbackFocus ?? dialogRef.current ?? undefined,
4455
}),
45-
[close, focusTrapOptions]
56+
[close, focusTrapOptions, open]
4657
);
47-
useFocusTrap(dialogRef, isOpen, _focusTrapOptions);
58+
4859
useBodyScrollLock(dialogRef, isOpen, preventScroll);
4960

5061
if (isOpen === false) {
@@ -54,22 +65,24 @@ export const ModalWrapper = <T extends Record<string, unknown>>({
5465
return createPortal(
5566
<components.Wrapper>
5667
<components.Overlay />
57-
<div
58-
ref={dialogRef}
59-
role="dialog"
60-
aria-modal="true"
61-
tabIndex={-1}
62-
style={{ position: 'relative' }}
63-
>
64-
<components.Modal
65-
title={title}
66-
description={description}
67-
close={close}
68-
additionalProps={additionalProps}
68+
<FocusTrap focusTrapOptions={_focusTrapOptions}>
69+
<div
70+
ref={dialogRef}
71+
role="dialog"
72+
aria-modal="true"
73+
tabIndex={-1}
74+
style={{ position: 'relative' }}
6975
>
70-
{children}
71-
</components.Modal>
72-
</div>
76+
<components.Modal
77+
title={title}
78+
description={description}
79+
close={close}
80+
additionalProps={additionalProps}
81+
>
82+
{children}
83+
</components.Modal>
84+
</div>
85+
</FocusTrap>
7386
</components.Wrapper>,
7487
document.getElementById(elementId) as HTMLElement
7588
);

src/hooks/useFocusTrap.tsx

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export const useModal = <T extends Record<string, unknown>>(
8888
return (
8989
<ModalWrapper
9090
isOpen={isOpen}
91+
open={open}
9192
close={close}
9293
elementId={elementId}
9394
title={title}
@@ -113,6 +114,7 @@ export const useModal = <T extends Record<string, unknown>>(
113114
elementId,
114115
focusTrapOptions,
115116
isOpen,
117+
open,
116118
preventScroll,
117119
]
118120
);

yarn.lock

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3201,6 +3201,14 @@ flatted@^3.1.0:
32013201
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
32023202
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
32033203

3204+
focus-trap-react@^10.0.2:
3205+
version "10.0.2"
3206+
resolved "https://registry.yarnpkg.com/focus-trap-react/-/focus-trap-react-10.0.2.tgz#eed4ce5b508bf3a0ce2ce63151c5c0f34a8f8529"
3207+
integrity sha512-MnN2cmdgpY7NY74ePOio4kbO5A3ILhrg1g5OGbgIQjcWEv1hhcbh6e98K0a+df88hNbE+4i9r8ji9aQnHou6GA==
3208+
dependencies:
3209+
focus-trap "^7.2.0"
3210+
tabbable "^6.0.1"
3211+
32043212
focus-trap@^7.2.0:
32053213
version "7.2.0"
32063214
resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.2.0.tgz#25af61b5635d3c18cd2fd176087db7b60be72c6b"

0 commit comments

Comments
 (0)