@digilogiclabs/create-saas-app 1.5.2 → 1.5.3

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 (216) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/templates/mobile/base/template/.env.example +15 -0
  3. package/dist/templates/mobile/base/template/App.tsx +88 -0
  4. package/dist/templates/mobile/base/template/app/(auth)/login.tsx +44 -0
  5. package/dist/templates/mobile/base/template/app/(auth)/signup.tsx +43 -0
  6. package/dist/templates/mobile/base/template/app/checkout.tsx +20 -0
  7. package/dist/templates/mobile/base/template/package.json +38 -0
  8. package/dist/templates/shared/auth/firebase/web/config.ts +23 -0
  9. package/dist/templates/shared/auth/supabase/web/config.ts +8 -0
  10. package/dist/templates/web/base/template/.env.example +15 -0
  11. package/dist/templates/web/base/template/.eslintrc.js +8 -0
  12. package/dist/templates/web/base/template/README.md +68 -0
  13. package/dist/templates/web/base/template/next.config.js +15 -0
  14. package/dist/templates/web/base/template/package.json +58 -0
  15. package/dist/templates/web/base/template/postcss.config.js +7 -0
  16. package/dist/templates/web/base/template/src/app/auth/callback/route.ts +18 -0
  17. package/dist/templates/web/base/template/src/app/checkout/page.tsx +28 -0
  18. package/dist/templates/web/base/template/src/app/error.tsx +97 -0
  19. package/dist/templates/web/base/template/src/app/globals.css +60 -0
  20. package/dist/templates/web/base/template/src/app/layout.tsx +35 -0
  21. package/dist/templates/web/base/template/src/app/loading.tsx +34 -0
  22. package/dist/templates/web/base/template/src/app/login/page.tsx +39 -0
  23. package/dist/templates/web/base/template/src/app/page.tsx +132 -0
  24. package/dist/templates/web/base/template/src/app/signup/page.tsx +39 -0
  25. package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +49 -0
  26. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +33 -0
  27. package/dist/templates/web/base/template/src/components/providers/theme-provider.tsx +94 -0
  28. package/dist/templates/web/base/template/src/components/shared/footer.tsx +36 -0
  29. package/dist/templates/web/base/template/src/components/shared/header.tsx +44 -0
  30. package/dist/templates/web/base/template/src/components/ui/badge.tsx +36 -0
  31. package/dist/templates/web/base/template/src/components/ui/button.tsx +56 -0
  32. package/dist/templates/web/base/template/src/components/ui/card.tsx +71 -0
  33. package/dist/templates/web/base/template/src/components/ui/theme-toggle.tsx +34 -0
  34. package/dist/templates/web/base/template/src/lib/auth-server.ts +177 -0
  35. package/dist/templates/web/base/template/src/lib/env.ts +46 -0
  36. package/dist/templates/web/base/template/src/lib/utils.ts +140 -0
  37. package/dist/templates/web/base/template/src/test/setup.ts +79 -0
  38. package/dist/templates/web/base/template/tailwind.config.js +77 -0
  39. package/dist/templates/web/base/template/tsconfig.json +33 -0
  40. package/dist/templates/web/base/template/vitest.config.ts +17 -0
  41. package/dist/templates/web/base/template.backup/.env.example +15 -0
  42. package/dist/templates/web/base/template.backup.20250817/.env.example +15 -0
  43. package/dist/templates/web/ui-auth/template/.env.example +15 -0
  44. package/dist/templates/web/ui-auth/template/.eslintrc.js +8 -0
  45. package/dist/templates/web/ui-auth/template/README.md +68 -0
  46. package/dist/templates/web/ui-auth/template/next.config.js +12 -0
  47. package/dist/templates/web/ui-auth/template/package.json +50 -0
  48. package/dist/templates/web/ui-auth/template/postcss.config.js +7 -0
  49. package/dist/templates/web/ui-auth/template/src/app/auth/callback/route.ts +12 -0
  50. package/dist/templates/web/ui-auth/template/src/app/checkout/page.tsx +25 -0
  51. package/dist/templates/web/ui-auth/template/src/app/error.tsx +67 -0
  52. package/dist/templates/web/ui-auth/template/src/app/globals.css +42 -0
  53. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +33 -0
  54. package/dist/templates/web/ui-auth/template/src/app/loading.tsx +20 -0
  55. package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +109 -0
  56. package/dist/templates/web/ui-auth/template/src/app/page.tsx +129 -0
  57. package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -0
  58. package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +49 -0
  59. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +29 -0
  60. package/dist/templates/web/ui-auth/template/src/components/providers/theme-provider.tsx +94 -0
  61. package/dist/templates/web/ui-auth/template/src/components/shared/footer.tsx +36 -0
  62. package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +53 -0
  63. package/dist/templates/web/ui-auth/template/src/components/ui/badge.tsx +36 -0
  64. package/dist/templates/web/ui-auth/template/src/components/ui/theme-toggle.tsx +34 -0
  65. package/dist/templates/web/ui-auth/template/src/lib/env.ts +49 -0
  66. package/dist/templates/web/ui-auth/template/src/lib/utils.ts +140 -0
  67. package/dist/templates/web/ui-auth/template/src/test/setup.ts +79 -0
  68. package/dist/templates/web/ui-auth/template/tailwind.config.js +77 -0
  69. package/dist/templates/web/ui-auth/template/tsconfig.json +33 -0
  70. package/dist/templates/web/ui-auth/template/vitest.config.ts +17 -0
  71. package/dist/templates/web/ui-auth/template.backup/.env.example +15 -0
  72. package/dist/templates/web/ui-auth/template.backup.20250817/.env.example +15 -0
  73. package/dist/templates/web/ui-auth-payments/template/.env.example +15 -0
  74. package/dist/templates/web/ui-auth-payments/template/README.md +165 -0
  75. package/dist/templates/web/ui-auth-payments/template/middleware.ts +68 -0
  76. package/dist/templates/web/ui-auth-payments/template/next.config.js +12 -0
  77. package/dist/templates/web/ui-auth-payments/template/package-lock.json +12240 -0
  78. package/dist/templates/web/ui-auth-payments/template/package.json +52 -0
  79. package/dist/templates/web/ui-auth-payments/template/postcss.config.js +7 -0
  80. package/dist/templates/web/ui-auth-payments/template/src/app/auth/callback/route.ts +12 -0
  81. package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +211 -0
  82. package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +142 -0
  83. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/layout.tsx +22 -0
  84. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +183 -0
  85. package/dist/templates/web/ui-auth-payments/template/src/app/error.tsx +67 -0
  86. package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +42 -0
  87. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +33 -0
  88. package/dist/templates/web/ui-auth-payments/template/src/app/loading.tsx +20 -0
  89. package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +38 -0
  90. package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -0
  91. package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +143 -0
  92. package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +50 -0
  93. package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -0
  94. package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +49 -0
  95. package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +52 -0
  96. package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +144 -0
  97. package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +68 -0
  98. package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +185 -0
  99. package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +32 -0
  100. package/dist/templates/web/ui-auth-payments/template/src/components/providers/theme-provider.tsx +94 -0
  101. package/dist/templates/web/ui-auth-payments/template/src/components/shared/footer.tsx +36 -0
  102. package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +62 -0
  103. package/dist/templates/web/ui-auth-payments/template/src/components/ui/badge.tsx +36 -0
  104. package/dist/templates/web/ui-auth-payments/template/src/components/ui/theme-toggle.tsx +34 -0
  105. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +246 -0
  106. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +340 -0
  107. package/dist/templates/web/ui-auth-payments/template/src/lib/auth-server.ts +177 -0
  108. package/dist/templates/web/ui-auth-payments/template/src/lib/env.ts +49 -0
  109. package/dist/templates/web/ui-auth-payments/template/src/lib/utils.ts +140 -0
  110. package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +79 -0
  111. package/dist/templates/web/ui-auth-payments/template/tailwind.config.js +77 -0
  112. package/dist/templates/web/ui-auth-payments/template/tsconfig.json +33 -0
  113. package/dist/templates/web/ui-auth-payments/template/tsconfig.tsbuildinfo +1 -0
  114. package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +17 -0
  115. package/dist/templates/web/ui-auth-payments-audio/template/.env.example +15 -0
  116. package/dist/templates/web/ui-auth-payments-audio/template/README.md +187 -0
  117. package/dist/templates/web/ui-auth-payments-audio/template/middleware.ts +68 -0
  118. package/dist/templates/web/ui-auth-payments-audio/template/next.config.js +12 -0
  119. package/dist/templates/web/ui-auth-payments-audio/template/package-lock.json +12241 -0
  120. package/dist/templates/web/ui-auth-payments-audio/template/package.json +53 -0
  121. package/dist/templates/web/ui-auth-payments-audio/template/postcss.config.js +7 -0
  122. package/dist/templates/web/ui-auth-payments-audio/template/src/app/auth/callback/route.ts +12 -0
  123. package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +211 -0
  124. package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +142 -0
  125. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/layout.tsx +22 -0
  126. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +183 -0
  127. package/dist/templates/web/ui-auth-payments-audio/template/src/app/error.tsx +67 -0
  128. package/dist/templates/web/ui-auth-payments-audio/template/src/app/globals.css +42 -0
  129. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +35 -0
  130. package/dist/templates/web/ui-auth-payments-audio/template/src/app/loading.tsx +20 -0
  131. package/dist/templates/web/ui-auth-payments-audio/template/src/app/login/page.tsx +6 -0
  132. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +181 -0
  133. package/dist/templates/web/ui-auth-payments-audio/template/src/app/signup/page.tsx +6 -0
  134. package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +49 -0
  135. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +52 -0
  136. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +144 -0
  137. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +185 -0
  138. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +32 -0
  139. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/theme-provider.tsx +94 -0
  140. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/footer.tsx +36 -0
  141. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +62 -0
  142. package/dist/templates/web/ui-auth-payments-audio/template/src/components/ui/badge.tsx +36 -0
  143. package/dist/templates/web/ui-auth-payments-audio/template/src/components/ui/theme-toggle.tsx +34 -0
  144. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +246 -0
  145. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/index.ts +14 -0
  146. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/auth-server.ts +177 -0
  147. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/env.ts +49 -0
  148. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/utils.ts +140 -0
  149. package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +79 -0
  150. package/dist/templates/web/ui-auth-payments-audio/template/tailwind.config.js +77 -0
  151. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.json +33 -0
  152. package/dist/templates/web/ui-auth-payments-audio/template/tsconfig.tsbuildinfo +1 -0
  153. package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +17 -0
  154. package/dist/templates/web/ui-auth-payments-video/template/.env.example +15 -0
  155. package/dist/templates/web/ui-auth-payments-video/template/README.md +190 -0
  156. package/dist/templates/web/ui-auth-payments-video/template/next.config.js +12 -0
  157. package/dist/templates/web/ui-auth-payments-video/template/package.json +53 -0
  158. package/dist/templates/web/ui-auth-payments-video/template/postcss.config.js +7 -0
  159. package/dist/templates/web/ui-auth-payments-video/template/src/app/auth/callback/route.ts +12 -0
  160. package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +211 -0
  161. package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +142 -0
  162. package/dist/templates/web/ui-auth-payments-video/template/src/app/error.tsx +67 -0
  163. package/dist/templates/web/ui-auth-payments-video/template/src/app/globals.css +42 -0
  164. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +33 -0
  165. package/dist/templates/web/ui-auth-payments-video/template/src/app/loading.tsx +20 -0
  166. package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +109 -0
  167. package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +187 -0
  168. package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +128 -0
  169. package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +49 -0
  170. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +32 -0
  171. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/theme-provider.tsx +94 -0
  172. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/footer.tsx +36 -0
  173. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +62 -0
  174. package/dist/templates/web/ui-auth-payments-video/template/src/components/ui/badge.tsx +36 -0
  175. package/dist/templates/web/ui-auth-payments-video/template/src/components/ui/theme-toggle.tsx +34 -0
  176. package/dist/templates/web/ui-auth-payments-video/template/src/lib/env.ts +49 -0
  177. package/dist/templates/web/ui-auth-payments-video/template/src/lib/utils.ts +140 -0
  178. package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +79 -0
  179. package/dist/templates/web/ui-auth-payments-video/template/tailwind.config.js +77 -0
  180. package/dist/templates/web/ui-auth-payments-video/template/tsconfig.json +33 -0
  181. package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +17 -0
  182. package/dist/templates/web/ui-only/template/.env.example +15 -0
  183. package/dist/templates/web/ui-only/template/.eslintrc.js +8 -0
  184. package/dist/templates/web/ui-only/template/README.md +68 -0
  185. package/dist/templates/web/ui-only/template/next.config.js +12 -0
  186. package/dist/templates/web/ui-only/template/package.json +49 -0
  187. package/dist/templates/web/ui-only/template/postcss.config.js +7 -0
  188. package/dist/templates/web/ui-only/template/src/app/auth/callback/route.ts +12 -0
  189. package/dist/templates/web/ui-only/template/src/app/checkout/page.tsx +25 -0
  190. package/dist/templates/web/ui-only/template/src/app/error.tsx +67 -0
  191. package/dist/templates/web/ui-only/template/src/app/globals.css +42 -0
  192. package/dist/templates/web/ui-only/template/src/app/layout.tsx +33 -0
  193. package/dist/templates/web/ui-only/template/src/app/loading.tsx +20 -0
  194. package/dist/templates/web/ui-only/template/src/app/login/page.tsx +63 -0
  195. package/dist/templates/web/ui-only/template/src/app/page.tsx +91 -0
  196. package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +79 -0
  197. package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +49 -0
  198. package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +26 -0
  199. package/dist/templates/web/ui-only/template/src/components/providers/theme-provider.tsx +94 -0
  200. package/dist/templates/web/ui-only/template/src/components/shared/footer.tsx +36 -0
  201. package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +53 -0
  202. package/dist/templates/web/ui-only/template/src/components/ui/badge.tsx +36 -0
  203. package/dist/templates/web/ui-only/template/src/components/ui/theme-toggle.tsx +34 -0
  204. package/dist/templates/web/ui-only/template/src/lib/env.ts +49 -0
  205. package/dist/templates/web/ui-only/template/src/lib/utils.ts +140 -0
  206. package/dist/templates/web/ui-only/template/src/test/setup.ts +79 -0
  207. package/dist/templates/web/ui-only/template/tailwind.config.js +77 -0
  208. package/dist/templates/web/ui-only/template/tsconfig.json +33 -0
  209. package/dist/templates/web/ui-only/template/vitest.config.ts +17 -0
  210. package/dist/templates/web/ui-only/template.backup/.env.example +15 -0
  211. package/dist/templates/web/ui-only/template.backup.20250817/.env.example +15 -0
  212. package/dist/templates/web/ui-package-test/template/next-env.d.ts +5 -0
  213. package/dist/templates/web/ui-package-test/template/package.json +42 -0
  214. package/dist/templates/web/ui-package-test/template/src/app/page.tsx +106 -0
  215. package/dist/templates/web/ui-package-test/template/tsconfig.json +41 -0
  216. package/package.json +3 -2
@@ -0,0 +1,88 @@
1
+ import React from 'react';
2
+ import { StatusBar } from 'expo-status-bar';
3
+ import { StyleSheet, Text, View, Button } from 'react-native';
4
+ import { SafeAreaProvider } from 'react-native-safe-area-context';
5
+ import { AuthProvider, useAuth } from '@digilogiclabs/saas-factory-auth/native';
6
+ import { StripeProvider } from '@digilogiclabs/saas-factory-payments/native';
7
+ import { Link, Slot } from 'expo-router';
8
+
9
+ function AppContent() {
10
+ const { user, signOut } = useAuth();
11
+
12
+ return (
13
+ <View style={styles.container}>
14
+ {user ? (
15
+ <>
16
+ <Text style={styles.title}>Welcome back!</Text>
17
+ <Text style={styles.subtitle}>You are signed in.</Text>
18
+ <Link href="/checkout" style={styles.link}>
19
+ <Text>Checkout</Text>
20
+ </Link>
21
+ <Button title="Sign Out" onPress={signOut} />
22
+ </>
23
+ ) : (
24
+ <>
25
+ <Text style={styles.title}>Welcome to {{titleCaseName}}</Text>
26
+ <Text style={styles.subtitle}>{{description}}</Text>
27
+ <Link href="/login" style={styles.link}>
28
+ <Text>Login</Text>
29
+ </Link>
30
+ <Link href="/signup" style={styles.link}>
31
+ <Text>Sign Up</Text>
32
+ </Link>
33
+ </>
34
+ )}
35
+ <StatusBar style="auto" />
36
+ </View>
37
+ );
38
+ }
39
+
40
+ export default function App() {
41
+ return (
42
+ <SafeAreaProvider>
43
+ <AuthProvider>
44
+ <StripeProvider
45
+ stripeKey={process.env.EXPO_PUBLIC_STRIPE_PUBLISHABLE_KEY!}
46
+ >
47
+ <AppContent />
48
+ </StripeProvider>
49
+ </AuthProvider>
50
+ </SafeAreaProvider>
51
+ );
52
+ }
53
+
54
+ const styles = StyleSheet.create({
55
+ container: {
56
+ flex: 1,
57
+ backgroundColor: '#fff',
58
+ alignItems: 'center',
59
+ justifyContent: 'center',
60
+ padding: 20,
61
+ },
62
+ title: {
63
+ fontSize: 24,
64
+ fontWeight: 'bold',
65
+ marginBottom: 10,
66
+ textAlign: 'center',
67
+ },
68
+ subtitle: {
69
+ fontSize: 16,
70
+ color: '#666',
71
+ marginBottom: 20,
72
+ textAlign: 'center',
73
+ },
74
+ description: {
75
+ fontSize: 14,
76
+ color: '#999',
77
+ textAlign: 'center',
78
+ },
79
+ link: {
80
+ marginTop: 15,
81
+ paddingVertical: 15,
82
+ borderWidth: 1,
83
+ borderColor: '#DDD',
84
+ borderRadius: 5,
85
+ textAlign: 'center',
86
+ width: '80%',
87
+ },
88
+ });
@@ -0,0 +1,44 @@
1
+ import { LoginForm } from '@digilogiclabs/saas-factory-ui/native';
2
+ import { AuthProvider } from '@digilogiclabs/saas-factory-auth/native';
3
+ import { createBrowserClient } from '@supabase/ssr';
4
+ import React from 'react';
5
+ import { View } from 'react-native';
6
+ import * as WebBrowser from 'expo-web-browser';
7
+ import { useOAuth } from '@clerk/clerk-expo';
8
+
9
+ export default function LoginPage() {
10
+ const supabase = createBrowserClient(
11
+ process.env.EXPO_PUBLIC_SUPABASE_URL!,
12
+ process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY!
13
+ );
14
+
15
+ const handleLogin = async (values: any) => {
16
+ await supabase.auth.signInWithPassword({
17
+ email: values.email,
18
+ password: values.password,
19
+ });
20
+ };
21
+
22
+ const handleGoogleLogin = async () => {
23
+ const { data, error } = await supabase.auth.signInWithOAuth({
24
+ provider: 'google',
25
+ options: {
26
+ redirectTo: 'exp://localhost:8081/auth/callback',
27
+ },
28
+ });
29
+
30
+ if (data.url) {
31
+ await WebBrowser.openAuthSessionAsync(data.url);
32
+ }
33
+ };
34
+
35
+ return (
36
+ <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
37
+ <LoginForm
38
+ onSubmit={handleLogin}
39
+ onGoogleSignIn={handleGoogleLogin}
40
+ authProvider={AuthProvider.SUPABASE}
41
+ />
42
+ </View>
43
+ );
44
+ }
@@ -0,0 +1,43 @@
1
+ import { SignupForm } from '@digilogiclabs/saas-factory-ui/native';
2
+ import { AuthProvider } from '@digilogiclabs/saas-factory-auth/native';
3
+ import { createBrowserClient } from '@supabase/ssr';
4
+ import React from 'react';
5
+ import { View } from 'react-native';
6
+ import * as WebBrowser from 'expo-web-browser';
7
+
8
+ export default function SignupPage() {
9
+ const supabase = createBrowserClient(
10
+ process.env.EXPO_PUBLIC_SUPABASE_URL!,
11
+ process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY!
12
+ );
13
+
14
+ const handleSignup = async (values: any) => {
15
+ await supabase.auth.signUp({
16
+ email: values.email,
17
+ password: values.password,
18
+ });
19
+ };
20
+
21
+ const handleGoogleSignup = async () => {
22
+ const { data, error } = await supabase.auth.signInWithOAuth({
23
+ provider: 'google',
24
+ options: {
25
+ redirectTo: 'exp://localhost:8081/auth/callback',
26
+ },
27
+ });
28
+
29
+ if (data.url) {
30
+ await WebBrowser.openAuthSessionAsync(data.url);
31
+ }
32
+ };
33
+
34
+ return (
35
+ <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
36
+ <SignupForm
37
+ onSubmit={handleSignup}
38
+ onGoogleSignIn={handleGoogleSignup}
39
+ authProvider={AuthProvider.SUPABASE}
40
+ />
41
+ </View>
42
+ );
43
+ }
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { View, Button } from 'react-native';
3
+ import { useStripe } from '@digilogiclabs/saas-factory-payments/native';
4
+
5
+ export default function CheckoutScreen() {
6
+ const { handleCheckout } = useStripe();
7
+
8
+ const onCheckout = async () => {
9
+ await handleCheckout({
10
+ priceId: 'price_12345', // Replace with your actual price ID
11
+ returnUrl: 'exp://localhost:8081/dashboard',
12
+ });
13
+ };
14
+
15
+ return (
16
+ <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
17
+ <Button title="Proceed to Checkout" onPress={onCheckout} />
18
+ </View>
19
+ );
20
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "{{packageName}}",
3
+ "version": "1.0.0",
4
+ "description": "{{description}}",
5
+ "main": "node_modules/expo/AppEntry.js",
6
+ "scripts": {
7
+ "start": "expo start",
8
+ "android": "expo start --android",
9
+ "ios": "expo start --ios",
10
+ "web": "expo start --web",
11
+ "build": "eas build",
12
+ "eject": "expo eject"
13
+ },
14
+ "dependencies": {
15
+ "expo": "~49.0.0",
16
+ "react": "18.2.0",
17
+ "react-native": "0.72.6",
18
+ "@expo/vector-icons": "^13.0.0",
19
+ "@react-navigation/native": "^6.1.0",
20
+ "@react-navigation/stack": "^6.3.0",
21
+ "@react-navigation/bottom-tabs": "^6.5.0",
22
+ "react-native-screens": "~3.22.0",
23
+ "react-native-safe-area-context": "4.6.3",
24
+ "react-native-gesture-handler": "~2.12.0",
25
+ "@digilogiclabs/saas-factory-ui": "^0.7.2",
26
+ "@digilogiclabs/saas-factory-auth": "^0.4.3",
27
+ "@digilogiclabs/saas-factory-payments": "^0.2.0",
28
+ "firebase": "^10.0.0",
29
+ "@supabase/supabase-js": "^2.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@babel/core": "^7.20.0",
33
+ "@types/react": "~18.2.14",
34
+ "@types/react-native": "~0.72.2",
35
+ "typescript": "^5.1.3"
36
+ },
37
+ "private": true
38
+ }
@@ -0,0 +1,23 @@
1
+ import { initializeApp } from 'firebase/app';
2
+ import { getAuth } from 'firebase/auth';
3
+ import { getFirestore } from 'firebase/firestore';
4
+
5
+ const firebaseConfig = {
6
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
7
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
8
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
9
+ storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
10
+ messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
11
+ appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
12
+ };
13
+
14
+ // Initialize Firebase
15
+ const app = initializeApp(firebaseConfig);
16
+
17
+ // Initialize Firebase Authentication and get a reference to the service
18
+ export const auth = getAuth(app);
19
+
20
+ // Initialize Cloud Firestore and get a reference to the service
21
+ export const db = getFirestore(app);
22
+
23
+ export default app;
@@ -0,0 +1,8 @@
1
+ import { createClient } from '@supabase/supabase-js';
2
+
3
+ const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!;
4
+ const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!;
5
+
6
+ export const supabase = createClient(supabaseUrl, supabaseAnonKey);
7
+
8
+ export default supabase;
@@ -0,0 +1,15 @@
1
+ # Auth Configuration
2
+ NEXT_PUBLIC_AUTH_PROVIDER=supabase|firebase
3
+
4
+ # Supabase
5
+ NEXT_PUBLIC_SUPABASE_URL=
6
+ NEXT_PUBLIC_SUPABASE_ANON_KEY=
7
+
8
+ # Firebase
9
+ NEXT_PUBLIC_FIREBASE_API_KEY=
10
+ NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
11
+ NEXT_PUBLIC_FIREBASE_PROJECT_ID=
12
+
13
+ # Payments
14
+ NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
15
+ STRIPE_SECRET_KEY=
@@ -0,0 +1,8 @@
1
+ /** @type {import('eslint').Linter.Config} */
2
+ module.exports = {
3
+ extends: ['next/core-web-vitals'],
4
+ rules: {
5
+ // Add any custom rules here
6
+ },
7
+ }
8
+
@@ -0,0 +1,68 @@
1
+ # {{titleCaseName}}
2
+
3
+ {{description}}
4
+
5
+ ## Getting Started
6
+
7
+ First, run the development server:
8
+
9
+ ```bash
10
+ npm run dev
11
+ # or
12
+ yarn dev
13
+ # or
14
+ pnpm dev
15
+ ```
16
+
17
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
+
19
+ ## Features
20
+
21
+ - ⚡ **Next.js 14** - React framework with App Router
22
+ - 🎨 **Tailwind CSS** - Utility-first CSS framework
23
+ - 🔒 **{{#auth}}{{#firebase}}Firebase{{/firebase}}{{#supabase}}Supabase{{/supabase}}{{/auth}} Auth** - Authentication ready
24
+ - 📱 **Responsive Design** - Mobile-first approach
25
+ - 🌙 **Dark Mode** - Built-in theme switching
26
+ - 📦 **TypeScript** - Type-safe development
27
+ - 🎯 **ESLint & Prettier** - Code quality tools
28
+
29
+ ## Project Structure
30
+
31
+ ```
32
+ src/
33
+ ├── app/ # Next.js App Router
34
+ │ ├── globals.css # Global styles
35
+ │ ├── layout.tsx # Root layout
36
+ │ └── page.tsx # Home page
37
+ ├── components/ # React components
38
+ │ ├── ui/ # UI components
39
+ │ └── providers/ # Context providers
40
+ ├── lib/ # Utility functions
41
+ ├── hooks/ # Custom React hooks
42
+ └── types/ # TypeScript definitions
43
+ ```
44
+
45
+ ## Environment Variables
46
+
47
+ Copy `.env.example` to `.env.local` and fill in your configuration:
48
+
49
+ ```bash
50
+ cp .env.example .env.local
51
+ ```
52
+
53
+ ## Deployment
54
+
55
+ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new).
56
+
57
+ Check out the [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
58
+
59
+ ## Learn More
60
+
61
+ - [Next.js Documentation](https://nextjs.org/docs)
62
+ - [Tailwind CSS Documentation](https://tailwindcss.com/docs)
63
+ - [{{#auth}}{{#firebase}}Firebase Documentation{{/firebase}}{{#supabase}}Supabase Documentation{{/supabase}}{{/auth}}]({{#auth}}{{#firebase}}https://firebase.google.com/docs{{/firebase}}{{#supabase}}https://supabase.com/docs{{/supabase}}{{/auth}})
64
+
65
+ ## Support
66
+
67
+ For support, email support@digilogiclabs.com or join our Discord community.
68
+
@@ -0,0 +1,15 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ experimental: {
4
+ appDir: true,
5
+ },
6
+ images: {
7
+ domains: ['localhost'],
8
+ },
9
+ env: {
10
+ CUSTOM_KEY: process.env.CUSTOM_KEY,
11
+ },
12
+ }
13
+
14
+ module.exports = nextConfig
15
+
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "{{packageName}}",
3
+ "version": "0.1.0",
4
+ "description": "{{description}}",
5
+ "private": true,
6
+ "scripts": {
7
+ "dev": "next dev --turbo",
8
+ "build": "next build",
9
+ "start": "next start",
10
+ "lint": "next lint",
11
+ "type-check": "tsc --noEmit",
12
+ "test": "vitest",
13
+ "test:ui": "vitest --ui",
14
+ "test:run": "vitest run"
15
+ },
16
+ "dependencies": {
17
+ "next": "^15.0.0",
18
+ "react": "^19.0.0",
19
+ "react-dom": "^19.0.0",
20
+ "@digilogiclabs/saas-factory-ui": "^0.7.2",
21
+ "@digilogiclabs/saas-factory-auth": "^0.4.3",
22
+ "@digilogiclabs/saas-factory-payments": "^0.2.0",
23
+ "tailwindcss": "^3.3.0",
24
+ "autoprefixer": "^10.4.16",
25
+ "postcss": "^8.4.31",
26
+ "clsx": "^2.0.0",
27
+ "class-variance-authority": "^0.7.0",
28
+ "tailwind-merge": "^2.0.0",
29
+ "next-themes": "^0.2.1",
30
+ "@radix-ui/react-slot": "^1.0.2",
31
+ "tailwindcss-animate": "^1.0.7",
32
+ "lucide-react": "^0.542.0",
33
+ "zod": "^3.22.4",
34
+ "firebase": "^10.0.0",
35
+ "@supabase/supabase-js": "^2.0.0"
36
+ },
37
+ "devDependencies": {
38
+ "typescript": "^5.0.0",
39
+ "@types/node": "^20.0.0",
40
+ "@types/react": "^19.0.0",
41
+ "@types/react-dom": "^19.0.0",
42
+ "eslint": "^8.0.0",
43
+ "eslint-config-next": "^15.0.0",
44
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
45
+ "@typescript-eslint/parser": "^6.0.0",
46
+ "prettier": "^3.0.0",
47
+ "prettier-plugin-tailwindcss": "^0.5.0",
48
+ "vitest": "^1.0.0",
49
+ "@vitejs/plugin-react": "^4.0.0",
50
+ "@testing-library/react": "^16.0.0",
51
+ "@testing-library/jest-dom": "^6.0.0",
52
+ "@testing-library/user-event": "^14.0.0",
53
+ "jsdom": "^24.0.0"
54
+ },
55
+ "engines": {
56
+ "node": ">=18.0.0"
57
+ }
58
+ }
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
7
+
@@ -0,0 +1,18 @@
1
+ import { createRouteHandlerClient } from '@supabase/auth-helpers-nextjs';
2
+ import { cookies } from 'next/headers';
3
+ import { NextResponse } from 'next/server';
4
+
5
+ import type { NextRequest } from 'next/server';
6
+
7
+ export async function GET(request: NextRequest) {
8
+ const requestUrl = new URL(request.url);
9
+ const code = requestUrl.searchParams.get('code');
10
+
11
+ if (code) {
12
+ const supabase = createRouteHandlerClient({ cookies });
13
+ await supabase.auth.exchangeCodeForSession(code);
14
+ }
15
+
16
+ // URL to redirect to after sign in process completes
17
+ return NextResponse.redirect(requestUrl.origin);
18
+ }
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { useStripe } from '@digilogiclabs/saas-factory-payments';
5
+ import { Button } from '@/components/ui/button';
6
+
7
+ export default function CheckoutPage() {
8
+ const { handleCheckout } = useStripe();
9
+
10
+ const onCheckout = async () => {
11
+ await handleCheckout({
12
+ priceId: 'price_12345', // Replace with your actual price ID
13
+ returnUrl: `${window.location.origin}/dashboard`,
14
+ });
15
+ };
16
+
17
+ return (
18
+ <div className="flex items-center justify-center min-h-screen bg-gray-100">
19
+ <div className="p-8 bg-white rounded-lg shadow-md">
20
+ <h1 className="text-2xl font-bold mb-4">Checkout</h1>
21
+ <p className="mb-6">Click the button below to proceed to payment.</p>
22
+ <Button onClick={onCheckout}>
23
+ Proceed to Checkout
24
+ </Button>
25
+ </div>
26
+ </div>
27
+ );
28
+ }
@@ -0,0 +1,97 @@
1
+ 'use client'
2
+
3
+ import { useEffect } from 'react'
4
+ import { Button, Card } from '@digilogiclabs/saas-factory-ui'
5
+ import { AlertTriangle, RefreshCw, Home } from 'lucide-react'
6
+ import Link from 'next/link'
7
+
8
+ interface ErrorProps {
9
+ error: Error & { digest?: string }
10
+ reset: () => void
11
+ }
12
+
13
+ export default function Error({ error, reset }: ErrorProps) {
14
+ useEffect(() => {
15
+ // Log error to error reporting service
16
+ console.error('Application error:', error)
17
+ }, [error])
18
+
19
+ return (
20
+ <div className="min-h-screen bg-gradient-to-br from-red-50 to-orange-100 dark:from-gray-900 dark:to-gray-800 flex items-center justify-center p-4">
21
+ <Card className="p-8 max-w-lg w-full">
22
+ <div className="flex flex-col items-center space-y-6 text-center">
23
+ {/* Error icon */}
24
+ <div className="w-16 h-16 bg-red-100 dark:bg-red-900 rounded-full flex items-center justify-center">
25
+ <AlertTriangle className="w-8 h-8 text-red-600 dark:text-red-400" />
26
+ </div>
27
+
28
+ {/* Error content */}
29
+ <div>
30
+ <h1 className="text-2xl font-bold text-gray-900 dark:text-white mb-2">
31
+ Something went wrong!
32
+ </h1>
33
+ <p className="text-gray-600 dark:text-gray-300 mb-4">
34
+ We encountered an unexpected error. This has been logged and our team will look into it.
35
+ </p>
36
+
37
+ {/* Error details in development */}
38
+ {process.env.NODE_ENV === 'development' && (
39
+ <details className="mt-4 text-left">
40
+ <summary className="cursor-pointer text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200">
41
+ Error details (development only)
42
+ </summary>
43
+ <div className="mt-2 p-3 bg-gray-100 dark:bg-gray-800 rounded text-xs font-mono text-gray-700 dark:text-gray-300 overflow-auto max-h-40">
44
+ <div className="mb-2">
45
+ <strong>Message:</strong> {error.message}
46
+ </div>
47
+ {error.digest && (
48
+ <div className="mb-2">
49
+ <strong>Digest:</strong> {error.digest}
50
+ </div>
51
+ )}
52
+ {error.stack && (
53
+ <div>
54
+ <strong>Stack:</strong>
55
+ <pre className="whitespace-pre-wrap mt-1">{error.stack}</pre>
56
+ </div>
57
+ )}
58
+ </div>
59
+ </details>
60
+ )}
61
+ </div>
62
+
63
+ {/* Action buttons */}
64
+ <div className="flex flex-col sm:flex-row gap-3 w-full">
65
+ <Button
66
+ onClick={reset}
67
+ className="flex-1"
68
+ size="lg"
69
+ >
70
+ <RefreshCw className="w-4 h-4 mr-2" />
71
+ Try again
72
+ </Button>
73
+
74
+ <Link href="/" className="flex-1">
75
+ <Button
76
+ variant="outline"
77
+ className="w-full"
78
+ size="lg"
79
+ >
80
+ <Home className="w-4 h-4 mr-2" />
81
+ Go home
82
+ </Button>
83
+ </Link>
84
+ </div>
85
+
86
+ {/* Help text */}
87
+ <p className="text-sm text-gray-500 dark:text-gray-400">
88
+ If this problem persists, please{' '}
89
+ <Link href="/contact" className="text-blue-600 hover:underline dark:text-blue-400">
90
+ contact support
91
+ </Link>
92
+ </p>
93
+ </div>
94
+ </Card>
95
+ </div>
96
+ )
97
+ }
@@ -0,0 +1,60 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ :root {
7
+ --background: 0 0% 100%;
8
+ --foreground: 222.2 84% 4.9%;
9
+ --card: 0 0% 100%;
10
+ --card-foreground: 222.2 84% 4.9%;
11
+ --popover: 0 0% 100%;
12
+ --popover-foreground: 222.2 84% 4.9%;
13
+ --primary: 221.2 83.2% 53.3%;
14
+ --primary-foreground: 210 40% 98%;
15
+ --secondary: 210 40% 96%;
16
+ --secondary-foreground: 222.2 84% 4.9%;
17
+ --muted: 210 40% 96%;
18
+ --muted-foreground: 215.4 16.3% 46.9%;
19
+ --accent: 210 40% 96%;
20
+ --accent-foreground: 222.2 84% 4.9%;
21
+ --destructive: 0 84.2% 60.2%;
22
+ --destructive-foreground: 210 40% 98%;
23
+ --border: 214.3 31.8% 91.4%;
24
+ --input: 214.3 31.8% 91.4%;
25
+ --ring: 221.2 83.2% 53.3%;
26
+ --radius: 0.5rem;
27
+ }
28
+
29
+ .dark {
30
+ --background: 222.2 84% 4.9%;
31
+ --foreground: 210 40% 98%;
32
+ --card: 222.2 84% 4.9%;
33
+ --card-foreground: 210 40% 98%;
34
+ --popover: 222.2 84% 4.9%;
35
+ --popover-foreground: 210 40% 98%;
36
+ --primary: 217.2 91.2% 59.8%;
37
+ --primary-foreground: 222.2 84% 4.9%;
38
+ --secondary: 217.2 32.6% 17.5%;
39
+ --secondary-foreground: 210 40% 98%;
40
+ --muted: 217.2 32.6% 17.5%;
41
+ --muted-foreground: 215 20.2% 65.1%;
42
+ --accent: 217.2 32.6% 17.5%;
43
+ --accent-foreground: 210 40% 98%;
44
+ --destructive: 0 62.8% 30.6%;
45
+ --destructive-foreground: 210 40% 98%;
46
+ --border: 217.2 32.6% 17.5%;
47
+ --input: 217.2 32.6% 17.5%;
48
+ --ring: 224.3 76.3% 94.1%;
49
+ }
50
+ }
51
+
52
+ @layer base {
53
+ * {
54
+ @apply border-border;
55
+ }
56
+ body {
57
+ @apply bg-background text-foreground;
58
+ }
59
+ }
60
+