2024-09-13 18:52:33 -05:00
|
|
|
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;
|
2024-09-13 18:52:33 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
2025-04-27 12:10:08 -05:00
|
|
|
// Discord search
|
2025-04-02 17:47:30 -05:00
|
|
|
const filteredDiscord = (discordData || [])
|
2025-04-27 12:10:08 -05:00
|
|
|
.filter(message => {
|
|
|
|
if (!message.content) return false;
|
|
|
|
return message.content.toLowerCase().includes(lowercaseTerm);
|
|
|
|
})
|
2025-04-02 17:47:30 -05:00
|
|
|
.map(message => ({ ...message, type: 'discord' }));
|
|
|
|
|
2025-04-27 12:10:08 -05:00
|
|
|
// Nostr search
|
2025-04-02 17:47:30 -05:00
|
|
|
const filteredNostr = (nostrData || [])
|
2025-04-27 12:10:08 -05:00
|
|
|
.filter(message => {
|
|
|
|
if (!message.content) return false;
|
|
|
|
return message.content.toLowerCase().includes(lowercaseTerm);
|
|
|
|
})
|
2025-04-02 17:47:30 -05:00
|
|
|
.map(message => ({ ...message, type: 'nostr' }));
|
|
|
|
|
2025-04-27 12:10:08 -05:00
|
|
|
// StackerNews search
|
2025-04-02 17:47:30 -05:00
|
|
|
const filteredStackerNews = (stackerNewsData || [])
|
2025-04-27 12:10:08 -05:00
|
|
|
.filter(item => {
|
|
|
|
if (!item.title) return false;
|
|
|
|
return item.title.toLowerCase().includes(lowercaseTerm);
|
|
|
|
})
|
2025-04-02 17:47:30 -05:00
|
|
|
.map(item => ({ ...item, type: 'stackernews' }));
|
|
|
|
|
2025-04-27 12:10:08 -05:00
|
|
|
// Combine and sort the results
|
2025-04-02 17:47:30 -05:00
|
|
|
const combinedResults = [...filteredDiscord, ...filteredNostr, ...filteredStackerNews].sort(
|
|
|
|
(a, b) => {
|
2025-04-27 12:10:08 -05:00
|
|
|
// 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 };
|
|
|
|
};
|