diff --git a/public/videos/plebdevs-montage.mp4 b/public/videos/plebdevs-montage.mp4
new file mode 100644
index 0000000..ac3ff62
Binary files /dev/null and b/public/videos/plebdevs-montage.mp4 differ
diff --git a/src/components/content/carousels/InteractivePromotionalCarousel.js b/src/components/content/carousels/InteractivePromotionalCarousel.js
index 535f93c..2f26f30 100644
--- a/src/components/content/carousels/InteractivePromotionalCarousel.js
+++ b/src/components/content/carousels/InteractivePromotionalCarousel.js
@@ -1,5 +1,5 @@
import Image from "next/image"
-import { useState } from "react"
+import { useState, useRef, useEffect } from "react"
import { useImageProxy } from "@/hooks/useImageProxy"
import GenericButton from "@/components/buttons/GenericButton"
import { useRouter } from "next/router"
@@ -13,68 +13,69 @@ const promotions = [
title: "Developer education & community platform",
description: "PlebDevs is your gateway to mastering Bitcoin, Lightning, and Nostr technologies. Join our community of aspiring developers and start your journey today!",
icon: "pi pi-code",
- image: "https://media.istockphoto.com/id/537331500/photo/programming-code-abstract-technology-background-of-software-deve.jpg?s=612x612&w=0&k=20&c=jlYes8ZfnCmD0lLn-vKvzQoKXrWaEcVypHnB5MuO-g8=",
+ video: "/videos/plebdevs-montage.mp4",
},
{
id: 2,
- category: "COURSES",
- title: "Structured learning paths for new devs",
- description: "Dive into our comprehensive courses covering Bitcoin protocol, Lightning Network, and Nostr. From basics to advanced topics, we've got you covered.",
+ category: "CONTENT",
+ title: "Comprehensive Learning Resources",
+ description: "Access our extensive library of courses, videos, and documents. From structured learning paths to hands-on workshops, we've got everything you need to master Bitcoin, Lightning, and Nostr development.",
icon: "pi pi-book",
image: "https://media.istockphoto.com/id/1224500457/photo/programming-code-abstract-technology-background-of-software-developer-and-computer-script.jpg?s=612x612&w=0&k=20&c=nHMypkMTU1HUUW85Zt0Ff7MDbq17n0eVeXaoM9Knt4Q=",
},
{
id: 3,
- category: "VIDEOS",
- title: "Hands-on workshops and devleloper video content",
- description: "Watch and learn with our interactive video workshops. Get practical experience building real Bitcoin and Lightning applications.",
- icon: "pi pi-video",
- image: "https://newsroom.siliconslopes.com/content/images/2018/10/code.jpg",
- },
- {
- id: 4,
- category: "DOCUMENTS",
- title: "In-depth Resources and Documentation",
- description: "Access our extensive library of documents, including guides, resources, and best practices for Bitcoin development.",
- icon: "pi pi-file",
- image: "https://img.freepik.com/free-photo/programming-background-with-person-working-with-codes-computer_23-2150010125.jpg",
- },
- {
- id: 5,
category: "COMMUNITY",
- title: "Join Our Community",
+ title: "Join Our Community of learners, hackers, and plebs",
description: "Connect with other developers, share your projects, and get support from our community of Bitcoin enthusiasts.",
icon: "pi pi-users",
image: "https://pikwizard.com/pw/medium/50238b1cad4ff412fdafc1325efa1c9f.jpg",
},
{
- id: 6,
+ id: 4,
category: "LIGHTNING / NOSTR",
- title: "Lightning and Nostr integrated",
+ title: "Lightning and Nostr integrated platform",
description: "This platform is the first of its kind to integrate Lightning Network and Nostr protocols, allowing users to send and receive payments and interact with the Nostr network.",
icon: "pi pi-bolt",
image: "https://www.financemagnates.com/wp-content/uploads/2016/05/Bicoin-lightning.jpg",
},
]
-// todo bigger ore simple CTA to get users into the content
const InteractivePromotionalCarousel = () => {
const [selectedPromotion, setSelectedPromotion] = useState(promotions[0])
const { returnImageProxy } = useImageProxy();
const windowWidth = useWindowWidth();
const isMobileView = windowWidth <= 1360;
const router = useRouter();
+ const videoRef = useRef(null);
+
+ useEffect(() => {
+ if (videoRef.current && selectedPromotion.video) {
+ videoRef.current.play();
+ }
+ }, [selectedPromotion]);
return (
-
+ {selectedPromotion.video ? (
+
+ ) : (
+
+ )}
{isMobileView ? (
{selectedPromotion.category}
@@ -93,17 +94,13 @@ const InteractivePromotionalCarousel = () => {
router.push('/content?tag=all')} severity="primary" icon={} label="View all content" className="w-fit py-2 font-semibold" size="small" outlined />
);
- case "COURSES":
+ case "CONTENT":
return (
-
router.push('/content?tag=courses')} icon={} label="View All Courses" className="w-fit py-2 font-semibold" size="small" outlined />
- );
- case "VIDEOS":
- return (
- router.push('/content?tag=videos')} icon={} label="View All Videos" className="w-fit py-2 font-semibold" size="small" outlined />
- );
- case "DOCUMENTS":
- return (
- router.push('/content?tag=documents')} icon={} label="View All Documents" className="w-fit py-2 font-semibold" size="small" outlined />
+ <>
+ router.push('/content?tag=courses')} icon={} label="Courses" className="py-2 font-semibold" size="small" outlined />
+ router.push('/content?tag=videos')} icon={} label="Videos" className="py-2 font-semibold" size="small" outlined />
+ router.push('/content?tag=documents')} icon={} label="Documents" className="py-2 font-semibold" size="small" outlined />
+ >
);
case "COMMUNITY":
return (
@@ -141,17 +138,13 @@ const InteractivePromotionalCarousel = () => {
router.push('/content?tag=all')} severity="primary" icon={} label="View all content" className="py-2 font-semibold" size="small" outlined />
>
);
- case "COURSES":
+ case "CONTENT":
return (
- router.push('/content?tag=courses')} icon={} label="View All Courses" className="py-2 font-semibold" size="small" outlined />
- );
- case "VIDEOS":
- return (
- router.push('/content?tag=videos')} icon={} label="View All Videos" className="py-2 font-semibold" size="small" outlined />
- );
- case "DOCUMENTS":
- return (
- router.push('/content?tag=documents')} icon={} label="View All Documents" className="py-2 font-semibold" size="small" outlined />
+ <>
+ router.push('/content?tag=courses')} icon={} label="Courses" className="py-2 font-semibold" size="small" outlined />
+ router.push('/content?tag=videos')} icon={} label="Videos" className="py-2 font-semibold" size="small" outlined />
+ router.push('/content?tag=documents')} icon={} label="Documents" className="py-2 font-semibold" size="small" outlined />
+ >
);
case "COMMUNITY":
return (
@@ -177,8 +170,8 @@ const InteractivePromotionalCarousel = () => {
{promotions.map((promo) => (
setSelectedPromotion(promo)}>
@@ -192,14 +185,14 @@ const InteractivePromotionalCarousel = () => {
promotions.map((promo) => (
setSelectedPromotion(promo)}>
-
{promo.category}
+
{promo.category}
-
{promo.title}
+
{promo.title}
))
)}
diff --git a/src/components/content/courses/CourseDetailsNew.js b/src/components/content/courses/CourseDetailsNew.js
index 5239d97..e145923 100644
--- a/src/components/content/courses/CourseDetailsNew.js
+++ b/src/components/content/courses/CourseDetailsNew.js
@@ -103,7 +103,7 @@ export default function CourseDetailsNew({ processedEvent, paidCourse, lessons,
if (paidCourse && !decryptionPerformed) {
return (
{
const [zapAmount, setZapAmount] = useState(0);
const router = useRouter();
@@ -96,7 +94,7 @@ const DocumentDetails = ({ processedEvent, topics, title, summary, image, price,
{
const [zapAmount, setZapAmount] = useState(0);
const router = useRouter();
@@ -99,7 +97,7 @@ const VideoDetails = ({ processedEvent, topics, title, summary, image, price, au
{
const [title, setTitle] = useState(draft?.title || '');
const [summary, setSummary] = useState(draft?.summary || '');
diff --git a/src/components/profile/progress/UserProgress.js b/src/components/profile/progress/UserProgress.js
index 422bb42..ddc36d8 100644
--- a/src/components/profile/progress/UserProgress.js
+++ b/src/components/profile/progress/UserProgress.js
@@ -41,7 +41,7 @@ const allTasks = [
const UserProgress = () => {
const [progress, setProgress] = useState(0);
const [currentTier, setCurrentTier] = useState('Pleb');
- const [expanded, setExpanded] = useState(null);
+ const [expandedItems, setExpandedItems] = useState({});
const [completedCourses, setCompletedCourses] = useState([]);
const [tasks, setTasks] = useState([]);
@@ -91,6 +91,13 @@ const UserProgress = () => {
fetchProgress();
}, []);
+ const handleAccordionChange = (index, isExpanded) => {
+ setExpandedItems(prev => ({
+ ...prev,
+ [index]: isExpanded
+ }));
+ };
+
return (
Dev Journey (Coming Soon)
@@ -115,7 +122,11 @@ const UserProgress = () => {
{tasks.map((task, index) => (
{task.subTasks ? (
- setExpanded(true)} onTabClose={(e) => setExpanded(false)}>
+ handleAccordionChange(index, e.index === 0)}
+ activeIndex={expandedItems[index] ? 0 : null}
+ >
{
-
+
+
+
+ {task.status}
+
-
{task.status}
-
{task.tier}
diff --git a/src/pages/about.js b/src/pages/about.js
index 6b30b46..75cf0ae 100644
--- a/src/pages/about.js
+++ b/src/pages/about.js
@@ -98,28 +98,30 @@ const AboutPage = () => {
severity="secondary"
outlined
icon="pi pi-github"
- label="GitHub"
+ tooltip="Github"
+ className="text-gray-300"
onClick={() => window.open('https://github.com/pleb-devs', '_blank')}
/>
window.open('https://x.com/pleb_devs', '_blank')}
/>
}
- label="Nostr"
+ icon={}
+ tooltip="Nostr"
onClick={() => window.open('https://nostr.com/plebdevs@plebdevs.com', '_blank')}
/>
copyToClipboard("austin@bitcoinpleb.dev")}
/>
diff --git a/src/pages/index.js b/src/pages/index.js
index fe31c3b..fe6f1e8 100644
--- a/src/pages/index.js
+++ b/src/pages/index.js
@@ -5,7 +5,7 @@ import VideosCarousel from '@/components/content/carousels/VideosCarousel';
import DocumentsCarousel from '@/components/content/carousels/DocumentsCarousel';
import InteractivePromotionalCarousel from '@/components/content/carousels/InteractivePromotionalCarousel';
-// todo: make paid course videos and documents not appear in carousels
+// todo: make paid course video and document lessons not appear in carousels
export default function Home() {
return (
<>
diff --git a/src/utils/nostr.js b/src/utils/nostr.js
index dca479b..9181863 100644
--- a/src/utils/nostr.js
+++ b/src/utils/nostr.js
@@ -34,6 +34,12 @@ export const findKind0Fields = async (kind0) => {
fields.pubkey = pubkey;
}
+ const lud16 = findTruthyPropertyValue(kind0, ['lud16', 'lightning', 'lnurl', 'lnurlp', 'lnurlw']);
+
+ if (lud16) {
+ fields.lightningAddress = lud16;
+ }
+
return fields;
}