import { PencilLine, Rss, TentTree } from 'lucide-react'
import React, { useEffect } from 'react'
import { motion } from 'framer-motion'
import { useFormik } from 'formik'
import * as Form from '@radix-ui/react-form'
import FormLayout, {
FormField,
FormLabelAndMessage,
Input,
Textarea,
} from '@components/StyledElements/Form/Form'
import { useCourse } from '@components/Contexts/CourseContext'
import useSWR, { mutate } from 'swr'
import { getAPIUrl } from '@services/config/config'
import { swrFetcher } from '@services/utils/ts/requests'
import useAdminStatus from '@components/Hooks/useAdminStatus'
import { useOrg } from '@components/Contexts/OrgContext'
import { createCourseUpdate, deleteCourseUpdate } from '@services/courses/updates'
import toast from 'react-hot-toast'
import ConfirmationModal from '@components/StyledElements/ConfirmationModal/ConfirmationModal'
import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
import { useLHSession } from '@components/Contexts/LHSessionContext'
dayjs.extend(relativeTime);
function CourseUpdates() {
const course = useCourse() as any;
const session = useLHSession() as any;
const access_token = session?.data?.tokens?.access_token;
const { data: updates } = useSWR(`${getAPIUrl()}courses/${course?.courseStructure.course_uuid}/updates`, (url) => swrFetcher(url, access_token))
const [isModelOpen, setIsModelOpen] = React.useState(false)
function handleModelOpen() {
setIsModelOpen(!isModelOpen)
}
// if user clicks outside the model, close the model
React.useLayoutEffect(() => {
function handleClickOutside(event: any) {
if (event.target.closest('.bg-white') || event.target.id === 'delete-update-button') return;
setIsModelOpen(false);
}
document.addEventListener('mousedown', handleClickOutside);
return () => document.removeEventListener('mousedown', handleClickOutside);
}, []);
return (
Updates
{updates && {updates.length}}
{isModelOpen &&
}
)
}
const UpdatesSection = () => {
const [selectedView, setSelectedView] = React.useState('list')
const adminStatus = useAdminStatus() ;
return (
Updates
{adminStatus.isAdmin &&
setSelectedView('new')}
className='py-2 px-4 space-x-2 items-center flex cursor-pointer text-xs font-medium hover:bg-gray-200 bg-gray-100 outline outline-1 outline-neutral-200/40'>
New Update
}
{selectedView === 'list' && }
{selectedView === 'new' && }
)
}
const NewUpdateForm = ({ setSelectedView }: any) => {
const org = useOrg() as any;
const course = useCourse() as any;
const session = useLHSession() as any;
const validate = (values: any) => {
const errors: any = {}
if (!values.title) {
errors.title = 'Title is required'
}
if (!values.content) {
errors.content = 'Content is required'
}
return errors
}
const formik = useFormik({
initialValues: {
title: '',
content: ''
},
validate,
onSubmit: async (values) => {
const body = {
title: values.title,
content: values.content,
course_uuid: course.courseStructure.course_uuid,
org_id: org.id
}
const res = await createCourseUpdate(body, session.data?.tokens?.access_token)
if (res.status === 200) {
toast.success('Update added successfully')
setSelectedView('list')
mutate(`${getAPIUrl()}courses/${course?.courseStructure.course_uuid}/updates`)
}
else {
toast.error('Failed to add update')
}
},
enableReinitialize: true,
})
useEffect(() => {
}
, [course, org])
return (
Test Course
Add new Course Update
)
}
const UpdatesListView = () => {
const course = useCourse() as any;
const adminStatus = useAdminStatus() ;
const session = useLHSession() as any;
const access_token = session?.data?.tokens?.access_token;
const { data: updates } = useSWR(`${getAPIUrl()}courses/${course?.courseStructure?.course_uuid}/updates`, (url) => swrFetcher(url, access_token))
return (
{updates && !adminStatus.loading && updates.map((update: any) => (
{update.title}
{dayjs(update.creation_date).fromNow()}
{adminStatus.isAdmin && !adminStatus.loading &&
}
{update.content}
))}
{(!updates || updates.length === 0) &&
}
)
}
const DeleteUpdateButton = ({ update }: any) => {
const session = useLHSession() as any;
const course = useCourse() as any;
const org = useOrg() as any;
const handleDelete = async () => {
const res = await deleteCourseUpdate(course.courseStructure.course_uuid, update.courseupdate_uuid, session.data?.tokens?.access_token)
if (res.status === 200) {
toast.success('Update deleted successfully')
mutate(`${getAPIUrl()}courses/${course?.courseStructure.course_uuid}/updates`)
}
else {
toast.error('Failed to delete update')
}
}
return (
Delete
}
functionToExecute={() => {
handleDelete()
}}
status="warning"
>
)
}
export default CourseUpdates