index.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { Button, Image, message, Modal, Space, Tabs, Tooltip } from "antd"
  2. import React, { useEffect, useState } from "react"
  3. import { useModel } from "umi"
  4. import FileBoxAD from "@/components/FileBoxAD"
  5. import { CloseCircleFilled, QuestionCircleFilled } from "@ant-design/icons"
  6. import style from './index.less'
  7. import LookLanding from "../lookLanding"
  8. interface Props {
  9. visible?: boolean,
  10. onChange?: (content: string[]) => void,
  11. onClose?: () => void,
  12. sliderImgContent?: { url: string, width?: number, height?: number }[]
  13. isBack?: boolean
  14. }
  15. /**
  16. * 选择素材
  17. * @returns
  18. */
  19. const SelectCloud: React.FC<Props> = (props) => {
  20. /**================================**/
  21. const { visible, onChange, onClose, sliderImgContent, isBack = true } = props
  22. const { state, set, getList } = useModel('useLaunchAdq.useBdMediaPup')
  23. const { mediaType, belongUser, parentId, selectItem, num } = state
  24. const [lookVisible, setLookVisible] = useState<boolean>(false)
  25. const [id, setId] = useState<number>(0)
  26. /**================================**/
  27. useEffect(() => {
  28. if (sliderImgContent && sliderImgContent?.length > 0) {
  29. setTimeout(() => {
  30. set({ selectItem: sliderImgContent })
  31. }, 100)
  32. } else {
  33. setTimeout(() => {
  34. set({ selectItem: [] })
  35. }, 100)
  36. }
  37. }, [])
  38. const handleOk = () => {
  39. if (selectItem && selectItem?.length > 0) {
  40. onChange && onChange(selectItem)
  41. } else {
  42. message.error('请选择')
  43. }
  44. }
  45. /**加载组件或数据更新执行请求列表 */
  46. useEffect(() => {
  47. if (belongUser === '1' || belongUser === '0') {
  48. getList()
  49. }
  50. }, [mediaType, belongUser, parentId])
  51. const clearImg = (id: number) => {
  52. set({ selectItem: selectItem?.filter(item => item.id !== id) })
  53. }
  54. return <Modal
  55. title={<Space>
  56. <span>选择素材</span>
  57. {(selectItem && num && selectItem?.length > 0 && num > 1) && <div className={style.selected}>
  58. {mediaType === 'IMG' ? <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
  59. <div style={{ overflowX: 'auto', maxWidth: 950, paddingTop: 8, display: 'flex' }}>
  60. <Image.PreviewGroup>
  61. {selectItem?.map((item: any, index: number) => (<div className={style.antImg} key={index}>
  62. <CloseCircleFilled className={style.clear} onClick={() => { clearImg(item?.id) }} />
  63. <Image
  64. className={style.imgAnt}
  65. width={30}
  66. height={30}
  67. src={item?.url}
  68. />
  69. </div>))}
  70. </Image.PreviewGroup>
  71. </div>
  72. <span style={{ color: '#1890ff' }}>已选:{selectItem.length}</span>
  73. </div> : selectItem?.map((item: any, index: number) => (
  74. <div key={index} className={style.antImg}>
  75. <CloseCircleFilled className={style.clear} onClick={() => { clearImg(item?.id) }} />
  76. <video className={style.imgAnt} src={item?.url} height={30} />
  77. </div>
  78. ))}
  79. </div>}
  80. </Space>}
  81. visible={visible}
  82. onOk={handleOk}
  83. onCancel={() => { onClose && onClose() }}
  84. width={1200}
  85. destroyOnClose
  86. maskClosable={false}
  87. bodyStyle={{ padding: 0 }}
  88. >
  89. <Tabs tabBarStyle={{ marginBottom: 0 }} onChange={(activeKey: any) => { set({ belongUser: activeKey }) }} activeKey={belongUser} style={{ margin: '0 24px' }} tabBarExtraContent={<Space>
  90. {
  91. mediaType === 'PAGE' ? null : <Button size='small' type="primary" onClick={() => { set({ imgVisrible: true }) }}>新建素材</Button>
  92. }
  93. <Tooltip title="功能都在下方内容区右键" placement="left">
  94. <QuestionCircleFilled />
  95. </Tooltip>
  96. </Space>}>
  97. <Tabs.TabPane tab={'个人本地'} key={1} />
  98. <Tabs.TabPane tab={'公共本地'} key={0} />
  99. </Tabs>
  100. <FileBoxAD isAll={false} noFile={true} isBack={isBack} setPage={(type, data) => {
  101. setId(data || 0)
  102. if (type === 1) {
  103. setLookVisible(true)
  104. }
  105. }} />
  106. {/* 查看落地页 */}
  107. {lookVisible && <LookLanding visible={lookVisible} onClose={() => setLookVisible(false)} id={id} />}
  108. </Modal>
  109. }
  110. export default React.memo(SelectCloud)