import React, { createContext, useContext, useState, ReactNode } from 'react'; import { Task, UserStory, Sprint } from '../types'; interface AppContextType { tasks: Task[]; userStories: UserStory[]; sprints: Sprint[]; activeSprint: Sprint | null; addTask: (task: Omit) => void; updateTask: (id: string, updates: Partial) => void; deleteTask: (id: string) => void; addComment: (taskId: string, comment: string, author: string) => void; addUserStory: (story: Omit) => void; updateUserStory: (id: string, updates: Partial) => void; reorderUserStories: (stories: UserStory[]) => void; addSprint: (sprint: Omit) => void; updateSprint: (id: string, updates: Partial) => void; closeSprint: (id: string) => void; setActiveSprint: (sprint: Sprint) => void; } const AppContext = createContext(undefined); export const useApp = () => { const context = useContext(AppContext); if (!context) { throw new Error('useApp must be used within AppProvider'); } return context; }; const mockUserStories: UserStory[] = [ { id: 'us-1', title: 'User Authentication', description: 'As a user, I want to log in securely', storyPoints: 5, businessValue: 8, acceptanceCriteria: 'User can login with email and password', status: 'in-sprint', priority: 1, sprintId: 'sprint-1' }, { id: 'us-2', title: 'Dashboard View', description: 'As a user, I want to see my dashboard', storyPoints: 8, businessValue: 9, acceptanceCriteria: 'Dashboard shows key metrics and recent activity', status: 'in-sprint', priority: 2, sprintId: 'sprint-1' }, { id: 'us-3', title: 'Data Export', description: 'As a user, I want to export my data', storyPoints: 3, businessValue: 5, acceptanceCriteria: 'User can export data in CSV format', status: 'sprint-ready', priority: 3 } ]; const mockSprint: Sprint = { id: 'sprint-1', name: 'Sprint 1', goal: 'Deliver core authentication and dashboard features', startDate: new Date('2025-10-13'), endDate: new Date('2025-10-27'), capacity: 40, status: 'active', userStories: ['us-1', 'us-2'] }; const mockTasks: Task[] = [ { id: 'task-1', title: 'Design login form', description: 'Create mockups for the login interface', timeComplexity: '4 hours', status: 'done', userStoryId: 'us-1', comments: [ { id: 'c-1', text: 'Mockups look great!', author: 'Jane Smith', timestamp: new Date('2025-10-14') } ], createdAt: new Date('2025-10-13'), updatedAt: new Date('2025-10-14') }, { id: 'task-2', title: 'Implement authentication API', description: 'Set up backend authentication endpoints', timeComplexity: '8 hours', status: 'in-progress', userStoryId: 'us-1', comments: [], createdAt: new Date('2025-10-13'), updatedAt: new Date('2025-10-15') }, { id: 'task-3', title: 'Create dashboard layout', description: 'Build responsive dashboard layout', timeComplexity: '6 hours', status: 'todo', userStoryId: 'us-2', comments: [], createdAt: new Date('2025-10-13'), updatedAt: new Date('2025-10-13') } ]; export const AppProvider = ({ children }: { children: ReactNode }) => { const [tasks, setTasks] = useState(mockTasks); const [userStories, setUserStories] = useState(mockUserStories); const [sprints, setSprints] = useState([mockSprint]); const [activeSprint, setActiveSprintState] = useState(mockSprint); const addTask = (taskData: Omit) => { const newTask: Task = { ...taskData, id: `task-${Date.now()}`, comments: [], createdAt: new Date(), updatedAt: new Date() }; setTasks([...tasks, newTask]); }; const updateTask = (id: string, updates: Partial) => { setTasks(tasks.map(task => task.id === id ? { ...task, ...updates, updatedAt: new Date() } : task )); }; const deleteTask = (id: string) => { setTasks(tasks.filter(task => task.id !== id)); }; const addComment = (taskId: string, text: string, author: string) => { setTasks(tasks.map(task => { if (task.id === taskId) { return { ...task, comments: [ ...task.comments, { id: `c-${Date.now()}`, text, author, timestamp: new Date() } ], updatedAt: new Date() }; } return task; })); }; const addUserStory = (storyData: Omit) => { const newStory: UserStory = { ...storyData, id: `us-${Date.now()}` }; setUserStories([...userStories, newStory]); }; const updateUserStory = (id: string, updates: Partial) => { setUserStories(userStories.map(story => story.id === id ? { ...story, ...updates } : story )); }; const reorderUserStories = (stories: UserStory[]) => { setUserStories(stories); }; const addSprint = (sprintData: Omit) => { const newSprint: Sprint = { ...sprintData, id: `sprint-${Date.now()}` }; setSprints([...sprints, newSprint]); }; const updateSprint = (id: string, updates: Partial) => { setSprints(sprints.map(sprint => sprint.id === id ? { ...sprint, ...updates } : sprint )); if (activeSprint?.id === id) { setActiveSprintState(prev => prev ? { ...prev, ...updates } : null); } }; const closeSprint = (id: string) => { // Move unfinished items back to backlog const sprint = sprints.find(s => s.id === id); if (sprint) { setUserStories(userStories.map(story => { if (story.sprintId === id) { return { ...story, status: 'backlog', sprintId: undefined }; } return story; })); setSprints(sprints.map(s => s.id === id ? { ...s, status: 'closed' as const } : s )); if (activeSprint?.id === id) { setActiveSprintState(null); } } }; const setActiveSprint = (sprint: Sprint) => { setActiveSprintState(sprint); }; return ( {children} ); };