|
|
@@ -1,7 +1,7 @@
|
|
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
import classNames from 'classnames';
|
|
|
import LivePlayer from './index';
|
|
|
-import { Radio } from 'antd';
|
|
|
+import { Radio, Dropdown, Menu, Popover, Input, Button, Empty, Tooltip } from 'antd';
|
|
|
import { useFullscreen } from 'ahooks';
|
|
|
import './index.less';
|
|
|
import {
|
|
|
@@ -9,9 +9,12 @@ import {
|
|
|
CaretLeftOutlined,
|
|
|
CaretRightOutlined,
|
|
|
CaretUpOutlined,
|
|
|
+ DeleteOutlined,
|
|
|
MinusOutlined,
|
|
|
PlusOutlined,
|
|
|
+ QuestionCircleOutlined,
|
|
|
} from '@ant-design/icons';
|
|
|
+import Service from './service';
|
|
|
|
|
|
type Player = {
|
|
|
id?: string;
|
|
|
@@ -37,10 +40,18 @@ interface ScreenProps {
|
|
|
showScreen?: boolean;
|
|
|
}
|
|
|
|
|
|
+const service = new Service();
|
|
|
+
|
|
|
+const DEFAULT_SAVE_CODE = 'screen_save';
|
|
|
+
|
|
|
export default (props: ScreenProps) => {
|
|
|
const [screen, setScreen] = useState(1);
|
|
|
const [players, setPlayers] = useState<Player[]>([]);
|
|
|
const [playerActive, setPlayerActive] = useState(0);
|
|
|
+ const [historyList, setHistoryList] = useState<any>([]);
|
|
|
+ const [historyTitle, setHistoryTitle] = useState('');
|
|
|
+ const [visible, setVisible] = useState(false);
|
|
|
+
|
|
|
const fullscreenRef = useRef(null);
|
|
|
const [isFullscreen, { setFull }] = useFullscreen(fullscreenRef);
|
|
|
|
|
|
@@ -62,6 +73,42 @@ export default (props: ScreenProps) => {
|
|
|
[players, playerActive, screen],
|
|
|
);
|
|
|
|
|
|
+ const handleHistory = (item: any) => {
|
|
|
+ const log = JSON.parse(item.content || '{}');
|
|
|
+ setScreen(log.screen);
|
|
|
+ setPlayers(log.players);
|
|
|
+ };
|
|
|
+
|
|
|
+ const getHistory = async () => {
|
|
|
+ const resp = await service.history.query(DEFAULT_SAVE_CODE);
|
|
|
+ if (resp.status === 200) {
|
|
|
+ setHistoryList(resp.result);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const deleteHistory = async (id: string) => {
|
|
|
+ const resp = await service.history.remove(DEFAULT_SAVE_CODE, id);
|
|
|
+ if (resp.status === 200) {
|
|
|
+ getHistory();
|
|
|
+ setVisible(false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const saveHistory = useCallback(async () => {
|
|
|
+ const param = {
|
|
|
+ name: historyTitle,
|
|
|
+ content: JSON.stringify({
|
|
|
+ screen: screen,
|
|
|
+ players: players,
|
|
|
+ }),
|
|
|
+ };
|
|
|
+ const resp = await service.history.save(DEFAULT_SAVE_CODE, param);
|
|
|
+ if (resp.status === 200) {
|
|
|
+ setVisible(false);
|
|
|
+ getHistory();
|
|
|
+ }
|
|
|
+ }, [players, historyTitle, screen]);
|
|
|
+
|
|
|
useEffect(() => {
|
|
|
const arr = new Array(screen).fill(1).map(() => ({ id: '', url: '' }));
|
|
|
setPlayers(arr);
|
|
|
@@ -75,32 +122,114 @@ export default (props: ScreenProps) => {
|
|
|
}
|
|
|
}, [props.url]);
|
|
|
|
|
|
+ useEffect(() => {
|
|
|
+ if (props.showScreen !== false) {
|
|
|
+ getHistory();
|
|
|
+ }
|
|
|
+ }, []);
|
|
|
+
|
|
|
const screenClass = `screen-${screen}`;
|
|
|
|
|
|
+ const DropdownMenu = (
|
|
|
+ <Menu>
|
|
|
+ {historyList.length ? (
|
|
|
+ historyList.map((item: any) => {
|
|
|
+ return (
|
|
|
+ <Menu.Item
|
|
|
+ key={item.id}
|
|
|
+ onClick={() => {
|
|
|
+ handleHistory(item);
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {item.name}
|
|
|
+ <DeleteOutlined
|
|
|
+ onClick={() => {
|
|
|
+ deleteHistory(item.id);
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Menu.Item>
|
|
|
+ );
|
|
|
+ })
|
|
|
+ ) : (
|
|
|
+ <Empty />
|
|
|
+ )}
|
|
|
+ </Menu>
|
|
|
+ );
|
|
|
+
|
|
|
return (
|
|
|
<div className={'live-player-warp'}>
|
|
|
<div className={'live-player-content'}>
|
|
|
<div className={'player-screen-tool'}>
|
|
|
{props.showScreen !== false && (
|
|
|
- <Radio.Group
|
|
|
- options={[
|
|
|
- { label: '单屏', value: 1 },
|
|
|
- { label: '四分屏', value: 4 },
|
|
|
- { label: '九分屏', value: 9 },
|
|
|
- { label: '全屏', value: 0 },
|
|
|
- ]}
|
|
|
- value={screen}
|
|
|
- onChange={(e) => {
|
|
|
- if (e.target.value) {
|
|
|
- setScreen(e.target.value);
|
|
|
- } else {
|
|
|
- // 全屏操作
|
|
|
- setFull();
|
|
|
- }
|
|
|
- }}
|
|
|
- optionType={'button'}
|
|
|
- buttonStyle={'solid'}
|
|
|
- />
|
|
|
+ <>
|
|
|
+ <div></div>
|
|
|
+ <div>
|
|
|
+ <Radio.Group
|
|
|
+ options={[
|
|
|
+ { label: '单屏', value: 1 },
|
|
|
+ { label: '四分屏', value: 4 },
|
|
|
+ { label: '九分屏', value: 9 },
|
|
|
+ { label: '全屏', value: 0 },
|
|
|
+ ]}
|
|
|
+ value={screen}
|
|
|
+ onChange={(e) => {
|
|
|
+ if (e.target.value) {
|
|
|
+ setScreen(e.target.value);
|
|
|
+ } else {
|
|
|
+ // 全屏操作
|
|
|
+ setFull();
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ optionType={'button'}
|
|
|
+ buttonStyle={'solid'}
|
|
|
+ />
|
|
|
+ {/*<Tooltip*/}
|
|
|
+ {/* title={''}*/}
|
|
|
+ {/*>*/}
|
|
|
+ {/* <QuestionCircleOutlined />*/}
|
|
|
+ {/*</Tooltip>*/}
|
|
|
+ </div>
|
|
|
+ <div className={'screen-tool-save'}>
|
|
|
+ <Popover
|
|
|
+ content={
|
|
|
+ <div style={{ width: 300 }}>
|
|
|
+ <Input.TextArea
|
|
|
+ rows={3}
|
|
|
+ onChange={(e) => {
|
|
|
+ setHistoryTitle(e.target.value);
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <Button
|
|
|
+ type={'primary'}
|
|
|
+ onClick={saveHistory}
|
|
|
+ style={{ width: '100%', marginTop: 16 }}
|
|
|
+ >
|
|
|
+ 保存
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+ title="分屏名称"
|
|
|
+ trigger="click"
|
|
|
+ visible={visible}
|
|
|
+ onVisibleChange={(v) => {
|
|
|
+ setVisible(v);
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Dropdown.Button
|
|
|
+ type={'primary'}
|
|
|
+ overlay={DropdownMenu}
|
|
|
+ onClick={() => {
|
|
|
+ setVisible(true);
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 保存
|
|
|
+ </Dropdown.Button>
|
|
|
+ </Popover>
|
|
|
+ <Tooltip title={'可保存分屏配置记录'}>
|
|
|
+ <QuestionCircleOutlined style={{ marginLeft: 8 }} />
|
|
|
+ </Tooltip>
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
)}
|
|
|
</div>
|
|
|
<div className={'player-body'}>
|