import ConfirmationModal from '@components/StyledElements/ConfirmationModal/ConfirmationModal' import { getAPIUrl, getUriWithOrg } from '@services/config/config' import { deleteActivity, updateActivity } from '@services/courses/activities' import { revalidateTags } from '@services/utils/ts/requests' import { Backpack, Eye, File, FilePenLine, FileSymlink, Globe, Lock, MoreVertical, Pencil, Save, Sparkles, Video, X, } from 'lucide-react' import { useLHSession } from '@components/Contexts/LHSessionContext' import Link from 'next/link' import { useRouter } from 'next/navigation' import React, { useEffect, useState } from 'react' import { Draggable } from 'react-beautiful-dnd' import { mutate } from 'swr' import { deleteAssignmentUsingActivityUUID, getAssignmentFromActivityUUID } from '@services/courses/assignments' import { useOrg } from '@components/Contexts/OrgContext' import { useCourse } from '@components/Contexts/CourseContext' import toast from 'react-hot-toast' import { useMediaQuery } from 'usehooks-ts' import ToolTip from '@components/StyledElements/Tooltip/Tooltip' type ActivitiyElementProps = { orgslug: string activity: any activityIndex: any course_uuid: string } interface ModifiedActivityInterface { activityId: string activityName: string } function ActivityElement(props: ActivitiyElementProps) { const router = useRouter() const session = useLHSession() as any; const access_token = session?.data?.tokens?.access_token; const [modifiedActivity, setModifiedActivity] = React.useState< ModifiedActivityInterface | undefined >(undefined) const [selectedActivity, setSelectedActivity] = React.useState< string | undefined >(undefined) const activityUUID = props.activity.activity_uuid const isMobile = useMediaQuery('(max-width: 767px)') async function deleteActivityUI() { const toast_loading = toast.loading('Deleting activity...') // Assignments if (props.activity.activity_type === 'TYPE_ASSIGNMENT') { await deleteAssignmentUsingActivityUUID(props.activity.activity_uuid, access_token) } await deleteActivity(props.activity.activity_uuid, access_token) mutate(`${getAPIUrl()}courses/${props.course_uuid}/meta`) await revalidateTags(['courses'], props.orgslug) toast.dismiss(toast_loading) toast.success('Activity deleted successfully') router.refresh() } async function changePublicStatus() { const toast_loading = toast.loading('Updating assignment...') await updateActivity( { ...props.activity, published: !props.activity.published, }, props.activity.activity_uuid, access_token ) mutate(`${getAPIUrl()}courses/${props.course_uuid}/meta`) toast.dismiss(toast_loading) toast.success('The activity has been updated successfully') await revalidateTags(['courses'], props.orgslug) router.refresh() } async function updateActivityName(activityId: string) { if ( modifiedActivity?.activityId === activityId && selectedActivity !== undefined ) { let modifiedActivityCopy = { ...props.activity, name: modifiedActivity.activityName, } await updateActivity(modifiedActivityCopy, activityUUID, access_token) mutate(`${getAPIUrl()}courses/${props.course_uuid}/meta`) await revalidateTags(['courses'], props.orgslug) router.refresh() } setSelectedActivity(undefined) } return ( {(provided, snapshot) => (
{/* Activity Type Icon */} {/* Centered Activity Name */}
{selectedActivity === props.activity.id ? (
setModifiedActivity({ activityId: props.activity.id, activityName: e.target.value, }) } />
) : (

{props.activity.name}

)} setSelectedActivity(props.activity.id)} className="text-neutral-400 hover:cursor-pointer size-3 min-w-3" />
{/* Edit, View, Publish, and Delete Buttons */}
{/* Publishing */}
{/* Delete Button */} } functionToExecute={() => deleteActivityUI()} status="warning" />
)} ) } const ACTIVITIES = { 'TYPE_VIDEO': { displayName: 'Video', Icon: Video }, 'TYPE_DOCUMENT': { displayName: 'Document', Icon: File }, 'TYPE_ASSIGNMENT': { displayName: 'Assignment', Icon: Backpack }, 'TYPE_DYNAMIC': { displayName: 'Dynamic', Icon: Sparkles } } const ActivityTypeIndicator = ({activityType, isMobile} : { activityType: keyof typeof ACTIVITIES, isMobile: boolean}) => { const {displayName, Icon} = ACTIVITIES[activityType] return (
{' '}
{displayName}
{' '}
) } const ActivityElementOptions = ({ activity, isMobile }: { activity: any; isMobile: boolean }) => { const [assignmentUUID, setAssignmentUUID] = useState(''); const org = useOrg() as any; const course = useCourse() as any; const session = useLHSession() as any; const access_token = session?.data?.tokens?.access_token; async function getAssignmentUUIDFromActivityUUID(activityUUID: string): Promise { const activity = await getAssignmentFromActivityUUID(activityUUID, access_token); if (activity) { return activity.data.assignment_uuid; } } const fetchAssignmentUUID = async () => { if (activity.activity_type === 'TYPE_ASSIGNMENT') { const assignment_uuid = await getAssignmentUUIDFromActivityUUID(activity.activity_uuid); if(assignment_uuid) setAssignmentUUID(assignment_uuid.replace('assignment_', '')); } }; useEffect(() => { fetchAssignmentUUID(); }, [activity, course]); return ( <> {activity.activity_type === 'TYPE_DYNAMIC' && ( <>
Edit Page
)} {activity.activity_type === 'TYPE_ASSIGNMENT' && ( <>
{!isMobile && Edit Assignment}
)} ); }; export default ActivityElement