import { useMemo, useRef, useState } from 'react' import { useLoaderData, useSearchParams } from 'react-router-dom' import { useLocalStorage } from 'hooks' import { BlogCardDetails, NSFWFilter, SortBy } from 'types' import { SearchInput } from '../../components/SearchInput' import { BlogCard } from '../../components/BlogCard' import '../../styles/filters.css' import '../../styles/pagination.css' import '../../styles/search.css' import '../../styles/styles.css' export const BlogsPage = () => { const blogs = useLoaderData() as Partial[] | undefined const [filterOptions, setFilterOptions] = useLocalStorage('filter-blog', { sort: SortBy.Latest, nsfw: NSFWFilter.Hide_NSFW }) // Search const searchTermRef = useRef(null) const [searchParams, setSearchParams] = useSearchParams() const [searchTerm, setSearchTerm] = useState(searchParams.get('q') || '') const handleSearch = () => { const value = searchTermRef.current?.value || '' // Access the input value from the ref setSearchTerm(value) if (value) { searchParams.set('q', value) } else { searchParams.delete('q') } setSearchParams(searchParams, { replace: true }) } const handleKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Enter') { handleSearch() } } // Filter const filteredBlogs = useMemo(() => { const filterNsfwFn = (blog: Partial) => { switch (filterOptions.nsfw) { case NSFWFilter.Hide_NSFW: return !blog.nsfw case NSFWFilter.Only_NSFW: return blog.nsfw default: return blog } } let filtered = blogs?.filter(filterNsfwFn) || [] const lowerCaseSearchTerm = searchTerm.toLowerCase() if (searchTerm !== '') { const filterSearchTermFn = (blog: Partial) => (blog.title || '').toLowerCase().includes(lowerCaseSearchTerm) || (blog.summary || '').toLowerCase().includes(lowerCaseSearchTerm) || (blog.content || '').toLowerCase().includes(lowerCaseSearchTerm) || (blog.tTags || []).findIndex((tag) => tag.toLowerCase().includes(lowerCaseSearchTerm) ) > -1 filtered = filtered.filter(filterSearchTermFn) } if (filterOptions.sort === SortBy.Latest) { filtered.sort((a, b) => a.published_at && b.published_at ? b.published_at - a.published_at : 0 ) } else if (filterOptions.sort === SortBy.Oldest) { filtered.sort((a, b) => a.published_at && b.published_at ? a.published_at - b.published_at : 0 ) } return filtered }, [blogs, searchTerm, filterOptions.sort, filterOptions.nsfw]) return (

Blogs

{Object.values(SortBy).map((item, index) => (
setFilterOptions((prev) => ({ ...prev, sort: item })) } > {item}
))}
{Object.values(NSFWFilter).map((item, index) => (
setFilterOptions((prev) => ({ ...prev, nsfw: item })) } > {item}
))}
{filteredBlogs && filteredBlogs.map((b) => )}
) }