'use client'; import { useState } from 'react'; import { Input } from '../ui/Input'; import Button from '../ui/Button'; import TagDisplay from '../tags/TagDisplay'; import AdvancedFilters from './AdvancedFilters'; import { Story, Tag, AdvancedFilters as AdvancedFiltersType } from '../../types/api'; interface ToolbarLayoutProps { stories: Story[]; tags: Tag[]; totalElements: number; searchQuery: string; selectedTags: string[]; viewMode: 'grid' | 'list'; sortOption: string; sortDirection: 'asc' | 'desc'; advancedFilters?: AdvancedFiltersType; onSearchChange: (e: React.ChangeEvent) => void; onTagToggle: (tagName: string) => void; onViewModeChange: (mode: 'grid' | 'list') => void; onSortChange: (option: string) => void; onSortDirectionToggle: () => void; onAdvancedFiltersChange?: (filters: AdvancedFiltersType) => void; onRandomStory: () => void; onClearFilters: () => void; children: React.ReactNode; } export default function ToolbarLayout({ stories, tags, totalElements, searchQuery, selectedTags, viewMode, sortOption, sortDirection, advancedFilters = {}, onSearchChange, onTagToggle, onViewModeChange, onSortChange, onSortDirectionToggle, onAdvancedFiltersChange, onRandomStory, onClearFilters, children }: ToolbarLayoutProps) { const [filterExpanded, setFilterExpanded] = useState(false); const [activeTab, setActiveTab] = useState<'tags' | 'advanced'>('tags'); const [tagSearch, setTagSearch] = useState(''); const popularTags = tags.slice(0, 6); // Filter remaining tags based on search query const remainingTags = tags.slice(6); const filteredRemainingTags = tagSearch ? remainingTags.filter(tag => tag.name.toLowerCase().includes(tagSearch.toLowerCase())) : remainingTags; const remainingTagsCount = Math.max(0, remainingTags.length); // Count active advanced filters const activeAdvancedFiltersCount = Object.values(advancedFilters).filter(value => value !== undefined && value !== '' && value !== 'all' && value !== false ).length; return (
{/* Integrated Header */}
{/* Title and Random Story Button */}

Your Story Library

{totalElements} stories in your collection

{/* Integrated Toolbar */}
{/* Search */}
{/* Sort */}
{/* View Toggle, Advanced Filters & Clear */}
{/* Advanced Filters Button */} {(searchQuery || selectedTags.length > 0 || activeAdvancedFiltersCount > 0) && ( )}
{/* Filter Section */}
{/* Top row - Popular tags and expand button */}
Popular Tags: {popularTags.map((tag) => (
onTagToggle(tag.name)} className={`cursor-pointer transition-all hover:scale-105 ${ selectedTags.includes(tag.name) ? 'ring-2 ring-blue-500 ring-offset-1' : '' }`} >
))} {/* More Tags Button */} {remainingTagsCount > 0 && ( )}
Showing {stories.length} of {totalElements} stories
{/* Expandable Filter Panel */} {filterExpanded && (
{/* Tab Navigation */}
{/* Tab Content */} {activeTab === 'tags' && (
setTagSearch(e.target.value)} className="flex-1" /> {tagSearch && ( )}
{filteredRemainingTags.length === 0 && tagSearch ? (
No tags match "{tagSearch}"
) : ( filteredRemainingTags.map((tag) => (
onTagToggle(tag.name)} className={`cursor-pointer transition-all hover:scale-105 ${ selectedTags.includes(tag.name) ? 'ring-2 ring-blue-500 ring-offset-1' : '' }`} >
)) )}
)} {activeTab === 'advanced' && onAdvancedFiltersChange && ( onAdvancedFiltersChange({})} /> )} {/* Action buttons */}
{(selectedTags.length > 0 || activeAdvancedFiltersCount > 0) && ( )}
)}
{/* Content */} {children}
); }