plebdevs/src/hooks/nostrQueries/useCoursesQuery.js

61 lines
1.9 KiB
JavaScript
Raw Normal View History

import { useState, useEffect } from 'react';
import { useNostr } from '@/hooks/useNostr';
import { useQuery } from '@tanstack/react-query';
const AUTHOR_PUBKEY = process.env.NEXT_PUBLIC_AUTHOR_PUBKEY
export function useCoursesQuery() {
const [isClient, setIsClient] = useState(false);
const { subscribe } = useNostr();
useEffect(() => {
setIsClient(true);
}, []);
const fetchCourses = async () => {
const filter = [{ kinds: [30004], authors: [AUTHOR_PUBKEY] }];
// Do we need required tags for courses? community instead?
// const hasRequiredTags = (tags) => {
// const hasPlebDevs = tags.some(([tag, value]) => tag === "t" && value === "plebdevs");
// const hasCourse = tags.some(([tag, value]) => tag === "t" && value === "course");
// return hasPlebDevs && hasCourse;
// };
return new Promise((resolve, reject) => {
let courses = [];
const subscription = subscribe(
filter,
{
onevent: (event) => {
// if (hasRequiredTags(event.tags)) {
// courses.push(event);
// }
courses.push(event);
},
onerror: (error) => {
console.error('Error fetching courses:', error);
reject(error);
},
onclose: () => {
resolve(courses);
},
}
);
setTimeout(() => {
subscription?.close();
resolve(courses);
}, 2000);
});
}
const { data: courses, isLoading: coursesLoading, error: coursesError, refetch: refetchCourses } = useQuery({
queryKey: ['courses', isClient],
queryFn: fetchCourses,
staleTime: 1000 * 60 * 10, // 10 minutes
cacheTime: 1000 * 60 * 60, // 1 hour
enabled: isClient,
})
return { courses, coursesLoading, coursesError, refetchCourses }
}