import React, { useEffect, useState, useCallback } from 'react'; import { useRouter } from 'next/router'; import { useImageProxy } from '@/hooks/useImageProxy'; import ZapDisplay from '@/components/zaps/ZapDisplay'; import { getTotalFromZaps } from '@/utils/lightning'; import { Tag } from 'primereact/tag'; import { nip19 } from 'nostr-tools'; import { useSession } from 'next-auth/react'; import GenericButton from '@/components/buttons/GenericButton'; import Image from 'next/image'; import dynamic from 'next/dynamic'; import ZapThreadsWrapper from '@/components/ZapThreadsWrapper'; import { useNDKContext } from "@/context/NDKContext"; import { useZapsSubscription } from '@/hooks/nostrQueries/zaps/useZapsSubscription'; import { findKind0Fields } from '@/utils/nostr'; import 'primeicons/primeicons.css'; import CoursePaymentButton from "@/components/bitcoinConnect/CoursePaymentButton"; import { ProgressSpinner } from 'primereact/progressspinner'; import appConfig from "@/config/appConfig"; import useWindowWidth from '@/hooks/useWindowWidth'; const MDDisplay = dynamic( () => import("@uiw/react-markdown-preview"), { ssr: false, } ); export default function CourseDetails({ processedEvent, paidCourse, lessons, decryptionPerformed, handlePaymentSuccess, handlePaymentError }) { const [author, setAuthor] = useState(null); const [nAddress, setNAddress] = useState(null); const [zapAmount, setZapAmount] = useState(0); const [user, setUser] = useState(null); const { zaps, zapsLoading, zapsError } = useZapsSubscription({ event: processedEvent }); const { returnImageProxy } = useImageProxy(); const { data: session, status } = useSession(); const router = useRouter(); const {ndk, addSigner} = useNDKContext(); const windowWidth = useWindowWidth(); const isMobileView = windowWidth <= 768; useEffect(() => { if (session) { setUser(session.user); } }, [session]); 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.pubkey); } }, [fetchAuthor, processedEvent]); useEffect(() => { if (processedEvent?.d) { const naddr = nip19.naddrEncode({ pubkey: processedEvent.pubkey, kind: processedEvent.kind, identifier: processedEvent.d, relayUrls: appConfig.defaultRelayUrls }); setNAddress(naddr); } }, [processedEvent]); useEffect(() => { if (zaps.length > 0) { const total = getTotalFromZaps(zaps, processedEvent); setZapAmount(total); } }, [zaps, processedEvent]); const renderPaymentMessage = () => { if (paidCourse && !decryptionPerformed) { return ( ); } const coursePurchased = session?.user?.purchased?.some(purchase => purchase?.courseId === processedEvent.d ); if (paidCourse && decryptionPerformed && author && session?.user?.role?.subscribed && processedEvent?.pubkey !== session?.user?.pubkey) { return } if (paidCourse && author && processedEvent?.pubkey === session?.user?.pubkey) { return } if (paidCourse && decryptionPerformed && author && coursePurchased) { return } return null; }; if (!processedEvent || !author) { return (
); } return (
router.push('/')} />
{processedEvent && processedEvent.topics && processedEvent.topics.length > 0 && ( processedEvent.topics.map((topic, index) => ( )) )}

{processedEvent?.name}

{processedEvent?.description}

{processedEvent && (
course thumbnail
{renderPaymentMessage()}
)}
{typeof window !== 'undefined' && nAddress !== null && (
)}
{ processedEvent?.content && }
); }