CloudPlate.js 4.88 KB
Newer Older
1 2 3
import React from 'react';
import { PlusOutlined, MinusOutlined, CloseOutlined } from '@ant-design/icons';
import classNames from 'classnames';
4 5
import { notification } from 'antd';
import { controlSlim } from '../apis/index';
6 7 8
import styles from './CloudPlate.less';

const CloudPlate = (props) => {
9
  const { onClose, videoInfo } = props;
10 11 12 13 14 15 16 17 18 19 20 21 22
  const dotCount = 8; // 点的数量
  const radius = 55; // 圆的半径

  //   计算每个点的大致样式
  const getDotStyle = (index) => {
    const angle = (index * 360) / dotCount; // 计算点所在的角度
    const radians = (angle * Math.PI) / 180; // 角度转换为弧度
    const top = Math.sin(radians) * radius + radius - 8; // 计算点的垂直位置
    const left = Math.cos(radians) * radius + radius - 8; // 计算点的水平位置

    return { top, left };
  };

23
  // 0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-变倍+,9-变倍-,10-焦距+,11-焦距-,12-光圈+,13-光圈-
24 25 26
  // 3-右,7-右下,1-下,5-左下,2-左,4-左上,0-上,6-右上
  const directionList = [3, 7, 1, 5, 2, 4, 0, 6];

27 28 29
  // 触发控制接口
  const handleControl = async (num) => {
    var formData = new FormData();
30 31
    const navigatorAgent = /(iPhone|iOS|Android|Windows Phone)/i.test(navigator?.userAgent);
    const userInfo = localStorage.getItem("userInfo") ? JSON.parse(localStorage.getItem("userInfo")) : {};
32 33 34
    const data = {
      id: videoInfo.id,
      direction: num,
李纪文's avatar
李纪文 committed
35
      'site-code': !navigatorAgent ? window?.globalConfig?.userInfo?.LocalSite || window?.globalConfig?.userInfo?.site || '' : userInfo?.localSite || userInfo?.LocalSite || '',
36 37 38 39 40 41 42 43 44 45 46
    };
    for (const key in data) {
      formData.append(key, data[key]);
    }
    const res = await controlSlim(formData);
    if (res.code !== 200) {
      notification.error({
        message: '操作失败',
        description: res?.msg ?? '',
      });
    }
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
  };
  return (
    <div className={styles['cloud-plate']}>
      <div className={styles['cloud-right']}>
        <div className={styles['circle-container']}>
          <div className={styles['block-container']}>
            <div className={styles['block-icon-container']}></div>
          </div>
          <div className={styles.circleWrap}>
            <div className={styles.lineWrap}>
              <div className={classNames(styles['vertical-line'], styles['line'])} />
              <div className={classNames(styles['horizontal-line'], styles['line'])} />
              <div className={classNames(styles['diagonal-line-1'], styles['line'])} />
              <div className={classNames(styles['diagonal-line-2'], styles['line'])} />
            </div>
          </div>
          <div className={styles['circle']}>
            {Array.from({ length: dotCount }).map((_, index) => (
              <div
                key={index}
                className={classNames(styles['dot'], styles[`dot${index + 1}`])}
                style={getDotStyle(index)}
                onClick={() => {
                  handleControl(directionList[index]);
                }}
              />
            ))}
          </div>
        </div>
        <div className={styles['info-contianer']}>
          <div className={styles['close-wrapper']} onClick={onClose}>
            <CloseOutlined />
          </div>
          <div className={classNames(styles['operation-wrap'])}>
            <div>变倍</div>
            <div
              className={styles['opera-btn']}
              onClick={() => {
                handleControl(8);
              }}
            >
              <PlusOutlined />
            </div>
            <div
              className={styles['opera-btn']}
              onClick={() => {
                handleControl(9);
              }}
            >
              <MinusOutlined />
            </div>
          </div>
          <div className={classNames(styles['operation-wrap'])}>
            <div>聚焦</div>
            <div
              className={styles['opera-btn']}
              onClick={() => {
                handleControl(10);
              }}
            >
              <PlusOutlined />
            </div>
            <div
              className={styles['opera-btn']}
              onClick={() => {
                handleControl(11);
              }}
            >
              <MinusOutlined />
            </div>
          </div>
          <div className={classNames(styles['operation-wrap'])}>
            <div>光圈</div>
            <div
              className={styles['opera-btn']}
              onClick={() => {
123
                handleControl(12);
124 125 126 127 128 129 130
              }}
            >
              <PlusOutlined />
            </div>
            <div
              className={styles['opera-btn']}
              onClick={() => {
131
                handleControl(13);
132 133 134 135 136 137 138 139 140 141 142 143
              }}
            >
              <MinusOutlined />
            </div>
          </div>
        </div>
      </div>
    </div>
  );
};

export default CloudPlate;