story-research-zapwall/lib/articleFiltering.ts
2025-12-22 09:48:57 +01:00

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
}