plebdevs/src/hooks/useContentSearch.js

62 lines
2.1 KiB
JavaScript
Raw Normal View History

import { useState, useEffect } from 'react';
import { useContentIdsQuery } from '@/hooks/apiQueries/useContentIdsQuery';
import { useNDKContext } from '@/context/NDKContext';
import { parseEvent, parseCourseEvent } from '@/utils/nostr';
const AUTHOR_PUBKEY = process.env.NEXT_PUBLIC_AUTHOR_PUBKEY;
export const useContentSearch = () => {
const [allContent, setAllContent] = useState([]);
const [searchResults, setSearchResults] = useState([]);
const { contentIds } = useContentIdsQuery();
const { ndk } = useNDKContext();
const fetchAllEvents = async (ids) => {
try {
await ndk.connect();
const filter = {
authors: [AUTHOR_PUBKEY],
kinds: [30004, 30023, 30402],
"#d": ids
}
const events = await ndk.fetchEvents(filter);
const parsedEvents = new Set();
events.forEach((event) => {
let parsed;
if (event.kind === 30004) {
parsed = parseCourseEvent(event);
} else {
parsed = parseEvent(event);
}
parsedEvents.add(parsed);
});
setAllContent(parsedEvents);
} catch (error) {
console.log('error', error)
}
}
useEffect(() => {
if (contentIds) {
fetchAllEvents(contentIds);
}
}, [contentIds]);
const searchContent = (term) => {
if (term.length > 2) {
const filtered = Array.from(allContent).filter(content => {
const searchableTitle = (content?.title || content?.name || '').toLowerCase();
const searchableDescription = (content?.summary || content?.description || '').toLowerCase();
const searchTerm = term.toLowerCase();
return searchableTitle.includes(searchTerm) || searchableDescription.includes(searchTerm);
});
setSearchResults(filtered);
} else {
setSearchResults([]);
}
};
return { searchContent, searchResults };
};