92 lines
2.3 KiB
TypeScript
92 lines
2.3 KiB
TypeScript
import type { Article } from '@/types/nostr'
|
|
import type { ArticleFilters, SortOption } from '@/components/ArticleFilters'
|
|
|
|
/**
|
|
* Filter articles based on search query
|
|
*/
|
|
export function filterArticlesBySearch(articles: Article[], searchQuery: string): Article[] {
|
|
if (!searchQuery.trim()) {
|
|
return articles
|
|
}
|
|
|
|
const query = searchQuery.toLowerCase().trim()
|
|
|
|
return articles.filter((article) => {
|
|
const titleMatch = article.title.toLowerCase().includes(query)
|
|
const previewMatch = article.preview.toLowerCase().includes(query)
|
|
const contentMatch = article.content.toLowerCase().includes(query)
|
|
|
|
return titleMatch || previewMatch || contentMatch
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Filter articles based on filters (author, price)
|
|
*/
|
|
export function filterArticles(articles: Article[], filters: ArticleFilters): Article[] {
|
|
let filtered = articles
|
|
|
|
// Filter by author
|
|
if (filters.authorPubkey) {
|
|
filtered = filtered.filter((article) => article.pubkey === filters.authorPubkey)
|
|
}
|
|
|
|
// Filter by min price
|
|
if (filters.minPrice !== null) {
|
|
filtered = filtered.filter((article) => article.zapAmount >= filters.minPrice!)
|
|
}
|
|
|
|
// Filter by max price
|
|
if (filters.maxPrice !== null) {
|
|
filtered = filtered.filter((article) => article.zapAmount <= filters.maxPrice!)
|
|
}
|
|
|
|
return filtered
|
|
}
|
|
|
|
/**
|
|
* Sort articles based on sort option
|
|
*/
|
|
export function sortArticles(articles: Article[], sortBy: SortOption): Article[] {
|
|
const sorted = [...articles]
|
|
|
|
switch (sortBy) {
|
|
case 'newest':
|
|
return sorted.sort((a, b) => b.createdAt - a.createdAt)
|
|
|
|
case 'oldest':
|
|
return sorted.sort((a, b) => a.createdAt - b.createdAt)
|
|
|
|
case 'price-low':
|
|
return sorted.sort((a, b) => a.zapAmount - b.zapAmount)
|
|
|
|
case 'price-high':
|
|
return sorted.sort((a, b) => b.zapAmount - a.zapAmount)
|
|
|
|
default:
|
|
return sorted.sort((a, b) => b.createdAt - a.createdAt)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Apply all filters and sorting to articles
|
|
*/
|
|
export function applyFiltersAndSort(
|
|
articles: Article[],
|
|
searchQuery: string,
|
|
filters: ArticleFilters
|
|
): Article[] {
|
|
let result = articles
|
|
|
|
// First apply search filter
|
|
result = filterArticlesBySearch(result, searchQuery)
|
|
|
|
// Then apply other filters
|
|
result = filterArticles(result, filters)
|
|
|
|
// Finally apply sorting
|
|
result = sortArticles(result, filters.sortBy)
|
|
|
|
return result
|
|
}
|