import React, { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { ArrowLeft, Plus, Trash2, Tag } from 'lucide-react' import { useStoryStore } from '../../store/storyStore' import { useUIStore } from '../../store/uiStore' import { Button } from '../../components/ui/Button' import { Modal } from '../../components/ui/Modal' import { Genre } from '../../types' export const AdminGenresPage: React.FC = () => { const navigate = useNavigate() const { genres, fetchGenres, addGenre, deleteGenre } = useStoryStore() const { addToast } = useUIStore() const [addOpen, setAddOpen] = useState(false) const [newName, setNewName] = useState('') const [deleteTarget, setDeleteTarget] = useState(null) useEffect(() => { fetchGenres() }, []) const handleAdd = async () => { if (!newName.trim()) return if (genres.some(g => g.name.toLowerCase() === newName.trim().toLowerCase())) { addToast('Genre already exists', 'error') return } try { await addGenre(newName.trim()) addToast(`Genre "${newName.trim()}" added!`) setNewName('') setAddOpen(false) } catch { addToast('Failed to add genre', 'error') } } const handleDelete = async (genre: Genre) => { try { await deleteGenre(genre.genre_id) addToast(`Genre "${genre.name}" deleted`, 'info') } catch { addToast('Failed to delete genre', 'error') } setDeleteTarget(null) } return (

Manage Genres

{genres.length} genres

All Genres

{genres.map(genre => (
{genre.name}
{genre.story_count} stories
))}
{/* Add modal */} setAddOpen(false)} title="Add Genre" size="sm">
setNewName(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleAdd()} placeholder="e.g., Dystopia..." className="w-full px-4 py-3 bg-slate-800 border border-slate-700 rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500" />
{/* Delete confirm */} setDeleteTarget(null)} title="Delete Genre" size="sm"> {deleteTarget && (

Delete the genre "{deleteTarget.name}"? This action cannot be undone.

)}
) }