index.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { txtLength } from "@/utils/utils"
  2. import { Button, Input, Space } from "antd"
  3. import { TextAreaProps } from "antd/lib/input/TextArea"
  4. import React, { useEffect, useState } from "react"
  5. import './index.less'
  6. interface Props extends TextAreaProps {
  7. length?: number
  8. isCurrent?: Array<'素材名称' | '落地页名' | '文案'>
  9. }
  10. /**
  11. * 广告名称 设置 组件
  12. * @returns
  13. */
  14. const InputName: React.FC<Props> = ({ isCurrent, value, onChange, length, ...props }) => {
  15. /******************************/
  16. const [status, setStatus] = useState<{ status?: string }>({})
  17. /******************************/
  18. useEffect(() => {
  19. if (length && txtLength(value as any) > length) {
  20. setStatus({ status: 'error' })
  21. } else {
  22. setStatus({})
  23. }
  24. }, [value])
  25. /** 插入通配符 */
  26. const insertMatching = (matching: string) => {
  27. onChange?.(value + `-${matching}` as any)
  28. }
  29. return <Space direction="vertical" size={0}>
  30. <Space align="end">
  31. <Input.TextArea value={value} {...props} onChange={(e) => {
  32. onChange?.(e)
  33. }} />
  34. {length && <span style={Object.keys(status).length > 0 ? { color: 'red' } : {}}>{txtLength(value as any)}/{length}</span>}
  35. </Space>
  36. {isCurrent && isCurrent?.length > 0 && <div className="matching">
  37. <span>通配符:</span>
  38. <Space>
  39. {isCurrent.includes('素材名称') && <Button type="link" onClick={() => insertMatching('<素材名称>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<素材名称>')}>+素材名称</Button>}
  40. {isCurrent.includes('落地页名') && <Button type="link" onClick={() => insertMatching('<落地页名>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<落地页名>')}>+落地页名</Button>}
  41. {isCurrent.includes('文案') && <Button type="link" onClick={() => insertMatching('<文案>')} style={{ padding: 0 }} disabled={value?.toString()?.includes('<文案>')}>+文案(前5个文字)</Button>}
  42. </Space>
  43. </div>}
  44. </Space>
  45. }
  46. export default React.memo(InputName)