Skip to main content

generateModal

import { generateModal } from "@react-crates/modal";

const {
modalCtrl,
ModalProvider,
DynamicModal,
useInOpenModal,
modalManager
} = generateModal({
[Name: string]: {
component: ModalFC<T = any, string = string>;
defaultOptions?: {
payload?: T;
modalKey?: string;
action?: (confirm?: boolean | string) => void | Promise<void>;
middleware?: ModalMiddleware;
backCoverConfirm?: boolean | string | null
backCoverColor?: string;
backCoverOpacity?: number;
escKeyActive?: boolean;
closeDelay?: number;
duration?: number;
transitionOptions?: {
transitionProperty?: string;
transitionTimingFunction?: string;
transitionDelay?: string;
};
position?: string | ((breakPoint: number) => string);
stateResponsiveComponent?: boolean;
onOpenAutoFocus?: FocusEventHandler<HTMLDivElement>;
label?: string;
role?: string;
title?: React.ReactNode;
subTitle?: React.ReactNode;
content?: React.ReactNode;
subContent?: React.ReactNode;
confirmContent?: React.ReactNode;
cancelContent?: React.ReactNode;
customActionContent?: React.ReactNode;
required?: boolean;
}
}
},
{
stateResponsiveComponent?: boolean;
backCoverColor?: string;
backCoverOpacity?: number;
duration?: number;
transition?: {
transitionProperty?: string;
transitionTimingFunction?: string;
transitionDelay?: string;
};
position?: {
[Name: string]: {
[open | active | close]: {
left?: string;
right?: string;
top?: string;
bottom?: string;
transform?: string;
opacity?: number;
background?: string;
className?: string;
}
}
};
});

Return

ModalProvider

modal component가 렌더되는 곳입니다. 링크

modalCtrl

modal을 open, remove, action등을 위한 controller입니다. 링크

DynamicModal

일반 modal 라이브러리처럼 React Component내에 선언적으로 작성하는 Modal입니다. 링크

useInOpenModal

modal이 open 유무를 확인할 수 있는 hook입니다.

예제

const { useIsOpenModal } = generateModal();

function Example() {
const isOpenModal = useIsOpenModal();

return <div>{isOpenModal ? "modal이 열림" : "modal이 닫힘"}</div>;
}

API Reference

generateModal

PropertyTypeDefaultDescription
modalComponentSeedTableobject-{ [Name: string]: ModalComponentSeed }
optionsobject-ModalManagerOptionsProps

ModalComponentSeed

PropertyTypeDefaultDescription
componentfunction- requiredModalFC<T = any, P = string>
defaultOptionsobject-ModalDefaultOptions<T>

ModalDefaultOptions <T = any>

modal의 기본 설정을 등록할 수 있습니다.

PropertyTypeDefaultDescription
payloadT-modal과 통신이 필요할 때 사용할 수 있습니다.
modalKeystring-동일한 modal이 동시에 실행되지 않게 할 수 있습니다.
actionfunction-(confirm?: boolean | string) => void | Promise<void>
modal의 action을 실행시켰을때 동작할 callback 입니다.
middlewarefunction-ModalMiddleware
action 을 인터셉터하여 원하는 로직을 수행하게 할 수 있습니다.
backCoverConfirmboolean | string | null-null 일 경우 동작하지 않습니다.
backCoverColorstring-back cover의 색상을 지정할 수 있습니다.
backCoverOpacitynumber-back cover의 투명도를 지정할 수 있습니다.
escKeyActiveboolean-esc 버튼으로 cancel action을 실행시킬 수 있습니다.
closeDelaynumber-modal이 설정한 delay후 close 됩니다.
durationnumber-modal이 생성, 닫힐 때 실행되는 transition의 속도입니다.
transitionOptionsobject-ModalTransitionOptions
modal이 생성, 닫힐 때 실행되는 transition의 옵션입니다.
positionstring | function-((breakPoint: number) => string)
modal의 위치를 설정할 수 있습니다.
stateResponsiveComponentboolean-modalActionState에 따라 자동으로 Modal Componet가 변경됩니다.
onOpenAutoFocusfunction-React.FocusEventHandler<HTMLDivElement>
modal이 focus 될 때 동작하는 로직을 작성할 수 있습니다.
labelstring-접근성 관련 property입니다.
rolestring-접근성 관련 property입니다.
titleReact.ReactNode-동적으로 modal의 내용을 입력할 수 있습니다.
subTitleReact.ReactNode-동적으로 modal의 내용을 입력할 수 있습니다.
contentReact.ReactNode-동적으로 modal의 내용을 입력할 수 있습니다.
subContentReact.ReactNode-동적으로 modal의 내용을 입력할 수 있습니다.
confirmContentReact.ReactNode-동적으로 modal의 내용을 입력할 수 있습니다.
cancelContentReact.ReactNode-동적으로 modal의 내용을 입력할 수 있습니다.
customActionContentReact.ReactNode-동적으로 modal의 내용을 입력할 수 있습니다.
requiredboolean-등록된 modal이 덮혀씌워지지 않거나 지워지지 않습니다.

ModalManagerOptionsProps

등록한 모달 전체의 default 값을 설정할 수 있습니다.

PropertyTypeDefaultDescription
stateResponsiveComponentbooleanfalsemodal이 actionState에 따라 자동으로 변경됩니다.
backCoverColorstring"rgb(0, 0, 0)"back cover의 색상을 지정할 수 있습니다.
backCoverOpacitynumber0.5back cover의 투명도를 지정할 수 있습니다.
durationnumber200modal이 생성, 닫힐 때 실행되는 transition의 속도입니다.
transitionOptionsobjectDEFAULT_TRANSITIONModalTransitionOptions
modal이 생성, 닫힐 때 실행되는 transition의 옵션입니다.
positionobjectDEFAULT_POSITION[Name: string]: ModalPositionTable

ModalTransitionOptions

PropertyTypeDefaultDescription
transitionPropertystring--
transitionTimingFunctionstring--
transitionDelaystring--

ModalPositionTable

PropertyTypeDefaultDescription
openobject- requiredModalPositionStyle
modal이 최초 생성될 때 position입니다.
activeobject- requiredModalPositionStyle
modal이 active 상태일 때 position입니다.
closeobject- requiredModalPositionStyle
modal이 close 될 때 position입니다.

ModalPositionStyle

PropertyTypeDefaultDescription
leftstring--
rightstring--
topstring--
bottomstring--
transformstring--
opacitynumber--
backgroundstring--
classNamestring--

Default

DEFAULT_TRANSITION

{
transitionProperty:
"opacity, transform, left, top, bottom, right, background, background-color",
transitionDelay: "0ms",
transitionTimingFunction: "cubic-bezier(0.25, 0.1, 0.25, 1)",
}

DEFAULT_POSITION

{
default: {
open: {
opacity: 0,
},
active: {
opacity: 1,
},
close: {
opacity: 0,
},
},
center: {
open: {
left: "50%",
top: "50%",
transform: "translate(-50%, -50%) scale(0.95)",
},
active: {
left: "50%",
top: "50%",
transform: "translate(-50%, -50%) scale(1)",
},
close: {
left: "50%",
top: "50%",
transform: "translate(-50%, -50%) scale(0.95)",
},
},
bottom: {
open: {
left: "50%",
top: "100%",
transform: "translate(-50%, 0)",
},
active: {
left: "50%",
top: "100%",
transform: "translate(-50%, -100%)",
},
close: {
left: "50%",
top: "100%",
transform: "translate(-50%, 0)",
},
},
top: {
open: {
left: "50%",
top: "0",
transform: "translate(-50%, -100%)",
},
active: {
left: "50%",
top: "0",
transform: "translate(-50%, 0)",
},
close: {
left: "50%",
top: "0",
transform: "translate(-50%, -100%)",
},
},
left: {
open: {
left: "0",
top: "50%",
transform: "translate(-100%, -50%)",
},
active: {
left: "0",
top: "50%",
transform: "translate(0, -50%)",
},
close: {
left: "0",
top: "50%",
transform: "translate(-100%, -50%)",
},
},
right: {
open: {
left: "100%",
top: "50%",
transform: "translate(0, -50%)",
},
active: {
left: "100%",
top: "50%",
transform: "translate(-100%, -50%)",
},
close: {
left: "100%",
top: "50%",
transform: "translate(0, -50%)",
},
},
leftTop: {
open: {
left: "0",
top: "0",
transform: "translate(-100%, -100%) scale(0)",
},
active: {
left: "0",
top: "0",
transform: "translate(0, 0) scale(1)",
},
close: {
left: "0",
top: "0",
transform: "translate(-100%, -100%) scale(0)",
},
},
leftBottom: {
open: {
left: "0",
top: "100%",
transform: "translate(-100%, 0) scale(0)",
},
active: {
left: "0",
top: "100%",
transform: "translate(0, -100%) scale(1)",
},
close: {
left: "0",
top: "100%",
transform: "translate(-100%, 0) scale(0)",
},
},
rightTop: {
open: {
left: "100%",
top: "0",
transform: "translate(0, -100%) scale(0)",
},
active: {
left: "100%",
top: "0",
transform: "translate(-100%, 0) scale(1)",
},
close: {
left: "100%",
top: "0",
transform: "translate(0, -100%) scale(0)",
},
},
rightBottom: {
open: {
left: "100%",
top: "100%",
transform: "translate(0, 0) scale(0)",
},
active: {
left: "100%",
top: "100%",
transform: "translate(-100%, -100%) scale(1)",
},
close: {
left: "100%",
top: "100%",
transform: "translate(0, 0) scale(0)",
},
},
backCover: {
open: {
top: "0",
left: "0",
background: "rgb(0, 0, 0)",
opacity: 0,
},
active: {
top: "0",
left: "0",
background: "rgb(0, 0, 0)",
opacity: 0.5,
},
close: {
top: "0",
left: "0",
background: "rgb(0, 0, 0)",
opacity: 0,
},
},
};