# InputDialog - 输入弹窗

## 说明

带输入框的弹窗，在 `ActionCustomDialog` 之上内置了一个 `Input`（默认 `colorDepth="low"`、显示清除按钮）。输入框的值由弹窗内部维护：`inputProps.value` 仅作为弹窗每次打开时的初始值，后续输入状态由组件自身管理，业务层无需单独维护 state。

组件会根据 `inputProps` 自动处理 iOS 键盘避让：输入框区域 ref 透传给 `BaseDialog` 用于测量上抬距离，`autoFocus` 时跳过弹入位移动画，`password` 类型时采用键盘稳态高度，避免弹窗位置抖动。

下表中标注「继承自 BaseDialog」的属性为 Dialog 体系公共属性（类型为 `Omit<BaseDialogPropsType, 'showTitle' | 'showButton'>` 再加 `inputProps`）。

## 属性

| 属性 | 说明 | 类型 | 默认值 | 必填 |
|------|------|------|--------|------|
| **visible** | 是否显示弹窗 | `boolean` | - | 是 |
| **inputProps** | 透传给内部 `Input` 的属性，`value` 仅作初始值 | `Partial<InputProps>` | - | 否 |
| **title** | 标题文案（继承自 BaseDialog） | `string` | - | 否 |
| **buttons** | 底部按钮，1~3 个，数量越界则不渲染按钮组（继承自 BaseDialog） | `AbstractDialogButtonType[]` | `[取消, 确定]` | 否 |
| **colorDepth** | 弹窗底色深度（继承自 BaseDialog） | `'base' \| 'low'` | `'base'` | 否 |
| **canDismiss** | 点击遮罩是否可关闭（继承自 BaseDialog） | `boolean` | `true` | 否 |
| **cancelable** | 返回键及无 callback 按钮是否可关闭弹窗（继承自 BaseDialog） | `boolean` | `true` | 否 |
| **hasShade** | 是否显示半透明遮罩背景（继承自 BaseDialog） | `boolean` | `true` | 否 |
| **titleIcon** | 标题上方图标（继承自 BaseDialog） | `ReactNode` | - | 否 |
| **titleIconStyle** | 标题图标容器样式，可覆盖 width/height（取值钳制在 32~120）（继承自 BaseDialog） | `StyleProp<ViewStyle>` | `80×80` | 否 |
| **onDismiss** | 非点击按钮方式（遮罩、返回键）关闭时回调（继承自 BaseDialog） | `() => void` | - | 否 |
| **onModalShow** | 弹窗显示时回调（继承自 BaseDialog） | `() => void` | - | 否 |
| **onModalHide** | 弹窗隐藏时回调（继承自 BaseDialog） | `() => void` | - | 否 |
| **accessible** | 无障碍：是否启用（继承自 BaseDialog） | `boolean` | `true` | 否 |
| **accessibilityLabel** | 无障碍标签（继承自 BaseDialog） | `string` | - | 否 |
| **layerDismissAccessibilityHint** | 遮罩可点击区域的无障碍标签（继承自 BaseDialog） | `string` | - | 否 |

### inputProps 常用字段（Partial&lt;InputProps&gt;）

| 字段 | 说明 | 类型 | 默认值 |
|------|------|------|--------|
| **value** | 初始输入值（仅弹窗打开时生效一次） | `string` | `''` |
| **onChangeText** | 输入变化回调 | `(text: string) => void` | - |
| **placeholder** | 占位文本 | `string` | - |
| **type** | 输入类型；`password` 时启用密码态键盘处理 | `'normal' \| 'password'` | `'normal'` |
| **maxLength** | 最大可输入字符数 | `number` | - |
| **autoFocus** | 是否自动聚焦（为 true 时跳过弹入位移动画） | `boolean` | - |
| **showClear** | 是否显示清除按钮 | `boolean` | `true` |

> 内部 `Input` 固定使用 `colorDepth="low"`、`showClear` 默认开启；如需覆盖可通过 `inputProps` 传入同名字段。

## 使用示例

```tsx
import { InputDialog } from 'miot/ui/hyperOSUI';

<InputDialog
  visible={visible}
  title="重命名"
  inputProps={{
    value: name,
    placeholder: '请输入设备名称',
    maxLength: 40,
    autoFocus: true,
    onChangeText: setName,
  }}
  buttons={[
    { title: '取消', callback: () => setVisible(false) },
    { title: '保存', type: 'primary', callback: onSave },
  ]}
  onDismiss={() => setVisible(false)}
/>
```

## 注意事项

- 输入值由弹窗内部维护，`inputProps.value` 只在 `visible` 由 `false` 变为 `true` 时作为初始值写入，输入过程中不会被外部 `value` 反复重置。若要在确定时拿到最新值，请通过 `inputProps.onChangeText` 同步到业务层 state。
- `autoFocus` 仅在 iOS 影响弹入动画（跳过位移、直接淡入），用于规避原生键盘抬升与动画冲突导致的黑边/吸附问题。
- `password` 类型下 iOS 会采用键盘稳态高度（`keyboardDidShow`），避免强密码建议条引起的弹窗位置多次跳变。
- 内部输入框容器已带 `paddingHorizontal: 24`，无需再额外包裹水平内边距。

## 修改记录

| 日期 | 版本 | 修改内容 | 修改原因 | 关联 |
|------|------|----------|----------|------|
| 2026-05-26 | v1.18.9 | 优化键盘弹起时输入框避让逻辑，修复组件阴影问题 | — | a9b63c8b |
| 2026-05-26 | v1.18.8 | 修复输入弹窗相关显示问题 | — | 8a6fc7c8 |
| 2026-04-30 | v1.18.6 | 修复输入弹窗若干交互问题 | — | 9563da96 |
| 2026-04-29 | v1.18.6 | 修复输入弹窗若干显示问题 | — | e15b02a4 |
| 2026-04-20 | v1.18.5-alpha.0 | 调整输入框与输入弹窗交互细节 | — | 77aee285 |
| 2026-04-14 | v1.18.5-alpha.0 | HyperOS 输入弹窗初版实现 | — | 71e5ce3d |
