00Boobs00 commited on
Commit
2cb0c17
·
verified ·
1 Parent(s): 3054d55

Upload pages/index.js with huggingface_hub

Browse files
Files changed (1) hide show
  1. pages/index.js +231 -0
pages/index.js ADDED
@@ -0,0 +1,231 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect, useContext } from 'react';
2
+ import Head from 'next/head';
3
+ import {
4
+ LayoutDashboard,
5
+ FolderKanban,
6
+ CheckSquare,
7
+ Users,
8
+ Settings,
9
+ Bell,
10
+ Search,
11
+ Menu,
12
+ Moon,
13
+ Sun,
14
+ Plus,
15
+ TrendingUp,
16
+ TrendingDown,
17
+ DollarSign,
18
+ Activity,
19
+ Calendar,
20
+ MoreHorizontal,
21
+ ChevronRight,
22
+ Filter,
23
+ Download,
24
+ RefreshCw
25
+ } from 'lucide-react';
26
+ import { ThemeContext } from './_app';
27
+ import Sidebar from '@/components/Sidebar';
28
+ import Header from '@/components/Header';
29
+ import StatCard from '@/components/StatCard';
30
+ import RevenueChart from '@/components/RevenueChart';
31
+ import ProjectTable from '@/components/ProjectTable';
32
+ import TaskBoard from '@/components/TaskBoard';
33
+ import TeamPerformance from '@/components/TeamPerformance';
34
+ import RecentActivity from '@/components/RecentActivity';
35
+
36
+ export default function Home() {
37
+ const { darkMode, toggleTheme } = useContext(ThemeContext);
38
+ const [sidebarOpen, setSidebarOpen] = useState(false);
39
+ const [loading, setLoading] = useState(true);
40
+ const [stats, setStats] = useState(null);
41
+ const [projects, setProjects] = useState([]);
42
+
43
+ // Fetch initial data
44
+ useEffect(() => {
45
+ const fetchData = async () => {
46
+ try {
47
+ // Simulate API delay
48
+ await new Promise(resolve => setTimeout(resolve, 1000));
49
+
50
+ const statsRes = await fetch('/api/stats');
51
+ const statsData = await statsRes.json();
52
+ setStats(statsData);
53
+
54
+ const projectsRes = await fetch('/api/projects');
55
+ const projectsData = await projectsRes.json();
56
+ setProjects(projectsData);
57
+ } catch (error) {
58
+ console.error('Error fetching data:', error);
59
+ } finally {
60
+ setLoading(false);
61
+ }
62
+ };
63
+
64
+ fetchData();
65
+ }, []);
66
+
67
+ return (
68
+ <div className={`min-h-screen flex ${darkMode ? 'dark' : ''}`}>
69
+ {/* Mobile Sidebar Overlay */}
70
+ {sidebarOpen && (
71
+ <div
72
+ className="fixed inset-0 z-40 bg-gray-600 bg-opacity-75 lg:hidden"
73
+ onClick={() => setSidebarOpen(false)}
74
+ ></div>
75
+ )}
76
+
77
+ {/* Sidebar */}
78
+ <Sidebar
79
+ isOpen={sidebarOpen}
80
+ onClose={() => setSidebarOpen(false)}
81
+ />
82
+
83
+ {/* Main Content */}
84
+ <div className="flex-1 flex flex-col lg:pl-64 transition-all duration-300">
85
+ {/* Top Header */}
86
+ <Header
87
+ onMenuClick={() => setSidebarOpen(true)}
88
+ onThemeToggle={toggleTheme}
89
+ isDark={darkMode}
90
+ />
91
+
92
+ {/* Main Page Content */}
93
+ <main className="flex-1 p-4 lg:p-8 overflow-y-auto">
94
+ <div className="max-w-7xl mx-auto space-y-8">
95
+
96
+ {/* Welcome Section */}
97
+ <div className="flex flex-col md:flex-row md:items-center md:justify-between">
98
+ <div>
99
+ <h1 className="text-3xl font-bold text-gray-900 dark:text-white">
100
+ Dashboard Overview
101
+ </h1>
102
+ <p className="mt-1 text-sm text-gray-500 dark:text-gray-400">
103
+ Welcome back, here's what's happening today.
104
+ </p>
105
+ </div>
106
+ <div className="mt-4 md:mt-0 flex space-x-3">
107
+ <button className="btn btn-secondary flex items-center">
108
+ <RefreshCw className="w-4 h-4 mr-2" />
109
+ Refresh
110
+ </button>
111
+ <button className="btn btn-primary flex items-center">
112
+ <Plus className="w-4 h-4 mr-2" />
113
+ New Project
114
+ </button>
115
+ </div>
116
+ </div>
117
+
118
+ {/* Stats Grid */}
119
+ {loading ? (
120
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
121
+ {[1, 2, 3, 4].map((i) => (
122
+ <div key={i} className="h-32 bg-gray-200 dark:bg-gray-700 rounded-lg animate-pulse"></div>
123
+ ))}
124
+ </div>
125
+ ) : (
126
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
127
+ <StatCard
128
+ title="Total Revenue"
129
+ value={stats?.revenue}
130
+ change="+12.5%"
131
+ positive={true}
132
+ icon={<DollarSign className="w-6 h-6 text-primary-600" />}
133
+ />
134
+ <StatCard
135
+ title="Active Projects"
136
+ value={stats?.projects}
137
+ change="+2.4%"
138
+ positive={true}
139
+ icon={<FolderKanban className="w-6 h-6 text-green-600" />}
140
+ />
141
+ <StatCard
142
+ title="Tasks Completed"
143
+ value={stats?.tasks}
144
+ change="-0.8%"
145
+ positive={false}
146
+ icon={<CheckSquare className="w-6 h-6 text-blue-600" />}
147
+ />
148
+ <StatCard
149
+ title="Team Velocity"
150
+ value={stats?.velocity}
151
+ change="+5.2%"
152
+ positive={true}
153
+ icon={<Activity className="w-6 h-6 text-purple-600" />}
154
+ />
155
+ </div>
156
+ )}
157
+
158
+ {/* Charts Section */}
159
+ <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
160
+ <div className="lg:col-span-2 card">
161
+ <div className="flex items-center justify-between mb-6">
162
+ <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
163
+ Revenue Analytics
164
+ </h3>
165
+ <select className="input-field w-auto py-1 pl-3 pr-8 text-sm">
166
+ <option>Last 7 Days</option>
167
+ <option>Last 30 Days</option>
168
+ <option>This Year</option>
169
+ </select>
170
+ </div>
171
+ <div className="h-80">
172
+ <RevenueChart />
173
+ </div>
174
+ </div>
175
+
176
+ <div className="card">
177
+ <h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-6">
178
+ Team Performance
179
+ </h3>
180
+ <div className="space-y-6">
181
+ <TeamPerformance />
182
+ </div>
183
+ </div>
184
+ </div>
185
+
186
+ {/* Projects and Activity Section */}
187
+ <div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
188
+ <div className="lg:col-span-2 card">
189
+ <div className="flex items-center justify-between mb-6">
190
+ <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
191
+ Current Projects
192
+ </h3>
193
+ <button className="text-sm text-primary-600 hover:text-primary-700 font-medium flex items-center">
194
+ View All <ChevronRight className="w-4 h-4 ml-1" />
195
+ </button>
196
+ </div>
197
+ <ProjectTable projects={projects} loading={loading} />
198
+ </div>
199
+
200
+ <div className="card">
201
+ <h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-6">
202
+ Recent Activity
203
+ </h3>
204
+ <RecentActivity />
205
+ </div>
206
+ </div>
207
+
208
+ {/* Task Board Preview */}
209
+ <div className="card">
210
+ <div className="flex items-center justify-between mb-6">
211
+ <h3 className="text-lg font-semibold text-gray-900 dark:text-white">
212
+ Sprint Task Board
213
+ </h3>
214
+ <div className="flex space-x-2">
215
+ <button className="p-2 text-gray-400 hover:text-gray-500 dark:hover:text-gray-300">
216
+ <Filter className="w-5 h-5" />
217
+ </button>
218
+ <button className="p-2 text-gray-400 hover:text-gray-500 dark:hover:text-gray-300">
219
+ <Download className="w-5 h-5" />
220
+ </button>
221
+ </div>
222
+ </div>
223
+ <TaskBoard />
224
+ </div>
225
+
226
+ </div>
227
+ </main>
228
+ </div>
229
+ </div>
230
+ );
231
+ }