@ray-js/ipc-player-integration 0.0.1-beta-22 → 0.0.1-beta-23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/ctx/ctx.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { useRef, useCallback, useEffect } from 'react';
2
+ import Strings from '../i18n';
2
3
  import { useAtom, updateAtom, getDefaultStore, useStore } from './store';
3
4
  import { PlayState, IntercomMode } from '../interface';
4
5
  import { ClarityType } from '@ray-js/ray-ipc-utils/lib/interface';
@@ -33,11 +34,14 @@ export const createUseCtx = _ref => {
33
34
  // 录像中
34
35
  const [recording] = useAtom(false);
35
36
 
37
+ // 录像是否不可点击
38
+ const [recordingDisabled, setRecordingDisabled] = useAtom(false);
39
+
36
40
  // 静音 true 代表静音 false 代表不静音
37
41
  const [mute] = useAtom(true);
38
42
 
39
43
  // 品牌色 默认
40
- const [brandColor, setBrandColor] = useAtom('#FF592A');
44
+ const [brandColor, setBrandColor] = useAtom('#4b9ae9');
41
45
 
42
46
  // ptz 是否点击
43
47
  const [ptzActive, setPtzActive] = useAtom(false);
@@ -141,6 +145,7 @@ export const createUseCtx = _ref => {
141
145
  saveToAlbum,
142
146
  screenType,
143
147
  recording,
148
+ recordingDisabled,
144
149
  mute,
145
150
  resolution,
146
151
  resolutionList,
@@ -196,7 +201,9 @@ export const createUseCtx = _ref => {
196
201
  const store = getDefaultStore();
197
202
  const _recording = store.get(recording);
198
203
  if (target && target === _recording) {
199
- console.log('Cannot record during video recording');
204
+ toast({
205
+ title: Strings.getLang('ipc_player_recording_now_tip')
206
+ });
200
207
  return false;
201
208
  }
202
209
  return new Promise((resolve, reject) => {
@@ -214,15 +221,15 @@ export const createUseCtx = _ref => {
214
221
  } else {
215
222
  IPCPlayerInstance.current.stopRecord({
216
223
  saveToAlbum,
217
- success: () => {
224
+ success: res => {
218
225
  updateAtom(recording, false);
219
- resolve(true);
226
+ resolve(res);
220
227
  },
221
228
  fail: err => {
222
- updateAtom(recording, true);
229
+ updateAtom(recording, false);
223
230
  reject(err);
224
231
  const errObj = err.innerError || err || {};
225
- const errMsg = errObj.errorMsg || I18n.t('error_recording');
232
+ const errMsg = errObj.errorMsg || Strings.getLang('ipc_player_stop_recording_err');
226
233
  toast({
227
234
  title: errMsg
228
235
  });
@@ -231,6 +238,7 @@ export const createUseCtx = _ref => {
231
238
  }
232
239
  });
233
240
  },
241
+ setRecordingDisabled,
234
242
  setPtzActive,
235
243
  setFullResolutionActive,
236
244
  setScreenType,
@@ -5,30 +5,46 @@ declare const Strings: kit.I18N<{
5
5
  ipc_player_resolution_SD: string;
6
6
  ipc_player_current_resolution_is_equal: string;
7
7
  ipc_player_screenshot_success_tip: string;
8
- ipc_player_recording_success_tip: string;
9
- ipc_player_shot_or_record_check: string;
8
+ ipc_player_error_screenshot_error_tip: string;
9
+ ipc_player_record_success_tip: string;
10
+ ipc_player_shot_success_check: string;
11
+ ipc_player_record_success_check: string;
12
+ ipc_player_recording_now_tip: string;
13
+ ipc_player_stop_recording_err: string;
10
14
  };
11
15
  zh: {
12
16
  ipc_player_resolution_HD: string;
13
17
  ipc_player_resolution_SD: string;
14
18
  ipc_player_current_resolution_is_equal: string;
15
19
  ipc_player_screenshot_success_tip: string;
16
- ipc_player_recording_success_tip: string;
17
- ipc_player_shot_or_record_check: string;
20
+ ipc_player_error_screenshot_error_tip: string;
21
+ ipc_player_record_success_tip: string;
22
+ ipc_player_shot_success_check: string;
23
+ ipc_player_record_success_check: string;
24
+ ipc_player_recording_now_tip: string;
25
+ ipc_player_stop_recording_err: string;
18
26
  };
19
27
  }, {
20
28
  ipc_player_resolution_HD: string;
21
29
  ipc_player_resolution_SD: string;
22
30
  ipc_player_current_resolution_is_equal: string;
23
31
  ipc_player_screenshot_success_tip: string;
24
- ipc_player_recording_success_tip: string;
25
- ipc_player_shot_or_record_check: string;
32
+ ipc_player_error_screenshot_error_tip: string;
33
+ ipc_player_record_success_tip: string;
34
+ ipc_player_shot_success_check: string;
35
+ ipc_player_record_success_check: string;
36
+ ipc_player_recording_now_tip: string;
37
+ ipc_player_stop_recording_err: string;
26
38
  } | {
27
39
  ipc_player_resolution_HD: string;
28
40
  ipc_player_resolution_SD: string;
29
41
  ipc_player_current_resolution_is_equal: string;
30
42
  ipc_player_screenshot_success_tip: string;
31
- ipc_player_recording_success_tip: string;
32
- ipc_player_shot_or_record_check: string;
43
+ ipc_player_error_screenshot_error_tip: string;
44
+ ipc_player_record_success_tip: string;
45
+ ipc_player_shot_success_check: string;
46
+ ipc_player_record_success_check: string;
47
+ ipc_player_recording_now_tip: string;
48
+ ipc_player_stop_recording_err: string;
33
49
  }>;
34
50
  export default Strings;
@@ -4,16 +4,24 @@ declare const _default: {
4
4
  ipc_player_resolution_SD: string;
5
5
  ipc_player_current_resolution_is_equal: string;
6
6
  ipc_player_screenshot_success_tip: string;
7
- ipc_player_recording_success_tip: string;
8
- ipc_player_shot_or_record_check: string;
7
+ ipc_player_error_screenshot_error_tip: string;
8
+ ipc_player_record_success_tip: string;
9
+ ipc_player_shot_success_check: string;
10
+ ipc_player_record_success_check: string;
11
+ ipc_player_recording_now_tip: string;
12
+ ipc_player_stop_recording_err: string;
9
13
  };
10
14
  zh: {
11
15
  ipc_player_resolution_HD: string;
12
16
  ipc_player_resolution_SD: string;
13
17
  ipc_player_current_resolution_is_equal: string;
14
18
  ipc_player_screenshot_success_tip: string;
15
- ipc_player_recording_success_tip: string;
16
- ipc_player_shot_or_record_check: string;
19
+ ipc_player_error_screenshot_error_tip: string;
20
+ ipc_player_record_success_tip: string;
21
+ ipc_player_shot_success_check: string;
22
+ ipc_player_record_success_check: string;
23
+ ipc_player_recording_now_tip: string;
24
+ ipc_player_stop_recording_err: string;
17
25
  };
18
26
  };
19
27
  export default _default;
@@ -4,15 +4,23 @@ export default {
4
4
  ipc_player_resolution_SD: 'SD',
5
5
  ipc_player_current_resolution_is_equal: 'Already at current clarity',
6
6
  ipc_player_screenshot_success_tip: 'Screenshot saved to album',
7
- ipc_player_recording_success_tip: 'Recording saved to album',
8
- ipc_player_shot_or_record_check: 'View'
7
+ ipc_player_error_screenshot_error_tip: 'Screenshot failed. Please try again later.',
8
+ ipc_player_record_success_tip: 'Recording saved to album',
9
+ ipc_player_shot_success_check: 'View',
10
+ ipc_player_record_success_check: 'View',
11
+ ipc_player_recording_now_tip: 'Recording in progress...',
12
+ ipc_player_stop_recording_err: 'Failed to stop recording. Please exit and try again.'
9
13
  },
10
14
  zh: {
11
15
  ipc_player_resolution_HD: '高清',
12
16
  ipc_player_resolution_SD: '标清',
13
17
  ipc_player_current_resolution_is_equal: '已是当前清晰度',
14
18
  ipc_player_screenshot_success_tip: '截图已保存在APP相册',
15
- ipc_player_recording_success_tip: '录像已保存在APP相册',
16
- ipc_player_shot_or_record_check: '查看'
19
+ ipc_player_error_screenshot_error_tip: '截图失败了,请稍后再试',
20
+ ipc_player_record_success_tip: '录像已保存在APP相册',
21
+ ipc_player_shot_success_check: '查看',
22
+ ipc_player_record_success_check: '查看',
23
+ ipc_player_recording_now_tip: '正在录像中...',
24
+ ipc_player_stop_recording_err: '结束录像失败,请退出重试'
17
25
  }
18
26
  };
@@ -72,8 +72,9 @@ export type ComponentConfig<T = ReturnType<UseCtx> & Record<string, any>> = {
72
72
  id: string;
73
73
  content: (props: T) => React.ReactElement;
74
74
  initProps?: T;
75
- absolutePosition?: Pick<React.CSSProperties, 'top' | 'left' | 'right' | 'bottom'>;
75
+ absolutePosition?: React.CSSProperties;
76
76
  absoluteContentClassName?: string;
77
+ absoluteContentStyle?: React.CSSProperties;
77
78
  };
78
79
  export type ComponentConfigProps = {
79
80
  IPCPlayerContext: IpcContext;
@@ -82,3 +83,8 @@ export type PlayStatusData = {
82
83
  playState: PlayState;
83
84
  playCode: number;
84
85
  };
86
+ export type RecordInfoData = boolean | {
87
+ tempImagePath: string;
88
+ filePath: string;
89
+ thumbPath: string;
90
+ };
@@ -58,9 +58,7 @@ export function FullScreen(props) {
58
58
  addContent('absolute', {
59
59
  id: voiceIntercomId,
60
60
  content: props => {
61
- return /*#__PURE__*/React.createElement(View, {
62
- className: clsx('ipc-player-plugin-full-screen-voice')
63
- }, /*#__PURE__*/React.createElement(VoiceIntercom, props));
61
+ return /*#__PURE__*/React.createElement(VoiceIntercom, props);
64
62
  },
65
63
  absoluteContentClassName: 'ipc-player-plugin-full-screen-voice-wrap',
66
64
  initProps: _objectSpread({}, props)
@@ -11,8 +11,9 @@
11
11
  position: absolute;
12
12
  top: 50%;
13
13
  transform: translate(0, -50%);
14
+ // transform: translate(180%, 0);
14
15
  right: calc(36px * var(--ipc-player-size-scale, 1));;
15
- z-index: 3;
16
+ z-index: 340;
16
17
  }
17
18
 
18
19
  .ipc-player-plugin-full-screen-voice {
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import React, { useContext } from 'react';
3
- import { CoverView } from '@ray-js/ray';
3
+ import { View } from '@ray-js/ray';
4
4
  import clsx from 'clsx';
5
5
  import { VoiceIntercom as Component } from '../voiceIntercom';
6
6
  import { useComponentHideState } from '../../ui/hooks';
@@ -21,7 +21,7 @@ export function VoiceIntercom(props) {
21
21
  const {
22
22
  event
23
23
  } = useContext(UIEventContext);
24
- return /*#__PURE__*/React.createElement(CoverView, {
24
+ return /*#__PURE__*/React.createElement(View, {
25
25
  className: clsx('ipc-player-plugin-full-screen-voice', {
26
26
  'ipc-player-plugin-full-screen-voice-hide': shouldHide || isPtzActive || fullResolutionActive
27
27
  })
@@ -17,10 +17,12 @@ export const Ptz = props => {
17
17
  } = props;
18
18
  const {
19
19
  screenType,
20
- isPtzActive
20
+ isPtzActive,
21
+ brandColor
21
22
  } = useStore({
22
23
  screenType: screenTypeAtom,
23
- isPtzActive: ptzActive
24
+ isPtzActive: ptzActive,
25
+ brandColor: props.brandColor
24
26
  });
25
27
  if (screenType === 'vertical') {
26
28
  return null;
@@ -33,9 +35,7 @@ export const Ptz = props => {
33
35
  addContent('absolute', {
34
36
  id: ptzControlId,
35
37
  content: props => {
36
- return /*#__PURE__*/React.createElement(View, {
37
- className: "ipc-player-plugin-full-screen-ptz-control"
38
- }, /*#__PURE__*/React.createElement(PtzControl, props));
38
+ return /*#__PURE__*/React.createElement(PtzControl, props);
39
39
  },
40
40
  absoluteContentClassName: 'ipc-player-plugin-full-screen-ptz-control-warp',
41
41
  initProps: _objectSpread({}, props)
@@ -46,6 +46,9 @@ export const Ptz = props => {
46
46
  updateAtom(ptzActive, !isPtzActive);
47
47
  }
48
48
  }, /*#__PURE__*/React.createElement(Text, {
49
- className: clsx('icon-panel', 'icon-panel-ptz', 'ipc-player-plugin-ptz-text-icon', isPtzActive && 'ipc-ptz-active')
49
+ className: clsx('icon-panel', 'icon-panel-ptz', 'ipc-player-plugin-ptz-text-icon'),
50
+ style: _objectSpread({}, isPtzActive && {
51
+ color: brandColor
52
+ })
50
53
  }));
51
54
  };
@@ -2,11 +2,6 @@
2
2
  color: var(--iconColor);
3
3
  font-size: calc(var(--iconPlayerSize) * var(--ipc-player-size-scale, 1)) !important;
4
4
  }
5
-
6
- .ipc-ptz-active {
7
- color: var(--iconActiveColor);
8
- }
9
-
10
5
  // .ipc-player-plugin-full-screen-ptz {
11
6
  // position: absolute;
12
7
  // top: 60%;
@@ -35,7 +30,7 @@
35
30
  }
36
31
 
37
32
  .arrow-icon-wrapper {
38
- font-size: 12px;
33
+ font-size: 25px;
39
34
  color: #707070;
40
35
  }
41
36
 
@@ -1,4 +1,3 @@
1
1
  import React from 'react';
2
2
  import { ComponentConfigProps } from '../../interface';
3
- import './ptz.less';
4
3
  export declare const PtzControl: (props: ComponentConfigProps) => React.JSX.Element;
@@ -1,13 +1,43 @@
1
- import React, { useContext } from 'react';
1
+ import React, { useContext, useEffect, useRef } from 'react';
2
2
  import { CoverView } from '@ray-js/ray';
3
3
  import clsx from 'clsx';
4
+ import _find from 'lodash/find';
5
+ import _get from 'lodash/get';
4
6
  import IpcPtzZoom from '@ray-js/ipc-ptz-zoom';
7
+ import IpcUtils from '@ray-js/ray-ipc-utils';
5
8
  import { useComponentHideState } from '../../ui/hooks';
6
9
  import { UIEventContext } from '../../ui/context';
7
10
  import { useStore } from '../../ctx/store';
11
+ import { getEnumRangeIsValid } from '../../utils/device';
8
12
  import { startTimeToHideAllComponent, pauseTimeToHideAllComponent } from '../../ui/constant';
9
- import './ptz.less';
13
+ import Styles from './ptz.less';
14
+ const getPtzData = devId => {
15
+ return [{
16
+ type: 'top',
17
+ show: getEnumRangeIsValid(devId, 'ptz_control', '0'),
18
+ dpValue: '0',
19
+ icon: 'ptz-arrow'
20
+ }, {
21
+ type: 'right',
22
+ show: getEnumRangeIsValid(devId, 'ptz_control', '2'),
23
+ dpValue: '2',
24
+ icon: 'ptz-arrow'
25
+ }, {
26
+ type: 'left',
27
+ show: getEnumRangeIsValid(devId, 'ptz_control', '6'),
28
+ dpValue: '6',
29
+ icon: 'ptz-arrow'
30
+ }, {
31
+ type: 'bottom',
32
+ show: getEnumRangeIsValid(devId, 'ptz_control', '4'),
33
+ dpValue: '4',
34
+ icon: 'ptz-arrow'
35
+ }];
36
+ };
10
37
  export const PtzControl = props => {
38
+ const {
39
+ devId
40
+ } = props;
11
41
  const {
12
42
  screenType,
13
43
  brandColor
@@ -19,6 +49,16 @@ export const PtzControl = props => {
19
49
  const {
20
50
  event
21
51
  } = useContext(UIEventContext);
52
+ const ptzTimeId = useRef(null);
53
+ const ptzData = useRef(getPtzData(devId));
54
+ useEffect(() => {
55
+ return () => {
56
+ if (ptzTimeId.current) {
57
+ clearInterval(ptzTimeId.current);
58
+ ptzTimeId.current = null;
59
+ }
60
+ };
61
+ }, []);
22
62
  return /*#__PURE__*/React.createElement(CoverView, {
23
63
  className: clsx('ipc-player-plugin-full-screen-ptz-control', {
24
64
  'ipc-player-plugin-full-screen-ptz-control-hide': shouldHide
@@ -26,38 +66,44 @@ export const PtzControl = props => {
26
66
  }, /*#__PURE__*/React.createElement(IpcPtzZoom, {
27
67
  ptzSize: "172px",
28
68
  zoomData: [],
29
- ptzData: [{
30
- type: 'top',
31
- // show: getEnumRangeIsValid('ptz_control', '0'),
32
- show: true,
33
- dpValue: '0',
34
- icon: 'ptz-arrow'
35
- }, {
36
- type: 'right',
37
- // show: getEnumRangeIsValid('ptz_control', '2'),
38
- show: true,
39
- dpValue: '2',
40
- icon: 'ptz-arrow'
41
- }, {
42
- type: 'left',
43
- // show: getEnumRangeIsValid('ptz_control', '6'),
44
- show: true,
45
- dpValue: '6',
46
- icon: 'ptz-arrow'
47
- }, {
48
- type: 'bottom',
49
- // show: getEnumRangeIsValid('ptz_control', '4'),
50
- show: true,
51
- dpValue: '4',
52
- icon: 'ptz-arrow'
53
- }],
54
- onTouchPtzStart: () => {
69
+ ptzData: ptzData.current,
70
+ onTouchPtzStart: async data => {
55
71
  event.emit(pauseTimeToHideAllComponent);
72
+ const {
73
+ type
74
+ } = data;
75
+ const dpData = await IpcUtils.getDpIdByCode(devId, 'ptz_control');
76
+ if (dpData.code === 0) {
77
+ const ptzControlId = dpData.data;
78
+ const sndDpValue = _get(_find(ptzData.current, {
79
+ type
80
+ }), 'dpValue', null);
81
+ IpcUtils.publishDps(devId, {
82
+ [ptzControlId]: sndDpValue
83
+ });
84
+ ptzTimeId.current = setInterval(() => {
85
+ IpcUtils.publishDps(devId, {
86
+ [ptzControlId]: sndDpValue
87
+ });
88
+ }, 1000);
89
+ }
56
90
  },
57
- onTouchPtzEnd: () => {
91
+ onTouchPtzEnd: async () => {
92
+ const ptzStopData = await IpcUtils.getDpIdByCode(devId, 'ptz_stop');
93
+ if (ptzStopData.code === 0) {
94
+ const ptzStopId = ptzStopData.data;
95
+ IpcUtils.publishDps(devId, {
96
+ [ptzStopId]: true
97
+ });
98
+ }
99
+ if (ptzTimeId.current) {
100
+ clearInterval(ptzTimeId.current);
101
+ ptzTimeId.current = null;
102
+ }
58
103
  event.emit(startTimeToHideAllComponent);
59
104
  },
60
105
  brandColor: brandColor,
61
- iconClassName: clsx('arrow-icon-wrapper')
106
+ iconClassName: Styles['arrow-icon-wrapper'],
107
+ darkMode: true
62
108
  }));
63
109
  };
@@ -1,11 +1,16 @@
1
1
  import React, { useState, useEffect, useRef, useContext } from 'react';
2
- import { View, Text } from '@ray-js/ray';
2
+ import { View, Text, Image } from '@ray-js/ray';
3
+ import { useSetState, useUpdateEffect } from 'ahooks';
3
4
  import clsx from 'clsx';
5
+ import IpcUtils from '@ray-js/ray-ipc-utils';
6
+ import Strings from '../../i18n';
4
7
  import { UIEventContext } from '../../ui/context';
5
- import { startTimeToHideAllComponent, pauseTimeToHideAllComponent } from '../../ui/constant';
6
8
  import { useStore, getDefaultStore } from '../../ctx/store';
7
9
  import './recordVideo.less';
8
- const RECORD_VIDEO_TOAST_ID = 'record_video_toast_id';
10
+ const CLOSE_TIME = 5000;
11
+ const RESET_TIMER = 3000;
12
+ const RECORD_VIDEO_SUCCESS_TOAST_ID = 'record_video_SUCCESS_toast_id';
13
+ const RECORD_VIDEO_TIMER_ID = 'record_video_timer_id';
9
14
  function formatTimeDiff(diff) {
10
15
  const padWithZero = true;
11
16
  const diffMs = Math.abs(diff);
@@ -49,11 +54,18 @@ function useTime() {
49
54
  };
50
55
  }
51
56
  function TimeRecord() {
57
+ // const { showTimer } = props;
52
58
  const {
53
59
  min,
54
60
  sec,
55
61
  cancel
56
62
  } = useTime();
63
+ // useEffect(() => {
64
+ // console.log('____________', showTimer);
65
+ // if (!showTimer) {
66
+ // cancel();
67
+ // }
68
+ // }, [showTimer]);
57
69
  return /*#__PURE__*/React.createElement(View, {
58
70
  className: "ipc-player-plugin-record-video-toast-time"
59
71
  }, /*#__PURE__*/React.createElement(View, {
@@ -73,44 +85,159 @@ export function RecordVideo(props) {
73
85
  deleteContent,
74
86
  recording: recordingAtom,
75
87
  setRecording,
88
+ setRecordingDisabled,
89
+ devId,
76
90
  className
77
91
  } = props;
78
92
  const {
79
- recording
93
+ recording,
94
+ brandColor,
95
+ screenType,
96
+ recordingDisabled
80
97
  } = useStore({
81
- recording: recordingAtom
98
+ recording: recordingAtom,
99
+ brandColor: props.brandColor,
100
+ screenType: props.screenType,
101
+ recordingDisabled: props.recordingDisabled
102
+ });
103
+ const [state, setState] = useSetState({
104
+ showTimer: false,
105
+ showShot: false,
106
+ shotUrl: ''
82
107
  });
108
+
109
+ /** 设置5秒后关闭录制成功弹窗 */
110
+ const timer = useRef();
111
+ const timeToCloseRecordToast = () => {
112
+ clearTimeout(timer.current);
113
+ // @ts-ignore
114
+ timer.current = setTimeout(() => {
115
+ setState({
116
+ showShot: false,
117
+ shotUrl: ''
118
+ });
119
+ deleteContent('absolute', RECORD_VIDEO_SUCCESS_TOAST_ID);
120
+ }, CLOSE_TIME);
121
+ };
122
+
123
+ /** 设置3秒后还原禁止结束录像状态 */
124
+ const recordDisabledTimer = useRef();
125
+ const timeToResetRecordDisabled = () => {
126
+ clearTimeout(recordDisabledTimer.current);
127
+ // @ts-ignore
128
+ recordDisabledTimer.current = setTimeout(() => {
129
+ setRecordingDisabled(false);
130
+ }, RESET_TIMER);
131
+ };
132
+ useUpdateEffect(() => {
133
+ if (state.showShot && screenType) {
134
+ showRecordToast();
135
+ }
136
+ }, [state.showShot, screenType]);
137
+
138
+ /** 根据showTimer的显示定时器 */
139
+ useUpdateEffect(() => {
140
+ if (state.showTimer) {
141
+ showRecordTimer();
142
+ } else {
143
+ deleteContent('absolute', RECORD_VIDEO_TIMER_ID);
144
+ // 清除定时器,元素移除
145
+ }
146
+ }, [state.showTimer]);
147
+
148
+ /** 跳转相册 */
149
+ const handCheck = () => {
150
+ IpcUtils.goToIpcPageNativeRoute('ipc_album_panel', devId);
151
+ };
152
+
153
+ /** 添加录制成功弹窗 */
154
+ const showRecordToast = () => {
155
+ deleteContent('absolute', RECORD_VIDEO_SUCCESS_TOAST_ID);
156
+ addContent('absolute', {
157
+ id: RECORD_VIDEO_SUCCESS_TOAST_ID,
158
+ absoluteContentClassName: 'ipc-player-plugin-record-success-toast-wrap',
159
+ absolutePosition: {
160
+ top: screenType === 'vertical' ? '12px' : '60px',
161
+ left: screenType === 'vertical' ? '16px' : '50%',
162
+ right: screenType === 'vertical' ? '16px' : 'unset',
163
+ display: 'flex',
164
+ width: screenType === 'vertical' ? 'auto' : '400px',
165
+ marginLeft: screenType === 'vertical' ? '0' : '-200px'
166
+ },
167
+ content: () => {
168
+ return /*#__PURE__*/React.createElement(View, {
169
+ className: "ipc-player-plugin-record-success-toast"
170
+ }, /*#__PURE__*/React.createElement(View, {
171
+ className: "ipc-player-plugin-record-success-toast-image-box"
172
+ }, /*#__PURE__*/React.createElement(Image, {
173
+ className: "ipc-player-plugin-record-success-toast-image",
174
+ src: state.shotUrl
175
+ })), /*#__PURE__*/React.createElement(View, {
176
+ className: "ipc-player-plugin-record-success-toast-title"
177
+ }, Strings.getLang('ipc_player_record_success_tip')), /*#__PURE__*/React.createElement(View, {
178
+ onClick: handCheck,
179
+ className: "ipc-player-plugin-record-success-toast-bottom",
180
+ style: {
181
+ color: brandColor,
182
+ borderColor: brandColor
183
+ }
184
+ }, Strings.getLang('ipc_player_record_success_check')));
185
+ }
186
+ });
187
+ timeToCloseRecordToast();
188
+ };
189
+ const showRecordTimer = () => {
190
+ deleteContent('absolute', RECORD_VIDEO_TIMER_ID);
191
+ addContent('absolute', {
192
+ id: RECORD_VIDEO_TIMER_ID,
193
+ absoluteContentClassName: 'ipc-player-plugin-record-video-toast-wrap',
194
+ content: () => /*#__PURE__*/React.createElement(View, {
195
+ className: clsx('ipc-player-plugin-record-video-toast', {
196
+ 'ipc-player-plugin-record-video-toast-show': state.showTimer,
197
+ 'ipc-player-plugin-record-video-toast-hide': !state.showTimer
198
+ })
199
+ }, /*#__PURE__*/React.createElement(View, {
200
+ className: "ipc-player-plugin-record-video-toast-point",
201
+ style: {
202
+ backgroundColor: brandColor
203
+ }
204
+ }), /*#__PURE__*/React.createElement(TimeRecord, null))
205
+ });
206
+ };
83
207
  const handRecordVideo = async () => {
84
208
  const store = getDefaultStore();
85
209
  const _recording = store.get(recordingAtom);
86
210
  const target = !_recording;
87
- if (target) {
88
- event.emit(pauseTimeToHideAllComponent);
89
- } else {
90
- event.emit(startTimeToHideAllComponent);
211
+ if (recordingDisabled) {
212
+ return false;
91
213
  }
92
- await setRecording(target);
214
+ const recordInfo = await setRecording(target);
93
215
  if (target) {
94
- addContent('absolute', {
95
- id: RECORD_VIDEO_TOAST_ID,
96
- absoluteContentClassName: 'ipc-player-plugin-record-video-toast-wrap',
97
- content: () => /*#__PURE__*/React.createElement(View, {
98
- className: "ipc-player-plugin-record-video-toast"
99
- }, /*#__PURE__*/React.createElement(View, {
100
- className: "ipc-player-plugin-record-video-toast-point"
101
- }), /*#__PURE__*/React.createElement(TimeRecord, null))
216
+ setRecordingDisabled(true);
217
+ setState({
218
+ showTimer: true
102
219
  });
220
+ /** 录制开始后3秒后才可结束 */
221
+ timeToResetRecordDisabled();
103
222
  } else {
104
- deleteContent('absolute', RECORD_VIDEO_TOAST_ID);
223
+ setState({
224
+ showTimer: false,
225
+ showShot: true,
226
+ shotUrl: recordInfo.tempImagePath
227
+ });
105
228
  }
229
+ return true;
106
230
  };
107
231
  return /*#__PURE__*/React.createElement(View, {
108
232
  onClick: () => handRecordVideo(),
109
- className: clsx(className, '')
233
+ className: clsx(className, ''),
234
+ style: {
235
+ opacity: recordingDisabled ? 0.5 : 1
236
+ }
110
237
  }, /*#__PURE__*/React.createElement(Text, {
111
238
  className: clsx('icon-panel', 'ipc-player-plugin-record-video-icon', recording ? 'icon-panel-record-stop' : 'icon-panel-record'),
112
239
  style: {
113
- color: recording ? 'rgba(255, 56, 56, 1)' : undefined
240
+ color: recording ? brandColor : undefined
114
241
  }
115
242
  }));
116
243
  }
@@ -3,13 +3,26 @@
3
3
  color: var(--iconColor);
4
4
  }
5
5
  .ipc-player-plugin-record-video-toast-wrap {
6
- z-index: 110;
6
+ z-index: 400;
7
7
  position: absolute;
8
8
  top: calc(7px * var(--ipc-player-size-scale, 1));
9
9
  left: 50%;
10
10
  transform: translateX(-50%);
11
11
  }
12
+
13
+ // 计时器显示
14
+ .ipc-player-plugin-record-video-toast-show {
15
+ transform: translate(0, 0) !important;
16
+ transition: transform ease-in 3s;
17
+ }
18
+ // 计时器隐藏
19
+ .ipc-player-plugin-record-video-toast-hide {
20
+ transform: translate(0, -110%) !important;
21
+ transition: transform 0.3s ease-in-out;
22
+ }
23
+
12
24
  .ipc-player-plugin-record-video-toast {
25
+ transform: translate(0, -110%);
13
26
  display: flex;
14
27
  padding: calc(12px * var(--ipc-player-size-scale, 1));
15
28
  align-items: center;
@@ -21,21 +34,65 @@
21
34
  width: calc(6px * var(--ipc-player-size-scale, 1));
22
35
  height: calc(6px * var(--ipc-player-size-scale, 1));
23
36
  border-radius: calc(6px * var(--ipc-player-size-scale, 1));
24
- background-color: #FF3838;
25
37
  }
26
38
  .ipc-player-plugin-record-video-toast-time {
27
39
  font-size: calc(12px * var(--ipc-player-size-scale, 1));;
28
- font-weight: 600;
40
+ font-weight: 700;
29
41
  color: var(--fontColor);
30
42
  margin-left: calc(8px * var(--ipc-player-size-scale, 1));;
31
43
  display: flex;
32
44
  align-items: center;
45
+ font-family: Manrope !important;
33
46
  .ipc-player-plugin-record-video-toast-time-warp {
34
- width: calc(17px * var(--ipc-player-size-scale, 1));;
35
47
  text-align: center;
36
48
  }
37
49
  .ipc-player-plugin-record-video-toast-time-delimiter {
38
50
  margin: 0 calc(2px * var(--ipc-player-size-scale, 1));;
39
51
  }
40
52
  }
53
+ }
54
+
55
+ /** 录制成功弹窗 */
56
+ .ipc-player-plugin-record-success-toast-wrap {
57
+ position: absolute;
58
+ }
59
+ .ipc-player-plugin-record-success-toast {
60
+ flex: 1;
61
+ border-radius: calc(8px * var(--ipc-player-size-scale, 1));;
62
+ background-color: var(--shot-card-bg-color);
63
+ display: flex;
64
+ align-items: center;
65
+ padding: calc(8px * var(--ipc-player-size-scale, 1)) calc(12px * var(--ipc-player-size-scale, 1));
66
+ z-index: 100;
67
+ .ipc-player-plugin-record-success-toast-image-box {
68
+ border-radius: calc(4px * var(--ipc-player-size-scale, 1));
69
+ overflow: hidden;
70
+ width: calc(66px * var(--ipc-player-size-scale, 1));
71
+ height: calc(66px * 0.57 * var(--ipc-player-size-scale, 1));
72
+ }
73
+ .ipc-player-plugin-record-success-toast-image {
74
+ width: 100%;
75
+ height: 100%;
76
+ object-fit: cover;
77
+ }
78
+ .ipc-player-plugin-record-success-toast-title {
79
+ flex: 1;
80
+ margin-left: calc(12px * var(--ipc-player-size-scale, 1));
81
+ font-size: calc(14px * var(--ipc-player-size-scale, 1));
82
+ color: var(--fontColor);
83
+ margin-right: calc(12px * var(--ipc-player-size-scale, 1));
84
+ word-break: break-word;
85
+
86
+ }
87
+ .ipc-player-plugin-record-success-toast-bottom {
88
+ border: 1px solid #1989FA;
89
+ min-width: calc(52px * var(--ipc-player-size-scale, 1));
90
+ max-width: calc(100px * var(--ipc-player-size-scale, 1));
91
+ border-radius: calc(4px * var(--ipc-player-size-scale, 1));
92
+ padding: calc(5px * var(--ipc-player-size-scale, 1)) calc(11px * var(--ipc-player-size-scale, 1));
93
+ font-size: calc(14px * var(--ipc-player-size-scale, 1));
94
+ white-space: nowrap;
95
+ overflow: hidden;
96
+ text-overflow: ellipsis;
97
+ }
41
98
  }
@@ -12,6 +12,7 @@ export const FullResolutionControl = props => {
12
12
  setResolution,
13
13
  setFullResolutionActive
14
14
  } = props;
15
+ console.log(props, 'props========');
15
16
  const {
16
17
  screenType,
17
18
  fullResolutionActive,
@@ -51,5 +52,5 @@ export const FullResolutionControl = props => {
51
52
  style: item === resolution && {
52
53
  color: brandColor
53
54
  }
54
- }, I18n.t(`ipc_player_resolution_${item}`))));
55
+ }, Strings.getLang(`ipc_player_resolution_${item}`))));
55
56
  };
@@ -13,6 +13,7 @@ export const Resolution = props => {
13
13
  IPCPlayerContext,
14
14
  setResolution,
15
15
  addContent,
16
+ deleteContent,
16
17
  setFullResolutionActive,
17
18
  className
18
19
  } = props;
@@ -30,6 +31,8 @@ export const Resolution = props => {
30
31
  return /*#__PURE__*/React.createElement(View, {
31
32
  onClick: () => {
32
33
  if (screenType === 'full') {
34
+ // 移除全屏清晰度空间
35
+ deleteContent('absolute', fullResolutionId);
33
36
  // 添加全屏清晰度空间
34
37
  addContent('absolute', {
35
38
  id: fullResolutionId,
@@ -40,8 +40,7 @@
40
40
  justify-content: center;
41
41
  align-items: center;
42
42
  background-color: transparent;
43
- // transform: translate(200%, 0);
44
- z-index: 3;
43
+ z-index: 345;
45
44
  }
46
45
 
47
46
  .ipc-player-plugin-full-resolution-control-text {
@@ -1,8 +1,9 @@
1
1
  import React, { useRef } from 'react';
2
2
  import { View, Image, Text } from '@ray-js/ray';
3
+ import { useSetState, useUpdateEffect } from 'ahooks';
3
4
  import clsx from 'clsx';
4
5
  import IpcUtils from '@ray-js/ray-ipc-utils';
5
- import Strings from '@/i18n';
6
+ import Strings from '../../i18n';
6
7
  import { useStore } from '../../ctx/store';
7
8
  import './screenshot.less';
8
9
  const CLOSE_TIME = 5000;
@@ -23,18 +24,37 @@ export function Screenshot(props) {
23
24
  screenType: props.screenType,
24
25
  brandColor: props.brandColor
25
26
  });
26
- useRef();
27
+
28
+ /** 记录截屏url */
29
+ const [state, setState] = useSetState({
30
+ showShot: false,
31
+ shotUrl: ''
32
+ });
33
+ useUpdateEffect(() => {
34
+ if (state.showShot && screenType) {
35
+ showShotToast();
36
+ }
37
+ }, [state.showShot, screenType]);
38
+ const timer = useRef();
27
39
  const timeToCloseToast = () => {
28
- // clearInterval(timer.current);
29
- // // @ts-ignore
30
- // timer.current = setTimeout(() => {
31
- // deleteContent('absolute', 'plugin-screenshot-toast');
32
- // }, CLOSE_TIME);
40
+ clearInterval(timer.current);
41
+ // @ts-ignore
42
+ timer.current = setTimeout(() => {
43
+ setState({
44
+ showShot: false,
45
+ shotUrl: ''
46
+ });
47
+ deleteContent('absolute', 'plugin-screenshot-toast');
48
+ }, CLOSE_TIME);
33
49
  };
50
+
51
+ /** 跳转相册 */
34
52
  const handCheck = () => {
35
53
  IpcUtils.goToIpcPageNativeRoute('ipc_album_panel', devId);
36
54
  };
37
- const showToast = str => {
55
+
56
+ /** 添加截屏成功弹窗 */
57
+ const showShotToast = () => {
38
58
  deleteContent('absolute', 'plugin-screenshot-toast');
39
59
  addContent('absolute', {
40
60
  id: 'plugin-screenshot-toast',
@@ -42,7 +62,10 @@ export function Screenshot(props) {
42
62
  absolutePosition: {
43
63
  top: screenType === 'vertical' ? '12px' : '60px',
44
64
  left: screenType === 'vertical' ? '16px' : '50%',
45
- right: screenType === 'vertical' ? '16px' : '50%'
65
+ right: screenType === 'vertical' ? '16px' : 'unset',
66
+ display: 'flex',
67
+ width: screenType === 'vertical' ? 'auto' : '400px',
68
+ marginLeft: screenType === 'vertical' ? '0' : '-200px'
46
69
  },
47
70
  content: () => {
48
71
  return /*#__PURE__*/React.createElement(View, {
@@ -51,7 +74,7 @@ export function Screenshot(props) {
51
74
  className: "ipc-player-plugin-screenshot-toast-image-box"
52
75
  }, /*#__PURE__*/React.createElement(Image, {
53
76
  className: "ipc-player-plugin-screenshot-toast-image",
54
- src: str
77
+ src: state.shotUrl
55
78
  })), /*#__PURE__*/React.createElement(View, {
56
79
  className: "ipc-player-plugin-screenshot-toast-title"
57
80
  }, Strings.getLang('ipc_player_screenshot_success_tip')), /*#__PURE__*/React.createElement(View, {
@@ -61,7 +84,7 @@ export function Screenshot(props) {
61
84
  color: brandColor,
62
85
  borderColor: brandColor
63
86
  }
64
- }, Strings.getLang('ipc_player_shot_or_record_check')));
87
+ }, Strings.getLang('ipc_player_shot_success_check')));
65
88
  }
66
89
  });
67
90
  timeToCloseToast();
@@ -74,11 +97,15 @@ export function Screenshot(props) {
74
97
  saveToAlbum,
75
98
  // 保存到 IPC 相册
76
99
  success: res => {
77
- showToast(res.tempImagePath);
100
+ console.log(res, 'res');
101
+ setState({
102
+ showShot: true,
103
+ shotUrl: res.tempImagePath
104
+ });
78
105
  },
79
106
  fail: err => {
80
107
  const errObj = err.innerError || err || {};
81
- const errMsg = errObj.errorMsg || I18n.t('error_screenshot');
108
+ const errMsg = errObj.errorMsg || Strings.getLang('ipc_player_error_screenshot_error_tip');
82
109
  toast({
83
110
  title: errMsg
84
111
  });
@@ -4,12 +4,9 @@
4
4
  }
5
5
  .ipc-player-plugin-screenshot-toast-wrap {
6
6
  position: absolute;
7
- // max-width: 300px;
8
- // left: 50%;
9
- // transform: translateX(-50%);
10
- // top: calc(16px * var(--ipc-player-size-scale, 1));
11
7
  }
12
8
  .ipc-player-plugin-screenshot-toast {
9
+ flex: 1;
13
10
  border-radius: calc(8px * var(--ipc-player-size-scale, 1));;
14
11
  background-color: var(--shot-card-bg-color);
15
12
  display: flex;
@@ -9,5 +9,5 @@ type Props = ComponentConfigProps & {
9
9
  onTouchStart?: TouchEventHandler['onTouchStart'];
10
10
  onTouchEnd?: TouchEventHandler['onTouchEnd'];
11
11
  };
12
- export declare function VoiceIntercom({ style, className, iconClassName, recording: recordingAtom, intercom: intercomAtom, intercomMode: intercomModeAtom, setIntercom, mute: muteAtom, setMute, getStreamStatus, onTouchStart, onTouchEnd, }: Props): React.JSX.Element;
12
+ export declare const VoiceIntercom: (props: Props) => React.JSX.Element;
13
13
  export {};
@@ -7,34 +7,39 @@ import { useStore, getDefaultStore } from '../../ctx/store';
7
7
  import './voiceIntercom.less';
8
8
  import { PlayerStreamStatus, IntercomMode } from '../../interface';
9
9
  import { UIEventContext } from '../../ui/context';
10
+ import { radialGradient } from '../../utils';
10
11
  import { startTimeToHideAllComponent, pauseTimeToHideAllComponent } from '../../ui/constant';
11
12
  const NILL = () => null;
12
- export function VoiceIntercom(_ref) {
13
- let {
13
+ export const VoiceIntercom = props => {
14
+ const {
14
15
  style,
15
16
  className,
16
17
  iconClassName,
17
- recording: recordingAtom,
18
- intercom: intercomAtom,
19
- intercomMode: intercomModeAtom,
18
+ // recording: recordingAtom,
19
+ // intercom: intercomAtom,
20
+ // intercomMode: intercomModeAtom,
20
21
  setIntercom,
21
- mute: muteAtom,
22
+ // mute: muteAtom,
22
23
  setMute,
23
24
  getStreamStatus,
24
25
  onTouchStart = NILL,
25
26
  onTouchEnd = NILL
26
- } = _ref;
27
+ } = props;
27
28
  const {
28
29
  event
29
30
  } = useContext(UIEventContext);
30
31
  const {
32
+ recording,
31
33
  mute,
32
34
  intercom,
33
- intercomMode
35
+ intercomMode,
36
+ brandColor
34
37
  } = useStore({
35
- mute: muteAtom,
36
- intercom: intercomAtom,
37
- intercomMode: intercomModeAtom
38
+ recording: props.recording,
39
+ mute: props.mute,
40
+ intercom: props.intercom,
41
+ intercomMode: props.intercomMode,
42
+ brandColor: props.brandColor
38
43
  });
39
44
  // 对讲开始之前的静音状态
40
45
  const originMuteStatusBeforeVoice = useRef(mute);
@@ -70,17 +75,19 @@ export function VoiceIntercom(_ref) {
70
75
  event.emit(startTimeToHideAllComponent);
71
76
  };
72
77
  return /*#__PURE__*/React.createElement(View, {
73
- style: _objectSpread({}, style),
78
+ style: _objectSpread(_objectSpread({}, style), {
79
+ background: radialGradient(brandColor)
80
+ }),
74
81
  className: clsx('ipc-player-plugin-voice-intercom', className),
75
82
  onTouchStart: async e => {
76
83
  onTouchStart(e);
77
- const store = getDefaultStore();
84
+ getDefaultStore();
78
85
  if (loading.current) return;
79
86
  loading.current = true;
80
- const _intercom = store.get(intercomAtom);
81
- const _recording = store.get(recordingAtom);
82
- const target = !_intercom;
83
- if (target && _recording) {
87
+ // const _intercom = store.get(intercomAtom);
88
+ // const _recording = store.get(recordingAtom);
89
+ const target = !intercom;
90
+ if (target && recording) {
84
91
  console.log('录制中,无法对讲');
85
92
  loading.current = false;
86
93
  return;
@@ -104,4 +111,4 @@ export function VoiceIntercom(_ref) {
104
111
  }) : /*#__PURE__*/React.createElement(View, {
105
112
  className: clsx('icon-panel', 'icon-panel-one-way-intercom', 'intercom-default-icon', iconClassName)
106
113
  }));
107
- }
114
+ };
@@ -18,16 +18,16 @@ const BottomLeftContent = _ref => {
18
18
  });
19
19
  const [shouldHide] = useComponentHideState(screenType);
20
20
  return /*#__PURE__*/React.createElement(CoverView, {
21
- className: clsx('ipc-player-bottom-left-content-wrap', {
22
- 'ipc-player-bottom-left-content-hide': shouldHide || fullResolutionActive,
23
- 'ipc-player-bottom-left-content-show': !shouldHide && !fullResolutionActive
24
- })
21
+ className: clsx('ipc-player-bottom-left-content-wrap')
25
22
  }, /*#__PURE__*/React.createElement(View, {
26
23
  style: {
27
24
  paddingBottom: screenType === 'vertical' ? '14px' : '20px',
28
25
  paddingLeft: screenType === 'vertical' ? 0 : '25px'
29
26
  },
30
- className: clsx('ipc-player-bottom-left-content-container')
27
+ className: clsx('ipc-player-bottom-left-content-container', {
28
+ 'ipc-player-bottom-left-content-hide': shouldHide || fullResolutionActive,
29
+ 'ipc-player-bottom-left-content-show': !shouldHide && !fullResolutionActive
30
+ })
31
31
  }, children));
32
32
  };
33
33
  export default BottomLeftContent;
@@ -18,16 +18,16 @@ const BottomRightContent = _ref => {
18
18
  });
19
19
  const [shouldHide] = useComponentHideState(screenType);
20
20
  return /*#__PURE__*/React.createElement(CoverView, {
21
- className: clsx('ipc-player-bottom-right-content-wrap', {
22
- 'ipc-player-bottom-right-content-hide': shouldHide || fullResolutionActive,
23
- 'ipc-player-bottom-right-content-show': !shouldHide && !fullResolutionActive
24
- })
21
+ className: clsx('ipc-player-bottom-right-content-wrap')
25
22
  }, /*#__PURE__*/React.createElement(View, {
26
23
  style: {
27
24
  paddingBottom: screenType === 'vertical' ? '14px' : '20px',
28
25
  paddingRight: screenType === 'vertical' ? 0 : '25px'
29
26
  },
30
- className: clsx('ipc-player-bottom-right-content-container')
27
+ className: clsx('ipc-player-bottom-right-content-container', {
28
+ 'ipc-player-bottom-right-content-hide': shouldHide || fullResolutionActive,
29
+ 'ipc-player-bottom-right-content-show': !shouldHide && !fullResolutionActive
30
+ })
31
31
  }, children));
32
32
  };
33
33
  export default BottomRightContent;
@@ -18,20 +18,16 @@ const TopLeftContent = _ref => {
18
18
  });
19
19
  const [shouldHide] = useComponentHideState(screenType);
20
20
  return /*#__PURE__*/React.createElement(CoverView, {
21
- className: clsx('ipc-player-top-left-content-wrap', {
22
- 'ipc-player-top-left-content-hide': shouldHide || fullResolutionActive,
23
- 'ipc-player-top-left-content-show': !shouldHide && !fullResolutionActive
24
- })
21
+ className: clsx('ipc-player-top-left-content-wrap')
25
22
  }, /*#__PURE__*/React.createElement(View, {
26
23
  style: {
27
24
  paddingTop: screenType === 'vertical' ? '12px' : '16px',
28
25
  paddingLeft: screenType === 'vertical' ? 0 : '25px'
29
- }
30
- // className={clsx('ipc-player-content-item', 'ipc-player-top-content', {
31
- // 'ipc-player-top-content-hide': shouldHide || fullResolutionActive,
32
- // })}
33
- ,
34
- className: clsx('ipc-player-top-left-content-container')
26
+ },
27
+ className: clsx('ipc-player-top-left-content-container', {
28
+ 'ipc-player-top-left-content-hide': shouldHide || fullResolutionActive,
29
+ 'ipc-player-top-left-content-show': !shouldHide && !fullResolutionActive
30
+ })
35
31
  }, children));
36
32
  };
37
33
  export default TopLeftContent;
@@ -18,16 +18,16 @@ const TopRightContent = _ref => {
18
18
  });
19
19
  const [shouldHide] = useComponentHideState(screenType);
20
20
  return /*#__PURE__*/React.createElement(CoverView, {
21
- className: clsx('ipc-player-top-right-content-wrap', {
22
- 'ipc-player-top-right-content-hide': shouldHide || fullResolutionActive,
23
- 'ipc-player-top-right-content-show': !shouldHide && !fullResolutionActive
24
- })
21
+ className: clsx('ipc-player-top-right-content-wrap')
25
22
  }, /*#__PURE__*/React.createElement(View, {
26
23
  style: {
27
24
  paddingTop: screenType === 'vertical' ? '12px' : '16px',
28
25
  paddingRight: screenType === 'vertical' ? 0 : '25px'
29
26
  },
30
- className: clsx('ipc-player-top-right-content-container')
27
+ className: clsx('ipc-player-top-right-content-container', {
28
+ 'ipc-player-top-right-content-hide': shouldHide || fullResolutionActive,
29
+ 'ipc-player-top-right-content-show': !shouldHide && !fullResolutionActive
30
+ })
31
31
  }, children));
32
32
  };
33
33
  export default TopRightContent;
package/lib/ui/ui.js CHANGED
@@ -267,30 +267,30 @@ export const IPCPlayerIntegration = /*#__PURE__*/React.memo(props => {
267
267
  ,
268
268
  onZoomChange: data => {
269
269
  console.log(`zoomChange事件: ${JSON.stringify(data)}`);
270
- ty.showToast({
271
- title: `zoomChange事件: ${JSON.stringify(data)}`
272
- });
273
- setTimeout(() => {
274
- ty.hideToast();
275
- }, 3000);
270
+ // ty.showToast({
271
+ // title: `zoomChange事件: ${JSON.stringify(data)}`,
272
+ // });
273
+ // setTimeout(() => {
274
+ // ty.hideToast();
275
+ // }, 3000);
276
276
  },
277
277
  onCameraPreviewFailure: data => {
278
278
  console.log(`onCameraPreviewFailure事件: ${JSON.stringify(data)}`);
279
- ty.showToast({
280
- title: `onCameraPreviewFailure事件: ${JSON.stringify(data)}`
281
- });
282
- setTimeout(() => {
283
- ty.hideToast();
284
- }, 3000);
279
+ // ty.showToast({
280
+ // title: `onCameraPreviewFailure事件: ${JSON.stringify(data)}`,
281
+ // });
282
+ // setTimeout(() => {
283
+ // ty.hideToast();
284
+ // }, 3000);
285
285
  },
286
286
  onCameraNotifyWeakNetwork: data => {
287
287
  console.log(`onCameraNotifyWeakNetwork: ${JSON.stringify(data)}`);
288
- ty.showToast({
289
- title: `onCameraNotifyWeakNetwork: ${JSON.stringify(data)}`
290
- });
291
- setTimeout(() => {
292
- ty.hideToast();
293
- }, 3000);
288
+ // ty.showToast({
289
+ // title: `onCameraNotifyWeakNetwork: ${JSON.stringify(data)}`,
290
+ // });
291
+ // setTimeout(() => {
292
+ // ty.hideToast();
293
+ // }, 3000);
294
294
  },
295
295
  clarity: resolution === 'HD' ? 'hd' : 'normal',
296
296
  privateState: privateState,
@@ -305,7 +305,6 @@ export const IPCPlayerIntegration = /*#__PURE__*/React.memo(props => {
305
305
  ctx: instance
306
306
  }, renderBottomRightContent), playerReady && (() => {
307
307
  if (!absoluteContent || !(absoluteContent !== null && absoluteContent !== void 0 && absoluteContent.length)) return null;
308
- console.log(absoluteContent, 'absoluteContent');
309
308
  return absoluteContent.map(item => {
310
309
  return /*#__PURE__*/React.createElement(CoverView, {
311
310
  key: item.id,
@@ -11,3 +11,9 @@ export interface IDpCode {
11
11
  }
12
12
  export declare function getDpIdsByCodes<T extends string>(devId: string, dpIds: T[]): Promise<Record<T, string>>;
13
13
  export declare const showMathPowValue: (value: any, scale: any) => string | 0;
14
+ export declare const getDevInfo: <T>(deviceId: string) => Promise<any>;
15
+ /**
16
+ * 根据DpCode获取枚举型DP的range是否包含对应项
17
+ * @param result: {code: number, msg: string}
18
+ */
19
+ export declare const getEnumRangeIsValid: (devId: any, dpCode: any, rangValue: any) => Promise<any>;
@@ -1,3 +1,4 @@
1
+ import IpcUtils from '@ray-js/ray-ipc-utils';
1
2
  export function getDpValue(options) {
2
3
  return new Promise((resolve, reject) => {
3
4
  ty.device.getDeviceInfo({
@@ -52,4 +53,55 @@ export const showMathPowValue = (value, scale) => {
52
53
  v = (Number(value) / Math.pow(10, scale)).toFixed(1);
53
54
  }
54
55
  return v;
56
+ };
57
+ export const getDevInfo = deviceId => {
58
+ return new Promise(resolve => {
59
+ try {
60
+ ty.device.getDeviceInfo({
61
+ deviceId,
62
+ success: res => {
63
+ resolve({
64
+ code: 0,
65
+ data: res
66
+ });
67
+ },
68
+ fail: err => {
69
+ resolve({
70
+ code: -1,
71
+ msg: err
72
+ });
73
+ }
74
+ });
75
+ } catch (err) {
76
+ resolve({
77
+ code: -1,
78
+ msg: String(err)
79
+ });
80
+ }
81
+ });
82
+ };
83
+
84
+ /**
85
+ * 根据DpCode获取枚举型DP的range是否包含对应项
86
+ * @param result: {code: number, msg: string}
87
+ */
88
+
89
+ export const getEnumRangeIsValid = async (devId, dpCode, rangValue) => {
90
+ const infoData = await IpcUtils.getDevInfo(devId);
91
+ if (infoData.code === 0) {
92
+ var _targetSchema$propert;
93
+ const {
94
+ schema
95
+ } = infoData.data;
96
+ const arrayFromValues = Object.values(schema);
97
+ const targetSchema = arrayFromValues.find(item => item.code === dpCode);
98
+ if ((targetSchema === null || targetSchema === void 0 || (_targetSchema$propert = targetSchema.property) === null || _targetSchema$propert === void 0 ? void 0 : _targetSchema$propert.type) === 'enum') {
99
+ const {
100
+ range
101
+ } = targetSchema.property;
102
+ return range.includes(rangValue);
103
+ }
104
+ return false;
105
+ }
106
+ return false;
55
107
  };
@@ -0,0 +1,3 @@
1
+ /** 美克风对讲按钮径向渐变 */
2
+ export declare const radialGradient: (color: any) => string;
3
+ export declare const adjustBrightness: (hex: any, factor: any) => string;
@@ -0,0 +1,15 @@
1
+ /** 美克风对讲按钮径向渐变 */
2
+ export const radialGradient = color => {
3
+ return `radial-gradient(at center, ${adjustBrightness(color, 0.88)}, ${adjustBrightness(color, 1.2)})`;
4
+ };
5
+ export const adjustBrightness = (hex, factor) => {
6
+ const color = parseInt(hex.slice(1), 16); // 去掉 # 转为数字
7
+ let r = color >> 16 & 0xff;
8
+ let g = color >> 8 & 0xff;
9
+ let b = color >> 0 & 0xff;
10
+ r = Math.min(255, Math.max(30, Math.floor(r * factor)));
11
+ g = Math.min(255, Math.max(30, Math.floor(g * factor)));
12
+ b = Math.min(255, Math.max(30, Math.floor(b * factor)));
13
+ const hexString = 1 << 24 | r << 16 | g << 8 | b;
14
+ return `#${hexString.toString(16).slice(1)}`;
15
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ray-js/ipc-player-integration",
3
- "version": "0.0.1-beta-22",
3
+ "version": "0.0.1-beta-23",
4
4
  "description": "IPC 播放器功能集成",
5
5
  "main": "lib/index",
6
6
  "files": [
@@ -35,7 +35,7 @@
35
35
  "dependencies": {
36
36
  "@ray-js/ray-ipc-player": "2.0.19-beta-beta-1",
37
37
  "@ray-js/ray-ipc-utils": "1.1.0-beta-12",
38
- "@ray-js/ipc-ptz-zoom": "0.0.2-beta-1",
38
+ "@ray-js/ipc-ptz-zoom": "0.0.2-beta-3",
39
39
  "clsx": "^1.2.1",
40
40
  "jotai": "^2.10.2",
41
41
  "@ray-js/panel-sdk": "^1.13.1"