import React, { useState, useEffect, useContext, useRef, memo } from 'react'; import {Link} from 'react-router-dom'; import {Pagination, Input, Button} from 'antd' import { getUrl2, isDev, 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 CRoundSelect from '../common/CRoundSelect' import ClipboardJS from 'clipboard' 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 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() 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.file_url, cover_url: item.cover_url } videoModalObj.setVisible(true) } // TODO use封装 function onSortChange(key, index) { const _item = _items[index] _items.splice(index, 1) _items.unshift(_item) setSortKey(key) } function getCopyText (file_url, cover_url) { return `` } const _inputValue = getCopyText(videoId.file_url, videoId.cover_url); const sorts = sortKey.split('-') return (