|  | @@ -1,4 +1,17 @@
 | 
	
		
			
				|  |  | -import React from "react"
 | 
	
		
			
				|  |  | +import React, { useEffect, useRef, useState } from "react"
 | 
	
		
			
				|  |  | +import '../../tencentAdPutIn/index.less'
 | 
	
		
			
				|  |  | +import { Button, Card, DatePicker, Dropdown, Input, Pagination, Select, Space, Spin, Table, Tabs } from "antd"
 | 
	
		
			
				|  |  | +import { getCreativeComponentListApi, GetCreativeComponentProps } from "@/services/adqV3/global"
 | 
	
		
			
				|  |  | +import './index.less'
 | 
	
		
			
				|  |  | +import { PlusOutlined } from "@ant-design/icons"
 | 
	
		
			
				|  |  | +import { useAjax } from "@/Hook/useAjax"
 | 
	
		
			
				|  |  | +import SelectAdAccount from "@/components/SelectAdAccount"
 | 
	
		
			
				|  |  | +import { COMMON_POTENTIAL_STATUS_ENUM, COMPONENT_GENERATION_TYPE_ENUM, DEFAULT_COMPONENT_SUB_IMAGE_TYPE, DEFAULT_COMPONENT_SUB_SHOW_IMAGE, DEFAULT_COMPONENT_SUB_SHOW_VIDEO, DEFAULT_COMPONENT_SUB_VIDEO_TYPE } from "./const"
 | 
	
		
			
				|  |  | +import moment from "moment"
 | 
	
		
			
				|  |  | +import { useDebounce, useSize } from "ahooks"
 | 
	
		
			
				|  |  | +import TableConfig from "./tableConfig"
 | 
	
		
			
				|  |  | +const COMPONENT_SUB_IMAGE_ENUM = DEFAULT_COMPONENT_SUB_IMAGE_TYPE.map(item => item.value)
 | 
	
		
			
				|  |  | +const COMPONENT_SUB_VIDEO_ENUM = DEFAULT_COMPONENT_SUB_VIDEO_TYPE.map(item => item.value)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 创意组件
 | 
	
	
		
			
				|  | @@ -6,9 +19,180 @@ import React from "react"
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  const ManageComponent: React.FC = () => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /*************************************/
 | 
	
		
			
				|  |  | +    const [queryParams, setQueryParams] = React.useState<GetCreativeComponentProps>({ pageNum: 1, pageSize: 20, activeKey: 'IMAGE' })
 | 
	
		
			
				|  |  | +    const [idSting, setIdSting] = useState<string>();
 | 
	
		
			
				|  |  | +    const debouncedIdSting = useDebounce(idSting, { wait: 500 });
 | 
	
		
			
				|  |  | +    const ref = useRef<HTMLDivElement>(null);
 | 
	
		
			
				|  |  | +    const size = useSize(ref);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    return <div>
 | 
	
		
			
				|  |  | -        111111111111111
 | 
	
		
			
				|  |  | +    const getCreativeComponentList = useAjax((params) => getCreativeComponentListApi(params))
 | 
	
		
			
				|  |  | +    /*************************************/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    useEffect(() => {
 | 
	
		
			
				|  |  | +        if (queryParams?.adAccountId) {
 | 
	
		
			
				|  |  | +            const { activeKey, componentSubType, ...params } = queryParams
 | 
	
		
			
				|  |  | +            if (debouncedIdSting) {
 | 
	
		
			
				|  |  | +                params[activeKey === 'IMAGE' ? 'imageId' : 'videoId'] = debouncedIdSting.split(/[,,\n\s]+/ig).filter((item: any) => item)
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                delete params?.[activeKey === 'IMAGE' ? 'imageId' : 'videoId']
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            getCreativeComponentList.run({ ...params, componentSubType: componentSubType || (activeKey === 'IMAGE' ? DEFAULT_COMPONENT_SUB_SHOW_IMAGE : DEFAULT_COMPONENT_SUB_SHOW_VIDEO) })
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }, [queryParams, debouncedIdSting])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return <div className="manageComponent">
 | 
	
		
			
				|  |  | +        <Card
 | 
	
		
			
				|  |  | +            className="cardResetCss"
 | 
	
		
			
				|  |  | +            bodyStyle={{ paddingBottom: 0, paddingTop: 0 }}
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +            <Space size={40}>
 | 
	
		
			
				|  |  | +                <Tabs
 | 
	
		
			
				|  |  | +                    items={[
 | 
	
		
			
				|  |  | +                        { label: '图片', key: 'IMAGE', children: false },
 | 
	
		
			
				|  |  | +                        { label: '视频', key: 'VIDEO', children: false }
 | 
	
		
			
				|  |  | +                    ]}
 | 
	
		
			
				|  |  | +                    activeKey={queryParams?.activeKey}
 | 
	
		
			
				|  |  | +                    onChange={(e) => {
 | 
	
		
			
				|  |  | +                        setQueryParams({
 | 
	
		
			
				|  |  | +                            ...queryParams,
 | 
	
		
			
				|  |  | +                            activeKey: e
 | 
	
		
			
				|  |  | +                        })
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <SelectAdAccount
 | 
	
		
			
				|  |  | +                    isReturnFirstValue
 | 
	
		
			
				|  |  | +                    value={queryParams?.adAccountId ? [queryParams.adAccountId] : undefined}
 | 
	
		
			
				|  |  | +                    type="radio"
 | 
	
		
			
				|  |  | +                    onChange={(value) => {
 | 
	
		
			
				|  |  | +                        setQueryParams({
 | 
	
		
			
				|  |  | +                            ...queryParams,
 | 
	
		
			
				|  |  | +                            adAccountId: value as number,
 | 
	
		
			
				|  |  | +                        })
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                    allowClear={false}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +            </Space>
 | 
	
		
			
				|  |  | +        </Card>
 | 
	
		
			
				|  |  | +        <Card
 | 
	
		
			
				|  |  | +            className="cardResetCss"
 | 
	
		
			
				|  |  | +            style={{ flex: 1, overflow: 'hidden' }}
 | 
	
		
			
				|  |  | +            bodyStyle={{
 | 
	
		
			
				|  |  | +                height: '100%',
 | 
	
		
			
				|  |  | +                overflow: 'hidden',
 | 
	
		
			
				|  |  | +                display: 'flex',
 | 
	
		
			
				|  |  | +                flexDirection: 'column',
 | 
	
		
			
				|  |  | +                width: '100%',
 | 
	
		
			
				|  |  | +                padding: 0
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  | +        >
 | 
	
		
			
				|  |  | +            <div className="manageComponent-header">
 | 
	
		
			
				|  |  | +                <Button icon={<PlusOutlined />} type="primary">新建组件</Button>
 | 
	
		
			
				|  |  | +                <Input.TextArea
 | 
	
		
			
				|  |  | +                    style={{ width: 160 }}
 | 
	
		
			
				|  |  | +                    value={idSting}
 | 
	
		
			
				|  |  | +                    rows={1}
 | 
	
		
			
				|  |  | +                    placeholder="素材ID(多个,,空格换行)"
 | 
	
		
			
				|  |  | +                    allowClear
 | 
	
		
			
				|  |  | +                    onChange={(e) => setIdSting(e.target.value)}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <Select
 | 
	
		
			
				|  |  | +                    showSearch
 | 
	
		
			
				|  |  | +                    placeholder="二级组件类型"
 | 
	
		
			
				|  |  | +                    filterOption={(input, option) =>
 | 
	
		
			
				|  |  | +                        ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    style={{ minWidth: 160 }}
 | 
	
		
			
				|  |  | +                    maxTagCount={1}
 | 
	
		
			
				|  |  | +                    mode="multiple"
 | 
	
		
			
				|  |  | +                    allowClear
 | 
	
		
			
				|  |  | +                    value={queryParams?.componentSubType}
 | 
	
		
			
				|  |  | +                    onChange={(e) => {
 | 
	
		
			
				|  |  | +                        setQueryParams({ ...queryParams, componentSubType: e, pageNum: 1 })
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                    options={queryParams?.activeKey === 'IMAGE' ? DEFAULT_COMPONENT_SUB_IMAGE_TYPE : DEFAULT_COMPONENT_SUB_VIDEO_TYPE}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <Select
 | 
	
		
			
				|  |  | +                    showSearch
 | 
	
		
			
				|  |  | +                    placeholder="已删除?"
 | 
	
		
			
				|  |  | +                    filterOption={(input, option) =>
 | 
	
		
			
				|  |  | +                        ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    style={{ width: 120 }}
 | 
	
		
			
				|  |  | +                    value={queryParams?.isDeleted}
 | 
	
		
			
				|  |  | +                    allowClear
 | 
	
		
			
				|  |  | +                    onChange={(e) => {
 | 
	
		
			
				|  |  | +                        setQueryParams({ ...queryParams, isDeleted: e, pageNum: 1 })
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                    options={[
 | 
	
		
			
				|  |  | +                        { label: '已删除', value: true },
 | 
	
		
			
				|  |  | +                        { label: '未删除', value: false }
 | 
	
		
			
				|  |  | +                    ]}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <Select
 | 
	
		
			
				|  |  | +                    showSearch
 | 
	
		
			
				|  |  | +                    placeholder="组件潜力"
 | 
	
		
			
				|  |  | +                    filterOption={(input, option) =>
 | 
	
		
			
				|  |  | +                        ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    style={{ minWidth: 120 }}
 | 
	
		
			
				|  |  | +                    maxTagCount={1}
 | 
	
		
			
				|  |  | +                    mode="multiple"
 | 
	
		
			
				|  |  | +                    value={queryParams?.potentialStatus}
 | 
	
		
			
				|  |  | +                    onChange={(e) => {
 | 
	
		
			
				|  |  | +                        setQueryParams({ ...queryParams, potentialStatus: e, pageNum: 1 })
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                    options={Object.keys(COMMON_POTENTIAL_STATUS_ENUM).map(key => ({ label: COMMON_POTENTIAL_STATUS_ENUM[key as keyof typeof COMMON_POTENTIAL_STATUS_ENUM], value: key }))}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <Select
 | 
	
		
			
				|  |  | +                    showSearch
 | 
	
		
			
				|  |  | +                    placeholder="来源"
 | 
	
		
			
				|  |  | +                    filterOption={(input, option) =>
 | 
	
		
			
				|  |  | +                        ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    style={{ minWidth: 120 }}
 | 
	
		
			
				|  |  | +                    maxTagCount={1}
 | 
	
		
			
				|  |  | +                    mode="multiple"
 | 
	
		
			
				|  |  | +                    value={queryParams?.generationType}
 | 
	
		
			
				|  |  | +                    onChange={(e) => {
 | 
	
		
			
				|  |  | +                        setQueryParams({ ...queryParams, generationType: e, pageNum: 1 })
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                    options={Object.keys(COMPONENT_GENERATION_TYPE_ENUM).map(key => ({ label: COMPONENT_GENERATION_TYPE_ENUM[key as keyof typeof COMPONENT_GENERATION_TYPE_ENUM], value: key }))}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +                <DatePicker.RangePicker
 | 
	
		
			
				|  |  | +                    placeholder={['创建时间开始', '创建时间结束']}
 | 
	
		
			
				|  |  | +                    value={queryParams?.createTimeMin && queryParams?.createTimeMax ? [moment(queryParams?.createTimeMin), moment(queryParams?.createTimeMax)] as any : undefined}
 | 
	
		
			
				|  |  | +                    onChange={(_, option) => setQueryParams({ ...queryParams, createTimeMin: option[0], createTimeMax: option[1], pageNum: 1 })}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +            <div className="manageComponent-content" ref={ref}>
 | 
	
		
			
				|  |  | +                <Table
 | 
	
		
			
				|  |  | +                    columns={TableConfig(queryParams?.activeKey as any)}
 | 
	
		
			
				|  |  | +                    dataSource={getCreativeComponentList.data?.records || []}
 | 
	
		
			
				|  |  | +                    loading={getCreativeComponentList.loading}
 | 
	
		
			
				|  |  | +                    scroll={{ x: 1000, y: (size?.height || 0) - 36 }}
 | 
	
		
			
				|  |  | +                    pagination={false}
 | 
	
		
			
				|  |  | +                    size="small"
 | 
	
		
			
				|  |  | +                    bordered
 | 
	
		
			
				|  |  | +                    rowKey="componentId"
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +            <div className="manageComponent-footer">
 | 
	
		
			
				|  |  | +                <Pagination
 | 
	
		
			
				|  |  | +                    size="small"
 | 
	
		
			
				|  |  | +                    total={getCreativeComponentList?.data?.total || 0}
 | 
	
		
			
				|  |  | +                    showSizeChanger
 | 
	
		
			
				|  |  | +                    showQuickJumper
 | 
	
		
			
				|  |  | +                    pageSize={getCreativeComponentList?.data?.size || 30}
 | 
	
		
			
				|  |  | +                    current={getCreativeComponentList?.data?.current || 1}
 | 
	
		
			
				|  |  | +                    onChange={(page: number, pageSize: number) => {
 | 
	
		
			
				|  |  | +                        ref.current?.querySelector('.ant-table-body')?.scrollTo({ top: 0 })
 | 
	
		
			
				|  |  | +                        setTimeout(() => setQueryParams({ ...queryParams, pageNum: page, pageSize }), 50)
 | 
	
		
			
				|  |  | +                    }}
 | 
	
		
			
				|  |  | +                />
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +        </Card>
 | 
	
		
			
				|  |  |      </div>
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |