import React from 'react' import type { Article } from '@/types/nostr' import { t } from '@/lib/i18n' import { AuthorFilter } from './AuthorFilter' export type SortOption = 'newest' | 'oldest' export interface ArticleFilters { authorPubkey: string | null sortBy: SortOption category: 'science-fiction' | 'scientific-research' | 'all' | null } interface ArticleFiltersProps { filters: ArticleFilters onFiltersChange: (filters: ArticleFilters) => void articles: Article[] } interface FiltersData { authors: string[] } function useFiltersData(articles: Article[]): FiltersData { const authorArticleCount = new Map() articles.forEach((article) => { if (!article.isPresentation) { const count = authorArticleCount.get(article.pubkey) ?? 0 authorArticleCount.set(article.pubkey, count + 1) } }) const authors = Array.from(authorArticleCount.keys()).filter((pubkey) => { const count = authorArticleCount.get(pubkey) ?? 0 return count > 0 }) return { authors, } } 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({ sortBy: value })} />
) } function FiltersHeader({ hasActiveFilters, onClear, }: { hasActiveFilters: boolean onClear: () => void }) { return (

{t('filters.sort')}

{hasActiveFilters && ( )}
) } 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, sortBy: 'newest', category: null, }) } const hasActiveFilters = filters.authorPubkey !== null || filters.sortBy !== 'newest' || filters.category !== null return (
) }