create-fluxstack 1.0.13 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/.env.example +29 -29
  2. package/app/client/README.md +69 -69
  3. package/app/client/index.html +14 -13
  4. package/app/client/src/App.tsx +157 -524
  5. package/app/client/src/components/ErrorBoundary.tsx +107 -0
  6. package/app/client/src/components/ErrorDisplay.css +365 -0
  7. package/app/client/src/components/ErrorDisplay.tsx +258 -0
  8. package/app/client/src/components/FluxStackConfig.tsx +1321 -0
  9. package/app/client/src/components/HybridLiveCounter.tsx +140 -0
  10. package/app/client/src/components/LiveClock.tsx +286 -0
  11. package/app/client/src/components/MainLayout.tsx +390 -0
  12. package/app/client/src/components/SidebarNavigation.tsx +391 -0
  13. package/app/client/src/components/StateDemo.tsx +178 -0
  14. package/app/client/src/components/SystemMonitor.tsx +1038 -0
  15. package/app/client/src/components/Teste.tsx +104 -0
  16. package/app/client/src/components/UserProfile.tsx +809 -0
  17. package/app/client/src/hooks/useAuth.ts +39 -0
  18. package/app/client/src/hooks/useNotifications.ts +56 -0
  19. package/app/client/src/lib/eden-api.ts +189 -53
  20. package/app/client/src/lib/errors.ts +340 -0
  21. package/app/client/src/lib/hooks/useErrorHandler.ts +258 -0
  22. package/app/client/src/lib/index.ts +45 -0
  23. package/app/client/src/main.tsx +3 -2
  24. package/app/client/src/pages/ApiDocs.tsx +182 -0
  25. package/app/client/src/pages/Demo.tsx +174 -0
  26. package/app/client/src/pages/HybridLive.tsx +263 -0
  27. package/app/client/src/pages/Overview.tsx +155 -0
  28. package/app/client/src/store/README.md +43 -0
  29. package/app/client/src/store/index.ts +16 -0
  30. package/app/client/src/store/slices/uiSlice.ts +151 -0
  31. package/app/client/src/store/slices/userSlice.ts +161 -0
  32. package/app/client/src/test/README.md +257 -0
  33. package/app/client/src/test/setup.ts +70 -0
  34. package/app/client/src/test/types.ts +12 -0
  35. package/app/client/src/vite-env.d.ts +1 -1
  36. package/app/client/tsconfig.app.json +44 -43
  37. package/app/client/tsconfig.json +7 -7
  38. package/app/client/tsconfig.node.json +25 -25
  39. package/app/client/zustand-setup.md +65 -0
  40. package/app/server/controllers/users.controller.ts +68 -68
  41. package/app/server/index.ts +9 -1
  42. package/app/server/live/CounterComponent.ts +191 -0
  43. package/app/server/live/FluxStackConfig.ts +529 -0
  44. package/app/server/live/LiveClockComponent.ts +214 -0
  45. package/app/server/live/SidebarNavigation.ts +156 -0
  46. package/app/server/live/SystemMonitor.ts +594 -0
  47. package/app/server/live/SystemMonitorIntegration.ts +151 -0
  48. package/app/server/live/TesteComponent.ts +87 -0
  49. package/app/server/live/UserProfileComponent.ts +135 -0
  50. package/app/server/live/register-components.ts +28 -0
  51. package/app/server/middleware/auth.ts +136 -0
  52. package/app/server/middleware/errorHandling.ts +250 -0
  53. package/app/server/middleware/index.ts +10 -0
  54. package/app/server/middleware/rateLimit.ts +193 -0
  55. package/app/server/middleware/requestLogging.ts +215 -0
  56. package/app/server/middleware/validation.ts +270 -0
  57. package/app/server/routes/index.ts +14 -2
  58. package/app/server/routes/upload.ts +92 -0
  59. package/app/server/routes/users.routes.ts +2 -9
  60. package/app/server/services/NotificationService.ts +302 -0
  61. package/app/server/services/UserService.ts +222 -0
  62. package/app/server/services/index.ts +46 -0
  63. package/core/cli/commands/plugin-deps.ts +263 -0
  64. package/core/cli/generators/README.md +339 -0
  65. package/core/cli/generators/component.ts +770 -0
  66. package/core/cli/generators/controller.ts +299 -0
  67. package/core/cli/generators/index.ts +144 -0
  68. package/core/cli/generators/interactive.ts +228 -0
  69. package/core/cli/generators/prompts.ts +83 -0
  70. package/core/cli/generators/route.ts +513 -0
  71. package/core/cli/generators/service.ts +465 -0
  72. package/core/cli/generators/template-engine.ts +154 -0
  73. package/core/cli/generators/types.ts +71 -0
  74. package/core/cli/generators/utils.ts +192 -0
  75. package/core/cli/index.ts +69 -0
  76. package/core/cli/plugin-discovery.ts +16 -85
  77. package/core/client/fluxstack.ts +17 -0
  78. package/core/client/hooks/index.ts +7 -0
  79. package/core/client/hooks/state-validator.ts +130 -0
  80. package/core/client/hooks/useAuth.ts +49 -0
  81. package/core/client/hooks/useChunkedUpload.ts +258 -0
  82. package/core/client/hooks/useHybridLiveComponent.ts +967 -0
  83. package/core/client/hooks/useWebSocket.ts +373 -0
  84. package/core/client/index.ts +47 -0
  85. package/core/client/state/createStore.ts +193 -0
  86. package/core/client/state/index.ts +15 -0
  87. package/core/config/env-dynamic.ts +1 -1
  88. package/core/config/env.ts +2 -1
  89. package/core/config/runtime-config.ts +3 -3
  90. package/core/config/schema.ts +84 -49
  91. package/core/framework/server.ts +30 -0
  92. package/core/index.ts +25 -0
  93. package/core/live/ComponentRegistry.ts +399 -0
  94. package/core/live/types.ts +164 -0
  95. package/core/plugins/built-in/live-components/commands/create-live-component.ts +1201 -0
  96. package/core/plugins/built-in/live-components/index.ts +27 -0
  97. package/core/plugins/built-in/logger/index.ts +1 -1
  98. package/core/plugins/built-in/monitoring/index.ts +1 -1
  99. package/core/plugins/built-in/static/index.ts +1 -1
  100. package/core/plugins/built-in/swagger/index.ts +1 -1
  101. package/core/plugins/built-in/vite/index.ts +1 -1
  102. package/core/plugins/dependency-manager.ts +384 -0
  103. package/core/plugins/index.ts +5 -1
  104. package/core/plugins/manager.ts +7 -3
  105. package/core/plugins/registry.ts +88 -10
  106. package/core/plugins/types.ts +11 -11
  107. package/core/server/framework.ts +43 -0
  108. package/core/server/index.ts +11 -1
  109. package/core/server/live/ComponentRegistry.ts +1017 -0
  110. package/core/server/live/FileUploadManager.ts +272 -0
  111. package/core/server/live/LiveComponentPerformanceMonitor.ts +930 -0
  112. package/core/server/live/SingleConnectionManager.ts +0 -0
  113. package/core/server/live/StateSignature.ts +644 -0
  114. package/core/server/live/WebSocketConnectionManager.ts +688 -0
  115. package/core/server/live/websocket-plugin.ts +435 -0
  116. package/core/server/middleware/errorHandling.ts +141 -0
  117. package/core/server/middleware/index.ts +16 -0
  118. package/core/server/plugins/static-files-plugin.ts +232 -0
  119. package/core/server/services/BaseService.ts +95 -0
  120. package/core/server/services/ServiceContainer.ts +144 -0
  121. package/core/server/services/index.ts +9 -0
  122. package/core/templates/create-project.ts +46 -2
  123. package/core/testing/index.ts +10 -0
  124. package/core/testing/setup.ts +74 -0
  125. package/core/types/build.ts +38 -14
  126. package/core/types/types.ts +319 -0
  127. package/core/utils/env-runtime.ts +7 -0
  128. package/core/utils/errors/handlers.ts +264 -39
  129. package/core/utils/errors/index.ts +528 -18
  130. package/core/utils/errors/middleware.ts +114 -0
  131. package/core/utils/logger/formatters.ts +222 -0
  132. package/core/utils/logger/index.ts +167 -48
  133. package/core/utils/logger/middleware.ts +253 -0
  134. package/core/utils/logger/performance.ts +384 -0
  135. package/core/utils/logger/transports.ts +365 -0
  136. package/create-fluxstack.ts +296 -296
  137. package/fluxstack.config.ts +17 -1
  138. package/package-template.json +66 -66
  139. package/package.json +31 -6
  140. package/public/README.md +16 -0
  141. package/vite.config.ts +29 -14
  142. package/.claude/settings.local.json +0 -74
  143. package/.github/workflows/ci-build-tests.yml +0 -480
  144. package/.github/workflows/dependency-management.yml +0 -324
  145. package/.github/workflows/release-validation.yml +0 -355
  146. package/.kiro/specs/fluxstack-architecture-optimization/design.md +0 -700
  147. package/.kiro/specs/fluxstack-architecture-optimization/requirements.md +0 -127
  148. package/.kiro/specs/fluxstack-architecture-optimization/tasks.md +0 -330
  149. package/CLAUDE.md +0 -200
  150. package/Dockerfile +0 -58
  151. package/Dockerfile.backend +0 -52
  152. package/Dockerfile.frontend +0 -54
  153. package/README-Docker.md +0 -85
  154. package/ai-context/00-QUICK-START.md +0 -86
  155. package/ai-context/README.md +0 -88
  156. package/ai-context/development/eden-treaty-guide.md +0 -362
  157. package/ai-context/development/patterns.md +0 -382
  158. package/ai-context/development/plugins-guide.md +0 -572
  159. package/ai-context/examples/crud-complete.md +0 -626
  160. package/ai-context/project/architecture.md +0 -399
  161. package/ai-context/project/overview.md +0 -213
  162. package/ai-context/recent-changes/eden-treaty-refactor.md +0 -281
  163. package/ai-context/recent-changes/type-inference-fix.md +0 -223
  164. package/ai-context/reference/environment-vars.md +0 -384
  165. package/ai-context/reference/troubleshooting.md +0 -407
  166. package/app/client/src/components/TestPage.tsx +0 -453
  167. package/bun.lock +0 -1063
  168. package/bunfig.toml +0 -16
  169. package/core/__tests__/integration.test.ts +0 -227
  170. package/core/build/index.ts +0 -186
  171. package/core/config/__tests__/config-loader.test.ts +0 -554
  172. package/core/config/__tests__/config-merger.test.ts +0 -657
  173. package/core/config/__tests__/env-converter.test.ts +0 -372
  174. package/core/config/__tests__/env-processor.test.ts +0 -431
  175. package/core/config/__tests__/env.test.ts +0 -452
  176. package/core/config/__tests__/integration.test.ts +0 -418
  177. package/core/config/__tests__/loader.test.ts +0 -331
  178. package/core/config/__tests__/schema.test.ts +0 -129
  179. package/core/config/__tests__/validator.test.ts +0 -318
  180. package/core/framework/__tests__/server.test.ts +0 -233
  181. package/core/plugins/__tests__/built-in.test.ts.disabled +0 -366
  182. package/core/plugins/__tests__/manager.test.ts +0 -398
  183. package/core/plugins/__tests__/monitoring.test.ts +0 -401
  184. package/core/plugins/__tests__/registry.test.ts +0 -335
  185. package/core/utils/__tests__/errors.test.ts +0 -139
  186. package/core/utils/__tests__/helpers.test.ts +0 -297
  187. package/core/utils/__tests__/logger.test.ts +0 -141
  188. package/create-test-app.ts +0 -156
  189. package/docker-compose.microservices.yml +0 -75
  190. package/docker-compose.simple.yml +0 -57
  191. package/docker-compose.yml +0 -71
  192. package/eslint.config.js +0 -23
  193. package/flux-cli.ts +0 -214
  194. package/nginx-lb.conf +0 -37
  195. package/publish.sh +0 -63
  196. package/run-clean.ts +0 -26
  197. package/run-env-tests.ts +0 -313
  198. package/tailwind.config.js +0 -34
  199. package/tests/__mocks__/api.ts +0 -56
  200. package/tests/fixtures/users.ts +0 -69
  201. package/tests/integration/api/users.routes.test.ts +0 -221
  202. package/tests/setup.ts +0 -29
  203. package/tests/unit/app/client/App-simple.test.tsx +0 -56
  204. package/tests/unit/app/client/App.test.tsx.skip +0 -237
  205. package/tests/unit/app/client/eden-api.test.ts +0 -186
  206. package/tests/unit/app/client/simple.test.tsx +0 -23
  207. package/tests/unit/app/controllers/users.controller.test.ts +0 -150
  208. package/tests/unit/core/create-project.test.ts.skip +0 -95
  209. package/tests/unit/core/framework.test.ts +0 -144
  210. package/tests/unit/core/plugins/logger.test.ts.skip +0 -268
  211. package/tests/unit/core/plugins/vite.test.ts.disabled +0 -188
  212. package/tests/utils/test-helpers.ts +0 -61
  213. package/vitest.config.ts +0 -50
  214. package/workspace.json +0 -6
@@ -0,0 +1,391 @@
1
+ // 🔥 Sidebar Navigation Component
2
+
3
+ import { useHybridLiveComponent } from 'fluxstack'
4
+ import {
5
+ FaHome,
6
+ FaUser,
7
+ FaCog,
8
+ FaFolder,
9
+ FaServer,
10
+ FaBars,
11
+ FaTimes,
12
+ FaMoon,
13
+ FaSun,
14
+ FaBell,
15
+ FaTools
16
+ } from 'react-icons/fa'
17
+
18
+ export interface SidebarNavigationState {
19
+ currentPage: 'dashboard' | 'profile' | 'settings' | 'files' | 'analytics' | 'config'
20
+ isCollapsed: boolean
21
+ theme: 'light' | 'dark'
22
+ notifications: {
23
+ profile: number
24
+ settings: number
25
+ files: number
26
+ analytics: number
27
+ config: number
28
+ }
29
+ lastNavigation: number
30
+ }
31
+
32
+ const initialState: SidebarNavigationState = {
33
+ currentPage: 'dashboard',
34
+ isCollapsed: false,
35
+ theme: 'light',
36
+ notifications: {
37
+ profile: 0,
38
+ settings: 0,
39
+ files: 0,
40
+ analytics: 0,
41
+ config: 0
42
+ },
43
+ lastNavigation: Date.now()
44
+ }
45
+
46
+ interface SidebarNavigationProps {
47
+ onPageChange: (page: string) => void
48
+ }
49
+
50
+ export function SidebarNavigation({ onPageChange }: SidebarNavigationProps) {
51
+ const { state, call, connected, status, error } = useHybridLiveComponent<SidebarNavigationState>(
52
+ 'SidebarNavigation',
53
+ initialState,
54
+ { debug: true }
55
+ )
56
+
57
+ // Show loading state
58
+ if (!connected || status !== 'synced') {
59
+ const getStatusMessage = () => {
60
+ switch (status) {
61
+ case 'connecting':
62
+ return '🔄 Conectando navegação...'
63
+ case 'reconnecting':
64
+ return '🔄 Reconectando menu...'
65
+ case 'mounting':
66
+ return '🚀 Carregando menu...'
67
+ case 'loading':
68
+ return '⏳ Carregando...'
69
+ case 'error':
70
+ return '❌ Erro na navegação'
71
+ default:
72
+ return '🔄 Preparando menu...'
73
+ }
74
+ }
75
+
76
+ return (
77
+ <div style={{
78
+ width: '280px',
79
+ height: '100vh',
80
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
81
+ color: 'white',
82
+ padding: '2rem',
83
+ display: 'flex',
84
+ flexDirection: 'column',
85
+ alignItems: 'center',
86
+ justifyContent: 'center',
87
+ textAlign: 'center'
88
+ }}>
89
+ <FaBars size={32} style={{ marginBottom: '1rem' }} />
90
+ <p>{getStatusMessage()}</p>
91
+ {error && (
92
+ <p style={{ fontSize: '0.9rem', marginTop: '0.5rem', opacity: 0.8 }}>
93
+ {error}
94
+ </p>
95
+ )}
96
+ </div>
97
+ )
98
+ }
99
+
100
+ const isDark = state.theme === 'dark'
101
+ const sidebarWidth = state.isCollapsed ? '80px' : '280px'
102
+
103
+ const menuItems = [
104
+ {
105
+ id: 'dashboard',
106
+ label: 'Dashboard',
107
+ icon: FaHome,
108
+ notifications: 0
109
+ },
110
+ {
111
+ id: 'profile',
112
+ label: 'Perfil',
113
+ icon: FaUser,
114
+ notifications: state.notifications.profile
115
+ },
116
+ {
117
+ id: 'settings',
118
+ label: 'Configurações',
119
+ icon: FaCog,
120
+ notifications: state.notifications.settings
121
+ },
122
+ {
123
+ id: 'files',
124
+ label: 'Arquivos',
125
+ icon: FaFolder,
126
+ notifications: state.notifications.files
127
+ },
128
+ {
129
+ id: 'analytics',
130
+ label: 'Monitoramento',
131
+ icon: FaServer,
132
+ notifications: state.notifications.analytics
133
+ },
134
+ {
135
+ id: 'config',
136
+ label: 'FluxStack Config',
137
+ icon: FaTools,
138
+ notifications: state.notifications.config
139
+ }
140
+ ]
141
+
142
+ const handleNavigate = async (page: string) => {
143
+ try {
144
+ await call('navigateTo', { page })
145
+ onPageChange(page)
146
+ } catch (error) {
147
+ console.error('Navigation error:', error)
148
+ }
149
+ }
150
+
151
+ const handleToggleSidebar = async () => {
152
+ try {
153
+ await call('toggleSidebar')
154
+ } catch (error) {
155
+ console.error('Toggle sidebar error:', error)
156
+ }
157
+ }
158
+
159
+ const handleToggleTheme = async () => {
160
+ try {
161
+ const newTheme = state.theme === 'light' ? 'dark' : 'light'
162
+ await call('setTheme', { theme: newTheme })
163
+ } catch (error) {
164
+ console.error('Theme toggle error:', error)
165
+ }
166
+ }
167
+
168
+ const handleClearNotifications = async () => {
169
+ try {
170
+ await call('clearAllNotifications')
171
+ } catch (error) {
172
+ console.error('Clear notifications error:', error)
173
+ }
174
+ }
175
+
176
+ return (
177
+ <div style={{
178
+ width: sidebarWidth,
179
+ height: '100vh',
180
+ backgroundColor: isDark ? '#1f2937' : '#ffffff',
181
+ borderRight: `1px solid ${isDark ? '#374151' : '#e5e7eb'}`,
182
+ display: 'flex',
183
+ flexDirection: 'column',
184
+ transition: 'width 0.3s ease',
185
+ overflow: 'hidden',
186
+ boxShadow: '2px 0 10px rgba(0, 0, 0, 0.1)'
187
+ }}>
188
+ {/* Header */}
189
+ <div style={{
190
+ padding: '1.5rem',
191
+ borderBottom: `1px solid ${isDark ? '#374151' : '#e5e7eb'}`,
192
+ display: 'flex',
193
+ alignItems: 'center',
194
+ justifyContent: 'space-between'
195
+ }}>
196
+ {!state.isCollapsed && (
197
+ <h2 style={{
198
+ color: isDark ? '#f9fafb' : '#111827',
199
+ margin: 0,
200
+ fontSize: '1.25rem',
201
+ fontWeight: 'bold'
202
+ }}>
203
+ 🔥 FluxStack
204
+ </h2>
205
+ )}
206
+
207
+ <button
208
+ onClick={handleToggleSidebar}
209
+ style={{
210
+ background: 'none',
211
+ border: 'none',
212
+ color: isDark ? '#9ca3af' : '#6b7280',
213
+ cursor: 'pointer',
214
+ padding: '0.5rem',
215
+ borderRadius: '0.5rem',
216
+ display: 'flex',
217
+ alignItems: 'center',
218
+ justifyContent: 'center',
219
+ fontSize: '1.1rem'
220
+ }}
221
+ >
222
+ {state.isCollapsed ? <FaBars /> : <FaTimes />}
223
+ </button>
224
+ </div>
225
+
226
+ {/* Navigation Menu */}
227
+ <nav style={{
228
+ flex: 1,
229
+ padding: '1rem',
230
+ display: 'flex',
231
+ flexDirection: 'column',
232
+ gap: '0.5rem'
233
+ }}>
234
+ {menuItems.map((item) => {
235
+ const Icon = item.icon
236
+ const isActive = state.currentPage === item.id
237
+ const hasNotifications = item.notifications > 0
238
+
239
+ return (
240
+ <button
241
+ key={item.id}
242
+ onClick={() => handleNavigate(item.id)}
243
+ style={{
244
+ display: 'flex',
245
+ alignItems: 'center',
246
+ gap: '1rem',
247
+ padding: '1rem',
248
+ borderRadius: '0.75rem',
249
+ border: 'none',
250
+ cursor: 'pointer',
251
+ transition: 'all 0.2s ease',
252
+ backgroundColor: isActive
253
+ ? (isDark ? '#3b82f6' : '#2563eb')
254
+ : 'transparent',
255
+ color: isActive
256
+ ? '#ffffff'
257
+ : (isDark ? '#d1d5db' : '#374151'),
258
+ position: 'relative',
259
+ justifyContent: state.isCollapsed ? 'center' : 'flex-start',
260
+ minHeight: '3rem'
261
+ }}
262
+ onMouseEnter={(e) => {
263
+ if (!isActive) {
264
+ e.currentTarget.style.backgroundColor = isDark ? '#374151' : '#f3f4f6'
265
+ }
266
+ }}
267
+ onMouseLeave={(e) => {
268
+ if (!isActive) {
269
+ e.currentTarget.style.backgroundColor = 'transparent'
270
+ }
271
+ }}
272
+ >
273
+ <Icon size={20} />
274
+
275
+ {!state.isCollapsed && (
276
+ <>
277
+ <span style={{
278
+ fontSize: '0.95rem',
279
+ fontWeight: isActive ? 'bold' : 'normal'
280
+ }}>
281
+ {item.label}
282
+ </span>
283
+
284
+ {hasNotifications && (
285
+ <span style={{
286
+ backgroundColor: '#ef4444',
287
+ color: 'white',
288
+ borderRadius: '50%',
289
+ width: '20px',
290
+ height: '20px',
291
+ display: 'flex',
292
+ alignItems: 'center',
293
+ justifyContent: 'center',
294
+ fontSize: '0.75rem',
295
+ fontWeight: 'bold',
296
+ marginLeft: 'auto'
297
+ }}>
298
+ {item.notifications}
299
+ </span>
300
+ )}
301
+ </>
302
+ )}
303
+
304
+ {state.isCollapsed && hasNotifications && (
305
+ <div style={{
306
+ position: 'absolute',
307
+ top: '0.5rem',
308
+ right: '0.5rem',
309
+ backgroundColor: '#ef4444',
310
+ borderRadius: '50%',
311
+ width: '12px',
312
+ height: '12px',
313
+ border: '2px solid white'
314
+ }} />
315
+ )}
316
+ </button>
317
+ )
318
+ })}
319
+ </nav>
320
+
321
+ {/* Footer Actions */}
322
+ <div style={{
323
+ padding: '1rem',
324
+ borderTop: `1px solid ${isDark ? '#374151' : '#e5e7eb'}`,
325
+ display: 'flex',
326
+ flexDirection: state.isCollapsed ? 'column' : 'row',
327
+ gap: '0.5rem'
328
+ }}>
329
+ {/* Theme Toggle */}
330
+ <button
331
+ onClick={handleToggleTheme}
332
+ style={{
333
+ display: 'flex',
334
+ alignItems: 'center',
335
+ justifyContent: 'center',
336
+ gap: state.isCollapsed ? 0 : '0.5rem',
337
+ padding: '0.75rem',
338
+ borderRadius: '0.5rem',
339
+ border: 'none',
340
+ cursor: 'pointer',
341
+ backgroundColor: isDark ? '#374151' : '#f3f4f6',
342
+ color: isDark ? '#d1d5db' : '#374151',
343
+ flex: state.isCollapsed ? 'none' : 1,
344
+ fontSize: '0.9rem'
345
+ }}
346
+ >
347
+ {isDark ? <FaSun /> : <FaMoon />}
348
+ {!state.isCollapsed && (
349
+ <span>{isDark ? 'Claro' : 'Escuro'}</span>
350
+ )}
351
+ </button>
352
+
353
+ {/* Clear Notifications */}
354
+ {!state.isCollapsed && (
355
+ <button
356
+ onClick={handleClearNotifications}
357
+ style={{
358
+ display: 'flex',
359
+ alignItems: 'center',
360
+ justifyContent: 'center',
361
+ gap: '0.5rem',
362
+ padding: '0.75rem',
363
+ borderRadius: '0.5rem',
364
+ border: 'none',
365
+ cursor: 'pointer',
366
+ backgroundColor: isDark ? '#374151' : '#f3f4f6',
367
+ color: isDark ? '#d1d5db' : '#374151',
368
+ flex: 1,
369
+ fontSize: '0.9rem'
370
+ }}
371
+ >
372
+ <FaBell />
373
+ <span>Limpar</span>
374
+ </button>
375
+ )}
376
+ </div>
377
+
378
+ {/* Connection Status (when collapsed) */}
379
+ {state.isCollapsed && (
380
+ <div style={{
381
+ padding: '0.5rem',
382
+ textAlign: 'center',
383
+ fontSize: '0.75rem',
384
+ color: isDark ? '#6b7280' : '#9ca3af'
385
+ }}>
386
+ {connected ? '🟢' : '🔴'}
387
+ </div>
388
+ )}
389
+ </div>
390
+ )
391
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * State Management Demo Component
3
+ * Demonstrates the usage of FluxStack state management system with Zustand
4
+ */
5
+
6
+ import React from 'react'
7
+ import { useNotifications } from '../hooks/useNotifications'
8
+ import { useAuth } from '../hooks/useAuth'
9
+ import { useUIStore } from '../store/slices/uiSlice'
10
+
11
+ export function StateDemo() {
12
+ const {
13
+ theme,
14
+ sidebarOpen,
15
+ notifications,
16
+ loading,
17
+ setTheme,
18
+ toggleSidebar,
19
+ setGlobalLoading
20
+ } = useUIStore()
21
+
22
+ const { success, error, warning, info, clearNotifications } = useNotifications()
23
+ const { currentUser, isAuthenticated, login, logout } = useAuth()
24
+
25
+ const handleThemeChange = (newTheme: 'light' | 'dark' | 'system') => {
26
+ setTheme(newTheme)
27
+ }
28
+
29
+ const handleToggleSidebar = () => {
30
+ toggleSidebar()
31
+ }
32
+
33
+ const handleToggleLoading = () => {
34
+ setGlobalLoading(!loading.global)
35
+ }
36
+
37
+ const handleTestNotifications = () => {
38
+ success('Success!', 'This is a success notification')
39
+ setTimeout(() => error('Error!', 'This is an error notification'), 1000)
40
+ setTimeout(() => warning('Warning!', 'This is a warning notification'), 2000)
41
+ setTimeout(() => info('Info!', 'This is an info notification'), 3000)
42
+ }
43
+
44
+ const handleTestAuth = async () => {
45
+ if (isAuthenticated) {
46
+ await logout()
47
+ } else {
48
+ try {
49
+ await login({ email: 'test@example.com', password: 'password' })
50
+ } catch (error) {
51
+ // Error is handled by the hook
52
+ }
53
+ }
54
+ }
55
+
56
+ return (
57
+ <div className="p-6 bg-white rounded-lg shadow-lg">
58
+ <h2 className="text-2xl font-bold mb-6 text-gray-800">
59
+ 🔄 State Management Demo
60
+ </h2>
61
+
62
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
63
+ {/* Theme Controls */}
64
+ <div className="space-y-4">
65
+ <h3 className="text-lg font-semibold text-gray-700">Theme</h3>
66
+ <div className="flex space-x-2">
67
+ {(['light', 'dark', 'system'] as const).map((themeOption) => (
68
+ <button
69
+ key={themeOption}
70
+ onClick={() => handleThemeChange(themeOption)}
71
+ className={`px-3 py-2 rounded-md text-sm font-medium transition-colors ${theme === themeOption
72
+ ? 'bg-blue-500 text-white'
73
+ : 'bg-gray-200 text-gray-700 hover:bg-gray-300'
74
+ }`}
75
+ >
76
+ {themeOption.charAt(0).toUpperCase() + themeOption.slice(1)}
77
+ </button>
78
+ ))}
79
+ </div>
80
+ <p className="text-sm text-gray-600">Current theme: {theme}</p>
81
+ </div>
82
+
83
+ {/* UI Controls */}
84
+ <div className="space-y-4">
85
+ <h3 className="text-lg font-semibold text-gray-700">UI State</h3>
86
+ <div className="space-y-2">
87
+ <button
88
+ onClick={handleToggleSidebar}
89
+ className="block w-full px-4 py-2 bg-green-500 text-white rounded-md hover:bg-green-600 transition-colors"
90
+ >
91
+ {sidebarOpen ? 'Close Sidebar' : 'Open Sidebar'}
92
+ </button>
93
+ <button
94
+ onClick={handleToggleLoading}
95
+ className="block w-full px-4 py-2 bg-purple-500 text-white rounded-md hover:bg-purple-600 transition-colors"
96
+ >
97
+ {loading.global ? 'Stop Loading' : 'Start Loading'}
98
+ </button>
99
+ </div>
100
+ <div className="text-sm text-gray-600">
101
+ <p>Sidebar: {sidebarOpen ? 'Open' : 'Closed'}</p>
102
+ <p>Loading: {loading.global ? 'Yes' : 'No'}</p>
103
+ </div>
104
+ </div>
105
+
106
+ {/* Notifications */}
107
+ <div className="space-y-4">
108
+ <h3 className="text-lg font-semibold text-gray-700">Notifications</h3>
109
+ <div className="space-y-2">
110
+ <button
111
+ onClick={handleTestNotifications}
112
+ className="block w-full px-4 py-2 bg-orange-500 text-white rounded-md hover:bg-orange-600 transition-colors"
113
+ >
114
+ Test Notifications
115
+ </button>
116
+ <button
117
+ onClick={clearNotifications}
118
+ className="block w-full px-4 py-2 bg-red-500 text-white rounded-md hover:bg-red-600 transition-colors"
119
+ >
120
+ Clear Notifications
121
+ </button>
122
+ </div>
123
+ <p className="text-sm text-gray-600">
124
+ Active notifications: {notifications.length}
125
+ </p>
126
+ </div>
127
+
128
+ {/* Authentication */}
129
+ <div className="space-y-4">
130
+ <h3 className="text-lg font-semibold text-gray-700">Authentication</h3>
131
+ <button
132
+ onClick={handleTestAuth}
133
+ className={`block w-full px-4 py-2 rounded-md transition-colors ${isAuthenticated
134
+ ? 'bg-red-500 text-white hover:bg-red-600'
135
+ : 'bg-blue-500 text-white hover:bg-blue-600'
136
+ }`}
137
+ >
138
+ {isAuthenticated ? 'Logout' : 'Login (Demo)'}
139
+ </button>
140
+ <div className="text-sm text-gray-600">
141
+ <p>Status: {isAuthenticated ? 'Authenticated' : 'Not authenticated'}</p>
142
+ {currentUser && (
143
+ <p>User: {currentUser.name} ({currentUser.email})</p>
144
+ )}
145
+ </div>
146
+ </div>
147
+ </div>
148
+
149
+ {/* State Inspector */}
150
+ <div className="mt-8 p-4 bg-gray-50 rounded-md">
151
+ <h4 className="text-md font-semibold text-gray-700 mb-2">State Inspector</h4>
152
+ <details className="text-sm">
153
+ <summary className="cursor-pointer text-blue-600 hover:text-blue-800">
154
+ View Current State (Click to expand)
155
+ </summary>
156
+ <pre className="mt-2 p-2 bg-white rounded border text-xs overflow-auto">
157
+ {JSON.stringify({
158
+ ui: {
159
+ theme,
160
+ sidebarOpen,
161
+ notificationCount: notifications.length,
162
+ globalLoading: loading.global
163
+ },
164
+ user: {
165
+ isAuthenticated,
166
+ currentUser: currentUser ? {
167
+ id: currentUser.id,
168
+ name: currentUser.name,
169
+ email: currentUser.email
170
+ } : null
171
+ }
172
+ }, null, 2)}
173
+ </pre>
174
+ </details>
175
+ </div>
176
+ </div>
177
+ )
178
+ }