ConfirmDialog
Overlay
되돌리기 어렵거나 중요한 행동을 실행하기 전에 사용자 확인을 받는 대화상자.
Usage
import
API Reference
같은 패밀리
예제
Usage
삭제·제출처럼 되돌리기 어려운 행동을 실행하기 전에 확인받을 때 사용한다.
import
import
import { ConfirmDialog } from '@mildang/design-system/Dialog';예제를 복사해 쓸 때 필요한 준비
• @mildang/icons 를 따로 설치한다. DS 패키지에 아이콘 컴포넌트가 포함되지 않는다.
API Reference
공개 Props가 없습니다.
같은 패밀리
@mildang/design-system/Dialog 에서 같이 내보내는 컴포넌트다.
예제
열린 상태
명령형으로 열리는 확인 다이얼로그의 떠 있는 모습을 상자 안에 고정해 보여줍니다.
import { confirmDialog } from '@mildang/design-system/Dialog';
import { Button } from '@mildang/design-system/Button';
const ConfirmDialogAsyncWithLoadingExample = () => {
const handleClick = () => {
confirmDialog({
title: '삭제 확인',
description: '정말 삭제하시겠습니까? 확인을 누르면 서버에 요청합니다.',
acceptButtonProps: { children: '삭제', bg: 'critical.fill.base' },
accept: async (update) => {
update((draft) => {
if (draft.acceptButtonProps) {
draft.acceptButtonProps['loading'] = true;
}
if (draft.rejectButtonProps) {
draft.rejectButtonProps['disabled'] = true;
}
});
await new Promise((resolve) => setTimeout(resolve, 2000));
},
});
};
return <Button onClick={handleClick}>비동기 요청 테스트</Button>;
};
export default ConfirmDialogAsyncWithLoadingExample;
Basic
import { confirmDialog } from '@mildang/design-system/Dialog';
import { Button } from '@mildang/design-system/Button';
const ConfirmDialogBasicExample = () => {
const handleClick = () => {
confirmDialog({
title: '콘텐츠 모듈 설정 저장',
description: (
<>
변동사항을 저장할 경우, 기존 학습 활동이 <b>재생성</b>됩니다. 저장하시겠습니까?
</>
),
});
};
return <Button onClick={handleClick}>Confirm Dialog 켜기</Button>;
};
export default ConfirmDialogBasicExample;
CustomButton
import { Button } from '@mildang/design-system/Button';
import { confirmDialog } from '@mildang/design-system/Dialog';
const ConfirmDialogCustomButtonExample = () => {
return (
<Button
onClick={() => {
confirmDialog({
title: '콘텐츠 모듈 설정 저장',
description: '변동사항을 저장할 경우, 기존 학습 활동이 재생성됩니다. 저장하시겠습니까?',
accept: () => console.log('Accepted'),
reject: () => console.log('Rejected'),
acceptButtonProps: { children: '저장 완료', color: 'primary' },
});
}}
>
Confirm Dialog 켜기
</Button>
);
};
export default ConfirmDialogCustomButtonExample;
EducoreTitleIcon
코드
import { confirmDialog } from '@mildang/design-system/Dialog';
import EducoreIconInfo from '@mildang/icons/educore/info';
import { Button } from '@mildang/design-system/Button';
const ConfirmDialogEducoreTitleIconExample = () => {
const handleClick = () => {
confirmDialog({
titleIcon: <EducoreIconInfo />,
title: '로그인 안내',
description: '로그인 후 사용 가능한 메뉴입니다.',
acceptButtonProps: { children: '로그인' },
rejectButtonProps: { children: '뒤로' },
});
};
return <Button onClick={handleClick}>Educore 타이틀 아이콘 다이얼로그</Button>;
};
export default ConfirmDialogEducoreTitleIconExample;
PreventDuplicateWithId
import { confirmDialog } from '@mildang/design-system/Dialog';
import { Button } from '@mildang/design-system/Button';
const ConfirmDialogPreventDuplicateWithIdExample = () => {
const handleClick = () => {
confirmDialog({
id: 'unique-dialog-id',
title: '중복 방지 테스트',
description: '이 다이얼로그는 id가 지정되어 있어서 중복으로 열리지 않습니다.',
accept: () => console.log('Accepted'),
reject: () => console.log('Rejected'),
});
confirmDialog({
id: 'unique-dialog-id',
title: '이 타이틀은 표시되지 않음',
description: '이 내용은 표시되지 않음',
accept: () => console.log('This should not appear'),
});
};
return <Button onClick={handleClick}>동일 ID로 여러 번 호출</Button>;
};
export default ConfirmDialogPreventDuplicateWithIdExample;
WithoutRejectButton
import { confirmDialog } from '@mildang/design-system/Dialog';
import { Button } from '@mildang/design-system/Button';
const ConfirmDialogWithoutRejectButtonExample = () => {
const handleClick = () => {
confirmDialog({
title: '알림',
description: '작업이 완료되었습니다.',
accept: () => console.log('확인됨'),
reject: null,
});
};
return <Button onClick={handleClick}>reject 버튼 없는 다이얼로그</Button>;
};
export default ConfirmDialogWithoutRejectButtonExample;
RetryOnFailure
import { useRef } from 'react';
import { confirmDialog } from '@mildang/design-system/Dialog';
import { Button } from '@mildang/design-system/Button';
const ConfirmDialogRetryOnFailureExample = function RetryOnFailureComponent() {
const attemptCountRef = useRef(0);
const handleClick = () => {
attemptCountRef.current = 0;
confirmDialog({
title: '데이터 저장',
description: '변경사항을 저장하시겠습니까? (처음 2번은 실패합니다)',
acceptButtonProps: { children: '저장', color: 'primary' },
accept: async (update) => {
attemptCountRef.current++;
update((draft) => {
if (draft.acceptButtonProps) {
draft.acceptButtonProps['loading'] = true;
}
if (draft.rejectButtonProps) {
draft.rejectButtonProps['disabled'] = true;
}
});
await new Promise((resolve) => setTimeout(resolve, 300));
if (attemptCountRef.current < 3) {
update((draft) => {
draft.description = `저장 실패! 다시 시도해주세요. (시도 횟수: ${attemptCountRef.current}/3)`;
if (draft.acceptButtonProps) {
draft.acceptButtonProps['loading'] = false;
}
if (draft.rejectButtonProps) {
draft.rejectButtonProps['disabled'] = false;
}
});
return false;
}
return true;
},
});
};
return <Button onClick={handleClick}>실패 시 Retry 테스트</Button>;
};
export default ConfirmDialogRetryOnFailureExample;
DeleteWithConfirmation
import { confirmDialog } from '@mildang/design-system/Dialog';
import { Button } from '@mildang/design-system/Button';
const ConfirmDialogDeleteWithConfirmationExample = () => {
const targetName = '중요한 프로젝트';
const handleClick = () => {
confirmDialog({
size: 'md',
title: `${targetName} 삭제`,
description: (
<>
{targetName}과 세부 데이터가 <b>영원히 삭제</b>됩니다. 데이터를 복원할 수 없습니다.{'\n'}
정말 <b>{targetName}</b>을 삭제하시겠습니까?
</>
),
confirmationText: targetName,
confirmationPlaceholder: `최초 확인을 위해 ${targetName} 이름을 동일하게 입력해주세요`,
acceptButtonProps: { children: `${targetName} 삭제`, bg: 'critical.fill.base' },
accept: () => {
console.log('삭제됨:', targetName);
},
});
};
return <Button onClick={handleClick}>삭제 확인 입력 테스트</Button>;
};
export default ConfirmDialogDeleteWithConfirmationExample;