import { Badge, Box, Button, ButtonGroup, Center, Container, Heading, HStack, Icon, IconButton, Stack, Tab, TabList, TabPanel, TabPanels, Tabs, Text, Tooltip, useDisclosure, useToast, } from '@chakra-ui/react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { __ } from '@wordpress/i18n'; import React, { useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { BiLinkExternal } from 'react-icons/bi'; import { useNavigate, useParams } from 'react-router-dom'; import NoQuestion from '../../../../assets/img/svgs/no-question.svg'; import AddNewButton from '../../../../assets/js/back-end/components/common/AddNewButton'; import BackToBuilder from '../../../../assets/js/back-end/components/common/BackToBuilder'; import BuilderHeader from '../../../../assets/js/back-end/components/common/BuilderHeader'; import CourseName from '../../../../assets/js/back-end/components/common/CourseName'; import { Sortable, Trash, } from '../../../../assets/js/back-end/constants/images'; import routes from '../../../../assets/js/back-end/constants/routes'; import urls from '../../../../assets/js/back-end/constants/urls'; import { SectionSchema } from '../../../../assets/js/back-end/schemas'; import Description from '../../../../assets/js/back-end/screens/quiz/components/Description'; import Name from '../../../../assets/js/back-end/screens/quiz/components/Name'; import QuizSKeleton from '../../../../assets/js/back-end/skeleton/QuizSkeleton'; import { CourseDataMap } from '../../../../assets/js/back-end/types/course'; import API from '../../../../assets/js/back-end/utils/api'; import { addContentToBuilderCache, deepClean, } from '../../../../assets/js/back-end/utils/utils'; import H5P_BADGE_COLOR from '../../constants/badgeColors'; import h5pRoutes from '../../constants/routes'; import h5pUrls from '../../constants/urls'; import TruncatedText from '../TruncatedText'; import H5PContentPicker, { H5PContent } from './H5PContentPicker'; import H5PQuizSettings from './H5PQuizSettings'; const tabStyles = { fontWeight: 'medium', py: '4', }; const AddNewH5PQuiz = () => { const { courseId, sectionId }: any = useParams(); const navigate = useNavigate(); const toast = useToast(); const queryClient = useQueryClient(); const methods = useForm(); const h5pQuizAPI = new API(h5pUrls.h5pQuizzes); const { isOpen: isPickerOpen, onOpen: openPicker, onClose: closePicker, } = useDisclosure(); const [selectedQuestions, setSelectedQuestions] = useState([]); const sectionAPI = new API(urls.sections); const courseAPI = new API(urls.courses); const sectionQuery = useQuery({ queryKey: [`section${sectionId}`, sectionId], queryFn: () => sectionAPI.get(sectionId), }); const courseQuery = useQuery({ queryKey: [`course${courseId}`, courseId], queryFn: () => courseAPI.get(courseId, 'edit'), }); const addH5PQuiz = useMutation({ mutationFn: (data: any) => h5pQuizAPI.store(data), }); const onSubmit = (data: any, status?: string) => { const payload = { ...deepClean(data), course_id: Number(courseId), parent_id: Number(sectionId), h5p_content_ids: selectedQuestions.map((q) => q.id), duration: (Number(data.duration_hour) || 0) * 60 + (Number(data.duration_minute) || 0), questions_display_per_page: data.questions_display_per_page_mode === '0' ? 0 : Number(data.questions_display_per_page_custom) || 5, status: status || 'draft', }; addH5PQuiz.mutate(payload, { onSuccess: (data: any) => { addContentToBuilderCache( queryClient, [`builder${courseId}`, courseId], data, 'h5p-quiz', ); toast({ title: __('H5P Quiz added.', 'learning-management-system'), status: 'success', isClosable: true, }); navigate({ pathname: h5pRoutes.h5pQuiz.builder.edit .replace(':courseId', courseId) .replace(':h5pQuizId', String(data.id)), }); }, onError: (err: any) => { toast({ title: err?.message || __('Something went wrong', 'learning-management-system'), status: 'error', isClosable: true, }); }, }); }; const addQuestions = (items: H5PContent[]) => { setSelectedQuestions((prev) => { const existingIds = new Set(prev.map((q) => q.id)); return [...prev, ...items.filter((i) => !existingIds.has(i.id))]; }); }; if ( !sectionQuery.isSuccess || !courseQuery.isSuccess || sectionQuery.data?.course_id != courseId ) { return ; } return ( methods.handleSubmit((data) => onSubmit(data, status)) } previewLink="" isLoading={addH5PQuiz.isPending} />
onSubmit(data))}> {__('Info', 'learning-management-system')} {__('Questions', 'learning-management-system')} {__('Settings', 'learning-management-system')} {/* Info */} {/* Questions */} {selectedQuestions.length === 0 && ( {__( 'No Questions Found', 'learning-management-system', )} {__( 'Add new question to add your content', 'learning-management-system', )} )} {selectedQuestions.map((q, index) => (
{index + 1} {q.content_type && ( {q.content_type} )}
{q.view_url && ( } minW="auto" /> )} } minW="auto" onClick={() => setSelectedQuestions((prev) => prev.filter( (item) => item.id !== q.id, ), ) } />
))}
q.id)} />
{/* Settings */}
); }; export default AddNewH5PQuiz;