mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-06-05 00:32:03 +00:00
79 lines
2.3 KiB
JavaScript
79 lines
2.3 KiB
JavaScript
import { useEffect, useState } from 'react';
|
|
import { parseCourseEvent } from '@/utils/nostr';
|
|
import { nip19 } from 'nostr-tools';
|
|
import { useToast } from '../useToast';
|
|
|
|
/**
|
|
* Hook to fetch and manage course data
|
|
* @param {Object} ndk - NDK instance for Nostr data fetching
|
|
* @param {Function} fetchAuthor - Function to fetch author data
|
|
* @param {Object} router - Next.js router instance
|
|
* @returns {Object} Course data and related state
|
|
*/
|
|
const useCourseData = (ndk, fetchAuthor, router) => {
|
|
const [course, setCourse] = useState(null);
|
|
const [lessonIds, setLessonIds] = useState([]);
|
|
const [paidCourse, setPaidCourse] = useState(null);
|
|
const [loading, setLoading] = useState(true);
|
|
const { showToast } = useToast();
|
|
|
|
useEffect(() => {
|
|
if (!router.isReady) return;
|
|
|
|
const { slug } = router.query;
|
|
|
|
const fetchCourseId = async () => {
|
|
if (slug.includes('naddr')) {
|
|
const { data } = nip19.decode(slug);
|
|
if (!data?.identifier) {
|
|
showToast('error', 'Error', 'Resource not found');
|
|
return null;
|
|
}
|
|
return data.identifier;
|
|
} else {
|
|
return slug;
|
|
}
|
|
};
|
|
|
|
const fetchCourse = async courseId => {
|
|
try {
|
|
await ndk.connect();
|
|
const event = await ndk.fetchEvent({ '#d': [courseId] });
|
|
if (!event) return null;
|
|
|
|
const author = await fetchAuthor(event.pubkey);
|
|
const lessonIds = event.tags.filter(tag => tag[0] === 'a').map(tag => tag[1].split(':')[2]);
|
|
|
|
const parsedCourse = { ...parseCourseEvent(event), author };
|
|
return { parsedCourse, lessonIds };
|
|
} catch (error) {
|
|
console.error('Error fetching event:', error);
|
|
return null;
|
|
}
|
|
};
|
|
|
|
const initializeCourse = async () => {
|
|
setLoading(true);
|
|
const id = await fetchCourseId();
|
|
if (!id) {
|
|
setLoading(false);
|
|
return;
|
|
}
|
|
|
|
const courseData = await fetchCourse(id);
|
|
if (courseData) {
|
|
const { parsedCourse, lessonIds } = courseData;
|
|
setCourse(parsedCourse);
|
|
setLessonIds(lessonIds);
|
|
setPaidCourse(parsedCourse.price && parsedCourse.price > 0);
|
|
}
|
|
setLoading(false);
|
|
};
|
|
|
|
initializeCourse();
|
|
}, [router.isReady, router.query, ndk, fetchAuthor, showToast]);
|
|
|
|
return { course, lessonIds, paidCourse, loading };
|
|
};
|
|
|
|
export default useCourseData;
|