diff --git a/admin-frontend/src/App.tsx b/admin-frontend/src/App.tsx index e58b82e..04f7c28 100644 --- a/admin-frontend/src/App.tsx +++ b/admin-frontend/src/App.tsx @@ -20,6 +20,7 @@ import UserTaggedPhotos from './pages/UserTaggedPhotos' import ManagePhotos from './pages/ManagePhotos' import Settings from './pages/Settings' import Help from './pages/Help' +import VideoPlayer from './pages/VideoPlayer' import Layout from './components/Layout' import PasswordChangeModal from './components/PasswordChangeModal' import AdminRoute from './components/AdminRoute' @@ -93,6 +94,14 @@ function AppRoutes() { return ( } /> + + + + } + /> { const isVideo = mediaType === 'video' - let photoUrl: string if (isVideo) { - // Use video endpoint for videos - photoUrl = `${apiClient.defaults.baseURL}/api/v1/videos/${photoId}/video` + // Open video in VideoPlayer page with Play button + const videoPlayerUrl = `/video/${photoId}` + window.open(videoPlayerUrl, '_blank') } else { // Use image endpoint for images - photoUrl = `${apiClient.defaults.baseURL}/api/v1/photos/${photoId}/image` + const photoUrl = `${apiClient.defaults.baseURL}/api/v1/photos/${photoId}/image` + window.open(photoUrl, '_blank') } - window.open(photoUrl, '_blank') } const openFolder = async (photoId: number) => { diff --git a/admin-frontend/src/pages/VideoPlayer.tsx b/admin-frontend/src/pages/VideoPlayer.tsx new file mode 100644 index 0000000..feb9da2 --- /dev/null +++ b/admin-frontend/src/pages/VideoPlayer.tsx @@ -0,0 +1,108 @@ +import { useState, useRef, useEffect } from 'react' +import { useParams } from 'react-router-dom' +import videosApi from '../api/videos' + +export default function VideoPlayer() { + const { id } = useParams<{ id: string }>() + const videoId = id ? parseInt(id, 10) : null + const videoRef = useRef(null) + const [isPlaying, setIsPlaying] = useState(false) + const [showPlayButton, setShowPlayButton] = useState(true) + + const videoUrl = videoId ? videosApi.getVideoUrl(videoId) : '' + + const handlePlay = () => { + if (videoRef.current) { + videoRef.current.play() + setIsPlaying(true) + setShowPlayButton(false) + } + } + + const handlePause = () => { + setIsPlaying(false) + setShowPlayButton(true) + } + + const handlePlayClick = () => { + handlePlay() + } + + // Hide play button when video starts playing + useEffect(() => { + const video = videoRef.current + if (!video) return + + const handlePlayEvent = () => { + setIsPlaying(true) + setShowPlayButton(false) + } + + const handlePauseEvent = () => { + setIsPlaying(false) + setShowPlayButton(true) + } + + const handleEnded = () => { + setIsPlaying(false) + setShowPlayButton(true) + } + + video.addEventListener('play', handlePlayEvent) + video.addEventListener('pause', handlePauseEvent) + video.addEventListener('ended', handleEnded) + + return () => { + video.removeEventListener('play', handlePlayEvent) + video.removeEventListener('pause', handlePauseEvent) + video.removeEventListener('ended', handleEnded) + } + }, []) + + if (!videoId || !videoUrl) { + return ( +
+
Video not found
+
+ ) + } + + return ( +
+
+
+ ) +} +