import React from 'react' import { useNavigate } from 'react-router-dom' import { Plus, BookOpen, Eye, Heart, MessageCircle, TrendingUp, Bell } from 'lucide-react' import { useAuthStore } from '../../store/authStore' import { useStoryStore } from '../../store/storyStore' import { useNotificationStore } from '../../store/notificationStore' import { Button } from '../../components/ui/Button' import { StatusBadge } from '../../components/ui/Badge' import { StoryAnalytics } from '../../components/writer/StoryAnalytics' function timeAgo(str: string): string { const diff = Date.now() - new Date(str).getTime() const m = Math.floor(diff / 60000) if (m < 1) return 'just now' if (m < 60) return `${m}m ago` const h = Math.floor(m / 60) if (h < 24) return `${h}h ago` return `${Math.floor(h / 24)}d ago` } export const WriterDashboard: React.FC = () => { const navigate = useNavigate() const { currentUser } = useAuthStore() const { stories, collaborations } = useStoryStore() const { notifications } = useNotificationStore() if (!currentUser) return null const ownedStories = stories.filter(s => s.user_id === currentUser.user_id) const collabStoryIds = new Set(collaborations.filter(c => c.user_id === currentUser.user_id).map(c => c.story_id)) const collabStories = stories.filter(s => collabStoryIds.has(s.story_id)) const myStories = ownedStories const allDashboardStories = [...ownedStories, ...collabStories] const published = myStories.filter(s => s.status === 'published') const drafts = myStories.filter(s => s.status === 'draft') const totalViews = myStories.reduce((acc, s) => acc + s.total_views, 0) const totalLikes = myStories.reduce((acc, s) => acc + s.total_likes, 0) const recentNotifs = notifications.slice(0, 5) return (
{/* Header */}

Welcome back, {currentUser.name}!

Here's how your stories are performing

{/* Stats */}
{[ { icon: , label: 'Total Stories', value: myStories.length, sub: `${published.length} published`, color: 'bg-indigo-500/20' }, { icon: , label: 'Total Views', value: totalViews.toLocaleString(), sub: 'All time', color: 'bg-blue-500/20' }, { icon: , label: 'Total Likes', value: totalLikes.toLocaleString(), sub: 'Across all stories', color: 'bg-rose-500/20' }, { icon: , label: 'Drafts', value: drafts.length, sub: 'In progress', color: 'bg-emerald-500/20' }, ].map(s => (
{s.icon}

{s.value}

{s.label}

{s.sub}

))}
{/* My stories */}

My Stories

{allDashboardStories.length === 0 ? (

No stories yet

Start your writing journey today!

) : (
{allDashboardStories.map(story => { const isCollab = collabStoryIds.has(story.story_id) return (

{story.title}

{isCollab && ( Collaborator )}
{isCollab && by {story.author_username}} {story.total_views.toLocaleString()} {story.total_likes} {story.total_comments} {story.total_chapters} chapters
) })}
)}
{/* Recent notifications */}

Recent Activity

{recentNotifs.length === 0 ? (
No recent activity
) : ( recentNotifs.map(n => (

{n.title}

{n.message}

{timeAgo(n.created_at)}

)) )}
{/* Analytics */} {myStories.some(s => s.status === 'published') && (

Analytics

(Story: The Chronicles of Eldoria)
)}
) }