import type { Article } from '@/types/nostr' export type SortOption = 'newest' | 'oldest' | 'price-low' | 'price-high' export interface ArticleFilters { authorPubkey: string | null minPrice: number | null maxPrice: number | null sortBy: SortOption category: 'science-fiction' | 'scientific-research' | 'all' | null } interface ArticleFiltersProps { filters: ArticleFilters onFiltersChange: (filters: ArticleFilters) => void articles: Article[] } interface FiltersData { authors: string[] minAvailablePrice: number maxAvailablePrice: number } function useFiltersData(articles: Article[]): FiltersData { const authors = Array.from(new Map(articles.map((a) => [a.pubkey, a.pubkey])).values()) const prices = articles.map((a) => a.zapAmount).sort((a, b) => a - b) return { authors, minAvailablePrice: prices[0] ?? 0, maxAvailablePrice: prices[prices.length - 1] ?? 1000, } } function FiltersGrid({ data, filters, onFiltersChange, }: { data: FiltersData filters: ArticleFilters onFiltersChange: (filters: ArticleFilters) => void }) { const update = (patch: Partial) => onFiltersChange({ ...filters, ...patch }) return (
update({ authorPubkey: value })} /> update({ minPrice: value })} /> update({ maxPrice: value })} /> update({ sortBy: value })} />
) } function FiltersHeader({ hasActiveFilters, onClear, }: { hasActiveFilters: boolean onClear: () => void }) { return (

Filters & Sort

{hasActiveFilters && ( )}
) } function AuthorFilter({ authors, value, onChange, }: { authors: string[] value: string | null onChange: (value: string | null) => void }) { return (
) } function PriceFilter({ label, id, placeholder, value, min, max, onChange, }: { label: string id: string placeholder: string value: number | null min: number max: number onChange: (value: number | null) => void }) { return (
onChange(e.target.value === '' ? null : parseInt(e.target.value, 10))} placeholder={placeholder} className="block w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
) } function SortFilter({ value, onChange, }: { value: SortOption onChange: (value: SortOption) => void }) { return (
) } export function ArticleFiltersComponent({ filters, onFiltersChange, articles, }: ArticleFiltersProps) { const data = useFiltersData(articles) const handleClearFilters = () => { onFiltersChange({ authorPubkey: null, minPrice: null, maxPrice: null, sortBy: 'newest', category: 'all', }) } const hasActiveFilters = filters.authorPubkey !== null || filters.minPrice !== null || filters.maxPrice !== null || filters.sortBy !== 'newest' || filters.category !== 'all' return (
) }