/** * @file 对于“常规输入控件”的公共逻辑抽象 * @description “常规输入控件”一般长成带边框的长条形,有默认的宽高,可以感知并适应所在表单/表单项(基于 size、layout 等信息) */ import cns from 'classnames' import { createContext, useContext, CSSProperties } from 'react' import { ValidateStatus as FormValidateStatus, useFormInfo, useFormSize } from '../Form/defs' import { concat } from '../utils' import { ComponentSize, usePrefix } from '../ConfigProvider' /** 输入控件状态信息 */ export interface InputStatus { focused: boolean disabled: boolean validateStatus?: FormValidateStatus } /** 常规输入控件颜色逻辑 */ export function useInputColorStyle({ focused, disabled, validateStatus }: InputStatus) { const formInfo = useFormInfo() const className = usePrefix('input-with-color') return cns( className, concat(className, 'validate-status', validateStatus ?? formInfo.validateStatus), focused && concat(className, 'focused'), disabled && concat(className, 'disabled') ) } /** 常规输入控件大小、间距等逻辑 */ function useInputSizeStyle(size?: ComponentSize) { const formInfo = useFormInfo() const groupSize = useContext(inputGroupSizeCtx) const className = usePrefix('input-with-size') return cns( concat(className, 'size', size ?? groupSize ?? formInfo.size), concat(className, 'layout', formInfo.layout.type) ) } /** 常规输入控件的样式(包括大小、间距、颜色等) */ export function useInputStyle({ size, ...inputStatus }: InputStatus & { size?: ComponentSize }) { const colorClassName = useInputColorStyle(inputStatus) const sizeClassName = useInputSizeStyle(size) return cns( colorClassName, sizeClassName ) } export const inputGroupSizeCtx = createContext(undefined) /** 获取输入控件的 size 信息 */ export function useInputSize(sizeFromProps: ComponentSize | undefined) { const groupSize = useContext(inputGroupSizeCtx) return useFormSize(sizeFromProps ?? groupSize) } /** 输入控件的基础公共属性 */ export interface BaseCommonProps { /** 输入值 */ value?: T /** 默认输入值 */ defaultValue?: T /** 输入值发生变更时的回调 */ onChange?: (value: T) => void /** 是否禁用 */ disabled?: boolean /** 尺寸 */ size?: ComponentSize } /** 输入控件的公共属性 */ export interface CommonProps extends BaseCommonProps { /** 占位内容 */ placeholder?: string /** 校验状态 */ validateStatus?: FormValidateStatus /** 自定义样式名 */ className?: string /** 自定义样式 */ style?: CSSProperties }