import React, { useState, useRef, useEffect } from "react"; import styles from "./video.module.scss"; import { course } from "../../../api/index"; import { ArrowLeftOutlined } from "@ant-design/icons"; import { useSelector } from "react-redux"; declare const window: any; interface PropInterface { id: number; cid: number; title: string; open: boolean; isLastpage: boolean; lastSeeDuration: number; progress: number; onCancel: () => void; goNextVideo: () => void; } export const VideoModel: React.FC = ({ id, cid, title, open, isLastpage, lastSeeDuration, progress, onCancel, goNextVideo, }) => { const systemConfig = useSelector((state: any) => state.systemConfig.value); const user = useSelector((state: any) => state.loginUser.value.user); const [playUrl, setPlayUrl] = useState(""); const [playDuration, setPlayDuration] = useState(0); const [playendedStatus, setPlayendedStatus] = useState(false); const [lastSeeValue, setLastSeeValue] = useState({}); const [loading, setLoading] = useState(false); const myRef = useRef(0); useEffect(() => { let params = null; if (open) { if (lastSeeDuration > 0 && progress < 100) { params = { time: 5, pos: lastSeeDuration, }; setLastSeeValue(params); } setPlayendedStatus(false); getVideoUrl(params); } }, [open, id, cid, lastSeeDuration]); useEffect(() => { myRef.current = playDuration; }, [playDuration]); const getVideoUrl = (params: any) => { course.playUrl(cid, id).then((res: any) => { setPlayUrl(res.data.url); initDPlayer(res.data.url, 0, params); }); }; const initDPlayer = (playUrl: string, isTrySee: number, params: any) => { window.player = new window.DPlayer({ container: document.getElementById("meedu-player-container"), autoplay: false, video: { url: playUrl, pic: systemConfig.playerPoster, }, try: isTrySee === 1, bulletSecret: { enabled: systemConfig.playerIsEnabledBulletSecret, text: systemConfig.playerBulletSecretText .replace("{name}", user.name) .replace("{email}", user.email) .replace("{idCard}", user.id_card), size: "14px", color: systemConfig.playerBulletSecretColor || "red", opacity: Number(systemConfig.playerBulletSecretOpacity), }, ban_drag: false, last_see_pos: params, }); // 监听播放进度更新evt window.player.on("timeupdate", () => { playTimeUpdate(parseInt(window.player.video.currentTime), false); }); window.player.on("ended", () => { setPlayendedStatus(true); playTimeUpdate(parseInt(window.player.video.currentTime), true); window.player && window.player.destroy(); }); setLoading(false); }; const playTimeUpdate = (duration: number, isEnd: boolean) => { if (duration - myRef.current >= 10 || isEnd === true) { setPlayDuration(duration); course.record(cid, id, duration).then((res: any) => {}); course.playPing(cid, id).then((res: any) => {}); } }; return ( <> {open && (
{ window.player && window.player.destroy(); onCancel(); }} > 返回
{title}
{playendedStatus && (
{isLastpage && (
{ window.player && window.player.destroy(); onCancel(); }} > 恭喜你学完最后一节
)} {!isLastpage && (
{ if (loading) { return; } setLoading(true); setLastSeeValue({}); setPlayendedStatus(false); goNextVideo(); }} > 播放下一节
)}
)}
)} ); };