Skip to content

Commit da07845

Browse files
committed
feature. Separate modal root and modal portal
1 parent 0e87d33 commit da07845

File tree

7 files changed

+45
-53
lines changed

7 files changed

+45
-53
lines changed

src/components/guide/progress/TProgress.interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ export interface TProgressProps extends TBaseProps {
44
isOpen?: boolean,
55
onRequestClose?: () => void,
66
message?: string,
7-
containerId?: string,
7+
appId?: string,
88
}
99

src/components/guide/progress/TProgress.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import {TProgressProps, TLoadingIndicator} from '@/components';
77

88
function TProgress({
99
message = '잠시만 기다려 주십시오',
10-
containerId = 'root',
10+
appId = 'root',
1111
...restProps
1212

1313
}: TProgressProps) {
1414

1515
// region [Hooks]
1616

17-
const props: TProgressProps = {message, containerId, ...restProps};
17+
const props: TProgressProps = {message, appId, ...restProps};
1818

1919
// endregion
2020

@@ -39,7 +39,7 @@ function TProgress({
3939
// endregion
4040

4141
return (
42-
<TModal containerId={props.containerId}
42+
<TModal appId={props.appId}
4343
isOpen={props.isOpen}
4444
onRequestClose={props.onRequestClose}
4545
className={`t-progress ${rootClass}`}

src/components/screen/modal/TModal.interface.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ export const modalSize = {sm: 'small', md: 'medium', lg: 'large', xlg: 'xlarge',
66
type modalSize = typeof modalSize[keyof typeof modalSize];
77

88
export interface TModalProps extends TBaseProps {
9-
containerId?: string,
9+
appId?: string,
10+
portalId?: string,
11+
1012
className?: string,
1113
overlayClassName?: string,
1214
bodyClassName?: string,

src/components/screen/modal/TModal.tsx

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import {modalSize, TIcon, TModalProps} from '@/components';
88
import themeToken from '~style/designToken/ThemeToken.module.scss';
99

1010
const TModal = ({
11-
containerId = 'root',
11+
appId = 'root',
12+
portalId,
1213
onRequestClose,
1314
...restProps
1415
}: TModalProps) => {
1516

1617
// region [Hooks]
1718

18-
const props:TModalProps = {containerId, onRequestClose, ...restProps};
19+
const props:TModalProps = {appId, portalId, onRequestClose, ...restProps};
1920

2021
const modalRef = useRef(null);
2122

@@ -33,6 +34,16 @@ const TModal = ({
3334
onRequestClose(e);
3435
}, [onRequestClose]);
3536

37+
const parentSelector = useMemo(() => {
38+
39+
if(portalId) {
40+
return () => document.querySelector(`#${portalId}`) as HTMLElement;
41+
}
42+
43+
return undefined;
44+
45+
}, [portalId])
46+
3647
// endregion
3748

3849

@@ -76,7 +87,7 @@ const TModal = ({
7687

7788
useLayoutEffect(() => {
7889

79-
const rootElement: HTMLElement = document.getElementById(props.containerId);
90+
const rootElement: HTMLElement = document.getElementById(props.appId);
8091

8192
setDocumentRoot(rootElement);
8293
ReactModal.setAppElement(rootElement);
@@ -90,20 +101,22 @@ const TModal = ({
90101
return documentRoot && createPortal(
91102
(
92103
// Official document: https://reactcommunity.org/react-modal/
93-
<ReactModal ref={modalRef}
94-
id={props.id}
95-
isOpen={props.isOpen}
96-
contentLabel={props.contentLabel}
97-
onAfterOpen={props.onAfterOpen}
98-
onAfterClose={() => props.onAfterClose?.()}
99-
onRequestClose={(event: React.MouseEvent | React.KeyboardEvent) => props.onRequestClose(event)}
100-
bodyOpenClassName={'t-modal-body--open'}
101-
portalClassName={`t-modal ${props.className ?? ''}`.trim()}
102-
overlayClassName={`t-modal__overlay ${props.overlayClassName ?? ''}`.trim()}
103-
className={`t-modal__overlay__body ${bodyClassName ?? ''}`.trim()}
104-
closeTimeoutMS={200}
105-
shouldCloseOnOverlayClick={false}
106-
testId={props.testId}
104+
<ReactModal
105+
ref={modalRef}
106+
id={props.id}
107+
isOpen={props.isOpen}
108+
contentLabel={props.contentLabel}
109+
onAfterOpen={props.onAfterOpen}
110+
onAfterClose={() => props.onAfterClose?.()}
111+
onRequestClose={(event: React.MouseEvent | React.KeyboardEvent) => props.onRequestClose(event)}
112+
bodyOpenClassName={'t-modal-body--open'}
113+
portalClassName={`t-modal ${props.className ?? ''}`.trim()}
114+
overlayClassName={`t-modal__overlay ${props.overlayClassName ?? ''}`.trim()}
115+
className={`t-modal__overlay__body ${bodyClassName ?? ''}`.trim()}
116+
closeTimeoutMS={200}
117+
shouldCloseOnOverlayClick={false}
118+
testId={props.testId}
119+
parentSelector={parentSelector}
107120
>
108121
{/* Close Button */}
109122
<TIcon

stories/components/guide/progress/TProgress.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const Template = () => {
2727

2828
return (<>
2929
<TButton onClick={progressOn}>Progress 3초간 열기</TButton>
30-
<TProgress containerId={'storybook-root'}
30+
<TProgress appId={'storybook-root'}
3131
isOpen={isProgressOpen}
3232
onRequestClose={() => setProgressOpen(false)}
3333
message={'3초 후 닫힙니다'}

stories/components/screen/modal/TModal.stories.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {Meta, StoryObj} from '@storybook/react';
22

33
import {useState} from 'react';
4+
import ReactModal from 'react-modal';
45
import TModal from '@/components/screen/modal/TModal';
56
import TButton from '@/components/button/button/TButton';
67

@@ -9,7 +10,8 @@ const meta: Meta<typeof TModal> = {
910
title: 'Screen/TModal',
1011
component: TModal,
1112
args: {
12-
containerId: 'storybook-root',
13+
appId: 'storybook-root',
14+
portalId: 'storybook-root'
1315
},
1416

1517
};
@@ -27,8 +29,12 @@ const Template = (args) => {
2729
<TButton size={'large'} main>저장</TButton>
2830
</>);
2931

32+
33+
ReactModal.setAppElement('#storybook-root');
34+
3035
return (
3136
<>
37+
<div id={'test-test'} />
3238
<TButton onClick={() => setIsOpen(true)}>모달 열기</TButton>
3339
<TModal {...args}
3440
title={'클러스터 생성'}

tests/unit/react/tks/component/screen/page/TPage.test.tsx

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -126,35 +126,6 @@ describe('TPage', () => {
126126

127127
});
128128

129-
it('When the space between content and panel is less than 700 px, information area should be invisible', async () => {
130-
131-
// Arrange
132-
const user = userEvent.setup();
133-
134-
render(<TPage infoPanelContent={'test info content'}>Content</TPage>);
135-
136-
const icon = screen.getByRole('img', {name: 'info'});
137-
138-
// Act
139-
await user.click(icon);
140-
141-
// Arrange
142-
const resizer = screen.getByTestId('t-page-information-area-resizer');
143-
144-
// Act
145-
await user.pointer([
146-
{keys: '[MouseLeft>]', target: resizer},
147-
{coords: {x: window.innerWidth - 200, y: 100}, target: document.body},
148-
{keys: '[/MouseLeft]'},
149-
]);
150-
151-
const informationArea = screen.getByTestId('t-page-information-area');
152-
153-
// Assert
154-
expect(informationArea).toHaveClass('t-page__information-area--invisible');
155-
156-
});
157-
158129

159130
it('When clicking info panel icon, information area has t-page__information-area--visible class and flex style', async () => {
160131

0 commit comments

Comments
 (0)