import React, { useState, useEffect, useContext, useRef, memo } from 'react'; import { Pagination, Input, Button } from 'antd' import { ThemeContext, ActionBtn, NoneData } from 'educoder' import axios from 'axios' import VideoInReviewItem from './VideoInReviewItem' import EditVideoModal from './EditVideoModal' import './InfosVideo.css' import InfoTab from '../common/InfoTab' import HeadlessModal from '../common/HeadlessModal' import ClipboardJS from 'clipboard' import VideoPlay from '../../../courses/Video/video-play'; import { logWatchHistory } from '../../../../services/video-service'; function useModal(initValue) { const [visible, setVisible] = useState(initValue) return { visible, setVisible } } function useCategory(initValue) { const [category, setCategory] = useState(initValue) function changeCategory(key) { setCategory(key) } return { category, changeCategory } } function usePagination() { const [page, setPage] = useState(1) function onPageChange(page) { setPage(page) } return { current: page, onChange: onPageChange } } const PAGE_SIZE = 16 const DEFAULT_VIDEO_WIDTH_IN_MD = "90%" // 400 const DEFAULT_VIDEO_HEIGHT_IN_MD = "55%" // 400 let videoId = {}; let _clipboard = null; const _items = [ { key: 'published_at-desc', name: '最新上传' }, { key: 'published_at-asc', name: '最早上传' }, ] function InfoVideo(props) { const [videos, setvideos] = useState(undefined) const [reviewvideos, setReviewvideos] = useState(undefined) const [count, setCount] = useState(0) const [loading, setLoading] = useState(true) const [sortKey, setSortKey] = useState(_items[0].key) const editModalObj = useModal(false) const videoModalObj = useModal(false) const categoryObj = useCategory('all') const pageObj = usePagination() const theme = useContext(ThemeContext); const editModalEl = useRef(null); const videoEl = useRef(null); const { showNotification, history } = props; const username = props.match.params.username; const { user } = props; function toUpload() { if (props.current_user.admin || (props.current_user.is_teacher && props.checkIfProfessionalCertification())) { history.push(`/users/${username}/videos/upload`) } else { props.showProfessionalCertificationDialog() } } function fetchvideos() { const fetchUrl = `/users/${username}/videos.json` const sorts = sortKey.split('-') setLoading(true) axios.get(fetchUrl, { params: { page: pageObj.current, per_page: PAGE_SIZE, sort_by: sorts[0], sort_direction: sorts[1], // } }).then((response) => { setLoading(false) if (response.data.videos) { setvideos(response.data.videos) setCount(response.data.count) } }).catch(() => { setLoading(false) }) } function fetchReviewvideos() { const fetchUrl = `/users/${username}/videos/review.json` const sorts = sortKey.split('-') setLoading(true) axios.get(fetchUrl, { params: { page: pageObj.current, per_page: PAGE_SIZE, sort_by: sorts[0], sort_direction: sorts[1], } }) .then((response) => { setLoading(false) if (response.data.videos) { setReviewvideos(response.data.videos) setCount(response.data.count) } }).catch(() => { }) } useEffect(() => { if (pageObj.current == 1) { if (categoryObj.category == 'all') { fetchvideos() } else { fetchReviewvideos() } } else { pageObj.onChange(1) } }, [categoryObj.category]) useEffect(() => { if (categoryObj.category == 'all') { fetchvideos() } else { fetchReviewvideos() } }, [pageObj.current, sortKey]) useEffect(() => { if (videoModalObj.visible == false) { // 关闭视频 videoEl.current && videoEl.current.pause(); videoId = {}; if (_clipboard) { _clipboard.destroy(); _clipboard = null; } } else { videoEl.current && videoEl.current.play() setTimeout(() => { if (!_clipboard) { _clipboard = new ClipboardJS('.copybtn'); _clipboard.on('success', (e) => { showNotification('复制成功') }); } }, 200) } }, [videoModalObj.visible]) useEffect(() => { }, []) function editSuccess() { fetchvideos() } function onEditVideo(item) { videoId = { videoId: item.id, title: item.title } editModalObj.setVisible(true) // editModalEl.current.toList(true, video); // this.refs['editVideoModal'].setVisible(true, video); } function onMaskClick(item) { videoId = { videoId: item.id, title: item.title, file_url: item.play_url || item.file_url, cover_url: item.cover_url } videoModalObj.setVisible(true) } // TODO use封装 function onSortChange(key, index) { try { const _item = _items[index]; _items.splice(index, 1); _items.unshift(_item); const keys = key.split('-'); const sorts = sortKey.split('-'); if (key === "published_at-desc") { if (keys[1] === sorts[1]) { setSortKey("published_at-asc") } else { setSortKey(key) } } else if (key === "published_at-asc") { if (keys[1] === sorts[1]) { setSortKey("published_at-desc") } else { setSortKey(key) } } } catch (e) { } } function deleteVideo(item) { props.confirm({ content: '该视频将被删除,不可恢复', subContent: '是否确认删除?', onOk: () => { const url = `/users/${user && user.login}/videos/${item.id}.json`; axios.delete(url).then(result => { if (result) { props.showNotification(`视频删除成功!`); if (pageObj.current === 1) { if (categoryObj.category === 'all') { fetchvideos() } else { fetchReviewvideos() } } else { pageObj.onChange(1) } } }).catch(error => { console.log(error); }) }, onCancel() { console.log('Cancel'); }, }); } function getCopyText(file_url, cover_url) { return `` } const _inputValue = getCopyText(videoId.file_url, videoId.cover_url); const sorts = sortKey.split('-') return (
{videoModalObj.visible && }
复制视频地址
{ toUpload() }} className="toUploadBtn" > 上传视频 } >
{count} 个视频 {/*{categoryObj.category == 'all' && }*/} {categoryObj.category == 'all' &&
  • {"最新上传"} onSortChange("published_at-asc", 0)}> onSortChange("published_at-desc", 0)}>
  • }
    {categoryObj.category == 'all' ?
    { videos == undefined ? '' : videos.length ? videos.map((item, index) => { return ( ) }) : }
    :
    { reviewvideos == undefined ? '' : reviewvideos.length ? reviewvideos.map((item, index) => { return ( ) }) : }
    } {/* categoryObj.category == 'all' && */} { count > PAGE_SIZE &&
    }
    ) } export default InfoVideo /** */