import { CustomFieldData } from "./CustomFieldData";

/**
 * Custom field reference
 * 自定义字段引用
 */
export type CustomFieldRef<V> = {
  /**
   * Get value
   */
  getValue(): V | undefined;

  /**
   * Set value
   * Its type is 'unknown' because the 'type' configuration of the CustomField may be changed
   * First time editing with the new 'type' may break the component
   * @param value Value, similar with the 'defaultValue' of the component
   */
  setValue(value: unknown): void;
};

/**
 * Custom field props
 * 自定义字段属性
 */
export type CustomFieldProps<D extends CustomFieldData, V> = {
  field: D;
  onChange: (name: string, value: V | undefined) => void;
  defaultValue?: unknown;
};

/**
 * Custom field interface
 * 自定义字段接口
 */
export interface ICustomField<
  V,
  D extends CustomFieldData,
  P extends CustomFieldProps<D, V>,
  R
> {
  (props: P): R;
}
