import React from 'react'; import { observer } from 'mobx-react'; import { Box, Grid, Text } from '@chakra-ui/react'; /** * Types */ import { CourseStatusEnum } from '@educt/enums'; import { CourseItemPropsType } from './CourseItem'; /** * Components */ import DeleteCourseDialog from '../DeleteCourseDialog'; import LoadingList from '@educt/components/LoadingList'; /** * Hooks */ import { useContext, useEffect } from 'react'; import { useRootStore } from '@educt/hooks/useRootStore'; import { useDisclosure } from '@chakra-ui/hooks'; import { useToast } from '@chakra-ui/toast'; import { useErrorHandler } from 'react-error-boundary'; /** * Contexts */ import { CoursesPageContext } from '@educt/contexts'; type CourseListPropsType = { render: React.FC; }; const CourseList: React.FC = ({ render: Item }) => { const { userStore: { me }, courseStore, } = useRootStore(); const { selectedCategory, courseStatus, deletingCourse, setDeletingCourse } = useContext(CoursesPageContext); const { onOpen: onOpenDeleteDialog, onClose: onCloseDeleteDialog, isOpen: isOpenDeleteDialog } = useDisclosure(); const handleError = useErrorHandler(); const toast = useToast(); const { courses, isLoading } = courseStore; /** * Fetch courses handler */ useEffect(() => { if (me !== null) { courseStore.loadCourses({ category_id: selectedCategory?.id, status: me.isAdmin || me.isTeacher ? courseStatus : CourseStatusEnum.PUBLISHED, }); } }, [courseStore, selectedCategory, courseStatus]); /** * Handle update course status */ const onSetStatus = async (id: string, status: CourseStatusEnum) => { try { await courseStore.setCourseStatus(id, status); toast({ title: 'Status updated.', status: 'info' }); } catch (error: any) { if (error.response) { toast({ title: error.message, status: 'error' }); } else { handleError(error); } } }; if (courses === null || isLoading) return ; return ( {deletingCourse && ( )} {courses.length !== 0 ? ( {courses.map(course => ( { setDeletingCourse(course); onOpenDeleteDialog(); }} onSetStatus={onSetStatus} /> ))} ) : ( There are no courses  {!selectedCategory && !courseStatus ? 'in the system yet' : `in this category${courseStatus ? ' or with this status' : ''}`} . )} ); }; export default observer(CourseList);