diff --git a/src/components/bitcoinConnect/PaymentButton.js b/src/components/bitcoinConnect/ResourcePaymentButton.js similarity index 100% rename from src/components/bitcoinConnect/PaymentButton.js rename to src/components/bitcoinConnect/ResourcePaymentButton.js diff --git a/src/components/course/CourseDetails.js b/src/components/content/courses/CourseDetails.js similarity index 100% rename from src/components/course/CourseDetails.js rename to src/components/content/courses/CourseDetails.js diff --git a/src/components/course/CourseLesson.js b/src/components/content/courses/CourseLesson.js similarity index 100% rename from src/components/course/CourseLesson.js rename to src/components/content/courses/CourseLesson.js diff --git a/src/components/course/DraftCourseDetails.js b/src/components/content/courses/DraftCourseDetails.js similarity index 100% rename from src/components/course/DraftCourseDetails.js rename to src/components/content/courses/DraftCourseDetails.js diff --git a/src/components/course/DraftCourseLesson.js b/src/components/content/courses/DraftCourseLesson.js similarity index 100% rename from src/components/course/DraftCourseLesson.js rename to src/components/content/courses/DraftCourseLesson.js diff --git a/src/components/content/resources/ResourceDetails.js b/src/components/content/resources/ResourceDetails.js new file mode 100644 index 0000000..a364b20 --- /dev/null +++ b/src/components/content/resources/ResourceDetails.js @@ -0,0 +1,78 @@ +import React, { useEffect, useState } from "react"; +import { Tag } from "primereact/tag"; +import Image from "next/image"; +import { useRouter } from "next/router"; +import ResourcePaymentButton from "@/components/bitcoinConnect/ResourcePaymentButton"; +import ZapDisplay from "@/components/zaps/ZapDisplay"; +import { useImageProxy } from "@/hooks/useImageProxy"; + +const ResourceDetails = ({processedEvent,topics, title, summary, image, price, author, paidResource, decryptedContent, zapAmount, zapsLoading, handlePaymentSuccess, handlePaymentError}) => { + const router = useRouter(); + const { slug } = router.query; + const { returnImageProxy } = useImageProxy(); + + + return ( +
+ router.push('/')} /> +
+
+
+ {topics && topics.length > 0 && ( + topics.map((topic, index) => ( + + )) + ) + } +
+

{title}

+

{summary}

+
+ avatar image +

+ Created by{' '} + + {author?.username} + +

+
+
+
+ {image && ( +
+ resource thumbnail +
+ {paidResource && !decryptedContent && } + + {/* if the resource has been paid for show a green paid x sats text */} + {paidResource && decryptedContent &&

Paid {processedEvent.price} sats

} + + +
+
+ )} +
+
+
+ ) +} + +export default ResourceDetails; \ No newline at end of file diff --git a/src/pages/course/[slug]/draft.js b/src/pages/course/[slug]/draft.js index f6985bf..22755d4 100644 --- a/src/pages/course/[slug]/draft.js +++ b/src/pages/course/[slug]/draft.js @@ -2,8 +2,8 @@ import React, { useEffect, useState, useCallback } from "react"; import { useRouter } from "next/router"; import axios from "axios"; import { parseEvent, findKind0Fields } from "@/utils/nostr"; -import DraftCourseDetails from "@/components/course/DraftCourseDetails"; -import DraftCourseLesson from "@/components/course/DraftCourseLesson"; +import DraftCourseDetails from "@/components/content/courses/DraftCourseDetails"; +import DraftCourseLesson from "@/components/content/courses/DraftCourseLesson"; import dynamic from 'next/dynamic'; import { useNDKContext } from "@/context/NDKContext"; diff --git a/src/pages/course/[slug]/index.js b/src/pages/course/[slug]/index.js index eee777c..19ef294 100644 --- a/src/pages/course/[slug]/index.js +++ b/src/pages/course/[slug]/index.js @@ -1,8 +1,8 @@ import React, { useEffect, useState, useCallback } from "react"; import { useRouter } from "next/router"; import { parseCourseEvent, parseEvent, findKind0Fields } from "@/utils/nostr"; -import CourseDetails from "@/components/course/CourseDetails"; -import CourseLesson from "@/components/course/CourseLesson"; +import CourseDetails from "@/components/content/courses/CourseDetails"; +import CourseLesson from "@/components/courses/CourseLesson"; import dynamic from 'next/dynamic'; import { useNDKContext } from "@/context/NDKContext"; diff --git a/src/pages/details/[slug]/index.js b/src/pages/details/[slug]/index.js index 443a1f9..21f69d0 100644 --- a/src/pages/details/[slug]/index.js +++ b/src/pages/details/[slug]/index.js @@ -14,9 +14,9 @@ import dynamic from 'next/dynamic'; import ZapThreadsWrapper from '@/components/ZapThreadsWrapper'; import { useToast } from '@/hooks/useToast'; import { useNDKContext } from '@/context/NDKContext'; +import ResourceDetails from '@/components/content/resources/ResourceDetails'; import { useZapsSubscription } from '@/hooks/nostrQueries/zaps/useZapsSubscription'; -import { LightningAddress } from "@getalby/lightning-tools"; -import PaymentButton from '@/components/bitcoinConnect/PaymentButton'; +import ResourcePaymentButton from '@/components/bitcoinConnect/ResourcePaymentButton'; import 'primeicons/primeicons.css'; const MDDisplay = dynamic( @@ -26,13 +26,6 @@ const MDDisplay = dynamic( } ); -const BitcoinConnectPayButton = dynamic( - () => import('@getalby/bitcoin-connect-react').then((mod) => mod.PayButton), - { - ssr: false, - } -); - const privkey = process.env.NEXT_PUBLIC_APP_PRIV_KEY; const pubkey = process.env.NEXT_PUBLIC_APP_PUBLIC_KEY; @@ -139,9 +132,10 @@ export default function Details() { authors: [pubkey] } - const author = await ndk.fetchEvent(filter); + const author = await ndk.fetchEvent(filter); if (author) { const fields = await findKind0Fields(JSON.parse(author.content)); + console.log("fields", fields); setAuthor(fields); } } catch (error) { @@ -206,6 +200,20 @@ export default function Details() { } } + const handlePaymentSuccess = async (response, newResource) => { + if (response && response?.preimage) { + console.log("newResource", newResource); + const updated = await update(); + console.log("session after update", updated); + } else { + showToast('error', 'Error', 'Failed to purchase resource. Please try again.'); + } + } + + const handlePaymentError = (error) => { + showToast('error', 'Payment Error', `Failed to purchase resource. Please try again. Error: ${error}`); + } + const renderContent = () => { if (decryptedContent) { return ; @@ -217,85 +225,25 @@ export default function Details() { return ; } return null; - }; - - const handlePaymentSuccess = async (response, newResource) => { - if (response && response?.preimage) { - console.log("newResource", newResource) - // Refetch session to get the latest user data - const updated = await update(); - console.log("session after update", updated) - // router.reload(); // Optionally, reload the page if necessary - } else { - showToast('error', 'Error', 'Failed to purchase resource. Please try again.'); - } - } - - const handlePaymentError = (error) => { - showToast('error', 'Payment Error', `Failed to purchase resource. Please try again. Error: ${error}`); } return (
-
- router.push('/')} /> -
-
-
- {processedEvent && processedEvent.topics && processedEvent.topics.length > 0 && ( - processedEvent.topics.map((topic, index) => ( - - )) - ) - } -
-

{processedEvent?.title}

-

{processedEvent?.summary}

-
- avatar image -

- Created by{' '} - - {author?.username} - -

-
-
-
- {processedEvent && ( -
- resource thumbnail -
- {paidResource && !decryptedContent && } - - {/* if the resource has been paid for show a green paid x sats text */} - {paidResource && decryptedContent &&

Paid {processedEvent.price} sats

} - - -
-
- )} -
-
-
+ {authorView && (