/* eslint-disable react-hooks/exhaustive-deps */
import React, { useEffect, isValidElement, useMemo, memo, Fragment } from 'react'
import { Space, Form } from 'antd'
import { useSafeState, useMemoizedFn } from 'ahooks'
import { QuestionCircleOutlined, CheckOutlined, CopyOutlined } from '@ant-design/icons'
import { run, isString, isObject, isFunction, copy, isExist, classnames, pickBy, isUndefined } from '@fexd/tools'
import { Action, Hook, Tooltip, useLazyRender } from '@fexd/pro-utils'
import FormItem from '../FormItem'
import { ProFieldValueFieldType, ProFieldValueTypes } from '../../types'
import types, { useUpdateAfterValueTypeAdd } from '../../valueTypes'
// import { compare, getObjectValues } from '../../utils'
export const CopyButton = memo(function CopyButton({ text, ...props }: any) {
const [done, setDone] = useSafeState(false)
useEffect(() => {
if (done) {
setTimeout(() => setDone(false), 3000)
}
}, [done])
return (
: }
onClick={(e: any) => {
run(e, 'stopPropagation')
copy(text)
setDone(true)
}}
/>
)
})
interface ReadonlyFieldProps extends ProFieldValueFieldType {
static?: boolean
}
export function useReadonlyField(props: ReadonlyFieldProps) {
const {
// key,
// @ts-ignore
___value___,
fromNowTooltip,
format,
unit,
builtInRule,
numberLocale,
currencyLocale,
form,
static: staticMode = false,
tooltip,
props: fieldProps = {},
fieldItemProps = {},
type: fieldTypeName = 'text',
options: fieldOptions,
renderField,
renderView = (types?.[(fieldTypeName as ProFieldValueTypes) ?? 'text'] as any)?.renderView,
disabled,
required,
copyable,
hook,
placeholder,
children,
lazyRender,
labelFontBold,
labelClassName,
labelStyle,
...field
} = props
// const form = Form.useFormInstance()
const getValue = useMemoizedFn(() => {
return (
run(() => {
if (!isExist(field?.name) || !form) {
return
}
try {
return form?.getFieldValue(field?.name as any)
} catch (err) {
return
}
}) ??
field?.value ??
field?.initialValue
)
})
const getValueContent = useMemoizedFn(() => {
const value = getValue()
const valueContent = run(() => {
try {
return (
run(renderView, undefined, value, {
options: fieldOptions,
...pickBy(
{
fromNowTooltip,
format,
unit,
builtInRule,
numberLocale,
currencyLocale,
},
(value) => !isUndefined(value),
),
...props,
}) ?? '--'
)
} catch (err) {
console.error('ProTable.valueType.renderField error!', err, { field })
}
})
if (isObject(valueContent) && !isValidElement(valueContent)) {
console.warn('ProTable.valueType.renderField error! not a valid element', valueContent, { field })
return null
}
return valueContent
})
// eslint-disable-next-line react-hooks/rules-of-hooks
const lazyContent = useLazyRender({
forceVisible: !lazyRender,
content: () => getValueContent(),
...(isObject(lazyRender) ? (lazyRender as any) : {}),
})
return useMemoizedFn<() => JSX.Element>(() => {
const value = getValue()
const content =
isValidElement(children) || isFunction(children) ? (
run(children)
) : (
<>
{!!value && copyable && (
)}
{lazyContent}
>
)
// 如果不需要展示 label,且不需要 form,则认为是纯粹的内容展示,不需要 form.item 包裹
if (staticMode || (!form && !field?.name && !field?.label)) {
if (field?.hidden) {
return null
}
return content
}
const mergedFormItemProps = {
...fieldItemProps,
...field,
}
return (
{field?.label}
{isExist(tooltip) && (
: null} />
)}
)
}
{...(fieldItemProps ?? {})}
className={classnames('f-pro-form-field f-pro-form-field-view', mergedFormItemProps?.className)}
{...(isFunction(children)
? {
name: undefined,
}
: {})}
>
<>{content}>
{/*
{function useNode() {
React.useEffect(() => {
console.log('didMount')
}, [])
return null
}}
*/}
)
})
// return '--'
}
export const ReadonlyField = memo(
function ReadonlyField(props: ReadonlyFieldProps) {
const content = useReadonlyField(props)
useUpdateAfterValueTypeAdd()
return content()
},
// (prevProps, nextProps) => compare(getObjectValues(prevProps?.field), getObjectValues(nextProps?.field)),
)
export default ReadonlyField