'use client' import { useEffect, useState } from 'react' interface RoadmapItem { phase: string title: string status: 'complete' | 'in-progress' | 'planned' description: string impact: string completed?: string items?: string[] } export default function RoadmapPage() { const [roadmap, setRoadmap] = useState([]) const [loading, setLoading] = useState(true) const [expandedItems, setExpandedItems] = useState>(new Set()) const [showCompleted, setShowCompleted] = useState(false) useEffect(() => { fetchRoadmap() }, []) const fetchRoadmap = async () => { try { const response = await fetch('/api/roadmap') const data = await response.json() setRoadmap(data.roadmap || []) // Auto-expand only non-complete items by default const autoExpand = new Set() data.roadmap?.forEach((item: RoadmapItem, index: number) => { if (item.status !== 'complete') { autoExpand.add(index) } }) setExpandedItems(autoExpand) } catch (error) { console.error('Failed to fetch roadmap:', error) } finally { setLoading(false) } } const toggleItem = (index: number) => { const newExpanded = new Set(expandedItems) if (newExpanded.has(index)) { newExpanded.delete(index) } else { newExpanded.add(index) } setExpandedItems(newExpanded) } const getStatusColor = (status: string) => { switch (status) { case 'complete': return 'bg-green-500/20 text-green-400 border-green-500/30' case 'in-progress': return 'bg-blue-500/20 text-blue-400 border-blue-500/30' case 'planned': return 'bg-gray-500/20 text-gray-400 border-gray-500/30' default: return 'bg-gray-500/20 text-gray-400 border-gray-500/30' } } const getStatusIcon = (status: string) => { switch (status) { case 'complete': return 'βœ…' case 'in-progress': return 'πŸ”„' case 'planned': return 'πŸ“‹' default: return '❓' } } const stats = { total: roadmap.length, complete: roadmap.filter(item => item.status === 'complete').length, inProgress: roadmap.filter(item => item.status === 'in-progress').length, planned: roadmap.filter(item => item.status === 'planned').length, } const completionRate = stats.total > 0 ? Math.round((stats.complete / stats.total) * 100) : 0 if (loading) { return (
Loading roadmap...
) } return (
{/* Header */}

πŸ—ΊοΈ Trading Bot Roadmap

Back to Home

Track development progress and upcoming features

{/* Stats Overview */}
Total Items
{stats.total}
βœ… Completed
{stats.complete}
πŸ”„ In Progress
{stats.inProgress}
πŸ“‹ Planned
{stats.planned}
{/* Progress Bar */}
Overall Completion
{completionRate}%
{/* Roadmap Items */}
{/* Completed Tasks Section */} {stats.complete > 0 && (
{showCompleted && (
{roadmap .map((item, index) => ({ item, index })) .filter(({ item }) => item.status === 'complete') .map(({ item, index }) => { const isExpanded = expandedItems.has(index) return (
toggleItem(index)} >
{getStatusIcon(item.status)}

{item.title}

{item.phase}

{item.description}

{item.completed && (
βœ“ Completed: {item.completed}
)}
{isExpanded && (
Expected Impact
{item.impact}
{item.items && item.items.length > 0 && (
Implementation Details:
    {item.items.map((subItem, subIndex) => (
  • β€’ {subItem}
  • ))}
)}
)}
) })}
)}
)} {/* In-Progress and Planned Tasks */}
{roadmap .map((item, index) => ({ item, index })) .filter(({ item }) => item.status !== 'complete') .map(({ item, index }) => { const isExpanded = expandedItems.has(index) return (
toggleItem(index)} >
{getStatusIcon(item.status)}

{item.title}

{item.phase}

{item.description}

{item.completed && (
βœ“ Completed: {item.completed}
)}
{isExpanded && (
Expected Impact
{item.impact}
{item.items && item.items.length > 0 && (
Implementation Details:
    {item.items.map((subItem, subIndex) => (
  • β€’ {subItem}
  • ))}
)}
)}
) })}
{/* Footer */}

Last updated: {new Date().toLocaleDateString()} β€’ Trading Bot v4

) }