You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/public/react/src/modules/courses/Video/LiveNew.js

307 lines
8.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React,{ Component } from "react";
import { Modal , Form , Input , Spin , Select , AutoComplete , DatePicker , InputNumber } from 'antd';
import locale from 'antd/lib/date-picker/locale/zh_CN';
import moment from 'moment';
import { handleDateString } from 'educoder';
import './video.css';
import axios from 'axios';
const { TextArea } = Input;
const { Option } = Select;
const array=['腾讯课堂','斗鱼直播','Bilibili','威佰通','zoom'];
function range(start, end) {
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
}
function disabledDateTime() {
return {
disabledMinutes: () => range(1, 30).concat(range(31, 60)),
};
}
function disabledDate(current) {
return current && current < moment().endOf('day').subtract(1, 'days');
}
class LiveNew extends Component{
constructor(props){
super(props);
this.state={
isSpining:false,
beginTime:undefined,
wei_flag:undefined
}
}
componentDidMount=()=>{
this.checkType();
}
componentDidUpdate=(prevState)=>{
if(prevState && prevState.liveId !== this.props.liveId){
this.setState({
isSpining:true
})
this.checkType();
}
}
checkType=()=>{
const { liveId } = this.props;
this.clearAll();
if(liveId){
const url =`/live_links/${liveId}/edit.json`;
axios.get(url).then(result=>{
if(result){
this.props.form.setFieldsValue({
url:result.data.url,
description:result.data.description,
platform:result.data.platform || "腾讯课堂",
duration:result.data.duration,
course_name:result.data.course_name
})
this.setState({
beginTime:result.data.live_time && moment(result.data.live_time,"YYYY-MM-DD HH:mm"),
wei_flag:result.data.platform && (result.data.platform === "威佰通"||result.data.platform === "zoom")
})
}
})
}
this.setState({
isSpining:false
})
}
handleSubmit=()=>{
this.props.form.validateFields((err, values) => {
if(!err){
this.setState({
isSpining:true
})
const { liveId } = this.props;
if(liveId){
// 修改
this.updateFunc(liveId,values);
}else{
this.creatFunc(values);
}
}
})
}
// 修改
updateFunc=(id,values)=>{
const url = `/live_links/${id}.json`;
const { beginTime } = this.state;
axios.put(url,{
...values,
live_time:beginTime
}).then(result=>{
if(result){
this.props.showNotification("修改成功!");
const { setliveVisibel } = this.props;
setliveVisibel && setliveVisibel(false,true);
}
this.setState({
isSpining:false
})
}).catch(error=>{
this.setState({
isSpining:false
})
console.log(error);
})
}
// 新增
creatFunc=(values)=>{
const CourseId=this.props.match.params.coursesId;
const url = `/courses/${CourseId}/live_links.json`;
const { beginTime } = this.state;
axios.post(url,{
...values,
live_time:beginTime
}).then(result=>{
if(result){
this.props.showNotification("添加成功!");
const { setliveVisibel } = this.props;
setliveVisibel && setliveVisibel(false,true);
}
this.setState({
isSpining:false
})
}).catch(error=>{
this.setState({
isSpining:false
})
console.log(error);
})
}
validateDesc= (rule, value, callback) => {
if(!value){
callback();
}
if (value.length > 100) {
callback("直播说明不能超过100个字");
}else{
callback();
}
}
cancelNew=()=>{
const { setliveVisibel } = this.props;
this.clearAll();
setliveVisibel && setliveVisibel(false);
}
clearAll=()=>{
this.props.form.setFieldsValue({
course_name:undefined,
platform:"腾讯课堂",
url:undefined,
description:undefined,
duration:undefined
})
this.setState({
beginTime:undefined,
wei_flag:false
})
}
onChangeTime=(data,dateString)=>{
this.setState({
beginTime:handleDateString(dateString)
})
}
ChangePlatform=(e)=>{
if(e === "威佰通"||e==="zoom"){
this.setState({
wei_flag:true
})
}else{
this.setState({
wei_flag:false
})
}
}
render(){
const { isSpining , beginTime , wei_flag } = this.state;
const {getFieldDecorator} = this.props.form;
const { visible } = this.props;
const dataSource = array.map((item,key)=>{
return(
<Option value={item}>{item}</Option>
)
})
return(
<Modal
visible={visible}
width="560px"
title={'添加直播'}
footer={null}
closable={false}
className="liveModal"
>
<Spin spinning={isSpining}>
<style>
{`
.ant-select-dropdown-menu-item{
text-align:center;
padding: 10px 0px;
border-bottom: 1px solid #eee;
}
.ant-select-dropdown-menu-item:last-child{
border-bottom:none;
}
`
}
</style>
<div className="task-popup-content">
<Form onSubmit={this.handleSubmit}>
<Form.Item label={`直播课程`}>
{getFieldDecorator('course_name', {
rules: [{required: true, message: "请输入课程名称"}],
})(
<Input placeholder="请输入课程名称" />
)}
</Form.Item>
<Form.Item label={`直播平台`}>
{getFieldDecorator('platform', {
rules: [{required: true, message: "请选择直播平台"}],
})(
<AutoComplete
placeholder="请选择或输入直播平台名称"
onChange={this.ChangePlatform}
dataSource={dataSource}
className="plateAutoComplete"
>
</AutoComplete>
)}
</Form.Item>
<Form.Item label={wei_flag?`会议号`:`直播链接`}>
{getFieldDecorator('url', {
rules: [],
})(
<Input placeholder={wei_flag?`请输入会议号`:"请输入第三方直播链接,如:腾讯课堂播放链接等。"} />
)}
</Form.Item>
<div className="flex-bottom">
<div className="flex1">
<p className="ant-col ant-form-item-label color-grey-3 font-16 setStyle">开播时间</p>
<DatePicker
dropdownClassName="hideDisable"
className="timeStyle mb20"
placeholder="如2020/02/02 12:00"
style={{width:"220px"}}
showTime={{ format: 'HH:mm' }}
locale={locale}
format="YYYY-MM-DD HH:mm"
showToday={false}
disabledTime={disabledDateTime}
disabledDate={disabledDate}
value={beginTime && moment(beginTime,"YYYY-MM-DD HH:mm")}
onChange={this.onChangeTime}
></DatePicker>
</div>
<Form.Item label={`直播预计时长`}>
{getFieldDecorator('duration', {
rules: [],
})(
<InputNumber placeholder="请输入直播时长" style={{width:"220px"}}/>
)}
</Form.Item>
<span className="mb20 ml5">分钟</span>
</div>
<Form.Item label={`直播说明`}>
{getFieldDecorator('description', {
rules: [{
validator: this.validateDesc,
}],
})(
<TextArea rows={4} placeholder="可在此介绍开播具体事项,如开播时间安排等。" />
)}
</Form.Item>
</Form>
<div className="clearfix mt30 edu-txt-center">
<a onClick={this.cancelNew} className="task-btn mr30">取消</a>
<a type="submit" onClick={this.handleSubmit} className="task-btn task-btn-orange">确定</a>
</div>
</div>
</Spin>
</Modal>
)
}
}
const WrappedLiveNew = Form.create({name: 'LiveNew'})(LiveNew);
export default WrappedLiveNew;