/* eslint-disable react-hooks/exhaustive-deps */
import React, { Fragment, memo, useState } from 'react'
import { useUpdate, useUpdateEffect } from 'ahooks'
import { isString, isExist, run, random } from '@fexd/tools'
import { Form, FormInstance } from 'antd'
import { ProFieldValueFieldType, ProFormInstance } from '../../types'
import EditableField, { useEditableField } from './EditableField'
import ReadonlyField, { useReadonlyField } from './ReadonlyField'
import { useUpdateAfterValueTypeAdd } from '../../valueTypes'
import FormItem from '../FormItem'
const genFieldKey = (field: ProFieldValueFieldType) =>
isString(field?.key) ? `${field?.key}:${field?.type}` : (field?.key ?? field?.type)
const FieldSwitch = memo(function FieldSwitch({
legacyRender = false,
...props
}: ProFieldValueFieldType & { legacyRender?: boolean }) {
const { mode = 'edit' } = props!
const [randomKey] = useState(() => random(0, 999999))
const fieldKey = genFieldKey(props!) ?? '(?)'
const key = `pf_${randomKey}_${fieldKey}`
const Field = mode === 'view' ? ReadonlyField : EditableField
const update = useUpdate()
useUpdateEffect(() => {
update() // key 变化后多触发一次渲染,修复 rc-field-form 未能及时应用最新值的问题
}, [key])
const getReadonlyFieldNode = useReadonlyField(props)
const getEditableFieldNode = useEditableField(props)
useUpdateAfterValueTypeAdd(!legacyRender)
const content = legacyRender ? (
) : (
{mode === 'view' ? run(getReadonlyFieldNode) : run(getEditableFieldNode)}
)
// if (props?.name) {
// console.log('props?.name', props?.name)
// return (
//
// {() => {
// console.log('cahnge')
// return
// }}
//
// )
// }
return content
})
const ProFieldSwitch = memo(function ProFieldSwitch({ form: propForm, ...props }: ProFieldValueFieldType): JSX.Element {
const ctxForm = Form.useFormInstance()
const form = (propForm ?? ctxForm) as any as ProFormInstance
if (!isExist(form)) {
return
}
return (
{(itemForm) => {
const value = run(form || itemForm, 'getFieldValue', props?.name as any)
return (
)
}}
)
})
export default ProFieldSwitch