@uniai-fe/uds-templates 0.5.4 → 0.5.5
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/package.json +1 -1
- package/src/cctv/components/cam-list/Container.tsx +19 -6
- package/src/cctv/components/cam-list/Item.tsx +15 -4
- package/src/cctv/components/video/Template.tsx +30 -8
- package/src/cctv/components/video/index.tsx +2 -0
- package/src/cctv/components/viewer/desktop/Container.tsx +17 -10
- package/src/cctv/components/viewer/desktop/Video.tsx +15 -4
- package/src/cctv/types/props.ts +147 -1
package/package.json
CHANGED
|
@@ -2,17 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
import clsx from "clsx";
|
|
4
4
|
import CCTVCamListItem from "./Item";
|
|
5
|
-
import type {
|
|
5
|
+
import type { CctvCamListContainerProps } from "../../types";
|
|
6
6
|
import { useCctvContext } from "../../hooks";
|
|
7
7
|
import { useMemo } from "react";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* CCTV; cam-list container
|
|
11
|
+
* @component
|
|
12
|
+
* @param {CctvCamListContainerProps} props
|
|
13
|
+
* @param {string} [props.className] 루트 컨테이너 클래스
|
|
14
|
+
* @param {CctvCompanyCameraList[]} [props.list] 외부에서 직접 주입하는 카메라 리스트
|
|
15
|
+
* @param {CctvVideoRenderOverlay} [props.renderOverlay] 각 item video overlay를 교체하는 custom render 함수
|
|
16
|
+
* @example
|
|
17
|
+
* <CCTV.CamList.Container renderOverlay={({ cam }) => <div>{cam?.cam_name}</div>} />
|
|
18
|
+
*/
|
|
9
19
|
export default function CCTVCamListContainer({
|
|
10
20
|
className,
|
|
11
21
|
list,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
list?: CctvCompanyCameraList[];
|
|
15
|
-
}) {
|
|
22
|
+
renderOverlay,
|
|
23
|
+
}: CctvCamListContainerProps) {
|
|
16
24
|
const { cams } = useCctvContext();
|
|
17
25
|
const camList = useMemo(() => list ?? cams, [list, cams]);
|
|
18
26
|
// console.log("CCTVCamListContainer camList:", { list, camList });
|
|
@@ -28,7 +36,12 @@ export default function CCTVCamListContainer({
|
|
|
28
36
|
<div className={clsx("cctv-cam-list-container", className)}>
|
|
29
37
|
<ul className="cctv-cam-list-track">
|
|
30
38
|
{camList.map(({ renderKey, ...cam }) => (
|
|
31
|
-
<CCTVCamListItem
|
|
39
|
+
<CCTVCamListItem
|
|
40
|
+
key={renderKey}
|
|
41
|
+
{...cam}
|
|
42
|
+
// 변경 설명: container에서 받은 overlay seam을 item까지 그대로 전달한다.
|
|
43
|
+
renderOverlay={renderOverlay}
|
|
44
|
+
/>
|
|
32
45
|
))}
|
|
33
46
|
</ul>
|
|
34
47
|
</div>
|
|
@@ -1,22 +1,30 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import clsx from "clsx";
|
|
4
|
-
import type { CctvCompanyCameraData } from "../../types";
|
|
5
4
|
import { useCctvRtcStream } from "../../hooks";
|
|
6
5
|
import { useMemo } from "react";
|
|
7
6
|
import CCTVVideoTemplate from "../video/Template";
|
|
7
|
+
import type { CctvCamListItemProps } from "../../types";
|
|
8
8
|
import {
|
|
9
9
|
getOverlayMessage,
|
|
10
10
|
getIsLive,
|
|
11
11
|
getIsError,
|
|
12
12
|
} from "../../utils/video-state";
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* CCTV; cam-list item
|
|
16
|
+
* @component
|
|
17
|
+
* @param {CctvCamListItemProps} props
|
|
18
|
+
* @param {string} [props.className] 루트 아이템 클래스
|
|
19
|
+
* @param {CctvVideoRenderOverlay} [props.renderOverlay] item video overlay를 교체하는 custom render 함수
|
|
20
|
+
* @example
|
|
21
|
+
* <CCTV.CamList.Item {...cam} renderOverlay={({ headerOptions }) => <div>{headerOptions?.title}</div>} />
|
|
22
|
+
*/
|
|
14
23
|
export default function CCTVCamListItem({
|
|
15
24
|
className,
|
|
25
|
+
renderOverlay,
|
|
16
26
|
...cam
|
|
17
|
-
}: {
|
|
18
|
-
className?: string;
|
|
19
|
-
} & CctvCompanyCameraData) {
|
|
27
|
+
}: CctvCamListItemProps) {
|
|
20
28
|
const { videoRef, ...rtcCtx } = useCctvRtcStream({ cam });
|
|
21
29
|
|
|
22
30
|
const isLive = useMemo(() => getIsLive({ cam, ...rtcCtx }), [cam, rtcCtx]);
|
|
@@ -37,6 +45,7 @@ export default function CCTVCamListItem({
|
|
|
37
45
|
>
|
|
38
46
|
<CCTVVideoTemplate
|
|
39
47
|
ref={videoRef}
|
|
48
|
+
cam={cam}
|
|
40
49
|
className="cctv-cam-list-video-container"
|
|
41
50
|
headerOptions={{
|
|
42
51
|
activeLiveState: true,
|
|
@@ -46,6 +55,8 @@ export default function CCTVCamListItem({
|
|
|
46
55
|
title: cam.cam_name,
|
|
47
56
|
}}
|
|
48
57
|
footerOptions={{ activeTitle: true, activeOpenButton: true, cam }}
|
|
58
|
+
// 변경 설명: list item custom overlay는 template seam 하나만 따라간다.
|
|
59
|
+
renderOverlay={renderOverlay}
|
|
49
60
|
{...{ isError, overlayMessage, isLive }}
|
|
50
61
|
/>
|
|
51
62
|
</li>
|
|
@@ -15,32 +15,54 @@ import type { CctvVideoTemplateProps } from "../../types/props";
|
|
|
15
15
|
* @property {CctvVideoOverlayHeaderProps} [headerOptions]
|
|
16
16
|
* @property {CctvVideoOverlayFooterProps} [footerOptions]
|
|
17
17
|
* @property {boolean} [isError]
|
|
18
|
-
* @property {
|
|
18
|
+
* @property {React.ReactNode} [overlayMessage]
|
|
19
19
|
* @property {boolean} [isLive]
|
|
20
|
+
* @property {CctvCompanyCameraData} [cam]
|
|
21
|
+
* @property {CctvVideoRenderOverlay} [renderOverlay]
|
|
20
22
|
* @property {React.Ref<HTMLVideoElement>} ref
|
|
21
23
|
*/
|
|
22
24
|
const CCTVVideoTemplate = forwardRef<HTMLVideoElement, CctvVideoTemplateProps>(
|
|
23
25
|
(
|
|
24
26
|
{
|
|
27
|
+
cam,
|
|
25
28
|
className,
|
|
26
29
|
headerOptions,
|
|
27
30
|
footerOptions,
|
|
28
31
|
isError,
|
|
29
32
|
isLive,
|
|
30
33
|
overlayMessage,
|
|
34
|
+
renderOverlay,
|
|
31
35
|
},
|
|
32
36
|
ref,
|
|
33
37
|
) => {
|
|
38
|
+
// 변경 설명: custom overlay가 없을 때는 기존 overlay 조립을 그대로 유지한다.
|
|
39
|
+
const defaultOverlay = (
|
|
40
|
+
<CCTVVideoOverlayContainer>
|
|
41
|
+
<CCTVVideoOverlayHeader {...headerOptions} />
|
|
42
|
+
<CCTVVideoOverlayBody className={isError ? "is-error" : undefined}>
|
|
43
|
+
{!isLive ? <CCTVVideoError>{overlayMessage}</CCTVVideoError> : null}
|
|
44
|
+
</CCTVVideoOverlayBody>
|
|
45
|
+
<CCTVVideoOverlayFooter {...footerOptions} isLive={isLive} />
|
|
46
|
+
</CCTVVideoOverlayContainer>
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
// 변경 설명: service는 기존 public 타입 기반 ctx만 받아 overlay를 교체할 수 있다.
|
|
50
|
+
const overlayNode =
|
|
51
|
+
typeof renderOverlay === "function"
|
|
52
|
+
? renderOverlay({
|
|
53
|
+
cam,
|
|
54
|
+
headerOptions,
|
|
55
|
+
footerOptions,
|
|
56
|
+
isError,
|
|
57
|
+
isLive,
|
|
58
|
+
overlayMessage,
|
|
59
|
+
})
|
|
60
|
+
: defaultOverlay;
|
|
61
|
+
|
|
34
62
|
return (
|
|
35
63
|
<CCTVVideoContainer className={className} isError={isError}>
|
|
36
64
|
<CCTVVideoContents ref={ref} muted />
|
|
37
|
-
|
|
38
|
-
<CCTVVideoOverlayHeader {...headerOptions} />
|
|
39
|
-
<CCTVVideoOverlayBody className={isError ? "is-error" : undefined}>
|
|
40
|
-
{!isLive ? <CCTVVideoError>{overlayMessage}</CCTVVideoError> : null}
|
|
41
|
-
</CCTVVideoOverlayBody>
|
|
42
|
-
<CCTVVideoOverlayFooter {...footerOptions} isLive={isLive} />
|
|
43
|
-
</CCTVVideoOverlayContainer>
|
|
65
|
+
{overlayNode}
|
|
44
66
|
</CCTVVideoContainer>
|
|
45
67
|
);
|
|
46
68
|
},
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import CCTVVideoContainer from "./Container";
|
|
2
2
|
import { CCTVVideoOverlay } from "./overlay";
|
|
3
|
+
import CCTVVideoTemplate from "./Template";
|
|
3
4
|
import CCTVVideoContents from "./Video";
|
|
4
5
|
|
|
5
6
|
export const CCTVVideo = {
|
|
6
7
|
Container: CCTVVideoContainer,
|
|
7
8
|
Contents: CCTVVideoContents,
|
|
9
|
+
Template: CCTVVideoTemplate,
|
|
8
10
|
Overlay: CCTVVideoOverlay,
|
|
9
11
|
};
|
|
@@ -2,22 +2,27 @@ import clsx from "clsx";
|
|
|
2
2
|
import CCTVViewerContainer from "../Container";
|
|
3
3
|
import CCTVViewerDesktopPagination from "./Pagination";
|
|
4
4
|
import CCTVViewerDesktopVideo from "./Video";
|
|
5
|
-
import type {
|
|
6
|
-
CctvCompanyCameraData,
|
|
7
|
-
CctvCompanyCameraList,
|
|
8
|
-
} from "../../../types";
|
|
5
|
+
import type { CctvViewerDesktopContainerProps } from "../../../types";
|
|
9
6
|
|
|
7
|
+
/**
|
|
8
|
+
* CCTV; viewer desktop container
|
|
9
|
+
* @component
|
|
10
|
+
* @param {CctvViewerDesktopContainerProps} props
|
|
11
|
+
* @param {string} [props.className] 루트 컨테이너 클래스
|
|
12
|
+
* @param {React.ReactNode} [props.children] 기본 조립 대신 직접 주입하는 children
|
|
13
|
+
* @param {CctvCompanyCameraData} [props.selectedCam] 외부에서 직접 주입하는 선택 카메라 데이터
|
|
14
|
+
* @param {CctvCompanyCameraList[]} [props.camList] 외부에서 직접 주입하는 pagination 카메라 리스트
|
|
15
|
+
* @param {CctvVideoRenderOverlay} [props.renderOverlay] main video overlay를 교체하는 custom render 함수
|
|
16
|
+
* @example
|
|
17
|
+
* <CCTV.Viewer.Desktop.Container renderOverlay={({ isLive }) => <div>{String(isLive)}</div>} />
|
|
18
|
+
*/
|
|
10
19
|
export default function CCTVViewerDesktopContainer({
|
|
11
20
|
className,
|
|
12
21
|
children,
|
|
13
22
|
selectedCam,
|
|
14
23
|
camList,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
children?: React.ReactNode;
|
|
18
|
-
selectedCam?: CctvCompanyCameraData;
|
|
19
|
-
camList?: CctvCompanyCameraList[];
|
|
20
|
-
}) {
|
|
24
|
+
renderOverlay,
|
|
25
|
+
}: CctvViewerDesktopContainerProps) {
|
|
21
26
|
return (
|
|
22
27
|
<CCTVViewerContainer
|
|
23
28
|
className={clsx("cctv-viewer-desktop-container", className)}
|
|
@@ -30,6 +35,8 @@ export default function CCTVViewerDesktopContainer({
|
|
|
30
35
|
{...(typeof selectedCam !== "undefined"
|
|
31
36
|
? { cam: selectedCam }
|
|
32
37
|
: {})}
|
|
38
|
+
// 변경 설명: container에서 받은 seam을 main viewer video로 전달한다.
|
|
39
|
+
renderOverlay={renderOverlay}
|
|
33
40
|
/>
|
|
34
41
|
<CCTVViewerDesktopPagination
|
|
35
42
|
{...(typeof camList !== "undefined" ? { list: camList } : {})}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
|
|
5
5
|
import { useCctvContext, useCctvRtcStream } from "../../../hooks";
|
|
6
|
-
import type {
|
|
6
|
+
import type { CctvViewerDesktopVideoProps } from "../../../types";
|
|
7
7
|
import CCTVVideoTemplate from "../../video/Template";
|
|
8
8
|
import {
|
|
9
9
|
getOverlayMessage,
|
|
@@ -11,11 +11,19 @@ import {
|
|
|
11
11
|
getIsError,
|
|
12
12
|
} from "../../../utils/video-state";
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* CCTV; viewer desktop video
|
|
16
|
+
* @component
|
|
17
|
+
* @param {CctvViewerDesktopVideoProps} props
|
|
18
|
+
* @param {CctvCompanyCameraData} [props.cam] 외부에서 직접 주입하는 선택 카메라 데이터
|
|
19
|
+
* @param {CctvVideoRenderOverlay} [props.renderOverlay] main video overlay를 교체하는 custom render 함수
|
|
20
|
+
* @example
|
|
21
|
+
* <CCTV.Viewer.Desktop.Video renderOverlay={({ cam }) => <div>{cam?.cam_name}</div>} />
|
|
22
|
+
*/
|
|
14
23
|
export default function CCTVViewerDesktopVideo({
|
|
15
24
|
cam: propsCam,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}) {
|
|
25
|
+
renderOverlay,
|
|
26
|
+
}: CctvViewerDesktopVideoProps) {
|
|
19
27
|
const { selectedCam, isFetching } = useCctvContext();
|
|
20
28
|
|
|
21
29
|
// props의 cam이 들어오면 우선 적용
|
|
@@ -36,6 +44,7 @@ export default function CCTVViewerDesktopVideo({
|
|
|
36
44
|
return (
|
|
37
45
|
<CCTVVideoTemplate
|
|
38
46
|
ref={videoRef}
|
|
47
|
+
cam={cam}
|
|
39
48
|
className="cctv-viewer-desktop-video-container"
|
|
40
49
|
headerOptions={{
|
|
41
50
|
activeLiveState: true,
|
|
@@ -46,6 +55,8 @@ export default function CCTVViewerDesktopVideo({
|
|
|
46
55
|
title: cam?.cam_name,
|
|
47
56
|
}}
|
|
48
57
|
footerOptions={{ activeTitle: false }}
|
|
58
|
+
// 변경 설명: viewer video는 service custom overlay를 직접 수용하는 첫 public entry다.
|
|
59
|
+
renderOverlay={renderOverlay}
|
|
49
60
|
{...{ isError, overlayMessage, isLive }}
|
|
50
61
|
/>
|
|
51
62
|
);
|
package/src/cctv/types/props.ts
CHANGED
|
@@ -1,4 +1,47 @@
|
|
|
1
|
-
import type { CctvCompanyCameraData } from "./list";
|
|
1
|
+
import type { CctvCompanyCameraData, CctvCompanyCameraList } from "./list";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CCTV; custom overlay render context
|
|
5
|
+
* @property {CctvCompanyCameraData | undefined} [cam] 현재 overlay가 참조하는 카메라 데이터
|
|
6
|
+
* @property {CctvVideoOverlayHeaderProps | undefined} [headerOptions] 기본 헤더 표시 옵션
|
|
7
|
+
* @property {CctvVideoOverlayFooterProps | undefined} [footerOptions] 기본 푸터 표시 옵션
|
|
8
|
+
* @property {boolean | undefined} [isError] 영상 에러 상태 여부
|
|
9
|
+
* @property {boolean | undefined} [isLive] 영상 live 상태 여부
|
|
10
|
+
* @property {React.ReactNode} [overlayMessage] 기본 안내/에러 메시지 콘텐츠
|
|
11
|
+
*/
|
|
12
|
+
export interface CctvVideoRenderOverlayContext {
|
|
13
|
+
/**
|
|
14
|
+
* 현재 overlay가 참조하는 카메라 데이터
|
|
15
|
+
*/
|
|
16
|
+
cam?: CctvCompanyCameraData;
|
|
17
|
+
/**
|
|
18
|
+
* 기본 헤더 표시 옵션
|
|
19
|
+
*/
|
|
20
|
+
headerOptions?: CctvVideoOverlayHeaderProps;
|
|
21
|
+
/**
|
|
22
|
+
* 기본 푸터 표시 옵션
|
|
23
|
+
*/
|
|
24
|
+
footerOptions?: CctvVideoOverlayFooterProps;
|
|
25
|
+
/**
|
|
26
|
+
* 영상 에러 상태 여부
|
|
27
|
+
*/
|
|
28
|
+
isError?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* 영상 live 상태 여부
|
|
31
|
+
*/
|
|
32
|
+
isLive?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 기본 안내/에러 메시지 콘텐츠
|
|
35
|
+
*/
|
|
36
|
+
overlayMessage?: React.ReactNode;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* CCTV; custom overlay render 함수
|
|
41
|
+
*/
|
|
42
|
+
export type CctvVideoRenderOverlay = (
|
|
43
|
+
context: CctvVideoRenderOverlayContext,
|
|
44
|
+
) => React.ReactNode;
|
|
2
45
|
|
|
3
46
|
/**
|
|
4
47
|
* CCTV; <CctvVideoOverlayHeader /> props
|
|
@@ -96,8 +139,13 @@ export interface CctvVideoStateProps {
|
|
|
96
139
|
* @property {boolean} [isError] 에러 상태 여부
|
|
97
140
|
* @property {boolean} [isLive] 영상이 정상적으로 재생 중인지 여부
|
|
98
141
|
* @property {React.ReactNode} [overlayMessage] 에러/안내 메시지 콘텐츠
|
|
142
|
+
* @property {CctvVideoRenderOverlay} [renderOverlay] custom overlay 렌더 함수
|
|
99
143
|
*/
|
|
100
144
|
export interface CctvVideoTemplateProps extends CctvVideoStateProps {
|
|
145
|
+
/**
|
|
146
|
+
* 현재 overlay가 참조하는 카메라 데이터
|
|
147
|
+
*/
|
|
148
|
+
cam?: CctvCompanyCameraData;
|
|
101
149
|
className?: string;
|
|
102
150
|
/**
|
|
103
151
|
* <CCtvVideoOverlayHeader /> 속성
|
|
@@ -107,4 +155,102 @@ export interface CctvVideoTemplateProps extends CctvVideoStateProps {
|
|
|
107
155
|
* <CctvVideoOverlayFooter /> 속성
|
|
108
156
|
*/
|
|
109
157
|
footerOptions?: CctvVideoOverlayFooterProps;
|
|
158
|
+
/**
|
|
159
|
+
* custom overlay 렌더 함수
|
|
160
|
+
*/
|
|
161
|
+
renderOverlay?: CctvVideoRenderOverlay;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* CCTV; cam-list item props
|
|
166
|
+
* @property {string} [className] 루트 아이템 클래스
|
|
167
|
+
* @property {CctvVideoRenderOverlay} [renderOverlay] custom overlay 렌더 함수
|
|
168
|
+
* @property {boolean} selected 카메라 선택 상태
|
|
169
|
+
* @property {() => void} [onSelect] 카메라 선택 핸들러
|
|
170
|
+
* @property {string} cam_id 카메라 id코드
|
|
171
|
+
* @property {string} cam_name 카메라 별칭
|
|
172
|
+
* @property {boolean} cam_online 카메라 online 여부
|
|
173
|
+
* @property {string} [cam_rtc] 카메라 rtc 경로
|
|
174
|
+
* @property {string} [cam_rtcp] 카메라 rtcp 경로
|
|
175
|
+
* @property {boolean} [cam_shared] 카메라 외부공유 여부
|
|
176
|
+
* @property {string} [company_id] 소속 업체 id
|
|
177
|
+
* @property {string} [company_name] 소속 업체명
|
|
178
|
+
*/
|
|
179
|
+
export interface CctvCamListItemProps extends CctvCompanyCameraData {
|
|
180
|
+
/**
|
|
181
|
+
* 루트 아이템 클래스
|
|
182
|
+
*/
|
|
183
|
+
className?: string;
|
|
184
|
+
/**
|
|
185
|
+
* custom overlay 렌더 함수
|
|
186
|
+
*/
|
|
187
|
+
renderOverlay?: CctvVideoRenderOverlay;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* CCTV; cam-list container props
|
|
192
|
+
* @property {string} [className] 루트 컨테이너 클래스
|
|
193
|
+
* @property {CctvCompanyCameraList[]} [list] 외부 주입 카메라 리스트
|
|
194
|
+
* @property {CctvVideoRenderOverlay} [renderOverlay] custom overlay 렌더 함수
|
|
195
|
+
*/
|
|
196
|
+
export interface CctvCamListContainerProps {
|
|
197
|
+
/**
|
|
198
|
+
* 루트 컨테이너 클래스
|
|
199
|
+
*/
|
|
200
|
+
className?: string;
|
|
201
|
+
/**
|
|
202
|
+
* 외부 주입 카메라 리스트
|
|
203
|
+
*/
|
|
204
|
+
list?: CctvCompanyCameraList[];
|
|
205
|
+
/**
|
|
206
|
+
* custom overlay 렌더 함수
|
|
207
|
+
*/
|
|
208
|
+
renderOverlay?: CctvVideoRenderOverlay;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* CCTV; viewer desktop video props
|
|
213
|
+
* @property {CctvCompanyCameraData} [cam] 외부에서 직접 주입하는 카메라 데이터
|
|
214
|
+
* @property {CctvVideoRenderOverlay} [renderOverlay] custom overlay 렌더 함수
|
|
215
|
+
*/
|
|
216
|
+
export interface CctvViewerDesktopVideoProps {
|
|
217
|
+
/**
|
|
218
|
+
* 외부에서 직접 주입하는 카메라 데이터
|
|
219
|
+
*/
|
|
220
|
+
cam?: CctvCompanyCameraData;
|
|
221
|
+
/**
|
|
222
|
+
* custom overlay 렌더 함수
|
|
223
|
+
*/
|
|
224
|
+
renderOverlay?: CctvVideoRenderOverlay;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* CCTV; viewer desktop container props
|
|
229
|
+
* @property {string} [className] 루트 컨테이너 클래스
|
|
230
|
+
* @property {React.ReactNode} [children] 기본 video/pagination 대신 직접 주입할 children
|
|
231
|
+
* @property {CctvCompanyCameraData} [selectedCam] 외부에서 직접 주입하는 선택 카메라 데이터
|
|
232
|
+
* @property {CctvCompanyCameraData[]} [camList] 외부에서 직접 주입하는 카메라 리스트
|
|
233
|
+
* @property {CctvVideoRenderOverlay} [renderOverlay] viewer video용 custom overlay 렌더 함수
|
|
234
|
+
*/
|
|
235
|
+
export interface CctvViewerDesktopContainerProps {
|
|
236
|
+
/**
|
|
237
|
+
* 루트 컨테이너 클래스
|
|
238
|
+
*/
|
|
239
|
+
className?: string;
|
|
240
|
+
/**
|
|
241
|
+
* 기본 video/pagination 대신 직접 주입할 children
|
|
242
|
+
*/
|
|
243
|
+
children?: React.ReactNode;
|
|
244
|
+
/**
|
|
245
|
+
* 외부에서 직접 주입하는 선택 카메라 데이터
|
|
246
|
+
*/
|
|
247
|
+
selectedCam?: CctvCompanyCameraData;
|
|
248
|
+
/**
|
|
249
|
+
* 외부에서 직접 주입하는 카메라 리스트
|
|
250
|
+
*/
|
|
251
|
+
camList?: CctvCompanyCameraList[];
|
|
252
|
+
/**
|
|
253
|
+
* viewer video용 custom overlay 렌더 함수
|
|
254
|
+
*/
|
|
255
|
+
renderOverlay?: CctvVideoRenderOverlay;
|
|
110
256
|
}
|