TelephoneFormItem.jsx 3.0 KB

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