import type { CSSProperties } from 'react'; import type { BaseTextInputProps } from '@pisell/utils'; /** * 国家码配置类型 */ export interface CountryCode { /** * 国家码 * @example '+86', '+1', '+44' */ code: string; /** * 国家名称 * @example '中国', '美国', '英国' */ name: string; /** * 国旗 emoji 或图标 * @example '🇨🇳', '🇺🇸', '🇬🇧' */ flag: string; /** * 号码格式(可选,用于显示占位符) * @example 'XXX XXXX XXXX', '(XXX) XXX-XXXX' */ format?: string; /** * 最大长度 * @example 11 (中国), 10 (美国) */ maxLength: number; /** * 校验正则 * @example /^1[3-9]\d{9}$/ (中国手机号) */ pattern: RegExp; } /** * PisellPhone 组件 Props 类型定义 * * 继承 BaseTextInputProps,添加电话号码特有的配置 */ export interface PisellPhoneProps extends BaseTextInputProps { /** * 状态模式 * @default 'edit' */ mode?: 'read' | 'edit'; /** * 是否禁用 * @default false */ disabled?: boolean; /** * 当前选中的国家码 * @default '+86' * @example '+86', '+1', '+44' */ countryCode?: string; /** * 默认国家码(非受控模式) * @default '+86' */ defaultCountryCode?: string; /** * 是否显示国家码选择器 * @default true */ showCountrySelector?: boolean; /** * 可用的国家码列表(从预设24个中过滤) * @example ['+86', '+1', '+44'] */ availableCountryCodes?: string[]; /** * 常用国家码(置顶显示) * @example ['+86', '+1'] */ commonCountryCodes?: string[]; /** * 完全自定义国家码列表(覆盖预设) */ countryCodes?: CountryCode[]; /** * 国家码变更回调 * @param code 新的国家码 */ onCountryCodeChange?: (code: string) => void; /** * 是否自动格式化 * @default true */ autoFormat?: boolean; /** * 格式化规则 * @default 'auto' */ formatRule?: 'mobile' | 'landline' | 'auto'; /** * 格式化分隔符 * @default ' ' */ separator?: string; /** * 是否启用拨号(移动端) * @default true */ enableDial?: boolean; /** * 是否显示拨号图标 * @default false */ showDialIcon?: boolean; /** * 拨号回调 * @param phone 完整的电话号码(含国家码) */ onDial?: (phone: string) => void; /** * 是否脱敏显示(只读态) * @default false */ enableMasking?: boolean; /** * 脱敏模式 * - middle: 中间4位脱敏(138****0000) * - last: 后4位脱敏(1380000****) * - custom: 使用自定义函数 * @default 'middle' */ maskPattern?: 'middle' | 'last' | 'custom'; /** * 自定义脱敏函数 * @param phone 电话号码 * @returns 脱敏后的号码 */ customMask?: (phone: string) => string; /** * 是否显示国旗图标 * @default true */ showFlag?: boolean; /** * 字号 * @example '14px' 或 14 * @default 16 */ fontSize?: string | number; /** * 字重 * @example 'bold' 或 600 * @default 500 */ fontWeight?: string | number; /** * 文本颜色 * @example '#000000' * @default '#101828' */ color?: string; /** * 占位文本 * @default '请输入电话号码' */ placeholder?: string; /** * 最大长度(根据国家码自动设置) */ maxLength?: number; /** * 是否显示清空按钮 * @default false */ allowClear?: boolean; /** * 是否自动聚焦 * @default false */ autoFocus?: boolean; /** * 是否校验格式 * @default true */ validateFormat?: boolean; /** * 自定义校验函数 * @param phone 电话号码(纯数字) * @param countryCode 国家码 * @returns true 表示校验通过,string 表示错误信息 */ customValidator?: (phone: string, countryCode: string) => boolean | string; /** * 自定义类名 */ className?: string; /** * 自定义样式 */ style?: CSSProperties; /** * ARIA 标签 */ 'aria-label'?: string; /** * ARIA 描述 */ 'aria-describedby'?: string; } export type { DisplayState, ValidationResult, TextInputState } from '@pisell/utils';