@digilogiclabs/create-saas-app 2.8.0 → 2.9.0

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 (94) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/generators/template-generator.js +8 -8
  3. package/dist/generators/template-generator.js.map +1 -1
  4. package/dist/templates/shared/quality/web/src/__tests__/accessibility.test.tsx +3 -3
  5. package/dist/templates/web/ai-platform/template/src/app/page.tsx +207 -207
  6. package/dist/templates/web/base/template/package.json +1 -3
  7. package/dist/templates/web/base/template/src/app/auth/callback/route.ts +32 -18
  8. package/dist/templates/web/base/template/src/app/dashboard/page.tsx +6 -43
  9. package/dist/templates/web/base/template/src/app/globals.css +158 -157
  10. package/dist/templates/web/base/template/src/app/page.tsx +2 -2
  11. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +800 -800
  12. package/dist/templates/web/ui-auth/template/src/app/globals.css +96 -95
  13. package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +109 -109
  14. package/dist/templates/web/ui-auth/template/src/app/page.tsx +4 -3
  15. package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -128
  16. package/dist/templates/web/ui-auth-ai/template/src/app/globals.css +35 -40
  17. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +1 -0
  18. package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +3 -3
  19. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +10 -49
  20. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +800 -800
  21. package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +212 -211
  22. package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -109
  23. package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +350 -350
  24. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +506 -506
  25. package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -128
  26. package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +143 -143
  27. package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +184 -184
  28. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +143 -233
  29. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +10 -50
  30. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +800 -800
  31. package/dist/templates/web/ui-auth-payments-ai/template/src/app/globals.css +97 -96
  32. package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +325 -364
  33. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +1 -1
  34. package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +389 -532
  35. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +644 -644
  36. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +119 -163
  37. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +158 -201
  38. package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +1 -2
  39. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +10 -51
  40. package/dist/templates/web/ui-auth-payments-audio/template/src/app/globals.css +97 -96
  41. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +402 -403
  42. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +143 -143
  43. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +184 -184
  44. package/dist/templates/web/ui-auth-payments-video/template/src/app/globals.css +229 -228
  45. package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +1 -1
  46. package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +4 -7
  47. package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +1 -1
  48. package/dist/templates/web/ui-only/template/src/app/globals.css +43 -42
  49. package/package.json +1 -1
  50. package/src/templates/shared/quality/web/src/__tests__/accessibility.test.tsx +3 -3
  51. package/src/templates/web/ai-platform/template/src/app/page.tsx +207 -207
  52. package/src/templates/web/base/template/package.json +1 -3
  53. package/src/templates/web/base/template/src/app/auth/callback/route.ts +32 -18
  54. package/src/templates/web/base/template/src/app/dashboard/page.tsx +6 -43
  55. package/src/templates/web/base/template/src/app/globals.css +158 -157
  56. package/src/templates/web/base/template/src/app/page.tsx +2 -2
  57. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +800 -800
  58. package/src/templates/web/ui-auth/template/src/app/globals.css +96 -95
  59. package/src/templates/web/ui-auth/template/src/app/login/page.tsx +109 -109
  60. package/src/templates/web/ui-auth/template/src/app/page.tsx +4 -3
  61. package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -128
  62. package/src/templates/web/ui-auth-ai/template/src/app/globals.css +35 -40
  63. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +1 -0
  64. package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +3 -3
  65. package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +10 -49
  66. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +800 -800
  67. package/src/templates/web/ui-auth-payments/template/src/app/globals.css +212 -211
  68. package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -109
  69. package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +350 -350
  70. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +506 -506
  71. package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -128
  72. package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +143 -143
  73. package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +184 -184
  74. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +143 -233
  75. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +10 -50
  76. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +800 -800
  77. package/src/templates/web/ui-auth-payments-ai/template/src/app/globals.css +97 -96
  78. package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +325 -364
  79. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +1 -1
  80. package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +389 -532
  81. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +644 -644
  82. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +119 -163
  83. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +158 -201
  84. package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +1 -2
  85. package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +10 -51
  86. package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +97 -96
  87. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +402 -403
  88. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +143 -143
  89. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +184 -184
  90. package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +229 -228
  91. package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +1 -1
  92. package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +4 -7
  93. package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +1 -1
  94. package/src/templates/web/ui-only/template/src/app/globals.css +43 -42
@@ -1,532 +1,389 @@
1
- 'use client'
2
-
3
- import React, { useState } from 'react'
4
- import {
5
- FormBuilder,
6
- FormSection,
7
- FormField,
8
- FormProvider,
9
- Button,
10
- Card,
11
- MobileContainer,
12
- PageTransition,
13
- Tabs,
14
- TabsList,
15
- TabsTrigger,
16
- TabsContent
17
- } from '@digilogiclabs/saas-factory-ui'
18
- import { useAuth } from '@digilogiclabs/app-sdk'
19
- import { useRouter } from 'next/navigation'
20
- import {
21
- User,
22
- Shield,
23
- Brain,
24
- Bell,
25
- Palette,
26
- Database,
27
- Key,
28
- Users,
29
- ArrowLeft,
30
- Save
31
- } from 'lucide-react'
32
- import Link from 'next/link'
33
-
34
- export default function SettingsPage() {
35
- const { user } = useAuth()
36
- const router = useRouter()
37
- const [activeTab, setActiveTab] = useState('profile')
38
- const [isLoading, setIsLoading] = useState(false)
39
-
40
- if (!user) {
41
- router.push('/login')
42
- return null
43
- }
44
-
45
- const handleSaveSettings = async (formData: FormData, section: string) => {
46
- setIsLoading(true)
47
- console.log(`Saving ${section} settings:`, Object.fromEntries(formData))
48
-
49
- // Simulate API call
50
- await new Promise(resolve => setTimeout(resolve, 1000))
51
-
52
- setIsLoading(false)
53
- // Show success message
54
- }
55
-
56
- return (
57
- <PageTransition type="slide" direction="up" duration={300}>
58
- <main className="min-h-screen bg-gradient-to-br from-primary/5 via-background to-secondary/5">
59
- <MobileContainer className="py-8">
60
- {/* Header */}
61
- <div className="flex items-center justify-between mb-8">
62
- <div className="flex items-center gap-4">
63
- <Link href="/dashboard" className="p-2 rounded-xl bg-white/10 backdrop-blur-md border border-white/20 hover:scale-105 transition-transform">
64
- <ArrowLeft className="w-5 h-5" />
65
- </Link>
66
- <div>
67
- <h1 className="text-2xl font-bold">Settings</h1>
68
- <p className="text-gray-600 dark:text-gray-300">Manage your account and preferences</p>
69
- </div>
70
- </div>
71
- </div>
72
-
73
- <Card className="max-w-6xl mx-auto">
74
- <Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
75
- <TabsList className="grid w-full grid-cols-6 mb-8">
76
- <TabsTrigger value="profile" className="flex items-center gap-2">
77
- <User className="w-4 h-4" />
78
- <span className="hidden sm:inline">Profile</span>
79
- </TabsTrigger>
80
- <TabsTrigger value="security" className="flex items-center gap-2">
81
- <Shield className="w-4 h-4" />
82
- <span className="hidden sm:inline">Security</span>
83
- </TabsTrigger>
84
- <TabsTrigger value="ai" className="flex items-center gap-2">
85
- <Brain className="w-4 h-4" />
86
- <span className="hidden sm:inline">AI</span>
87
- </TabsTrigger>
88
- <TabsTrigger value="notifications" className="flex items-center gap-2">
89
- <Bell className="w-4 h-4" />
90
- <span className="hidden sm:inline">Alerts</span>
91
- </TabsTrigger>
92
- <TabsTrigger value="appearance" className="flex items-center gap-2">
93
- <Palette className="w-4 h-4" />
94
- <span className="hidden sm:inline">Theme</span>
95
- </TabsTrigger>
96
- <TabsTrigger value="team" className="flex items-center gap-2">
97
- <Users className="w-4 h-4" />
98
- <span className="hidden sm:inline">Team</span>
99
- </TabsTrigger>
100
- </TabsList>
101
-
102
- {/* Profile Settings */}
103
- <TabsContent value="profile" className="space-y-6">
104
- <FormProvider>
105
- <FormBuilder
106
- onSubmit={(formData) => handleSaveSettings(formData, 'profile')}
107
- autoSave={true}
108
- autoSaveInterval={30000}
109
- className="space-y-6"
110
- >
111
- <FormSection
112
- title="Personal Information"
113
- description="Update your basic profile information"
114
- collapsible={false}
115
- >
116
- <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
117
- <FormField
118
- name="firstName"
119
- type="text"
120
- label="First Name"
121
- placeholder="Enter your first name"
122
- defaultValue={user.user_metadata?.first_name || ''}
123
- validation={['required', 'minLength:2']}
124
- />
125
-
126
- <FormField
127
- name="lastName"
128
- type="text"
129
- label="Last Name"
130
- placeholder="Enter your last name"
131
- defaultValue={user.user_metadata?.last_name || ''}
132
- validation={['required', 'minLength:2']}
133
- />
134
- </div>
135
-
136
- <FormField
137
- name="email"
138
- type="email"
139
- label="Email Address"
140
- placeholder="Enter your email"
141
- defaultValue={user.email || ''}
142
- validation={['required', 'email']}
143
- helpText="Changing your email will require verification"
144
- />
145
-
146
- <FormField
147
- name="avatar"
148
- type="file"
149
- label="Profile Picture"
150
- accept="image/*"
151
- maxSize={5000000} // 5MB
152
- helpText="Upload a profile picture (max 5MB)"
153
- preview={true}
154
- />
155
-
156
- <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
157
- <FormField
158
- name="company"
159
- type="text"
160
- label="Company"
161
- placeholder="Enter your company name"
162
- defaultValue={user.user_metadata?.company || ''}
163
- />
164
-
165
- <FormField
166
- name="jobTitle"
167
- type="text"
168
- label="Job Title"
169
- placeholder="Enter your job title"
170
- defaultValue={user.user_metadata?.job_title || ''}
171
- />
172
- </div>
173
-
174
- <FormField
175
- name="bio"
176
- type="textarea"
177
- label="Bio"
178
- placeholder="Tell us about yourself..."
179
- rows={4}
180
- maxLength={500}
181
- showCharacterCount={true}
182
- defaultValue={user.user_metadata?.bio || ''}
183
- />
184
- </FormSection>
185
-
186
- <FormSection
187
- title="Contact Information"
188
- description="How we can reach you"
189
- collapsible={true}
190
- >
191
- <FormField
192
- name="phone"
193
- type="tel"
194
- label="Phone Number"
195
- placeholder="+1 (555) 123-4567"
196
- defaultValue={user.user_metadata?.phone || ''}
197
- validation={['phone']}
198
- />
199
-
200
- <FormField
201
- name="timezone"
202
- type="select"
203
- label="Timezone"
204
- placeholder="Select your timezone"
205
- options={[
206
- { value: 'America/New_York', label: 'Eastern Time (ET)' },
207
- { value: 'America/Chicago', label: 'Central Time (CT)' },
208
- { value: 'America/Denver', label: 'Mountain Time (MT)' },
209
- { value: 'America/Los_Angeles', label: 'Pacific Time (PT)' },
210
- { value: 'Europe/London', label: 'London (GMT)' },
211
- { value: 'Europe/Paris', label: 'Paris (CET)' },
212
- { value: 'Asia/Tokyo', label: 'Tokyo (JST)' },
213
- { value: 'Australia/Sydney', label: 'Sydney (AEST)' }
214
- ]}
215
- defaultValue={user.user_metadata?.timezone || 'America/New_York'}
216
- validation={['required']}
217
- />
218
- </FormSection>
219
-
220
- <div className="flex justify-end">
221
- <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
222
- <Save className="w-4 h-4" />
223
- {isLoading ? 'Saving...' : 'Save Changes'}
224
- </Button>
225
- </div>
226
- </FormBuilder>
227
- </FormProvider>
228
- </TabsContent>
229
-
230
- {/* Security Settings */}
231
- <TabsContent value="security" className="space-y-6">
232
- <FormProvider>
233
- <FormBuilder
234
- onSubmit={(formData) => handleSaveSettings(formData, 'security')}
235
- className="space-y-6"
236
- >
237
- <FormSection
238
- title="Password & Authentication"
239
- description="Manage your login credentials"
240
- collapsible={false}
241
- >
242
- <FormField
243
- name="currentPassword"
244
- type="password"
245
- label="Current Password"
246
- placeholder="Enter your current password"
247
- validation={['required']}
248
- />
249
-
250
- <FormField
251
- name="newPassword"
252
- type="password"
253
- label="New Password"
254
- placeholder="Enter a new password"
255
- validation={['minLength:8', 'hasUppercase', 'hasLowercase', 'hasNumber']}
256
- showPasswordStrength={true}
257
- helpText="Password must be at least 8 characters with uppercase, lowercase, and number"
258
- />
259
-
260
- <FormField
261
- name="confirmNewPassword"
262
- type="password"
263
- label="Confirm New Password"
264
- placeholder="Confirm your new password"
265
- validation={['required']}
266
- />
267
- </FormSection>
268
-
269
- <FormSection
270
- title="Two-Factor Authentication"
271
- description="Add an extra layer of security"
272
- collapsible={true}
273
- >
274
- <FormField
275
- name="enableTwoFactor"
276
- type="checkbox"
277
- label="Enable Two-Factor Authentication"
278
- helpText="Require a code from your phone in addition to your password"
279
- />
280
-
281
- <FormField
282
- name="twoFactorMethod"
283
- type="radio"
284
- label="Authentication Method"
285
- options={[
286
- { value: 'sms', label: 'SMS Text Message' },
287
- { value: 'app', label: 'Authenticator App (Recommended)' },
288
- { value: 'email', label: 'Email' }
289
- ]}
290
- defaultValue="app"
291
- dependsOn="enableTwoFactor"
292
- />
293
- </FormSection>
294
-
295
- <FormSection
296
- title="Login Sessions"
297
- description="Manage your active sessions"
298
- collapsible={true}
299
- >
300
- <div className="space-y-4">
301
- <div className="p-4 border rounded-lg">
302
- <div className="flex justify-between items-start">
303
- <div>
304
- <div className="font-medium">Current Session</div>
305
- <div className="text-sm text-gray-600 dark:text-gray-300">
306
- Chrome on Mac • 192.168.1.100 • Active now
307
- </div>
308
- </div>
309
- <span className="text-xs bg-green-100 text-green-800 px-2 py-1 rounded">Current</span>
310
- </div>
311
- </div>
312
-
313
- <Button variant="outline" size="sm">
314
- Sign Out All Other Sessions
315
- </Button>
316
- </div>
317
- </FormSection>
318
-
319
- <div className="flex justify-end">
320
- <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
321
- <Shield className="w-4 h-4" />
322
- {isLoading ? 'Updating...' : 'Update Security'}
323
- </Button>
324
- </div>
325
- </FormBuilder>
326
- </FormProvider>
327
- </TabsContent>
328
-
329
- {/* AI Preferences */}
330
- <TabsContent value="ai" className="space-y-6">
331
- <FormProvider>
332
- <FormBuilder
333
- onSubmit={(formData) => handleSaveSettings(formData, 'ai')}
334
- autoSave={true}
335
- className="space-y-6"
336
- >
337
- <FormSection
338
- title="AI Model Preferences"
339
- description="Configure your preferred AI models and behavior"
340
- collapsible={false}
341
- >
342
- <FormField
343
- name="defaultTextModel"
344
- type="select"
345
- label="Default Text Model"
346
- options={[
347
- { value: 'gpt-4', label: 'GPT-4 (Most capable)' },
348
- { value: 'gpt-4-turbo', label: 'GPT-4 Turbo (Faster)' },
349
- { value: 'gpt-3.5-turbo', label: 'GPT-3.5 Turbo (Cost-effective)' },
350
- { value: 'claude-3', label: 'Claude 3 (Great for analysis)' }
351
- ]}
352
- defaultValue="gpt-4"
353
- validation={['required']}
354
- />
355
-
356
- <FormField
357
- name="creativityLevel"
358
- type="range"
359
- label="Creativity Level"
360
- min={0}
361
- max={100}
362
- defaultValue={70}
363
- showValue={true}
364
- helpText="Lower values are more conservative, higher values are more creative"
365
- />
366
-
367
- <FormField
368
- name="responseLength"
369
- type="select"
370
- label="Default Response Length"
371
- options={[
372
- { value: 'short', label: 'Short (1-2 paragraphs)' },
373
- { value: 'medium', label: 'Medium (3-5 paragraphs)' },
374
- { value: 'long', label: 'Long (6+ paragraphs)' },
375
- { value: 'auto', label: 'Auto (context-dependent)' }
376
- ]}
377
- defaultValue="medium"
378
- validation={['required']}
379
- />
380
- </FormSection>
381
-
382
- <FormSection
383
- title="Content Filters"
384
- description="Control what content is generated"
385
- collapsible={true}
386
- >
387
- <FormField
388
- name="contentFilters"
389
- type="multiSelect"
390
- label="Enable Content Filters"
391
- options={[
392
- { value: 'violence', label: 'Violence & Gore' },
393
- { value: 'adult', label: 'Adult Content' },
394
- { value: 'hate', label: 'Hate Speech' },
395
- { value: 'harmful', label: 'Harmful Instructions' },
396
- { value: 'personal', label: 'Personal Information' }
397
- ]}
398
- defaultValue={['violence', 'adult', 'hate', 'harmful', 'personal']}
399
- helpText="These filters help ensure generated content meets community standards"
400
- />
401
-
402
- <FormField
403
- name="allowCodeGeneration"
404
- type="checkbox"
405
- label="Allow Code Generation"
406
- defaultValue={true}
407
- helpText="Enable AI to generate code snippets and programming examples"
408
- />
409
- </FormSection>
410
-
411
- <FormSection
412
- title="Usage & Limits"
413
- description="Manage your AI usage preferences"
414
- collapsible={true}
415
- >
416
- <FormField
417
- name="monthlyLimit"
418
- type="number"
419
- label="Monthly Request Limit"
420
- placeholder="Enter limit (0 for unlimited)"
421
- min={0}
422
- defaultValue={0}
423
- helpText="Set a limit to control your usage and costs"
424
- />
425
-
426
- <FormField
427
- name="lowUsageAlerts"
428
- type="checkbox"
429
- label="Low Usage Alerts"
430
- defaultValue={true}
431
- helpText="Get notified when you're approaching your usage limits"
432
- />
433
- </FormSection>
434
-
435
- <div className="flex justify-end">
436
- <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
437
- <Brain className="w-4 h-4" />
438
- {isLoading ? 'Saving...' : 'Save AI Preferences'}
439
- </Button>
440
- </div>
441
- </FormBuilder>
442
- </FormProvider>
443
- </TabsContent>
444
-
445
- {/* Notification Settings */}
446
- <TabsContent value="notifications" className="space-y-6">
447
- <FormProvider>
448
- <FormBuilder
449
- onSubmit={(formData) => handleSaveSettings(formData, 'notifications')}
450
- autoSave={true}
451
- className="space-y-6"
452
- >
453
- <FormSection
454
- title="Email Notifications"
455
- description="Choose what emails you want to receive"
456
- collapsible={false}
457
- >
458
- <FormField
459
- name="emailNotifications"
460
- type="multiSelect"
461
- label="Email Preferences"
462
- options={[
463
- { value: 'account', label: 'Account & Security Updates' },
464
- { value: 'billing', label: 'Billing & Payment Notifications' },
465
- { value: 'features', label: 'New Features & Updates' },
466
- { value: 'tips', label: 'Tips & Best Practices' },
467
- { value: 'marketing', label: 'Marketing & Promotional Emails' }
468
- ]}
469
- defaultValue={['account', 'billing', 'features']}
470
- />
471
-
472
- <FormField
473
- name="emailFrequency"
474
- type="select"
475
- label="Email Frequency"
476
- options={[
477
- { value: 'immediate', label: 'Immediate' },
478
- { value: 'daily', label: 'Daily Digest' },
479
- { value: 'weekly', label: 'Weekly Summary' },
480
- { value: 'never', label: 'Never (Critical only)' }
481
- ]}
482
- defaultValue="daily"
483
- validation={['required']}
484
- />
485
- </FormSection>
486
-
487
- <FormSection
488
- title="Push Notifications"
489
- description="Browser and mobile push notifications"
490
- collapsible={true}
491
- >
492
- <FormField
493
- name="pushNotifications"
494
- type="checkbox"
495
- label="Enable Push Notifications"
496
- defaultValue={true}
497
- helpText="Receive real-time notifications in your browser"
498
- />
499
-
500
- <FormField
501
- name="pushTypes"
502
- type="multiSelect"
503
- label="Push Notification Types"
504
- options={[
505
- { value: 'generation-complete', label: 'AI Generation Complete' },
506
- { value: 'usage-alerts', label: 'Usage Limit Alerts' },
507
- { value: 'team-invites', label: 'Team Invitations' },
508
- { value: 'system-maintenance', label: 'System Maintenance' }
509
- ]}
510
- defaultValue={['generation-complete', 'usage-alerts']}
511
- dependsOn="pushNotifications"
512
- />
513
- </FormSection>
514
-
515
- <div className="flex justify-end">
516
- <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
517
- <Bell className="w-4 h-4" />
518
- {isLoading ? 'Saving...' : 'Save Notification Preferences'}
519
- </Button>
520
- </div>
521
- </FormBuilder>
522
- </FormProvider>
523
- </TabsContent>
524
-
525
- {/* More tabs would continue here... */}
526
- </Tabs>
527
- </Card>
528
- </MobileContainer>
529
- </main>
530
- </PageTransition>
531
- )
532
- }
1
+ 'use client'
2
+
3
+ import React, { useState } from 'react'
4
+ import {
5
+ Button,
6
+ Card,
7
+ Input,
8
+ Label,
9
+ MobileContainer,
10
+ PageTransition,
11
+ Tabs,
12
+ TabsList,
13
+ TabsTrigger,
14
+ TabsContent
15
+ } from '@digilogiclabs/saas-factory-ui'
16
+ import { useAuth } from '@digilogiclabs/app-sdk'
17
+ import { useRouter } from 'next/navigation'
18
+ import {
19
+ User,
20
+ Shield,
21
+ Brain,
22
+ Bell,
23
+ Palette,
24
+ Users,
25
+ ArrowLeft,
26
+ Save
27
+ } from 'lucide-react'
28
+ import Link from 'next/link'
29
+
30
+ export default function SettingsPage() {
31
+ const { user } = useAuth()
32
+ const router = useRouter()
33
+ const [activeTab, setActiveTab] = useState('profile')
34
+ const [isLoading, setIsLoading] = useState(false)
35
+
36
+ if (!user) {
37
+ router.push('/login')
38
+ return null
39
+ }
40
+
41
+ const handleSaveSettings = async (e: React.FormEvent, section: string) => {
42
+ e.preventDefault()
43
+ setIsLoading(true)
44
+ const formData = new FormData(e.target as HTMLFormElement)
45
+ console.log(`Saving ${section} settings:`, Object.fromEntries(formData))
46
+ await new Promise(resolve => setTimeout(resolve, 1000))
47
+ setIsLoading(false)
48
+ }
49
+
50
+ return (
51
+ <PageTransition type="slide" direction="up" duration={300}>
52
+ <main className="min-h-screen bg-gradient-to-br from-primary/5 via-background to-secondary/5">
53
+ <MobileContainer className="py-8">
54
+ {/* Header */}
55
+ <div className="flex items-center justify-between mb-8">
56
+ <div className="flex items-center gap-4">
57
+ <Link href="/dashboard" className="p-2 rounded-xl bg-white/10 backdrop-blur-md border border-white/20 hover:scale-105 transition-transform">
58
+ <ArrowLeft className="w-5 h-5" />
59
+ </Link>
60
+ <div>
61
+ <h1 className="text-2xl font-bold">Settings</h1>
62
+ <p className="text-gray-600 dark:text-gray-300">Manage your account and preferences</p>
63
+ </div>
64
+ </div>
65
+ </div>
66
+
67
+ <Card className="max-w-6xl mx-auto">
68
+ <Tabs value={activeTab} onValueChange={setActiveTab} className="w-full">
69
+ <TabsList className="grid w-full grid-cols-6 mb-8">
70
+ <TabsTrigger value="profile" className="flex items-center gap-2">
71
+ <User className="w-4 h-4" />
72
+ <span className="hidden sm:inline">Profile</span>
73
+ </TabsTrigger>
74
+ <TabsTrigger value="security" className="flex items-center gap-2">
75
+ <Shield className="w-4 h-4" />
76
+ <span className="hidden sm:inline">Security</span>
77
+ </TabsTrigger>
78
+ <TabsTrigger value="ai" className="flex items-center gap-2">
79
+ <Brain className="w-4 h-4" />
80
+ <span className="hidden sm:inline">AI</span>
81
+ </TabsTrigger>
82
+ <TabsTrigger value="notifications" className="flex items-center gap-2">
83
+ <Bell className="w-4 h-4" />
84
+ <span className="hidden sm:inline">Alerts</span>
85
+ </TabsTrigger>
86
+ <TabsTrigger value="appearance" className="flex items-center gap-2">
87
+ <Palette className="w-4 h-4" />
88
+ <span className="hidden sm:inline">Theme</span>
89
+ </TabsTrigger>
90
+ <TabsTrigger value="team" className="flex items-center gap-2">
91
+ <Users className="w-4 h-4" />
92
+ <span className="hidden sm:inline">Team</span>
93
+ </TabsTrigger>
94
+ </TabsList>
95
+
96
+ {/* Profile Settings */}
97
+ <TabsContent value="profile" className="space-y-6 p-6">
98
+ <form onSubmit={(e) => handleSaveSettings(e, 'profile')} className="space-y-6">
99
+ <div>
100
+ <h3 className="text-lg font-semibold mb-1">Personal Information</h3>
101
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Update your basic profile information</p>
102
+ <div className="space-y-4">
103
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
104
+ <div>
105
+ <Label htmlFor="firstName">First Name</Label>
106
+ <Input id="firstName" name="firstName" placeholder="Enter your first name" required />
107
+ </div>
108
+ <div>
109
+ <Label htmlFor="lastName">Last Name</Label>
110
+ <Input id="lastName" name="lastName" placeholder="Enter your last name" required />
111
+ </div>
112
+ </div>
113
+ <div>
114
+ <Label htmlFor="email">Email Address</Label>
115
+ <Input id="email" name="email" type="email" placeholder="Enter your email" defaultValue={user.email || ''} required />
116
+ <p className="text-xs text-gray-500 mt-1">Changing your email will require verification</p>
117
+ </div>
118
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4">
119
+ <div>
120
+ <Label htmlFor="company">Company</Label>
121
+ <Input id="company" name="company" placeholder="Enter your company name" />
122
+ </div>
123
+ <div>
124
+ <Label htmlFor="jobTitle">Job Title</Label>
125
+ <Input id="jobTitle" name="jobTitle" placeholder="Enter your job title" />
126
+ </div>
127
+ </div>
128
+ <div>
129
+ <Label htmlFor="bio">Bio</Label>
130
+ <textarea id="bio" name="bio" placeholder="Tell us about yourself..." rows={4} className="w-full p-3 border rounded-lg bg-background" />
131
+ </div>
132
+ </div>
133
+ </div>
134
+
135
+ <div>
136
+ <h3 className="text-lg font-semibold mb-1">Contact Information</h3>
137
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">How we can reach you</p>
138
+ <div className="space-y-4">
139
+ <div>
140
+ <Label htmlFor="phone">Phone Number</Label>
141
+ <Input id="phone" name="phone" type="tel" placeholder="+1 (555) 123-4567" />
142
+ </div>
143
+ <div>
144
+ <Label htmlFor="timezone">Timezone</Label>
145
+ <select id="timezone" name="timezone" className="w-full p-3 border rounded-lg bg-background">
146
+ <option value="America/New_York">Eastern Time (ET)</option>
147
+ <option value="America/Chicago">Central Time (CT)</option>
148
+ <option value="America/Denver">Mountain Time (MT)</option>
149
+ <option value="America/Los_Angeles">Pacific Time (PT)</option>
150
+ <option value="Europe/London">London (GMT)</option>
151
+ <option value="Europe/Paris">Paris (CET)</option>
152
+ <option value="Asia/Tokyo">Tokyo (JST)</option>
153
+ <option value="Australia/Sydney">Sydney (AEST)</option>
154
+ </select>
155
+ </div>
156
+ </div>
157
+ </div>
158
+
159
+ <div className="flex justify-end">
160
+ <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
161
+ <Save className="w-4 h-4" />
162
+ {isLoading ? 'Saving...' : 'Save Changes'}
163
+ </Button>
164
+ </div>
165
+ </form>
166
+ </TabsContent>
167
+
168
+ {/* Security Settings */}
169
+ <TabsContent value="security" className="space-y-6 p-6">
170
+ <form onSubmit={(e) => handleSaveSettings(e, 'security')} className="space-y-6">
171
+ <div>
172
+ <h3 className="text-lg font-semibold mb-1">Password &amp; Authentication</h3>
173
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Manage your login credentials</p>
174
+ <div className="space-y-4">
175
+ <div>
176
+ <Label htmlFor="currentPassword">Current Password</Label>
177
+ <Input id="currentPassword" name="currentPassword" type="password" placeholder="Enter your current password" required />
178
+ </div>
179
+ <div>
180
+ <Label htmlFor="newPassword">New Password</Label>
181
+ <Input id="newPassword" name="newPassword" type="password" placeholder="Enter a new password" />
182
+ <p className="text-xs text-gray-500 mt-1">Password must be at least 8 characters with uppercase, lowercase, and number</p>
183
+ </div>
184
+ <div>
185
+ <Label htmlFor="confirmNewPassword">Confirm New Password</Label>
186
+ <Input id="confirmNewPassword" name="confirmNewPassword" type="password" placeholder="Confirm your new password" />
187
+ </div>
188
+ </div>
189
+ </div>
190
+
191
+ <div>
192
+ <h3 className="text-lg font-semibold mb-1">Two-Factor Authentication</h3>
193
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Add an extra layer of security</p>
194
+ <div className="space-y-3">
195
+ <label className="flex items-center gap-2">
196
+ <input type="checkbox" name="enableTwoFactor" className="rounded" />
197
+ <span className="text-sm">Enable Two-Factor Authentication</span>
198
+ </label>
199
+ <div className="space-y-2 ml-6">
200
+ <label className="flex items-center gap-2">
201
+ <input type="radio" name="twoFactorMethod" value="sms" />
202
+ <span className="text-sm">SMS Text Message</span>
203
+ </label>
204
+ <label className="flex items-center gap-2">
205
+ <input type="radio" name="twoFactorMethod" value="app" defaultChecked />
206
+ <span className="text-sm">Authenticator App (Recommended)</span>
207
+ </label>
208
+ <label className="flex items-center gap-2">
209
+ <input type="radio" name="twoFactorMethod" value="email" />
210
+ <span className="text-sm">Email</span>
211
+ </label>
212
+ </div>
213
+ </div>
214
+ </div>
215
+
216
+ <div>
217
+ <h3 className="text-lg font-semibold mb-1">Login Sessions</h3>
218
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Manage your active sessions</p>
219
+ <div className="p-4 border rounded-lg mb-4">
220
+ <div className="flex justify-between items-start">
221
+ <div>
222
+ <div className="font-medium">Current Session</div>
223
+ <div className="text-sm text-gray-600 dark:text-gray-300">
224
+ Chrome on Mac &bull; Active now
225
+ </div>
226
+ </div>
227
+ <span className="text-xs bg-green-100 text-green-800 px-2 py-1 rounded">Current</span>
228
+ </div>
229
+ </div>
230
+ <Button variant="outline" size="sm" type="button">
231
+ Sign Out All Other Sessions
232
+ </Button>
233
+ </div>
234
+
235
+ <div className="flex justify-end">
236
+ <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
237
+ <Shield className="w-4 h-4" />
238
+ {isLoading ? 'Updating...' : 'Update Security'}
239
+ </Button>
240
+ </div>
241
+ </form>
242
+ </TabsContent>
243
+
244
+ {/* AI Preferences */}
245
+ <TabsContent value="ai" className="space-y-6 p-6">
246
+ <form onSubmit={(e) => handleSaveSettings(e, 'ai')} className="space-y-6">
247
+ <div>
248
+ <h3 className="text-lg font-semibold mb-1">AI Model Preferences</h3>
249
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Configure your preferred AI models and behavior</p>
250
+ <div className="space-y-4">
251
+ <div>
252
+ <Label htmlFor="defaultTextModel">Default Text Model</Label>
253
+ <select id="defaultTextModel" name="defaultTextModel" className="w-full p-3 border rounded-lg bg-background" defaultValue="gpt-4">
254
+ <option value="gpt-4">GPT-4 (Most capable)</option>
255
+ <option value="gpt-4-turbo">GPT-4 Turbo (Faster)</option>
256
+ <option value="gpt-3.5-turbo">GPT-3.5 Turbo (Cost-effective)</option>
257
+ <option value="claude-3">Claude 3 (Great for analysis)</option>
258
+ </select>
259
+ </div>
260
+ <div>
261
+ <Label htmlFor="creativityLevel">Creativity Level</Label>
262
+ <input type="range" id="creativityLevel" name="creativityLevel" min={0} max={100} defaultValue={70} className="w-full" />
263
+ <p className="text-xs text-gray-500 mt-1">Lower values are more conservative, higher values are more creative</p>
264
+ </div>
265
+ <div>
266
+ <Label htmlFor="responseLength">Default Response Length</Label>
267
+ <select id="responseLength" name="responseLength" className="w-full p-3 border rounded-lg bg-background" defaultValue="medium">
268
+ <option value="short">Short (1-2 paragraphs)</option>
269
+ <option value="medium">Medium (3-5 paragraphs)</option>
270
+ <option value="long">Long (6+ paragraphs)</option>
271
+ <option value="auto">Auto (context-dependent)</option>
272
+ </select>
273
+ </div>
274
+ </div>
275
+ </div>
276
+
277
+ <div>
278
+ <h3 className="text-lg font-semibold mb-1">Usage &amp; Limits</h3>
279
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Manage your AI usage preferences</p>
280
+ <div className="space-y-4">
281
+ <div>
282
+ <Label htmlFor="monthlyLimit">Monthly Request Limit</Label>
283
+ <Input id="monthlyLimit" name="monthlyLimit" type="number" min={0} defaultValue={0} placeholder="Enter limit (0 for unlimited)" />
284
+ <p className="text-xs text-gray-500 mt-1">Set a limit to control your usage and costs</p>
285
+ </div>
286
+ <label className="flex items-center gap-2">
287
+ <input type="checkbox" name="lowUsageAlerts" defaultChecked className="rounded" />
288
+ <span className="text-sm">Get notified when approaching usage limits</span>
289
+ </label>
290
+ </div>
291
+ </div>
292
+
293
+ <div className="flex justify-end">
294
+ <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
295
+ <Brain className="w-4 h-4" />
296
+ {isLoading ? 'Saving...' : 'Save AI Preferences'}
297
+ </Button>
298
+ </div>
299
+ </form>
300
+ </TabsContent>
301
+
302
+ {/* Notification Settings */}
303
+ <TabsContent value="notifications" className="space-y-6 p-6">
304
+ <form onSubmit={(e) => handleSaveSettings(e, 'notifications')} className="space-y-6">
305
+ <div>
306
+ <h3 className="text-lg font-semibold mb-1">Email Notifications</h3>
307
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Choose what emails you want to receive</p>
308
+ <div className="space-y-3">
309
+ {[
310
+ { value: 'account', label: 'Account & Security Updates', checked: true },
311
+ { value: 'billing', label: 'Billing & Payment Notifications', checked: true },
312
+ { value: 'features', label: 'New Features & Updates', checked: true },
313
+ { value: 'tips', label: 'Tips & Best Practices', checked: false },
314
+ { value: 'marketing', label: 'Marketing & Promotional Emails', checked: false },
315
+ ].map(opt => (
316
+ <label key={opt.value} className="flex items-center gap-2">
317
+ <input type="checkbox" name="emailNotifications" value={opt.value} defaultChecked={opt.checked} className="rounded" />
318
+ <span className="text-sm">{opt.label}</span>
319
+ </label>
320
+ ))}
321
+ </div>
322
+ <div className="mt-4">
323
+ <Label htmlFor="emailFrequency">Email Frequency</Label>
324
+ <select id="emailFrequency" name="emailFrequency" className="w-full p-3 border rounded-lg bg-background" defaultValue="daily">
325
+ <option value="immediate">Immediate</option>
326
+ <option value="daily">Daily Digest</option>
327
+ <option value="weekly">Weekly Summary</option>
328
+ <option value="never">Never (Critical only)</option>
329
+ </select>
330
+ </div>
331
+ </div>
332
+
333
+ <div>
334
+ <h3 className="text-lg font-semibold mb-1">Push Notifications</h3>
335
+ <p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Browser and mobile push notifications</p>
336
+ <div className="space-y-3">
337
+ <label className="flex items-center gap-2">
338
+ <input type="checkbox" name="pushNotifications" defaultChecked className="rounded" />
339
+ <span className="text-sm">Enable Push Notifications</span>
340
+ </label>
341
+ <div className="ml-6 space-y-2">
342
+ {[
343
+ { value: 'generation-complete', label: 'AI Generation Complete', checked: true },
344
+ { value: 'usage-alerts', label: 'Usage Limit Alerts', checked: true },
345
+ { value: 'team-invites', label: 'Team Invitations', checked: false },
346
+ { value: 'system-maintenance', label: 'System Maintenance', checked: false },
347
+ ].map(opt => (
348
+ <label key={opt.value} className="flex items-center gap-2">
349
+ <input type="checkbox" name="pushTypes" value={opt.value} defaultChecked={opt.checked} className="rounded" />
350
+ <span className="text-sm">{opt.label}</span>
351
+ </label>
352
+ ))}
353
+ </div>
354
+ </div>
355
+ </div>
356
+
357
+ <div className="flex justify-end">
358
+ <Button type="submit" disabled={isLoading} className="flex items-center gap-2">
359
+ <Bell className="w-4 h-4" />
360
+ {isLoading ? 'Saving...' : 'Save Notification Preferences'}
361
+ </Button>
362
+ </div>
363
+ </form>
364
+ </TabsContent>
365
+
366
+ {/* Appearance placeholder */}
367
+ <TabsContent value="appearance" className="p-6">
368
+ <div className="text-center py-12 text-gray-500">
369
+ <Palette className="w-12 h-12 mx-auto mb-4 opacity-50" />
370
+ <h3 className="text-lg font-semibold mb-2">Appearance Settings</h3>
371
+ <p>Theme and display preferences coming soon.</p>
372
+ </div>
373
+ </TabsContent>
374
+
375
+ {/* Team placeholder */}
376
+ <TabsContent value="team" className="p-6">
377
+ <div className="text-center py-12 text-gray-500">
378
+ <Users className="w-12 h-12 mx-auto mb-4 opacity-50" />
379
+ <h3 className="text-lg font-semibold mb-2">Team Settings</h3>
380
+ <p>Team management and collaboration settings coming soon.</p>
381
+ </div>
382
+ </TabsContent>
383
+ </Tabs>
384
+ </Card>
385
+ </MobileContainer>
386
+ </main>
387
+ </PageTransition>
388
+ )
389
+ }