From 3173e6b417c18d9c83064d02f9cecc7121410aef Mon Sep 17 00:00:00 2001 From: swve Date: Tue, 22 Apr 2025 15:53:02 +0200 Subject: [PATCH] refactor: change video activity modal UI --- .../Objects/Activities/Video/Video.tsx | 41 +++- .../Modals/Activities/Create/NewActivity.tsx | 8 +- ...gnment.tsx => AssignmentActivityModal.tsx} | 0 ...umentPdf.tsx => DocumentActivityModal.tsx} | 0 ...amicCanva.tsx => DynamicActivityModal.tsx} | 0 .../Create/NewActivityModal/Video.tsx | 199 ------------------ .../NewActivityModal/VideoActivityModal.tsx | 187 ++++++++++++++++ 7 files changed, 221 insertions(+), 214 deletions(-) rename apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/{Assignment.tsx => AssignmentActivityModal.tsx} (100%) rename apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/{DocumentPdf.tsx => DocumentActivityModal.tsx} (100%) rename apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/{DynamicCanva.tsx => DynamicActivityModal.tsx} (100%) delete mode 100644 apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx create mode 100644 apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/VideoActivityModal.tsx diff --git a/apps/web/components/Objects/Activities/Video/Video.tsx b/apps/web/components/Objects/Activities/Video/Video.tsx index 2ba6b15c..cf09ca56 100644 --- a/apps/web/components/Objects/Activities/Video/Video.tsx +++ b/apps/web/components/Objects/Activities/Video/Video.tsx @@ -3,17 +3,42 @@ import YouTube from 'react-youtube' import { getActivityMediaDirectory } from '@services/media/media' import { useOrg } from '@components/Contexts/OrgContext' -function VideoActivity({ activity, course }: { activity: any; course: any }) { +interface VideoActivityProps { + activity: { + activity_sub_type: string + activity_uuid: string + content: { + filename?: string + uri?: string + } + } + course: { + course_uuid: string + } +} + +function VideoActivity({ activity, course }: VideoActivityProps) { const org = useOrg() as any const [videoId, setVideoId] = React.useState('') React.useEffect(() => { - if (activity && activity.content && activity.content.uri) { - var getYouTubeID = require('get-youtube-id'); + if (activity?.content?.uri) { + var getYouTubeID = require('get-youtube-id') setVideoId(getYouTubeID(activity.content.uri)) } }, [activity, org]) + const getVideoSrc = () => { + if (!activity.content?.filename) return '' + return getActivityMediaDirectory( + org?.org_uuid, + course?.course_uuid, + activity.activity_uuid, + activity.content.filename, + 'video' + ) + } + return (
{activity && ( @@ -24,13 +49,7 @@ function VideoActivity({ activity, course }: { activity: any; course: any }) {
@@ -44,7 +63,7 @@ function VideoActivity({ activity, course }: { activity: any; course: any }) { width: '100%', height: '100%', playerVars: { - autoplay: 0, + autoplay: 0 }, }} videoId={videoId} diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivity.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivity.tsx index ff851a06..9dac7af1 100644 --- a/apps/web/components/Objects/Modals/Activities/Create/NewActivity.tsx +++ b/apps/web/components/Objects/Modals/Activities/Create/NewActivity.tsx @@ -4,11 +4,11 @@ import VideoPageActivityImage from 'public//activities_types/video-page-activity import DocumentPdfPageActivityImage from 'public//activities_types/documentpdf-page-activity.png' import AssignmentActivityImage from 'public//activities_types/assignment-page-activity.png' -import DynamicCanvaModal from './NewActivityModal/DynamicCanva' -import VideoModal from './NewActivityModal/Video' +import DynamicCanvaModal from './NewActivityModal/DynamicActivityModal' +import VideoModal from './NewActivityModal/VideoActivityModal' import Image from 'next/image' -import DocumentPdfModal from './NewActivityModal/DocumentPdf' -import Assignment from './NewActivityModal/Assignment' +import DocumentPdfModal from './NewActivityModal/DocumentActivityModal' +import Assignment from './NewActivityModal/AssignmentActivityModal' function NewActivityModal({ closeModal, diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/AssignmentActivityModal.tsx similarity index 100% rename from apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Assignment.tsx rename to apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/AssignmentActivityModal.tsx diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentPdf.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentActivityModal.tsx similarity index 100% rename from apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentPdf.tsx rename to apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DocumentActivityModal.tsx diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DynamicCanva.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DynamicActivityModal.tsx similarity index 100% rename from apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DynamicCanva.tsx rename to apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/DynamicActivityModal.tsx diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx deleted file mode 100644 index 3cc61bd1..00000000 --- a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/Video.tsx +++ /dev/null @@ -1,199 +0,0 @@ -import FormLayout, { - ButtonBlack, - Flex, - FormField, - FormLabel, - FormMessage, - Input, -} from '@components/Objects/StyledElements/Form/Form' -import React, { useState } from 'react' -import * as Form from '@radix-ui/react-form' -import BarLoader from 'react-spinners/BarLoader' -import { Youtube } from 'lucide-react' -import { constructAcceptValue } from '@/lib/constants'; - -const SUPPORTED_FILES = constructAcceptValue(['mp4', 'webm']) - -interface ExternalVideoObject { - name: string - type: string - uri: string - chapter_id: string -} - -function VideoModal({ - submitFileActivity, - submitExternalVideo, - chapterId, - course, -}: any) { - const [video, setVideo] = React.useState(null) as any - const [isSubmitting, setIsSubmitting] = useState(false) - const [name, setName] = React.useState('') - const [youtubeUrl, setYoutubeUrl] = React.useState('') - const [selectedView, setSelectedView] = React.useState('file') as any - - const handleVideoChange = (event: React.ChangeEvent) => { - setVideo(event.target.files[0]) - } - - const handleNameChange = (event: React.ChangeEvent) => { - setName(event.target.value) - } - - const handleYoutubeUrlChange = ( - event: React.ChangeEvent - ) => { - setYoutubeUrl(event.target.value) - } - - const handleSubmit = async (e: any) => { - e.preventDefault() - setIsSubmitting(true) - - if (selectedView === 'file') { - let status = await submitFileActivity( - video, - 'video', - { - name: name, - chapter_id: chapterId, - activity_type: 'TYPE_VIDEO', - activity_sub_type: 'SUBTYPE_VIDEO_HOSTED', - published_version: 1, - version: 1, - course_id: course.id, - }, - chapterId - ) - - setIsSubmitting(false) - } - if (selectedView === 'youtube') { - let external_video_object: ExternalVideoObject = { - name, - type: 'youtube', - uri: youtubeUrl, - chapter_id: chapterId, - } - - let status = await submitExternalVideo( - external_video_object, - 'activity', - chapterId - ) - setIsSubmitting(false) - } - } - - /* TODO : implement some sort of progress bar for file uploads, it is not possible yet because i'm not using axios. - and the actual upload isn't happening here anyway, it's in the submitFileActivity function */ - - return ( - - - - Video name - - Please provide a name for your video activity - - - - - - -
-
-
-
{ - setSelectedView('file') - }} - className="rounded-full bg-slate-900 text-zinc-50 py-2 px-4 text-sm drop-shadow-md hover:cursor-pointer hover:bg-slate-700 " - > - Video upload -
-
{ - setSelectedView('youtube') - }} - className="rounded-full bg-slate-900 text-zinc-50 py-2 px-4 text-sm drop-shadow-md hover:cursor-pointer hover:bg-slate-700" - > - YouTube Video -
-
- {selectedView === 'file' && ( -
- - - Video file - - Please provide a video for your activity - - - - - - -
- )} - {selectedView === 'youtube' && ( -
- - - - - YouTube URL - - - Please provide a video for your activity - - - - - - -
- )} -
-
- - - - - {isSubmitting ? ( - - ) : ( - 'Create activity' - )} - - - -
- ) -} - -export default VideoModal diff --git a/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/VideoActivityModal.tsx b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/VideoActivityModal.tsx new file mode 100644 index 00000000..38e7e7f7 --- /dev/null +++ b/apps/web/components/Objects/Modals/Activities/Create/NewActivityModal/VideoActivityModal.tsx @@ -0,0 +1,187 @@ +import FormLayout, { + ButtonBlack, + Flex, + FormField, + FormLabel, + FormMessage, + Input, +} from '@components/Objects/StyledElements/Form/Form' +import React, { useState } from 'react' +import * as Form from '@radix-ui/react-form' +import BarLoader from 'react-spinners/BarLoader' +import { Youtube, Upload } from 'lucide-react' +import { constructAcceptValue } from '@/lib/constants' + +const SUPPORTED_FILES = constructAcceptValue(['mp4', 'webm']) + +interface ExternalVideoObject { + name: string + type: string + uri: string + chapter_id: string +} + +function VideoModal({ + submitFileActivity, + submitExternalVideo, + chapterId, + course, +}: any) { + const [video, setVideo] = React.useState(null) + const [isSubmitting, setIsSubmitting] = useState(false) + const [name, setName] = React.useState('') + const [youtubeUrl, setYoutubeUrl] = React.useState('') + const [selectedView, setSelectedView] = React.useState<'file' | 'youtube'>('file') + + const handleVideoChange = (event: React.ChangeEvent) => { + if (event.target.files?.[0]) { + setVideo(event.target.files[0]) + } + } + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + setIsSubmitting(true) + + try { + if (selectedView === 'file' && video) { + await submitFileActivity( + video, + 'video', + { + name: name, + chapter_id: chapterId, + activity_type: 'TYPE_VIDEO', + activity_sub_type: 'SUBTYPE_VIDEO_HOSTED', + published_version: 1, + version: 1, + course_id: course.id, + }, + chapterId + ) + } + + if (selectedView === 'youtube') { + const external_video_object: ExternalVideoObject = { + name, + type: 'youtube', + uri: youtubeUrl, + chapter_id: chapterId, + } + + await submitExternalVideo( + external_video_object, + 'activity', + chapterId + ) + } + } finally { + setIsSubmitting(false) + } + } + + return ( + + + + Activity Name + + Please provide a name for your video activity + + + + setName(e.target.value)} + type="text" + required + placeholder="Enter activity name..." + /> + + + +
+
+ + +
+ +
+ {selectedView === 'file' && ( +
+ + Video File +
+ +
+
+
+ )} + + {selectedView === 'youtube' && ( +
+ + YouTube URL + + setYoutubeUrl(e.target.value)} + type="text" + required + placeholder="https://youtube.com/watch?v=..." + /> + + +
+ )} +
+
+ + + + + {isSubmitting ? ( + + ) : ( + 'Create Activity' + )} + + + +
+ ) +} + +export default VideoModal