# useDismissible
URL: /lynx/hooks/use-dismissible
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/hooks/use-dismissible.mdx
닫을 수 있는 요소의 표시 상태와 dismiss를 관리하는 훅입니다.
사용 가능 버전: @seed-design/lynx-react-use-dismissible@1.0.0
## Installation
- npm: npm install bun add @seed-design/lynx-react-use-dismissible
- pnpm: pnpm add bun add @seed-design/lynx-react-use-dismissible
- yarn: yarn add bun add @seed-design/lynx-react-use-dismissible
- bun: bun add bun add @seed-design/lynx-react-use-dismissible
## Import
```ts
import { useDismissible } from "@seed-design/lynx-react-use-dismissible";
```
`useDismissible`은 스타일 없이 사용할 수 있는 독립 패키지입니다. `@seed-design/lynx-react`를 설치하지 않아도 사용할 수 있습니다.
`@seed-design/lynx-react-callout`이 이 훅으로 Callout의 표시 상태를 관리합니다. 훅은 표시 상태만 다루며, 닫기 버튼의 tap 처리와 접근성 속성은 각 컴포넌트가 정합니다.
## Usage
### Uncontrolled (기본)
```tsx
import { useDismissible } from "@seed-design/lynx-react-use-dismissible";
function Notice() {
const { open, dismiss } = useDismissible({
onDismiss: () => console.log("dismissed"),
});
if (!open) return null;
return (
공지 내용
닫기
);
}
```
`dismiss`는 열린 상태를 닫고 `onDismiss`를 한 번 호출합니다. 이미 닫힌 상태에서 다시 호출하면 아무것도 하지 않습니다.
### Controlled
```tsx
import { useState } from "@lynx-js/react";
import { useDismissible } from "@seed-design/lynx-react-use-dismissible";
function ControlledNotice() {
const [open, setOpen] = useState(true);
const dismissible = useDismissible({ open, onDismiss: () => setOpen(false) });
if (!dismissible.open) return null;
return (
탭하면 닫힙니다
);
}
```
Controlled 모드에서 `dismiss`는 값을 바꾸지 않고 `onDismiss`만 호출합니다. 실제로 닫으려면 부모가 `open`을 `false`로 바꿔야 합니다. `open`이 `false`이면 `dismiss`는 `onDismiss`를 호출하지 않습니다.
## API
### Props
| Prop | Type | Default | Description |
| ------------- | ------------ | ------- | ------------------------------------------ |
| `defaultOpen` | `boolean` | `true` | 처음 렌더링할 때 표시할지 여부입니다. `open`이 없을 때만 사용합니다. |
| `open` | `boolean` | - | 표시 여부입니다. 제공하면 controlled 모드로 동작합니다. |
| `onDismiss` | `() => void` | - | 열린 상태에서 `dismiss`를 호출하면 실행됩니다. |
### Return
| Property | Type | Description |
| --------- | ------------ | ------------------------------------------- |
| `open` | `boolean` | 현재 표시 여부입니다. |
| `dismiss` | `() => void` | 열린 상태를 닫고 `onDismiss`를 호출합니다. 참조가 바뀌지 않습니다. |
## 웹 버전과의 차이
| 항목 | Lynx (`useDismissible`) | Web (`@seed-design/react` 내부) |
| -------- | ------------------------------------------ | ---------------------------------------------------- |
| 공개 여부 | 독립 패키지로 공개 | 패키지 내부 private 훅 |
| 반환값 | `open`, `dismiss` | `open`, `dismiss`, `rootProps`, `dismissButtonProps` |
| 닫기 버튼 연결 | 각 컴포넌트가 `dismiss`를 tap handler에 연결 | `dismissButtonProps`의 `onClick` |
| 닫기 취소 | 미지원. 닫기 버튼은 사용자 handler 뒤 항상 `dismiss`를 호출 | 사용자 `onClick`에서 `preventDefault()`를 호출하면 닫지 않음 |
React에서는 Callout과 PageBanner가 `@seed-design/react` 한 패키지 안에 있어 private 훅으로 공유합니다. Lynx에서는 컴포넌트마다 Headless 패키지가 분리되어 있어, 같은 dismiss 상태를 여러 패키지가 공유할 수 있도록 독립 패키지로 제공합니다.