@digilogiclabs/create-saas-app 1.14.0 → 1.17.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.
- package/README.md +134 -29
- package/bin/index.js +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/prompts/project-setup.d.ts.map +1 -1
- package/dist/cli/prompts/project-setup.js +45 -12
- package/dist/cli/prompts/project-setup.js.map +1 -1
- package/dist/generators/template-generator.d.ts.map +1 -1
- package/dist/generators/template-generator.js +27 -4
- package/dist/generators/template-generator.js.map +1 -1
- package/dist/templates/mobile/ui-auth-payments/template/.env.example +20 -0
- package/dist/templates/mobile/ui-auth-payments/template/README.md +218 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/_layout.tsx +153 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/analytics.tsx +668 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/billing.tsx +743 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +676 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/orders.tsx +402 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/profile.tsx +580 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/_layout.tsx +125 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/auth/login.tsx +246 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/auth/signup.tsx +362 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/onboarding/index.tsx +193 -0
- package/dist/templates/mobile/ui-auth-payments/template/app/tour/index.tsx +272 -0
- package/dist/templates/mobile/ui-auth-payments/template/app.json +93 -0
- package/dist/templates/mobile/ui-auth-payments/template/babel.config.js +23 -0
- package/dist/templates/mobile/ui-auth-payments/template/eas.json +45 -0
- package/dist/templates/mobile/ui-auth-payments/template/expo-env.d.ts +3 -0
- package/dist/templates/mobile/ui-auth-payments/template/jest-setup.ts +74 -0
- package/dist/templates/mobile/ui-auth-payments/template/metro.config.js +11 -0
- package/dist/templates/mobile/ui-auth-payments/template/package.json +106 -0
- package/dist/templates/mobile/ui-auth-payments/template/tsconfig.json +31 -0
- package/dist/templates/web/base/template/src/app/dashboard/page.tsx +62 -20
- package/dist/templates/web/ui-auth/template/package.json +1 -1
- package/dist/templates/web/ui-auth-payments/template/package.json +1 -1
- package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +69 -17
- package/dist/templates/web/ui-auth-payments-ai/template/package.json +1 -1
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +218 -7
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +62 -9
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +364 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +532 -0
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +70 -51
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +76 -60
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +1 -1
- package/dist/templates/web/ui-auth-payments-audio/template/package.json +1 -1
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +71 -17
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +1 -1
- package/dist/templates/web/ui-auth-payments-video/template/package.json +1 -1
- package/package.json +1 -1
- package/src/templates/mobile/ui-auth-payments/template/.env.example +20 -0
- package/src/templates/mobile/ui-auth-payments/template/README.md +218 -0
- package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/_layout.tsx +153 -0
- package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/analytics.tsx +668 -0
- package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/billing.tsx +743 -0
- package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +676 -0
- package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/orders.tsx +402 -0
- package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/profile.tsx +580 -0
- package/src/templates/mobile/ui-auth-payments/template/app/_layout.tsx +125 -0
- package/src/templates/mobile/ui-auth-payments/template/app/auth/login.tsx +246 -0
- package/src/templates/mobile/ui-auth-payments/template/app/auth/signup.tsx +362 -0
- package/src/templates/mobile/ui-auth-payments/template/app/onboarding/index.tsx +193 -0
- package/src/templates/mobile/ui-auth-payments/template/app/tour/index.tsx +272 -0
- package/src/templates/mobile/ui-auth-payments/template/app.json +93 -0
- package/src/templates/mobile/ui-auth-payments/template/babel.config.js +23 -0
- package/src/templates/mobile/ui-auth-payments/template/eas.json +45 -0
- package/src/templates/mobile/ui-auth-payments/template/expo-env.d.ts +3 -0
- package/src/templates/mobile/ui-auth-payments/template/jest-setup.ts +74 -0
- package/src/templates/mobile/ui-auth-payments/template/metro.config.js +11 -0
- package/src/templates/mobile/ui-auth-payments/template/package.json +106 -0
- package/src/templates/mobile/ui-auth-payments/template/tsconfig.json +31 -0
- package/src/templates/web/base/template/src/app/dashboard/page.tsx +62 -20
- package/src/templates/web/ui-auth/template/package.json +1 -1
- package/src/templates/web/ui-auth-payments/template/package.json +1 -1
- package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +69 -17
- package/src/templates/web/ui-auth-payments-ai/template/package.json +1 -1
- package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +218 -7
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +62 -9
- package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +364 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +532 -0
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +70 -51
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +76 -60
- package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +1 -1
- package/src/templates/web/ui-auth-payments-audio/template/package.json +1 -1
- package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +71 -17
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +1 -1
- package/src/templates/web/ui-auth-payments-video/template/package.json +1 -1
package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import React, { useState, useActionState } from 'react'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
Button,
|
|
6
|
+
Card,
|
|
7
|
+
Input,
|
|
8
|
+
Label,
|
|
9
|
+
SingleStepForm,
|
|
10
|
+
FormField,
|
|
11
|
+
FormProvider
|
|
12
|
+
} from '@digilogiclabs/saas-factory-ui'
|
|
5
13
|
import { useAuth } from '@digilogiclabs/saas-factory-auth'
|
|
6
14
|
import { useRouter } from 'next/navigation'
|
|
7
15
|
import { signUpAction } from '@/lib/actions/auth'
|
|
@@ -92,84 +100,92 @@ export function SignupForm() {
|
|
|
92
100
|
</div>
|
|
93
101
|
)}
|
|
94
102
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
103
|
+
{/* Enhanced form with enterprise form system */}
|
|
104
|
+
<FormProvider>
|
|
105
|
+
<SingleStepForm
|
|
106
|
+
onSubmit={async (formData) => {
|
|
107
|
+
try {
|
|
108
|
+
const result = await formAction(formData)
|
|
109
|
+
if (result?.success) {
|
|
110
|
+
const emailValue = formData.get('email') as string
|
|
111
|
+
const passwordValue = formData.get('password') as string
|
|
112
|
+
await signUp(emailValue, passwordValue)
|
|
113
|
+
router.push('/')
|
|
114
|
+
}
|
|
115
|
+
} catch (err) {
|
|
116
|
+
console.error('Sign up error:', err)
|
|
117
|
+
}
|
|
118
|
+
}}
|
|
119
|
+
className="space-y-4"
|
|
120
|
+
submitButton={{
|
|
121
|
+
text: loading ? 'Signing Up...' : 'Sign Up',
|
|
122
|
+
disabled: loading,
|
|
123
|
+
className: 'w-full'
|
|
124
|
+
}}
|
|
125
|
+
realTimeValidation={true}
|
|
126
|
+
debounceMs={300}
|
|
127
|
+
crossFieldValidation={{
|
|
128
|
+
passwordMatch: {
|
|
129
|
+
fields: ['password', 'confirmPassword'],
|
|
130
|
+
validator: (values) => values.password === values.confirmPassword,
|
|
131
|
+
message: 'Passwords must match'
|
|
132
|
+
}
|
|
133
|
+
}}
|
|
134
|
+
>
|
|
135
|
+
<FormField
|
|
100
136
|
name="name"
|
|
101
137
|
type="text"
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
required
|
|
138
|
+
label="Name"
|
|
139
|
+
placeholder="Enter your full name"
|
|
140
|
+
validation={['required', 'minLength:2']}
|
|
106
141
|
disabled={loading}
|
|
142
|
+
className="mb-4"
|
|
107
143
|
/>
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
)}
|
|
111
|
-
</div>
|
|
112
|
-
<div>
|
|
113
|
-
<Label htmlFor="email">Email</Label>
|
|
114
|
-
<Input
|
|
115
|
-
id="email"
|
|
144
|
+
|
|
145
|
+
<FormField
|
|
116
146
|
name="email"
|
|
117
147
|
type="email"
|
|
118
|
-
|
|
119
|
-
onChange={(e) => setEmail(e.target.value)}
|
|
148
|
+
label="Email"
|
|
120
149
|
placeholder="Enter your email"
|
|
121
|
-
required
|
|
150
|
+
validation={['required', 'email']}
|
|
122
151
|
disabled={loading}
|
|
152
|
+
className="mb-4"
|
|
123
153
|
/>
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
)}
|
|
127
|
-
</div>
|
|
128
|
-
<div>
|
|
129
|
-
<Label htmlFor="password">Password</Label>
|
|
130
|
-
<Input
|
|
131
|
-
id="password"
|
|
154
|
+
|
|
155
|
+
<FormField
|
|
132
156
|
name="password"
|
|
133
157
|
type="password"
|
|
134
|
-
|
|
135
|
-
onChange={(e) => setPassword(e.target.value)}
|
|
158
|
+
label="Password"
|
|
136
159
|
placeholder="Enter your password"
|
|
137
|
-
required
|
|
160
|
+
validation={['required', 'minLength:8', 'hasUppercase', 'hasLowercase', 'hasNumber']}
|
|
138
161
|
disabled={loading}
|
|
162
|
+
className="mb-4"
|
|
163
|
+
showPasswordStrength={true}
|
|
164
|
+
helpText="Password must be at least 8 characters with uppercase, lowercase, and number"
|
|
139
165
|
/>
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
)}
|
|
143
|
-
</div>
|
|
144
|
-
<div>
|
|
145
|
-
<Label htmlFor="confirmPassword">Confirm Password</Label>
|
|
146
|
-
<Input
|
|
147
|
-
id="confirmPassword"
|
|
166
|
+
|
|
167
|
+
<FormField
|
|
148
168
|
name="confirmPassword"
|
|
149
169
|
type="password"
|
|
150
|
-
|
|
151
|
-
onChange={(e) => setConfirmPassword(e.target.value)}
|
|
170
|
+
label="Confirm Password"
|
|
152
171
|
placeholder="Confirm your password"
|
|
153
|
-
required
|
|
172
|
+
validation={['required']}
|
|
154
173
|
disabled={loading}
|
|
174
|
+
className="mb-6"
|
|
155
175
|
/>
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
>
|
|
170
|
-
Sign up with Google
|
|
171
|
-
</Button>
|
|
172
|
-
</form>
|
|
176
|
+
</SingleStepForm>
|
|
177
|
+
</FormProvider>
|
|
178
|
+
|
|
179
|
+
{/* Social Auth */}
|
|
180
|
+
<Button
|
|
181
|
+
type="button"
|
|
182
|
+
variant="outline"
|
|
183
|
+
className="w-full mt-4"
|
|
184
|
+
onClick={handleGoogleSignUp}
|
|
185
|
+
disabled={loading}
|
|
186
|
+
>
|
|
187
|
+
Sign up with Google
|
|
188
|
+
</Button>
|
|
173
189
|
|
|
174
190
|
<div className="mt-4 text-center">
|
|
175
191
|
<p className="text-sm text-gray-600 dark:text-gray-300">
|
|
@@ -144,7 +144,7 @@ export function Header() {
|
|
|
144
144
|
key={item.href}
|
|
145
145
|
href={item.href}
|
|
146
146
|
className="group flex items-center gap-2 text-muted-foreground hover:text-primary transition-all duration-300 relative px-3 py-2 rounded-lg hover:bg-gradient-to-r hover:from-primary/10 hover:to-secondary/10 animate-fade-in-up"
|
|
147
|
-
style={{ animationDelay:
|
|
147
|
+
style={{ animationDelay: (index * 100) + 'ms' }}
|
|
148
148
|
>
|
|
149
149
|
<item.icon className="w-4 h-4 transition-transform duration-300 group-hover:scale-110 group-hover:rotate-3" />
|
|
150
150
|
<span className="relative">
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"next": "^15.0.0",
|
|
18
18
|
"react": "^19.0.0",
|
|
19
19
|
"react-dom": "^19.0.0",
|
|
20
|
-
"@digilogiclabs/saas-factory-ui": "^0.
|
|
20
|
+
"@digilogiclabs/saas-factory-ui": "^0.21.0",
|
|
21
21
|
"@digilogiclabs/saas-factory-auth": "^1.0.1",
|
|
22
22
|
"@digilogiclabs/saas-factory-payments": "^1.1.0",
|
|
23
23
|
"stripe": "^14.0.0",
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import { Suspense } from 'react'
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Card,
|
|
5
|
+
DashboardLayout,
|
|
6
|
+
CommandPalette,
|
|
7
|
+
Tour
|
|
8
|
+
} from '@digilogiclabs/saas-factory-ui'
|
|
9
|
+
import {
|
|
10
|
+
User,
|
|
11
|
+
Settings,
|
|
12
|
+
CreditCard,
|
|
13
|
+
Activity,
|
|
14
|
+
Home,
|
|
15
|
+
Music,
|
|
16
|
+
Headphones,
|
|
17
|
+
Mic,
|
|
18
|
+
BarChart
|
|
19
|
+
} from 'lucide-react'
|
|
4
20
|
import { requireAuth } from '@/lib/auth-server'
|
|
5
21
|
import Link from 'next/link'
|
|
6
22
|
|
|
@@ -90,26 +106,63 @@ export default async function DashboardPage() {
|
|
|
90
106
|
// Server-side authentication requirement
|
|
91
107
|
const user = await requireAuth()
|
|
92
108
|
|
|
109
|
+
const sidebarNavigation = [
|
|
110
|
+
{ name: 'Overview', href: '/dashboard', icon: Home, current: true },
|
|
111
|
+
{ name: 'Audio Library', href: '/dashboard/library', icon: Music },
|
|
112
|
+
{ name: 'Recording Studio', href: '/dashboard/studio', icon: Mic },
|
|
113
|
+
{ name: 'Playback', href: '/dashboard/player', icon: Headphones },
|
|
114
|
+
{ name: 'Analytics', href: '/dashboard/analytics', icon: BarChart },
|
|
115
|
+
{ name: 'Settings', href: '/settings', icon: Settings },
|
|
116
|
+
{ name: 'Billing', href: '/billing', icon: CreditCard }
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
const tourSteps = [
|
|
120
|
+
{
|
|
121
|
+
target: '[data-tour="overview"]',
|
|
122
|
+
title: 'Audio Dashboard',
|
|
123
|
+
content: 'Welcome to your audio production dashboard. Manage your tracks and recordings here.'
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
target: '[data-tour="stats"]',
|
|
127
|
+
title: 'Audio Statistics',
|
|
128
|
+
content: 'View your audio production metrics and usage statistics.'
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
target: '[data-tour="actions"]',
|
|
132
|
+
title: 'Audio Tools',
|
|
133
|
+
content: 'Quick access to recording, mixing, and audio management tools.'
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
|
|
93
137
|
return (
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
<
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
138
|
+
<DashboardLayout
|
|
139
|
+
navigation={sidebarNavigation}
|
|
140
|
+
headerActions={[
|
|
141
|
+
<CommandPalette key="command-palette" />,
|
|
142
|
+
<Tour key="tour" steps={tourSteps} />
|
|
143
|
+
]}
|
|
144
|
+
>
|
|
145
|
+
<div className="min-h-screen bg-gray-50 dark:bg-gray-900">
|
|
146
|
+
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
|
147
|
+
{/* Header */}
|
|
148
|
+
<div className="mb-8" data-tour="overview">
|
|
149
|
+
<h1 className="text-3xl font-bold text-gray-900 dark:text-white">
|
|
150
|
+
Welcome back, {user.name || user.email}!
|
|
151
|
+
</h1>
|
|
152
|
+
<p className="text-gray-600 dark:text-gray-300 mt-2">
|
|
153
|
+
Here's what's happening with your audio projects today.
|
|
154
|
+
</p>
|
|
155
|
+
</div>
|
|
105
156
|
|
|
106
157
|
{/* Stats - Streaming with Suspense */}
|
|
107
|
-
<
|
|
108
|
-
<
|
|
109
|
-
|
|
158
|
+
<div data-tour="stats">
|
|
159
|
+
<Suspense fallback={<UserStatsSkeleton />}>
|
|
160
|
+
<UserStats userId={user.id} />
|
|
161
|
+
</Suspense>
|
|
162
|
+
</div>
|
|
110
163
|
|
|
111
164
|
{/* Quick Actions */}
|
|
112
|
-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8">
|
|
165
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-8" data-tour="actions">
|
|
113
166
|
<Card className="p-6">
|
|
114
167
|
<div className="flex items-center mb-4">
|
|
115
168
|
<User className="h-6 w-6 text-blue-600 dark:text-blue-400 mr-3" />
|
|
@@ -179,5 +232,6 @@ export default async function DashboardPage() {
|
|
|
179
232
|
</Card>
|
|
180
233
|
</div>
|
|
181
234
|
</div>
|
|
235
|
+
</DashboardLayout>
|
|
182
236
|
)
|
|
183
237
|
}
|
|
@@ -144,7 +144,7 @@ export function Header() {
|
|
|
144
144
|
key={item.href}
|
|
145
145
|
href={item.href}
|
|
146
146
|
className="group flex items-center gap-2 text-muted-foreground hover:text-primary transition-all duration-300 relative px-3 py-2 rounded-lg hover:bg-gradient-to-r hover:from-primary/10 hover:to-accent/10 animate-fade-in-up"
|
|
147
|
-
style={{ animationDelay:
|
|
147
|
+
style={{ animationDelay: (index * 100) + 'ms' }}
|
|
148
148
|
>
|
|
149
149
|
<item.icon className="w-4 h-4 transition-transform duration-300 group-hover:scale-110 group-hover:rotate-3" />
|
|
150
150
|
<span className="relative">
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"next": "^15.0.0",
|
|
18
18
|
"react": "^19.0.0",
|
|
19
19
|
"react-dom": "^19.0.0",
|
|
20
|
-
"@digilogiclabs/saas-factory-ui": "^0.
|
|
20
|
+
"@digilogiclabs/saas-factory-ui": "^0.21.0",
|
|
21
21
|
"@digilogiclabs/saas-factory-auth": "^1.0.1",
|
|
22
22
|
"@digilogiclabs/saas-factory-payments": "^1.1.0",
|
|
23
23
|
"stripe": "^14.0.0",
|
package/package.json
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Supabase Configuration
|
|
2
|
+
EXPO_PUBLIC_SUPABASE_URL=your-supabase-url
|
|
3
|
+
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
|
|
4
|
+
|
|
5
|
+
# Stripe Configuration
|
|
6
|
+
EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=your-stripe-publishable-key
|
|
7
|
+
|
|
8
|
+
# App Configuration
|
|
9
|
+
EXPO_PUBLIC_APP_NAME={{titleCaseName}}
|
|
10
|
+
EXPO_PUBLIC_APP_VERSION=1.0.0
|
|
11
|
+
|
|
12
|
+
# Development
|
|
13
|
+
EXPO_PUBLIC_API_URL=http://localhost:3000/api
|
|
14
|
+
EXPO_PUBLIC_DEBUG=true
|
|
15
|
+
|
|
16
|
+
# EAS Build Configuration (for CI/CD)
|
|
17
|
+
EAS_PROJECT_ID=your-eas-project-id
|
|
18
|
+
APPLE_ID=your-apple-id
|
|
19
|
+
ASC_APP_ID=your-app-store-connect-app-id
|
|
20
|
+
APPLE_TEAM_ID=your-apple-team-id
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# {{titleCaseName}} - Mobile App
|
|
2
|
+
|
|
3
|
+
A React Native mobile application built with Expo, featuring authentication, payments, and a comprehensive dashboard.
|
|
4
|
+
|
|
5
|
+
## 🚀 Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install dependencies
|
|
9
|
+
npm install
|
|
10
|
+
|
|
11
|
+
# Start the development server
|
|
12
|
+
npm run dev
|
|
13
|
+
|
|
14
|
+
# Run on iOS simulator
|
|
15
|
+
npm run ios
|
|
16
|
+
|
|
17
|
+
# Run on Android emulator
|
|
18
|
+
npm run android
|
|
19
|
+
|
|
20
|
+
# Run on web
|
|
21
|
+
npm run web
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 📱 Features
|
|
25
|
+
|
|
26
|
+
- **Authentication**: Complete sign up, sign in, and user management
|
|
27
|
+
- **Payments**: Stripe integration with payment methods and subscriptions
|
|
28
|
+
- **Dashboard**: Real-time analytics and order management
|
|
29
|
+
- **Native Navigation**: Bottom tabs with Expo Router
|
|
30
|
+
- **Offline Support**: Network-aware components and offline caching
|
|
31
|
+
- **Push Notifications**: Order updates and promotional messages
|
|
32
|
+
- **Camera Integration**: Profile photos and QR code scanning
|
|
33
|
+
- **Location Services**: Delivery tracking and location-based features
|
|
34
|
+
|
|
35
|
+
## 🏗️ Tech Stack
|
|
36
|
+
|
|
37
|
+
- **React Native** 0.73+ with Expo 50+
|
|
38
|
+
- **TypeScript** for type safety
|
|
39
|
+
- **Expo Router** for navigation
|
|
40
|
+
- **Stripe** for payments
|
|
41
|
+
- **Supabase** for backend services
|
|
42
|
+
- **React Hook Form** + Zod for form validation
|
|
43
|
+
- **@digilogiclabs/saas-factory-ui** for UI components
|
|
44
|
+
- **@digilogiclabs/saas-factory-auth** for authentication
|
|
45
|
+
- **@digilogiclabs/saas-factory-payments** for payment processing
|
|
46
|
+
|
|
47
|
+
## 📦 Project Structure
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
├── app/ # Expo Router pages
|
|
51
|
+
│ ├── (tabs)/ # Main app tabs
|
|
52
|
+
│ │ ├── index.tsx # Dashboard
|
|
53
|
+
│ │ ├── orders.tsx # Orders list
|
|
54
|
+
│ │ ├── analytics.tsx # Analytics dashboard
|
|
55
|
+
│ │ ├── billing.tsx # Payments & billing
|
|
56
|
+
│ │ └── profile.tsx # User profile
|
|
57
|
+
│ ├── auth/ # Authentication screens
|
|
58
|
+
│ │ ├── login.tsx # Sign in
|
|
59
|
+
│ │ └── signup.tsx # Sign up
|
|
60
|
+
│ └── _layout.tsx # Root layout with providers
|
|
61
|
+
├── components/ # Reusable components
|
|
62
|
+
├── hooks/ # Custom hooks
|
|
63
|
+
├── utils/ # Utility functions
|
|
64
|
+
├── types/ # TypeScript types
|
|
65
|
+
└── constants/ # App constants
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 🔧 Configuration
|
|
69
|
+
|
|
70
|
+
### Environment Variables
|
|
71
|
+
|
|
72
|
+
Copy `.env.example` to `.env` and update the values:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Supabase
|
|
76
|
+
EXPO_PUBLIC_SUPABASE_URL=your-supabase-url
|
|
77
|
+
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
|
|
78
|
+
|
|
79
|
+
# Stripe
|
|
80
|
+
EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY=your-stripe-publishable-key
|
|
81
|
+
|
|
82
|
+
# App Configuration
|
|
83
|
+
EXPO_PUBLIC_APP_NAME={{titleCaseName}}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### EAS Configuration
|
|
87
|
+
|
|
88
|
+
For building and deploying with EAS Build:
|
|
89
|
+
|
|
90
|
+
1. Install EAS CLI: `npm install -g eas-cli`
|
|
91
|
+
2. Login: `eas login`
|
|
92
|
+
3. Configure: `eas build:configure`
|
|
93
|
+
4. Build: `eas build --platform all`
|
|
94
|
+
|
|
95
|
+
## 🔒 Permissions
|
|
96
|
+
|
|
97
|
+
The app requests the following permissions:
|
|
98
|
+
|
|
99
|
+
- **Camera**: Profile photos and QR code scanning
|
|
100
|
+
- **Location**: Delivery tracking and location services
|
|
101
|
+
- **Notifications**: Order updates and push notifications
|
|
102
|
+
- **Storage**: Offline caching and data storage
|
|
103
|
+
|
|
104
|
+
## 🎨 UI Components
|
|
105
|
+
|
|
106
|
+
This app uses the **@digilogiclabs/saas-factory-ui** library for native components:
|
|
107
|
+
|
|
108
|
+
- **Native Cards**: Styled containers with shadows
|
|
109
|
+
- **Native Buttons**: Various styles and states
|
|
110
|
+
- **Native Forms**: Validated input fields
|
|
111
|
+
- **Native Charts**: Data visualization
|
|
112
|
+
- **Native Navigation**: Tab bars and navigation
|
|
113
|
+
- **Native Modals**: Overlay components
|
|
114
|
+
|
|
115
|
+
## 💳 Payments Integration
|
|
116
|
+
|
|
117
|
+
Stripe integration includes:
|
|
118
|
+
|
|
119
|
+
- **Payment Methods**: Add/remove credit cards
|
|
120
|
+
- **Subscriptions**: Manage recurring payments
|
|
121
|
+
- **Invoices**: View billing history
|
|
122
|
+
- **Apple Pay**: iOS native payment method
|
|
123
|
+
- **Google Pay**: Android native payment method
|
|
124
|
+
|
|
125
|
+
## 📊 Analytics
|
|
126
|
+
|
|
127
|
+
Built-in analytics dashboard with:
|
|
128
|
+
|
|
129
|
+
- **Revenue Tracking**: Daily, weekly, monthly views
|
|
130
|
+
- **Order Analytics**: Sales and conversion metrics
|
|
131
|
+
- **Customer Insights**: User behavior and trends
|
|
132
|
+
- **Real-time Data**: Live updates and notifications
|
|
133
|
+
|
|
134
|
+
## 🧪 Testing
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# Run tests
|
|
138
|
+
npm test
|
|
139
|
+
|
|
140
|
+
# Run tests with coverage
|
|
141
|
+
npm run test:coverage
|
|
142
|
+
|
|
143
|
+
# Run tests in watch mode
|
|
144
|
+
npm run test:watch
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 🚀 Deployment
|
|
148
|
+
|
|
149
|
+
### Development Build
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Create development build
|
|
153
|
+
eas build --profile development
|
|
154
|
+
|
|
155
|
+
# Install on device
|
|
156
|
+
eas install
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Production Build
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Build for App Store/Play Store
|
|
163
|
+
eas build --profile production
|
|
164
|
+
|
|
165
|
+
# Submit to stores
|
|
166
|
+
eas submit --platform all
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 📱 Platform Support
|
|
170
|
+
|
|
171
|
+
- **iOS**: 13.0+
|
|
172
|
+
- **Android**: API 21+ (Android 5.0)
|
|
173
|
+
- **Web**: Modern browsers (for development)
|
|
174
|
+
|
|
175
|
+
## 🔄 Updates
|
|
176
|
+
|
|
177
|
+
The app supports over-the-air updates with Expo Updates:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# Publish update
|
|
181
|
+
eas update --branch production
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## 🆘 Troubleshooting
|
|
185
|
+
|
|
186
|
+
### Common Issues
|
|
187
|
+
|
|
188
|
+
1. **Metro bundler issues**: Clear cache with `expo start -c`
|
|
189
|
+
2. **Build failures**: Check EAS build logs in the dashboard
|
|
190
|
+
3. **Permission errors**: Verify permissions in app.json
|
|
191
|
+
4. **Stripe setup**: Ensure proper API keys and webhook endpoints
|
|
192
|
+
|
|
193
|
+
### Debug Mode
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# Enable debug mode
|
|
197
|
+
EXPO_PUBLIC_DEBUG=true npm run dev
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## 📄 License
|
|
201
|
+
|
|
202
|
+
This project is licensed under the MIT License. See LICENSE file for details.
|
|
203
|
+
|
|
204
|
+
## 🤝 Contributing
|
|
205
|
+
|
|
206
|
+
1. Fork the repository
|
|
207
|
+
2. Create a feature branch: `git checkout -b feature/new-feature`
|
|
208
|
+
3. Commit changes: `git commit -am 'Add new feature'`
|
|
209
|
+
4. Push to branch: `git push origin feature/new-feature`
|
|
210
|
+
5. Submit a pull request
|
|
211
|
+
|
|
212
|
+
## 📞 Support
|
|
213
|
+
|
|
214
|
+
For support and questions:
|
|
215
|
+
|
|
216
|
+
- Email: support@{{packageName}}.com
|
|
217
|
+
- Documentation: [docs.{{packageName}}.com](https://docs.{{packageName}}.com)
|
|
218
|
+
- Issues: [GitHub Issues](https://github.com/{{githubRepo}}/issues)
|