mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-06-05 00:32:03 +00:00
61 lines
1.9 KiB
JavaScript
61 lines
1.9 KiB
JavaScript
import { useState, useEffect } from 'react';
|
|
import { parseEvent } from '@/utils/nostr';
|
|
|
|
/**
|
|
* Hook to fetch and manage lesson data for a course
|
|
* @param {Object} ndk - NDK instance for Nostr data fetching
|
|
* @param {Function} fetchAuthor - Function to fetch author data
|
|
* @param {Array} lessonIds - Array of lesson IDs to fetch
|
|
* @param {String} pubkey - Public key of the course author
|
|
* @returns {Object} Lesson data and state
|
|
*/
|
|
const useLessons = (ndk, fetchAuthor, lessonIds, pubkey) => {
|
|
const [lessons, setLessons] = useState([]);
|
|
const [uniqueLessons, setUniqueLessons] = useState([]);
|
|
|
|
// Fetch lessons when IDs or pubkey change
|
|
useEffect(() => {
|
|
if (lessonIds.length > 0 && pubkey) {
|
|
const fetchLessons = async () => {
|
|
try {
|
|
await ndk.connect();
|
|
|
|
// Create a single filter with all lesson IDs to avoid multiple calls
|
|
const filter = {
|
|
'#d': lessonIds,
|
|
kinds: [30023, 30402],
|
|
authors: [pubkey],
|
|
};
|
|
|
|
const events = await ndk.fetchEvents(filter);
|
|
const newLessons = [];
|
|
|
|
// Process events (no need to check for duplicates here)
|
|
for (const event of events) {
|
|
const author = await fetchAuthor(event.pubkey);
|
|
const parsedLesson = { ...parseEvent(event), author };
|
|
newLessons.push(parsedLesson);
|
|
}
|
|
|
|
setLessons(newLessons);
|
|
} catch (error) {
|
|
console.error('Error fetching events:', error);
|
|
}
|
|
};
|
|
|
|
fetchLessons();
|
|
}
|
|
}, [lessonIds, ndk, fetchAuthor, pubkey]);
|
|
|
|
// Keep this deduplication logic using Map
|
|
useEffect(() => {
|
|
const newUniqueLessons = Array.from(
|
|
new Map(lessons.map(lesson => [lesson.id, lesson])).values()
|
|
);
|
|
setUniqueLessons(newUniqueLessons);
|
|
}, [lessons]);
|
|
|
|
return { lessons, uniqueLessons, setLessons };
|
|
};
|
|
|
|
export default useLessons;
|