@digilogiclabs/create-saas-app 2.11.0 → 2.12.1

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 (413) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/index.js +1 -1
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/generators/template-generator.d.ts +0 -2
  6. package/dist/generators/template-generator.d.ts.map +1 -1
  7. package/dist/generators/template-generator.js +18 -17
  8. package/dist/generators/template-generator.js.map +1 -1
  9. package/dist/templates/mobile/base/template/App.tsx +7 -4
  10. package/dist/templates/mobile/base/template/app/checkout.tsx +5 -2
  11. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/_layout.tsx +6 -2
  12. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/billing.tsx +7 -3
  13. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +5 -2
  14. package/dist/templates/mobile/ui-auth-payments/template/app/(tabs)/profile.tsx +7 -2
  15. package/dist/templates/mobile/ui-auth-payments/template/app/_layout.tsx +2 -4
  16. package/dist/templates/mobile/ui-auth-payments/template/app/auth/login.tsx +6 -3
  17. package/dist/templates/mobile/ui-auth-payments/template/app/auth/signup.tsx +6 -3
  18. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/_layout.tsx +6 -2
  19. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/billing.tsx +7 -3
  20. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/index.tsx +5 -2
  21. package/dist/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/profile.tsx +7 -2
  22. package/dist/templates/mobile/ui-auth-payments-ai/template/app/_layout.tsx +2 -4
  23. package/dist/templates/mobile/ui-auth-payments-ai/template/app/auth/login.tsx +6 -3
  24. package/dist/templates/mobile/ui-auth-payments-ai/template/app/auth/signup.tsx +6 -3
  25. package/dist/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  26. package/dist/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  27. package/dist/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  28. package/dist/templates/shared/config/web/next.config.mjs +0 -1
  29. package/dist/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  30. package/dist/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  31. package/dist/templates/shared/email/web/src/lib/email/client.ts +1 -1
  32. package/dist/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  33. package/dist/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  34. package/dist/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  35. package/dist/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  36. package/dist/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  37. package/dist/templates/shared/loading/web/components/skeleton.tsx +4 -4
  38. package/dist/templates/shared/mock/web/.env.local +55 -0
  39. package/dist/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  40. package/dist/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  41. package/dist/templates/shared/mock/web/src/lib/mock.ts +147 -0
  42. package/dist/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  43. package/dist/templates/shared/redis/web/src/lib/redis.ts +1 -1
  44. package/dist/templates/web/ai-platform/template/package.json +0 -1
  45. package/dist/templates/web/ai-platform/template/src/app/chat/page.tsx +5 -2
  46. package/dist/templates/web/ai-platform/template/src/app/playground/page.tsx +5 -2
  47. package/dist/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +2 -5
  48. package/dist/templates/web/base/template/eslint.config.mjs +14 -0
  49. package/dist/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  50. package/dist/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  51. package/dist/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  52. package/dist/templates/web/base/template/src/app/layout.tsx +40 -38
  53. package/dist/templates/web/base/template/src/app/login/page.tsx +116 -66
  54. package/dist/templates/web/base/template/src/app/page.tsx +97 -193
  55. package/dist/templates/web/base/template/src/app/settings/page.tsx +154 -0
  56. package/dist/templates/web/base/template/src/app/signup/page.tsx +117 -66
  57. package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  58. package/dist/templates/web/base/template/src/components/shared/header.tsx +229 -63
  59. package/dist/templates/web/iot-dashboard/template/package.json +0 -1
  60. package/dist/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +2 -5
  61. package/dist/templates/web/marketplace/template/package.json +0 -1
  62. package/dist/templates/web/marketplace/template/src/components/providers/app-providers.tsx +2 -5
  63. package/dist/templates/web/micro-saas/template/package.json +0 -1
  64. package/dist/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +2 -5
  65. package/dist/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  66. package/dist/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  67. package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  68. package/dist/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  69. package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  70. package/dist/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  71. package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  72. package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  73. package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  74. package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  75. package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  76. package/dist/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  77. package/dist/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  78. package/dist/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  79. package/dist/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  80. package/dist/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  81. package/dist/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  82. package/dist/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  83. package/dist/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  84. package/dist/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  85. package/dist/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  86. package/dist/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  87. package/dist/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  88. package/dist/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  89. package/dist/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  90. package/dist/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  91. package/dist/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  92. package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  93. package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  94. package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  95. package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  96. package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  97. package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  98. package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  99. package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  100. package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  101. package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  102. package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  103. package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  104. package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  105. package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  106. package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  107. package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  108. package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  109. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  110. package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  111. package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  112. package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  113. package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  114. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  115. package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  116. package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  117. package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  118. package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  119. package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  120. package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  121. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  122. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  123. package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  124. package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  125. package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  126. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  127. package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  128. package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  129. package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  130. package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  131. package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  132. package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  133. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  134. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  135. package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  136. package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  137. package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  138. package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  139. package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  140. package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  141. package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  142. package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  143. package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  144. package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  145. package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  146. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  147. package/dist/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  148. package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  149. package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  150. package/dist/templates/web/ui-only/template/eslint.config.mjs +14 -0
  151. package/dist/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  152. package/dist/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  153. package/dist/templates/web/ui-only/template/src/app/page.tsx +69 -91
  154. package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  155. package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  156. package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  157. package/dist/templates/web/ui-package-test/template/package.json +19 -23
  158. package/dist/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  159. package/dist/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  160. package/dist/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  161. package/dist/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  162. package/package.json +1 -1
  163. package/src/templates/mobile/base/template/App.tsx +7 -4
  164. package/src/templates/mobile/base/template/app/checkout.tsx +5 -2
  165. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/_layout.tsx +6 -2
  166. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/billing.tsx +7 -3
  167. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/index.tsx +5 -2
  168. package/src/templates/mobile/ui-auth-payments/template/app/(tabs)/profile.tsx +7 -2
  169. package/src/templates/mobile/ui-auth-payments/template/app/_layout.tsx +2 -4
  170. package/src/templates/mobile/ui-auth-payments/template/app/auth/login.tsx +6 -3
  171. package/src/templates/mobile/ui-auth-payments/template/app/auth/signup.tsx +6 -3
  172. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/_layout.tsx +6 -2
  173. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/billing.tsx +7 -3
  174. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/index.tsx +5 -2
  175. package/src/templates/mobile/ui-auth-payments-ai/template/app/(tabs)/profile.tsx +7 -2
  176. package/src/templates/mobile/ui-auth-payments-ai/template/app/_layout.tsx +2 -4
  177. package/src/templates/mobile/ui-auth-payments-ai/template/app/auth/login.tsx +6 -3
  178. package/src/templates/mobile/ui-auth-payments-ai/template/app/auth/signup.tsx +6 -3
  179. package/src/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
  180. package/src/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
  181. package/src/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
  182. package/src/templates/shared/config/web/next.config.mjs +0 -1
  183. package/src/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
  184. package/src/templates/shared/design/web/src/components/ui/button.tsx +56 -0
  185. package/src/templates/shared/email/web/src/lib/email/client.ts +1 -1
  186. package/src/templates/shared/error-pages/web/src/app/error.tsx +13 -11
  187. package/src/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
  188. package/src/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
  189. package/src/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
  190. package/src/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
  191. package/src/templates/shared/loading/web/components/skeleton.tsx +4 -4
  192. package/src/templates/shared/mock/web/.env.local +55 -0
  193. package/src/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
  194. package/src/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
  195. package/src/templates/shared/mock/web/src/lib/mock.ts +147 -0
  196. package/src/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
  197. package/src/templates/shared/redis/web/src/lib/redis.ts +1 -1
  198. package/src/templates/web/ai-platform/template/package.json +0 -1
  199. package/src/templates/web/ai-platform/template/src/app/chat/page.tsx +5 -2
  200. package/src/templates/web/ai-platform/template/src/app/playground/page.tsx +5 -2
  201. package/src/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +2 -5
  202. package/src/templates/web/base/template/eslint.config.mjs +14 -0
  203. package/src/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
  204. package/src/templates/web/base/template/src/app/checkout/page.tsx +76 -103
  205. package/src/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
  206. package/src/templates/web/base/template/src/app/layout.tsx +40 -38
  207. package/src/templates/web/base/template/src/app/login/page.tsx +116 -66
  208. package/src/templates/web/base/template/src/app/page.tsx +97 -193
  209. package/src/templates/web/base/template/src/app/settings/page.tsx +154 -0
  210. package/src/templates/web/base/template/src/app/signup/page.tsx +117 -66
  211. package/src/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
  212. package/src/templates/web/base/template/src/components/shared/header.tsx +229 -63
  213. package/src/templates/web/iot-dashboard/template/package.json +0 -1
  214. package/src/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +2 -5
  215. package/src/templates/web/marketplace/template/package.json +0 -1
  216. package/src/templates/web/marketplace/template/src/components/providers/app-providers.tsx +2 -5
  217. package/src/templates/web/micro-saas/template/package.json +0 -1
  218. package/src/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +2 -5
  219. package/src/templates/web/ui-auth/template/eslint.config.mjs +14 -0
  220. package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
  221. package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
  222. package/src/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
  223. package/src/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
  224. package/src/templates/web/ui-auth/template/src/app/page.tsx +106 -306
  225. package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
  226. package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
  227. package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
  228. package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
  229. package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
  230. package/src/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
  231. package/src/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
  232. package/src/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
  233. package/src/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
  234. package/src/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
  235. package/src/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
  236. package/src/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
  237. package/src/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
  238. package/src/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
  239. package/src/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
  240. package/src/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
  241. package/src/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
  242. package/src/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
  243. package/src/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
  244. package/src/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
  245. package/src/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
  246. package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
  247. package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
  248. package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
  249. package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
  250. package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
  251. package/src/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
  252. package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
  253. package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
  254. package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
  255. package/src/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
  256. package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
  257. package/src/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
  258. package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
  259. package/src/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
  260. package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
  261. package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
  262. package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
  263. package/src/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
  264. package/src/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
  265. package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
  266. package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
  267. package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
  268. package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
  269. package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
  270. package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
  271. package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
  272. package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
  273. package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
  274. package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
  275. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
  276. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
  277. package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
  278. package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
  279. package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
  280. package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
  281. package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
  282. package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
  283. package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
  284. package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
  285. package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
  286. package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
  287. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
  288. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
  289. package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
  290. package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
  291. package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
  292. package/src/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
  293. package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
  294. package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
  295. package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
  296. package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
  297. package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
  298. package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
  299. package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
  300. package/src/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
  301. package/src/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
  302. package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
  303. package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
  304. package/src/templates/web/ui-only/template/eslint.config.mjs +14 -0
  305. package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
  306. package/src/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
  307. package/src/templates/web/ui-only/template/src/app/page.tsx +69 -91
  308. package/src/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
  309. package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
  310. package/src/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
  311. package/src/templates/web/ui-package-test/template/package.json +19 -23
  312. package/src/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
  313. package/src/templates/web/ui-package-test/template/src/app/globals.css +88 -0
  314. package/src/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
  315. package/src/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
  316. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  317. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  318. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  319. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  320. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  321. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  322. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  323. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  324. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  325. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  326. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  327. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  328. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  329. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  330. package/dist/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  331. package/dist/templates/web/base/template/.eslintrc.js +0 -8
  332. package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  333. package/dist/templates/web/base/template/src/test/setup.ts +0 -74
  334. package/dist/templates/web/base/template/vitest.config.ts +0 -17
  335. package/dist/templates/web/ui-auth/template/.eslintrc.js +0 -8
  336. package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  337. package/dist/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  338. package/dist/templates/web/ui-auth/template/vitest.config.ts +0 -17
  339. package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  340. package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  341. package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  342. package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  343. package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  344. package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  345. package/dist/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  346. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  347. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  348. package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  349. package/dist/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  350. package/dist/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  351. package/dist/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  352. package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  353. package/dist/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  354. package/dist/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  355. package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  356. package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  357. package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  358. package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  359. package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  360. package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  361. package/dist/templates/web/ui-only/template/.eslintrc.js +0 -8
  362. package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  363. package/dist/templates/web/ui-only/template/src/test/setup.ts +0 -74
  364. package/dist/templates/web/ui-only/template/vitest.config.ts +0 -17
  365. package/src/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
  366. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
  367. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
  368. package/src/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
  369. package/src/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
  370. package/src/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
  371. package/src/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
  372. package/src/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
  373. package/src/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
  374. package/src/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
  375. package/src/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
  376. package/src/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
  377. package/src/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
  378. package/src/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
  379. package/src/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
  380. package/src/templates/web/base/template/.eslintrc.js +0 -8
  381. package/src/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
  382. package/src/templates/web/base/template/src/test/setup.ts +0 -74
  383. package/src/templates/web/base/template/vitest.config.ts +0 -17
  384. package/src/templates/web/ui-auth/template/.eslintrc.js +0 -8
  385. package/src/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
  386. package/src/templates/web/ui-auth/template/src/test/setup.ts +0 -74
  387. package/src/templates/web/ui-auth/template/vitest.config.ts +0 -17
  388. package/src/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
  389. package/src/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
  390. package/src/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
  391. package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
  392. package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
  393. package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
  394. package/src/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
  395. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
  396. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
  397. package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
  398. package/src/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
  399. package/src/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
  400. package/src/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
  401. package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
  402. package/src/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
  403. package/src/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
  404. package/src/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
  405. package/src/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
  406. package/src/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
  407. package/src/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
  408. package/src/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
  409. package/src/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
  410. package/src/templates/web/ui-only/template/.eslintrc.js +0 -8
  411. package/src/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
  412. package/src/templates/web/ui-only/template/src/test/setup.ts +0 -74
  413. package/src/templates/web/ui-only/template/vitest.config.ts +0 -17
@@ -1,332 +1,82 @@
1
1
  'use client';
2
2
 
3
- import React, { useState } from 'react';
4
- import { usePayments } from '@digilogiclabs/app-sdk';
5
- import { formatCurrency, formatDate } from '@/lib/utils';
6
- import {
7
- Button,
8
- Card,
9
- Input,
10
- Label,
11
- Modal
12
- } from '@digilogiclabs/saas-factory-ui';
3
+ import React from 'react';
4
+ import { Card, CardContent, CardHeader, CardTitle } from '@digilogiclabs/saas-factory-ui';
5
+ import { CreditCard, ExternalLink, Receipt } from 'lucide-react';
6
+ import Link from 'next/link';
13
7
 
14
8
  export default function BillingPage() {
15
- const { loading } = usePayments();
16
- const [showPaymentMethodModal, setShowPaymentMethodModal] = useState(false);
17
- const [showPlanChangeModal, setShowPlanChangeModal] = useState(false);
18
- const [editingPaymentMethod, setEditingPaymentMethod] = useState<string | null>(null);
19
- const [selectedPlan, setSelectedPlan] = useState('pro');
20
-
21
- const handleSubscriptionChange = () => {
22
- setShowPlanChangeModal(true);
23
- };
24
-
25
- const handlePaymentMethodUpdate = (methodId?: string) => {
26
- setEditingPaymentMethod(methodId || null);
27
- setShowPaymentMethodModal(true);
28
- };
29
-
30
- const handleInvoiceDownload = (invoiceId: string) => {
31
- console.log('Download invoice:', invoiceId);
9
+ const handleManageBilling = async () => {
10
+ const res = await fetch('/api/billing/portal', { method: 'POST' });
11
+ const data = await res.json();
12
+ if (data.url) {
13
+ window.location.href = data.url;
14
+ }
32
15
  };
33
16
 
34
- const handlePaymentMethodSubmit = async (e: React.FormEvent) => {
35
- e.preventDefault();
36
- const formData = new FormData(e.target as HTMLFormElement);
37
- console.log('Payment method data:', Object.fromEntries(formData));
38
- setShowPaymentMethodModal(false);
39
- setEditingPaymentMethod(null);
40
- };
41
-
42
- const handlePlanChangeSubmit = async (e: React.FormEvent) => {
43
- e.preventDefault();
44
- const formData = new FormData(e.target as HTMLFormElement);
45
- console.log('Plan change data:', Object.fromEntries(formData));
46
- setShowPlanChangeModal(false);
47
- };
48
-
49
- // Mock data
50
- const currentSubscription = {
51
- plan: 'Pro Plan',
52
- price: 1999,
53
- interval: 'month',
54
- status: 'active',
55
- nextBilling: new Date(Date.now() + 15 * 24 * 60 * 60 * 1000)
56
- };
57
-
58
- const paymentMethods = [
59
- { id: 'pm_123', type: 'card', last4: '4242', brand: 'visa', expiryMonth: 12, expiryYear: 2025, isDefault: true },
60
- { id: 'pm_456', type: 'card', last4: '0005', brand: 'mastercard', expiryMonth: 8, expiryYear: 2026, isDefault: false }
61
- ];
62
-
63
- const invoices = [
64
- { id: 'inv_123', amount: 1999, currency: 'usd', status: 'paid', date: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000), description: 'Pro Plan - Monthly' },
65
- { id: 'inv_456', amount: 1999, currency: 'usd', status: 'paid', date: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000), description: 'Pro Plan - Monthly' },
66
- { id: 'inv_789', amount: 999, currency: 'usd', status: 'paid', date: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000), description: 'Basic Plan - Monthly' }
67
- ];
68
-
69
- const plans = [
70
- { value: 'basic', label: 'Basic Plan', price: '$9/month', description: 'Perfect for individuals getting started', features: ['1,000 AI requests/month', 'Basic AI models', 'Email support', '5GB storage'] },
71
- { value: 'pro', label: 'Pro Plan', price: '$29/month', description: 'Best for growing teams and businesses', features: ['10,000 AI requests/month', 'Advanced AI models', 'Priority support', '50GB storage', 'Team collaboration'], recommended: true },
72
- { value: 'enterprise', label: 'Enterprise Plan', price: 'Custom pricing', description: 'For large organizations', features: ['Unlimited AI requests', 'All AI models', 'Dedicated support', 'Unlimited storage', 'Advanced security'] }
73
- ];
74
-
75
17
  return (
76
- <div className="min-h-screen bg-gray-100 py-8">
77
- <div className="max-w-7xl mx-auto px-4">
78
- <div className="mb-8">
79
- <h1 className="text-4xl font-bold text-gray-900 mb-2">Billing &amp; Subscription</h1>
80
- <p className="text-xl text-gray-600">Manage your subscription and billing information</p>
81
- </div>
82
-
83
- <div className="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
84
- {/* Current Subscription */}
85
- <Card className="p-6">
86
- <h2 className="text-2xl font-bold mb-6">Current Subscription</h2>
87
- <div className="space-y-4">
88
- <div>
89
- <h3 className="font-semibold">{currentSubscription.plan}</h3>
90
- <p className="text-2xl font-bold">
91
- {formatCurrency(currentSubscription.price)}
92
- <span className="text-sm font-normal">/{currentSubscription.interval}</span>
93
- </p>
94
- </div>
95
- <div>
96
- <p className="text-sm text-gray-600">Status</p>
97
- <span className="inline-block px-2 py-1 bg-green-100 text-green-800 rounded text-sm">
98
- {currentSubscription.status}
99
- </span>
100
- </div>
18
+ <div className="mx-auto max-w-4xl px-4 py-8">
19
+ <h1 className="text-3xl font-bold text-foreground mb-2">Billing</h1>
20
+ <p className="text-muted-foreground mb-8">Manage your subscription and payment methods.</p>
21
+
22
+ <div className="grid gap-6 md:grid-cols-2 mb-8">
23
+ <Card>
24
+ <CardHeader>
25
+ <CardTitle className="text-lg">Current Plan</CardTitle>
26
+ </CardHeader>
27
+ <CardContent>
28
+ <div className="flex items-center justify-between">
101
29
  <div>
102
- <p className="text-sm text-gray-600">Next billing date</p>
103
- <p>{formatDate(currentSubscription.nextBilling)}</p>
30
+ <p className="text-2xl font-bold text-foreground">Free</p>
31
+ <p className="text-sm text-muted-foreground">Basic features included</p>
104
32
  </div>
105
- <Button
106
- onClick={handleSubscriptionChange}
107
- disabled={loading}
108
- variant="outline"
109
- className="w-full"
110
- >
111
- Change Plan
112
- </Button>
33
+ <Link href="/checkout" className="inline-flex items-center justify-center rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors">
34
+ Upgrade
35
+ </Link>
113
36
  </div>
114
- </Card>
115
-
116
- {/* Payment Methods */}
117
- <Card className="p-6">
118
- <h2 className="text-2xl font-bold mb-6">Payment Methods</h2>
119
- <div className="space-y-4">
120
- {paymentMethods.map((method) => (
121
- <div key={method.id} className="flex items-center justify-between p-3 border rounded-lg">
122
- <div className="flex items-center">
123
- <div className="w-8 h-8 bg-blue-100 rounded flex items-center justify-center mr-3">
124
- <span role="img" aria-label="credit card">&#128179;</span>
125
- </div>
126
- <div>
127
- <p className="font-medium">
128
- {method.brand.toUpperCase()} &bull;&bull;&bull;&bull; {method.last4}
129
- </p>
130
- <p className="text-sm text-gray-600">
131
- Expires {method.expiryMonth}/{method.expiryYear}
132
- {method.isDefault && <span className="ml-2 text-blue-600">(Default)</span>}
133
- </p>
134
- </div>
135
- </div>
136
- <Button
137
- onClick={() => handlePaymentMethodUpdate(method.id)}
138
- disabled={loading}
139
- variant="outline"
140
- size="sm"
141
- >
142
- Edit
143
- </Button>
144
- </div>
145
- ))}
146
- <Button
147
- onClick={() => handlePaymentMethodUpdate()}
148
- disabled={loading}
149
- variant="outline"
150
- className="w-full"
151
- >
152
- Add Payment Method
153
- </Button>
154
- </div>
155
- </Card>
156
- </div>
157
-
158
- {/* Billing History */}
159
- <Card className="p-6">
160
- <h2 className="text-2xl font-bold mb-6">Billing History</h2>
161
- <div className="overflow-x-auto">
162
- <table className="w-full">
163
- <thead>
164
- <tr className="border-b">
165
- <th className="text-left py-2">Date</th>
166
- <th className="text-left py-2">Description</th>
167
- <th className="text-left py-2">Amount</th>
168
- <th className="text-left py-2">Status</th>
169
- <th className="text-left py-2">Actions</th>
170
- </tr>
171
- </thead>
172
- <tbody>
173
- {invoices.map((invoice) => (
174
- <tr key={invoice.id} className="border-b">
175
- <td className="py-3">{formatDate(invoice.date)}</td>
176
- <td className="py-3">{invoice.description}</td>
177
- <td className="py-3">{formatCurrency(invoice.amount)}</td>
178
- <td className="py-3">
179
- <span className="inline-block px-2 py-1 bg-green-100 text-green-800 rounded text-sm">
180
- {invoice.status}
181
- </span>
182
- </td>
183
- <td className="py-3">
184
- <Button
185
- onClick={() => handleInvoiceDownload(invoice.id)}
186
- variant="outline"
187
- size="sm"
188
- >
189
- Download
190
- </Button>
191
- </td>
192
- </tr>
193
- ))}
194
- </tbody>
195
- </table>
196
- </div>
37
+ </CardContent>
197
38
  </Card>
198
39
 
199
- {/* Payment Method Modal */}
200
- <Modal
201
- isOpen={showPaymentMethodModal}
202
- onClose={() => { setShowPaymentMethodModal(false); setEditingPaymentMethod(null); }}
203
- title={editingPaymentMethod ? "Edit Payment Method" : "Add Payment Method"}
204
- >
205
- <form onSubmit={handlePaymentMethodSubmit} className="space-y-4">
206
- <div>
207
- <h3 className="font-semibold mb-3">Card Information</h3>
208
- <div className="space-y-3">
209
- <div>
210
- <Label htmlFor="cardNumber">Card Number</Label>
211
- <Input id="cardNumber" name="cardNumber" placeholder="1234 5678 9012 3456" required disabled={loading} />
212
- </div>
213
- <div className="grid grid-cols-2 gap-4">
214
- <div>
215
- <Label htmlFor="expiryDate">Expiry Date</Label>
216
- <Input id="expiryDate" name="expiryDate" placeholder="MM/YY" required disabled={loading} />
217
- </div>
218
- <div>
219
- <Label htmlFor="cvc">CVC</Label>
220
- <Input id="cvc" name="cvc" placeholder="123" required disabled={loading} />
221
- </div>
222
- </div>
40
+ <Card>
41
+ <CardHeader>
42
+ <CardTitle className="text-lg">Payment Method</CardTitle>
43
+ </CardHeader>
44
+ <CardContent>
45
+ <div className="flex items-center gap-3">
46
+ <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-muted">
47
+ <CreditCard className="h-5 w-5 text-muted-foreground" />
223
48
  </div>
224
- </div>
225
- <div>
226
- <h3 className="font-semibold mb-3">Billing Information</h3>
227
- <div className="space-y-3">
228
- <div>
229
- <Label htmlFor="cardholderName">Cardholder Name</Label>
230
- <Input id="cardholderName" name="cardholderName" placeholder="Full name as it appears on card" required disabled={loading} />
231
- </div>
232
- <div>
233
- <Label htmlFor="billingAddress">Street Address</Label>
234
- <Input id="billingAddress" name="billingAddress" placeholder="Street address" required disabled={loading} />
235
- </div>
236
- <div className="grid grid-cols-2 gap-4">
237
- <div>
238
- <Label htmlFor="city">City</Label>
239
- <Input id="city" name="city" placeholder="City" required disabled={loading} />
240
- </div>
241
- <div>
242
- <Label htmlFor="postalCode">ZIP/Postal Code</Label>
243
- <Input id="postalCode" name="postalCode" placeholder="ZIP/Postal code" required disabled={loading} />
244
- </div>
245
- </div>
246
- <label className="flex items-center gap-2">
247
- <input type="checkbox" name="makeDefault" className="rounded" />
248
- <span className="text-sm">Make this my default payment method</span>
249
- </label>
49
+ <div>
50
+ <p className="text-sm font-medium text-foreground">No payment method</p>
51
+ <p className="text-xs text-muted-foreground">Add one to upgrade your plan</p>
250
52
  </div>
251
53
  </div>
252
- <Button type="submit" className="w-full" disabled={loading}>
253
- {editingPaymentMethod ? "Update Payment Method" : "Add Payment Method"}
254
- </Button>
255
- </form>
256
- </Modal>
54
+ </CardContent>
55
+ </Card>
56
+ </div>
257
57
 
258
- {/* Plan Change Modal */}
259
- <Modal
260
- isOpen={showPlanChangeModal}
261
- onClose={() => setShowPlanChangeModal(false)}
262
- title="Change Subscription Plan"
58
+ <Card>
59
+ <CardHeader>
60
+ <CardTitle className="flex items-center gap-2 text-lg">
61
+ <Receipt className="h-5 w-5" />
62
+ Invoices
63
+ </CardTitle>
64
+ </CardHeader>
65
+ <CardContent>
66
+ <p className="text-sm text-muted-foreground">
67
+ No invoices yet. Invoices will appear here after your first payment.
68
+ </p>
69
+ </CardContent>
70
+ </Card>
71
+
72
+ <div className="mt-6 flex justify-end">
73
+ <button
74
+ onClick={handleManageBilling}
75
+ className="inline-flex items-center justify-center rounded-md border border-input bg-background px-4 py-2 text-sm font-medium text-foreground hover:bg-accent transition-colors"
263
76
  >
264
- <form onSubmit={handlePlanChangeSubmit} className="space-y-6">
265
- <div>
266
- <h3 className="font-semibold mb-3">Select New Plan</h3>
267
- <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
268
- {plans.map(plan => (
269
- <label
270
- key={plan.value}
271
- className={`relative block p-4 border-2 rounded-xl cursor-pointer hover:border-primary transition-colors ${selectedPlan === plan.value ? 'border-primary bg-primary/5' : 'border-gray-200 dark:border-gray-700'}`}
272
- >
273
- <input
274
- type="radio"
275
- name="newPlan"
276
- value={plan.value}
277
- checked={selectedPlan === plan.value}
278
- onChange={(e) => setSelectedPlan(e.target.value)}
279
- className="sr-only"
280
- required
281
- />
282
- {plan.recommended && (
283
- <span className="absolute -top-3 left-1/2 -translate-x-1/2 bg-primary text-primary-foreground text-xs px-2 py-1 rounded-full">Recommended</span>
284
- )}
285
- <h4 className="font-semibold">{plan.label}</h4>
286
- <p className="text-2xl font-bold my-2">{plan.price}</p>
287
- <p className="text-sm text-gray-600 mb-2">{plan.description}</p>
288
- <ul className="text-sm space-y-1">
289
- {plan.features.map(f => <li key={f}>&#10003; {f}</li>)}
290
- </ul>
291
- </label>
292
- ))}
293
- </div>
294
- </div>
295
-
296
- <div>
297
- <h3 className="font-semibold mb-3">Billing Frequency</h3>
298
- <div className="space-y-2">
299
- <label className="flex items-center gap-2">
300
- <input type="radio" name="billingInterval" value="monthly" defaultChecked required />
301
- <span className="text-sm">Monthly billing</span>
302
- </label>
303
- <label className="flex items-center gap-2">
304
- <input type="radio" name="billingInterval" value="yearly" />
305
- <span className="text-sm">Yearly billing (save 20%)</span>
306
- </label>
307
- </div>
308
- </div>
309
-
310
- <label className="flex items-center gap-2">
311
- <input type="checkbox" name="prorationPolicy" required className="rounded" />
312
- <span className="text-sm">I understand that charges will be prorated for the current billing period</span>
313
- </label>
314
-
315
- <div className="bg-blue-50 dark:bg-blue-900/20 p-4 rounded-lg">
316
- <h4 className="font-medium text-blue-900 dark:text-blue-100 mb-2">Plan Change Summary</h4>
317
- <div className="text-sm text-blue-800 dark:text-blue-200 space-y-1">
318
- <div>Current plan: Pro Plan ($29/month)</div>
319
- <div>New plan: Will be calculated based on selection</div>
320
- <div>Effective date: Immediate</div>
321
- <div>Next billing date: {formatDate(new Date(Date.now() + 15 * 24 * 60 * 60 * 1000))}</div>
322
- </div>
323
- </div>
324
-
325
- <Button type="submit" className="w-full" disabled={loading}>
326
- Change Plan
327
- </Button>
328
- </form>
329
- </Modal>
77
+ <ExternalLink className="mr-2 h-4 w-4" />
78
+ Manage in Stripe
79
+ </button>
330
80
  </div>
331
81
  </div>
332
82
  );
@@ -1,143 +1,127 @@
1
1
  'use client';
2
2
 
3
- import React from 'react';
4
- import { usePayments } from '@digilogiclabs/app-sdk';
5
- import { formatCurrency } from '@/lib/utils';
6
- import { Button, Card } from '@digilogiclabs/saas-factory-ui';
3
+ import React, { useState } from 'react';
4
+ import { Button, Card, CardContent, CardHeader, CardTitle } from '@digilogiclabs/saas-factory-ui';
5
+ import { CreditCard, Check, ArrowLeft } from 'lucide-react';
6
+ import Link from 'next/link';
7
7
 
8
- export default function CheckoutPage() {
9
- const { loading } = usePayments();
10
-
11
- const handlePlanSelect = (planId: string) => {
12
- console.log('Plan selected:', planId);
13
- // Handle plan selection - redirect to payment processing
14
- };
8
+ const PLANS = [
9
+ {
10
+ id: 'starter',
11
+ name: 'Starter',
12
+ price: '$9',
13
+ period: '/month',
14
+ features: ['Up to 1,000 users', 'Basic analytics', 'Email support', 'API access'],
15
+ featured: false,
16
+ },
17
+ {
18
+ id: 'pro',
19
+ name: 'Pro',
20
+ price: '$29',
21
+ period: '/month',
22
+ features: ['Unlimited users', 'Advanced analytics', 'Priority support', 'Custom domains', 'Team management'],
23
+ featured: true,
24
+ },
25
+ {
26
+ id: 'enterprise',
27
+ name: 'Enterprise',
28
+ price: '$99',
29
+ period: '/month',
30
+ features: ['Everything in Pro', 'SSO/SAML', 'Dedicated support', 'SLA guarantee', 'Custom integrations'],
31
+ featured: false,
32
+ },
33
+ ];
15
34
 
16
- const handlePayment = () => {
17
- console.log('Processing payment...');
18
- // Handle payment processing
19
- };
35
+ export default function CheckoutPage() {
36
+ const [selectedPlan, setSelectedPlan] = useState('pro');
37
+ const [loading, setLoading] = useState(false);
20
38
 
21
- // Example pricing plans - in real app these would come from your backend/Stripe
22
- const plans = [
23
- {
24
- id: 'basic',
25
- name: 'Basic Plan',
26
- price: 999, // in cents
27
- interval: 'month',
28
- features: ['Feature 1', 'Feature 2', 'Feature 3'],
29
- stripePriceId: 'price_basic_monthly'
30
- },
31
- {
32
- id: 'pro',
33
- name: 'Pro Plan',
34
- price: 1999, // in cents
35
- interval: 'month',
36
- features: ['All Basic features', 'Feature 4', 'Feature 5', 'Priority support'],
37
- popular: true,
38
- stripePriceId: 'price_pro_monthly'
39
- },
40
- {
41
- id: 'enterprise',
42
- name: 'Enterprise Plan',
43
- price: 4999, // in cents
44
- interval: 'month',
45
- features: ['All Pro features', 'Custom integrations', 'Dedicated support', 'SLA guarantee'],
46
- stripePriceId: 'price_enterprise_monthly'
39
+ const onCheckout = async () => {
40
+ setLoading(true);
41
+ try {
42
+ // TODO: Create Stripe checkout session
43
+ const res = await fetch('/api/checkout', {
44
+ method: 'POST',
45
+ headers: { 'Content-Type': 'application/json' },
46
+ body: JSON.stringify({ planId: selectedPlan }),
47
+ });
48
+ const data = await res.json();
49
+ if (data.url) {
50
+ window.location.href = data.url;
51
+ }
52
+ } finally {
53
+ setLoading(false);
47
54
  }
48
- ];
55
+ };
49
56
 
50
57
  return (
51
- <div className="min-h-screen bg-gray-100 py-8">
52
- <div className="max-w-6xl mx-auto px-4">
53
- <div className="text-center mb-12">
54
- <h1 className="text-4xl font-bold text-gray-900 mb-4">Choose Your Plan</h1>
55
- <p className="text-xl text-gray-600">Select the perfect plan for your needs</p>
58
+ <div className="min-h-screen bg-background py-12">
59
+ <div className="mx-auto max-w-5xl px-4">
60
+ <div className="mb-8">
61
+ <Link
62
+ href="/dashboard"
63
+ className="inline-flex items-center gap-1 text-sm text-muted-foreground hover:text-foreground mb-4"
64
+ >
65
+ <ArrowLeft className="h-3 w-3" />
66
+ Back to Dashboard
67
+ </Link>
68
+ <h1 className="text-3xl font-bold text-foreground">Choose Your Plan</h1>
69
+ <p className="text-muted-foreground mt-1">
70
+ Select the plan that best fits your needs.
71
+ </p>
56
72
  </div>
57
-
58
- {/* Subscription Plans */}
59
- <div className="grid md:grid-cols-3 gap-6 mb-8">
60
- {plans.map((plan) => (
61
- <Card key={plan.id} className={`p-6 relative ${plan.popular ? 'ring-2 ring-blue-500' : ''}`}>
62
- {plan.popular && (
63
- <div className="absolute -top-3 left-1/2 transform -translate-x-1/2">
64
- <span className="bg-blue-500 text-white px-3 py-1 rounded-full text-sm font-medium">
65
- Most Popular
66
- </span>
73
+
74
+ <div className="grid gap-6 md:grid-cols-3 mb-8">
75
+ {PLANS.map((plan) => (
76
+ <Card
77
+ key={plan.id}
78
+ className={`cursor-pointer transition-all ${
79
+ selectedPlan === plan.id
80
+ ? 'ring-2 ring-primary border-primary'
81
+ : 'hover:border-primary/50'
82
+ } ${plan.featured ? 'shadow-lg' : ''}`}
83
+ onClick={() => setSelectedPlan(plan.id)}
84
+ >
85
+ <CardHeader>
86
+ <CardTitle className="flex items-center justify-between">
87
+ {plan.name}
88
+ {plan.featured && (
89
+ <span className="text-xs font-medium bg-primary text-primary-foreground px-2 py-0.5 rounded-full">
90
+ Popular
91
+ </span>
92
+ )}
93
+ </CardTitle>
94
+ <div>
95
+ <span className="text-3xl font-bold text-foreground">{plan.price}</span>
96
+ <span className="text-muted-foreground">{plan.period}</span>
67
97
  </div>
68
- )}
69
- <h3 className="text-xl font-bold mb-2">{plan.name}</h3>
70
- <div className="text-3xl font-bold mb-4">
71
- {formatCurrency(plan.price)}
72
- <span className="text-sm font-normal">/{plan.interval}</span>
73
- </div>
74
- <ul className="mb-6 space-y-2">
75
- {plan.features.map((feature, index) => (
76
- <li key={index} className="flex items-center">
77
- <span className="text-green-500 mr-2">✓</span>
78
- {feature}
79
- </li>
80
- ))}
81
- </ul>
82
- <Button
83
- onClick={() => handlePlanSelect(plan.id)}
84
- disabled={loading}
85
- className="w-full"
86
- variant={plan.popular ? "default" : "outline"}
87
- >
88
- {loading ? 'Processing...' : 'Select Plan'}
89
- </Button>
98
+ </CardHeader>
99
+ <CardContent>
100
+ <ul className="space-y-2">
101
+ {plan.features.map((feat) => (
102
+ <li key={feat} className="flex items-center gap-2 text-sm text-muted-foreground">
103
+ <Check className="h-4 w-4 text-primary shrink-0" />
104
+ {feat}
105
+ </li>
106
+ ))}
107
+ </ul>
108
+ </CardContent>
90
109
  </Card>
91
110
  ))}
92
111
  </div>
93
112
 
94
- {/* Payment Form */}
95
- <Card className="p-6 max-w-md mx-auto">
96
- <h2 className="text-2xl font-bold mb-6">Payment Details</h2>
97
- <div className="space-y-4">
98
- <div>
99
- <label className="block text-sm font-medium mb-2">Card Number</label>
100
- <input
101
- type="text"
102
- placeholder="1234 5678 9012 3456"
103
- className="w-full p-3 border rounded-lg"
104
- disabled
105
- />
106
- </div>
107
- <div className="grid grid-cols-2 gap-4">
108
- <div>
109
- <label className="block text-sm font-medium mb-2">Expiry Date</label>
110
- <input
111
- type="text"
112
- placeholder="MM/YY"
113
- className="w-full p-3 border rounded-lg"
114
- disabled
115
- />
116
- </div>
117
- <div>
118
- <label className="block text-sm font-medium mb-2">CVC</label>
119
- <input
120
- type="text"
121
- placeholder="123"
122
- className="w-full p-3 border rounded-lg"
123
- disabled
124
- />
125
- </div>
126
- </div>
127
- <Button
128
- onClick={handlePayment}
129
- disabled={loading}
130
- className="w-full"
131
- >
132
- {loading ? 'Processing...' : 'Complete Payment'}
133
- </Button>
134
- <p className="text-sm text-gray-600 text-center">
135
- This is a demo. Payment processing requires Stripe integration.
136
- </p>
137
- </div>
138
- </Card>
113
+ <div className="flex justify-center">
114
+ <Button
115
+ onClick={onCheckout}
116
+ size="lg"
117
+ disabled={loading}
118
+ className="min-w-[200px]"
119
+ >
120
+ <CreditCard className="mr-2 h-4 w-4" />
121
+ {loading ? 'Processing...' : 'Continue to Payment'}
122
+ </Button>
123
+ </div>
139
124
  </div>
140
125
  </div>
141
126
  );
142
127
  }
143
-