import React, { useState, useRef } from 'react' import { useNavigate } from 'react-router-dom' import { Feather, ArrowLeft, X } from 'lucide-react' import { useAuthStore } from '../../store/authStore' import { useStoryStore } from '../../store/storyStore' import { useUIStore } from '../../store/uiStore' import { Button } from '../../components/ui/Button' import { StoryCreationAIPanel, StoryCreationAIPanelRef } from '../../components/writer/StoryCreationAIPanel' import { Story } from '../../types' const ALL_GENRES = ['Fantasy', 'Sci-Fi', 'Romance', 'Historical Fiction', 'Adventure', 'Thriller', 'Mystery', 'Horror', 'Contemporary', 'Poetry'] export const CreateStoryPage: React.FC = () => { const navigate = useNavigate() const { currentUser } = useAuthStore() const { addStory, addSuggestion } = useStoryStore() const { addToast } = useUIStore() const aiPanelRef = useRef(null) const [form, setForm] = useState({ title: '', short_description: '', content: '', cover_image: '', genres: [] as string[], mature_content: false, }) const [errors, setErrors] = useState>({}) const [loading, setLoading] = useState(false) const validate = () => { const e: Record = {} if (!form.title.trim()) e.title = 'Title is required' if (!form.short_description.trim()) e.short_description = 'Description is required' if (form.short_description.length > 280) e.short_description = 'Max 280 characters' if (!form.content.trim()) e.content = 'Story content is required' if (form.genres.length === 0) e.genres = 'Select at least one genre' setErrors(e) return Object.keys(e).length === 0 } const handleSubmit = async (status: 'draft' | 'published') => { if (!validate() || !currentUser) return setLoading(true) await new Promise(r => setTimeout(r, 500)) const story: Story = { story_id: Date.now(), ...form, cover_image: form.cover_image || undefined, user_id: currentUser.user_id, author_username: currentUser.username, status, created_at: new Date().toISOString(), updated_at: new Date().toISOString(), total_likes: 0, total_comments: 0, total_chapters: 0, total_views: 0, } let realId: number try { realId = await addStory(story) } catch (err: any) { const msg = err?.response?.data?.message || err?.message || 'Failed to save story.' addToast(msg, 'error') setLoading(false) return } addToast(status === 'published' ? 'Story published!' : 'Draft saved!') navigate(`/writer/edit-story/${realId}`) setLoading(false) } const toggleGenre = (g: string) => { setForm(f => ({ ...f, genres: f.genres.includes(g) ? f.genres.filter(x => x !== g) : [...f.genres, g], })) setErrors(e => ({ ...e, genres: '' })) } const setField = (field: string, value: string | boolean) => { setForm(f => ({ ...f, [field]: value })) setErrors(e => ({ ...e, [field]: '' })) } return (

Create New Story

Tell your story to the world

{/* Title */}
setField('title', e.target.value)} placeholder="The Chronicles of Eldoria..." className={`w-full px-4 py-3 bg-slate-800 border rounded-xl text-white placeholder-slate-500 focus:outline-none focus:border-indigo-500 text-lg font-serif ${errors.title ? 'border-rose-500' : 'border-slate-700'}`} /> {errors.title &&

{errors.title}

}
{/* Short description */}