CompanyFormItem.jsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import consts from '@/consts'
  2. import { queryCompany } from '@/services/customer'
  3. import { useDebounceFn } from 'ahooks'
  4. import { Input, Alert, Popover } from 'antd'
  5. import { useState } from 'react'
  6. import { useModal } from '@/components/ModalStore'
  7. export const validateEnum = {
  8. Success: 'success',
  9. Warning: 'warning',
  10. Error: 'error',
  11. Validating: 'validating'
  12. }
  13. const CompanyFormItem = ({ value, onChange, validateFn }) => {
  14. const dispatchModal = useModal()
  15. const [state, setState] = useState({
  16. inputVal: value,
  17. visible: false,
  18. list: null
  19. })
  20. const triggerChange = changedValue => {
  21. onChange?.(changedValue)
  22. }
  23. const queryList = async search => {
  24. if (!search) return
  25. const { code = -1, data } = await queryCompany({
  26. current: 1,
  27. pageSize: 10,
  28. search,
  29. waiver: true
  30. })
  31. if (code === consts.RET_CODE.SUCCESS) {
  32. const { customer = [] } = data
  33. setState({ ...state, list: customer, visible: !!customer?.length })
  34. if (customer?.length) {
  35. validateFn(validateEnum.Warning)
  36. } else {
  37. validateFn(validateEnum.Success)
  38. }
  39. }
  40. }
  41. const { run: handleQueryList, cancel: cancelQuerying } = useDebounceFn(queryList, { wait: 600 })
  42. const handleOnInputChange = async e => {
  43. const val = e.target.value || ''
  44. if (!val) {
  45. cancelQuerying()
  46. setState({ ...state, inputVal: val, list: null, visible: false })
  47. validateFn(validateEnum.Error)
  48. } else {
  49. setState({ ...state, inputVal: val })
  50. validateFn(validateEnum.Validating)
  51. handleQueryList(val)
  52. }
  53. triggerChange(val)
  54. }
  55. const { visible, list, inputVal } = state
  56. return (
  57. <Popover
  58. placement="bottom"
  59. visible={list && list.length && visible}
  60. onVisibleChange={e => setState({ ...state, visible: e })}
  61. title={
  62. <Alert
  63. message="已存在同名单位,请确认是否继续添加"
  64. type="warning"
  65. style={{ padding: '5px', margin: '10px 0' }}
  66. />
  67. }
  68. trigger="click"
  69. content={
  70. <ul className="list-none">
  71. {list?.map(item => {
  72. return (
  73. <p key={item.id}>
  74. <span
  75. className="text-primary cursor-pointer hover:text-hex-967bbd"
  76. onClick={() => dispatchModal('D_COMPANY_DETAIL', { dataId: item.id })}>
  77. {item.companyName}
  78. </span>
  79. <span className="mx-1">/</span>
  80. <span>{item.districtName?.replaceAll(' / ', ',')}</span>
  81. </p>
  82. )
  83. })}
  84. </ul>
  85. }>
  86. <Input
  87. type="text"
  88. autoComplete="false"
  89. value={inputVal}
  90. placeholder="请输入单位全称"
  91. onChange={handleOnInputChange}
  92. />
  93. </Popover>
  94. )
  95. }
  96. export default CompanyFormItem