import React, { useEffect, useState, useCallback } from 'react'; import { useRouter } from 'next/router'; import { useImageProxy } from '@/hooks/useImageProxy'; import { Tag } from 'primereact/tag'; import { Button } from 'primereact/button'; import Image from 'next/image'; import dynamic from 'next/dynamic'; import axios from 'axios'; import { v4 as uuidv4 } from 'uuid'; import { useSession } from 'next-auth/react'; import { useNDKContext } from "@/context/NDKContext"; import { NDKEvent } from "@nostr-dev-kit/ndk"; import { findKind0Fields } from '@/utils/nostr'; import { useToast } from '@/hooks/useToast'; import 'primeicons/primeicons.css'; const MDDisplay = dynamic( () => import("@uiw/react-markdown-preview"), { ssr: false, } ); export default function DraftCourseDetails({ processedEvent, lessons }) { const [author, setAuthor] = useState(null); const [user, setUser] = useState(null); const { showToast } = useToast(); const { returnImageProxy } = useImageProxy(); const { data: session, status } = useSession(); const router = useRouter(); const ndk = useNDKContext(); const fetchAuthor = useCallback(async (pubkey) => { if (!pubkey) return; const author = await ndk.getUser({ pubkey }); const profile = await author.fetchProfile(); const fields = await findKind0Fields(profile); if (fields) { setAuthor(fields); } }, [ndk]); useEffect(() => { if (processedEvent) { fetchAuthor(processedEvent?.user?.pubkey); } }, [fetchAuthor, processedEvent]); useEffect(() => { if (session) { setUser(session.user); } }, [session]); const handleDelete = () => { console.log('delete'); } const handleSubmit = async (e) => { e.preventDefault(); const newCourseId = uuidv4(); const processedLessons = []; try { // Step 1: Process lessons for (const lesson of lessons) { processedLessons.push({ d: lesson?.d, kind: lesson?.price ? 30402 : 30023, pubkey: lesson.pubkey }); } // Step 2: Create and publish course const courseEvent = createCourseEvent(newCourseId, processedEvent.title, processedEvent.summary, processedEvent.image, processedLessons); const published = await courseEvent.publish(); console.log('published', published); if (!published) { throw new Error('Failed to publish course'); } // Step 3: Save course to db console.log('processedLessons:', processedLessons); await axios.post('/api/courses', { id: newCourseId, resources: { connect: processedLessons.map(lesson => ({ id: lesson?.d })) }, noteId: courseEvent.id, user: { connect: { id: user.id } }, price: processedEvent?.price || 0 }); // step 4: Update all resources to have the course id await Promise.all(processedLessons.map(lesson => axios.put(`/api/resources/${lesson?.d}`, { courseId: newCourseId }))); // Step 5: Delete draft await axios.delete(`/api/courses/drafts/${processedEvent.id}`); // Step 6: Show success message and redirect showToast('success', 'Course created successfully'); router.push(`/course/${courseEvent.id}`); } catch (error) { console.error('Error creating course:', error); showToast('error', error.message || 'Failed to create course. Please try again.'); } }; const createCourseEvent = (courseId, title, summary, coverImage, lessons) => { const event = new NDKEvent(ndk); event.kind = 30004; event.content = ""; event.tags = [ ['d', courseId], ['name', title], ['picture', coverImage], ['image', coverImage], ['description', summary], ['l', "Education"], ...lessons.map((lesson) => ['a', `${lesson.kind}:${lesson.pubkey}:${lesson.d}`]), ]; return event; }; return (
{processedEvent && processedEvent.topics && processedEvent.topics.length > 0 && ( processedEvent.topics.map((topic, index) => ( )) )}

{processedEvent?.title}

{processedEvent?.summary}

avatar thumbnail

Created by{' '} {author?.username || author?.name || author?.pubkey}

{processedEvent && (
resource thumbnail
)}
{ processedEvent?.content && }
); }