plebdevs/src/hooks/useCommunitySearch.js

104 lines
3.0 KiB
JavaScript
Raw Normal View History

import { useState, useEffect } from 'react';
import { useDiscordQuery } from '@/hooks/communityQueries/useDiscordQuery';
import { useCommunityNotes } from '@/hooks/nostr/useCommunityNotes';
import { useQuery } from '@tanstack/react-query';
import axios from 'axios';
const fetchStackerNews = async () => {
2025-04-02 17:47:30 -05:00
const response = await axios.get('/api/stackernews');
return response.data.data.items.items;
};
export const useCommunitySearch = () => {
2025-04-02 17:47:30 -05:00
const [searchResults, setSearchResults] = useState([]);
const { data: discordData } = useDiscordQuery({ page: 1 });
const { communityNotes: nostrData } = useCommunityNotes();
const { data: stackerNewsData } = useQuery({
queryKey: ['stackerNews'],
queryFn: fetchStackerNews,
});
const searchCommunity = term => {
if (term.length < 3) {
setSearchResults([]);
return;
}
const lowercaseTerm = term.toLowerCase();
// Discord search - match only on message content
2025-04-02 17:47:30 -05:00
const filteredDiscord = (discordData || [])
.filter(message => {
if (!message.content) return false;
return message.content.toLowerCase().includes(lowercaseTerm);
})
.map(message => ({
...message,
type: 'discord',
_matches: {
content: {
text: message.content,
term: lowercaseTerm
}
}
}));
2025-04-02 17:47:30 -05:00
// Nostr search - match only on message content
2025-04-02 17:47:30 -05:00
const filteredNostr = (nostrData || [])
.filter(message => {
if (!message.content) return false;
return message.content.toLowerCase().includes(lowercaseTerm);
})
.map(message => ({
...message,
type: 'nostr',
_matches: {
content: {
text: message.content,
term: lowercaseTerm
}
}
}));
2025-04-02 17:47:30 -05:00
// StackerNews search - match only on title
2025-04-02 17:47:30 -05:00
const filteredStackerNews = (stackerNewsData || [])
.filter(item => {
if (!item.title) return false;
return item.title.toLowerCase().includes(lowercaseTerm);
})
.map(item => ({
...item,
type: 'stackernews',
_matches: {
title: {
text: item.title,
term: lowercaseTerm
}
}
}));
2025-04-02 17:47:30 -05:00
// Combine and sort the results
2025-04-02 17:47:30 -05:00
const combinedResults = [...filteredDiscord, ...filteredNostr, ...filteredStackerNews].sort(
(a, b) => {
// Get timestamps in a consistent format (milliseconds)
const getTimestamp = item => {
if (item.type === 'nostr') {
return item.created_at * 1000;
} else if (item.type === 'discord') {
return new Date(item.timestamp).getTime();
} else if (item.type === 'stackernews') {
return new Date(item.createdAt).getTime();
}
return 0;
};
return getTimestamp(b) - getTimestamp(a);
2025-04-02 17:47:30 -05:00
}
);
setSearchResults(combinedResults);
};
return { searchCommunity, searchResults };
};