selectCorpUserGroup.tsx 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import useNewToken from '@/Hook/useNewToken';
  2. import React, { useEffect, useState } from 'react';
  3. import './global.less'
  4. import SelectCorpUserGroupModal from './selectCorpUserGroupModal';
  5. import { Tag, Tooltip } from 'antd';
  6. export type CorpUserProps = { corpUserId: string, name: string, corpName: string, corpId: string }
  7. interface SelectCorpUserGroupProps {
  8. value?: TASK_CREATE.CorpUserGroupProps[];
  9. onChange?: (value?: TASK_CREATE.CorpUserGroupProps[]) => void;
  10. placeholder?: React.ReactNode
  11. disabled?: boolean
  12. }
  13. /**
  14. * 分组选择企微账号
  15. * @param param0
  16. * @returns
  17. */
  18. const SelectCorpUserGroup: React.FC<SelectCorpUserGroupProps> = ({ placeholder, value = [{ corpUsers: [] }], onChange, disabled }) => {
  19. /************************************************************/
  20. const { token } = useNewToken()
  21. const [visible, setVisible] = useState<boolean>(false);
  22. const [corpUserList, setCorpUserList] = useState<TASK_CREATE.CorpUserProps[]>([])
  23. /************************************************************/
  24. useEffect(() => {
  25. const newCorpUserList = value?.map(item => item.corpUsers).flat(1)
  26. if (JSON.stringify(newCorpUserList) !== JSON.stringify(corpUserList)) {
  27. setCorpUserList(newCorpUserList)
  28. }
  29. }, [value, corpUserList])
  30. return <>
  31. <div
  32. className='selectCorpUser'
  33. style={{
  34. border: `1px solid ${token.colorBorder}`,
  35. padding: `0px ${token.paddingXS}px`,
  36. borderRadius: token.borderRadius,
  37. height: token.controlHeight,
  38. }}
  39. onClick={() => {
  40. setVisible(true)
  41. }}
  42. >
  43. <div className='selectCorpUserContent'>
  44. {(corpUserList && corpUserList?.length > 0) ? <>
  45. <Tag
  46. closable={!disabled}
  47. onClose={(e) => {
  48. e.preventDefault();
  49. const newData = value?.map(item => ({ ...item, corpUsers: item.corpUsers?.filter(item => item.corpUserId !== corpUserList?.[0]?.corpUserId) }))?.filter(item => item?.corpUsers?.length > 0)
  50. onChange(newData)
  51. }}
  52. >
  53. {corpUserList?.[0]?.name || corpUserList?.[0]?.corpUserId}
  54. </Tag>
  55. {corpUserList?.length > 1 && <Tooltip
  56. color="#FFF"
  57. title={<span style={{ color: '#000' }}>
  58. {corpUserList?.filter((_, index) => index !== 0)?.map((item) => <Tag
  59. key={item.corpUserId}
  60. closable={!disabled}
  61. onClose={(e) => {
  62. e.stopPropagation()
  63. const newData = value?.map(ii => ({ ...ii, corpUsers: ii.corpUsers?.filter(i => i.corpUserId !== item.corpUserId) }))?.filter(item => item?.corpUsers?.length > 0)
  64. onChange(newData)
  65. }}
  66. >{item.name || item?.corpUserId}</Tag>)}</span>
  67. }
  68. >
  69. <Tag>+{corpUserList.length - 1} ...</Tag>
  70. </Tooltip>}
  71. </> : <span style={{ color: token.colorTextDisabled }}>{placeholder || '请选择客服号'}</span>}
  72. </div>
  73. </div>
  74. {visible && <SelectCorpUserGroupModal
  75. visible={visible}
  76. value={value}
  77. disabled={disabled}
  78. onClose={() => setVisible(false)}
  79. onChange={(value) => {
  80. setVisible(false)
  81. onChange?.(value)
  82. }}
  83. />}
  84. </>
  85. };
  86. export default React.memo(SelectCorpUserGroup);