빠른 시작
이 가이드는 타입이 있는 결과를 반환하는 확인 오버레이를 만듭니다. 런타임은 시각적인 dialog 컴포넌트를 포함하지 않습니다. 대신 어댑터를 등록하고, OverlayHost가 열린 item의 type에 맞는 어댑터를 렌더링하게 합니다.
1. 설치
npm install @ilokesto/overlay@2.0.0 react2. 어댑터 맵 만들기
import type { OverlayAdapterMap } from '@ilokesto/overlay';
export const overlayAdapters: OverlayAdapterMap = {
confirm: ({ close, remove, title, description }) => {
const finish = (result: boolean) => {
close(result);
remove();
};
return (
<div role="dialog" aria-modal="true" aria-labelledby="confirm-title">
<h2 id="confirm-title">{String(title)}</h2>
{description ? <p>{String(description)}</p> : null}
<button onClick={() => finish(true)}>확인</button>
<button onClick={() => finish(false)}>취소</button>
</div>
);
},
};close(result)는 결정을 기록하고 remove()는 pending promise를 완료합니다. 이 첫 adapter는 exit animation이 없으므로 즉시 제거합니다. motion adapter는 status === 'closing'인 동안 렌더링하고 transition 또는 animation 완료 event에서 remove()를 호출해야 합니다.
3. provider 마운트하기
import { OverlayProvider } from '@ilokesto/overlay';
import { overlayAdapters } from './overlay-adapters';
import { DeleteButton } from './delete-button';
export function App() {
return (
<OverlayProvider adapters={overlayAdapters}>
<DeleteButton />
</OverlayProvider>
);
}OverlayProvider는 기본적으로 provider 단위 저장소를 만들고 children 뒤에 OverlayHost를 마운트합니다. useOverlay를 호출하는 컴포넌트는 반드시 이 provider 안에 있어야 합니다.
4. 오버레이 열기
import { useOverlay } from '@ilokesto/overlay';
export function DeleteButton() {
const { display } = useOverlay();
async function handleDelete() {
const confirmed = await display<boolean>({
type: 'confirm',
props: {
title: 'Delete this project?',
description: 'This action cannot be undone.',
},
});
if (confirmed) console.log('프로젝트 삭제');
}
return <button onClick={() => void handleDelete()}>Delete</button>;
}호출자가 결과를 기다려야 하면 display<TResult>()를 사용하세요. 생성된 id만 필요하고 lifecycle을 직접 관리한다면 open()이 더 알맞습니다.
5. 실행 및 확인
React 애플리케이션을 시작하고 Delete를 선택하세요. 확인을 선택하면 dialog가 제거되고 삭제 경로가 실행되며 취소는 삭제 없이 제거합니다. 이 예제는 기본 dialog semantics만 제공하고 focus trap, Escape 처리, scroll lock, 시각적 표현은 제공하지 않습니다. 일반 dialog라면 이 정책을 다시 만들지 말고 @ilokesto/modal을 사용하세요.