@digilogiclabs/create-saas-app 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/template-generator.d.ts.map +1 -1
- package/dist/generators/template-generator.js +15 -8
- package/dist/generators/template-generator.js.map +1 -1
- package/dist/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
- package/dist/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
- package/dist/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
- package/dist/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
- package/dist/templates/shared/design/web/src/components/ui/button.tsx +56 -0
- package/dist/templates/shared/email/web/src/lib/email/client.ts +1 -1
- package/dist/templates/shared/error-pages/web/src/app/error.tsx +13 -11
- package/dist/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
- package/dist/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
- package/dist/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
- package/dist/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
- package/dist/templates/shared/loading/web/components/skeleton.tsx +4 -4
- package/dist/templates/shared/mock/web/.env.local +55 -0
- package/dist/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
- package/dist/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
- package/dist/templates/shared/mock/web/src/lib/mock.ts +147 -0
- package/dist/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
- package/dist/templates/shared/redis/web/src/lib/redis.ts +1 -1
- package/dist/templates/web/base/template/eslint.config.mjs +14 -0
- package/dist/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
- package/dist/templates/web/base/template/src/app/checkout/page.tsx +76 -103
- package/dist/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
- package/dist/templates/web/base/template/src/app/layout.tsx +40 -38
- package/dist/templates/web/base/template/src/app/login/page.tsx +116 -66
- package/dist/templates/web/base/template/src/app/page.tsx +97 -193
- package/dist/templates/web/base/template/src/app/settings/page.tsx +154 -0
- package/dist/templates/web/base/template/src/app/signup/page.tsx +117 -66
- package/dist/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/base/template/src/components/shared/header.tsx +229 -63
- package/dist/templates/web/ui-auth/template/eslint.config.mjs +14 -0
- package/dist/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
- package/dist/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
- package/dist/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
- package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
- package/dist/templates/web/ui-auth/template/src/app/page.tsx +106 -306
- package/dist/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
- package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
- package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
- package/dist/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
- package/dist/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
- package/dist/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
- package/dist/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
- package/dist/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
- package/dist/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
- package/dist/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
- package/dist/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/dist/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
- package/dist/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
- package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
- package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
- package/dist/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
- package/dist/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
- package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
- package/dist/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
- package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
- package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
- package/dist/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
- package/dist/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
- package/dist/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
- package/dist/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
- package/dist/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
- package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
- package/dist/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
- package/dist/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
- package/dist/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
- package/dist/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
- package/dist/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
- package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
- package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
- package/dist/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
- package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
- package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
- package/dist/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
- package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
- package/dist/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
- package/dist/templates/web/ui-only/template/eslint.config.mjs +14 -0
- package/dist/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
- package/dist/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
- package/dist/templates/web/ui-only/template/src/app/page.tsx +69 -91
- package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
- package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
- package/dist/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
- package/dist/templates/web/ui-package-test/template/package.json +19 -23
- package/dist/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
- package/dist/templates/web/ui-package-test/template/src/app/globals.css +88 -0
- package/dist/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
- package/dist/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
- package/package.json +1 -1
- package/src/templates/shared/admin/web/src/components/admin-nav.tsx +3 -3
- package/src/templates/shared/auth/supabase/web/src/lib/auth-session.ts +36 -16
- package/src/templates/shared/auth/supabase/web/src/middleware.ts +6 -0
- package/src/templates/shared/cookie-consent/web/components/cookie-consent.tsx +5 -5
- package/src/templates/shared/design/web/src/components/ui/button.tsx +56 -0
- package/src/templates/shared/email/web/src/lib/email/client.ts +1 -1
- package/src/templates/shared/error-pages/web/src/app/error.tsx +13 -11
- package/src/templates/shared/error-pages/web/src/app/global-error.tsx +2 -0
- package/src/templates/shared/error-pages/web/src/app/not-found.tsx +6 -6
- package/src/templates/shared/legal/web/src/app/(legal)/privacy/page.tsx +4 -4
- package/src/templates/shared/legal/web/src/app/(legal)/terms/page.tsx +4 -4
- package/src/templates/shared/loading/web/components/skeleton.tsx +4 -4
- package/src/templates/shared/mock/web/.env.local +55 -0
- package/src/templates/shared/mock/web/src/components/mock-auth-provider.tsx +72 -0
- package/src/templates/shared/mock/web/src/components/mock-banner.tsx +29 -0
- package/src/templates/shared/mock/web/src/lib/mock.ts +147 -0
- package/src/templates/shared/payments/web/src/app/api/webhooks/stripe/route.ts +10 -4
- package/src/templates/shared/redis/web/src/lib/redis.ts +1 -1
- package/src/templates/web/base/template/eslint.config.mjs +14 -0
- package/src/templates/web/base/template/src/app/auth/callback/route.ts +1 -1
- package/src/templates/web/base/template/src/app/checkout/page.tsx +76 -103
- package/src/templates/web/base/template/src/app/dashboard/page.tsx +145 -329
- package/src/templates/web/base/template/src/app/layout.tsx +40 -38
- package/src/templates/web/base/template/src/app/login/page.tsx +116 -66
- package/src/templates/web/base/template/src/app/page.tsx +97 -193
- package/src/templates/web/base/template/src/app/settings/page.tsx +154 -0
- package/src/templates/web/base/template/src/app/signup/page.tsx +117 -66
- package/src/templates/web/base/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/base/template/src/components/shared/header.tsx +229 -63
- package/src/templates/web/ui-auth/template/eslint.config.mjs +14 -0
- package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +3 -3
- package/src/templates/web/ui-auth/template/src/app/dev-setup/page.tsx +81 -91
- package/src/templates/web/ui-auth/template/src/app/layout.tsx +38 -36
- package/src/templates/web/ui-auth/template/src/app/login/page.tsx +22 -45
- package/src/templates/web/ui-auth/template/src/app/page.tsx +106 -306
- package/src/templates/web/ui-auth/template/src/app/setup/page.tsx +387 -402
- package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +24 -47
- package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +229 -94
- package/src/templates/web/ui-auth-ai/template/src/app/layout.tsx +38 -45
- package/src/templates/web/ui-auth-ai/template/src/app/login/page.tsx +86 -0
- package/src/templates/web/ui-auth-ai/template/src/app/page.tsx +107 -193
- package/src/templates/web/ui-auth-ai/template/src/app/signup/page.tsx +105 -0
- package/src/templates/web/ui-auth-ai/template/src/components/ai/audio-generator.tsx +144 -140
- package/src/templates/web/ui-auth-ai/template/src/components/ai/video-generator.tsx +156 -157
- package/src/templates/web/ui-auth-ai/template/src/components/auth/login-form.tsx +7 -3
- package/src/templates/web/ui-auth-ai/template/src/components/providers/app-providers.tsx +25 -0
- package/src/templates/web/ui-auth-ai/template/src/components/shared/footer.tsx +36 -0
- package/src/templates/web/ui-auth-ai/template/src/components/shared/header.tsx +228 -0
- package/src/templates/web/ui-auth-ai/template/src/components/ui/button.tsx +5 -5
- package/src/templates/web/ui-auth-ai/template/src/components/ui/input.tsx +1 -1
- package/src/templates/web/ui-auth-ai/template/src/components/ui/select.tsx +1 -1
- package/src/templates/web/ui-auth-ai/template/src/components/ui/textarea.tsx +1 -1
- package/src/templates/web/ui-auth-ai/template/src/components/ui/theme-toggle.tsx +34 -0
- package/src/templates/web/ui-auth-ai/template/src/lib/supabase.ts +6 -4
- package/src/templates/web/ui-auth-ai/template/src/providers/auth-provider.tsx +7 -5
- package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +63 -192
- package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +104 -296
- package/src/templates/web/ui-auth-payments/template/src/app/dashboard/page.tsx +27 -27
- package/src/templates/web/ui-auth-payments/template/src/app/dev-setup/page.tsx +70 -81
- package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +38 -36
- package/src/templates/web/ui-auth-payments/template/src/app/login/loading.tsx +9 -9
- package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +4 -104
- package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +69 -337
- package/src/templates/web/ui-auth-payments/template/src/app/setup/page.tsx +55 -68
- package/src/templates/web/ui-auth-payments/template/src/app/signup/loading.tsx +13 -13
- package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +4 -123
- package/src/templates/web/ui-auth-payments/template/src/components/client/auth-status.tsx +37 -52
- package/src/templates/web/ui-auth-payments/template/src/components/client/login-form.tsx +49 -103
- package/src/templates/web/ui-auth-payments/template/src/components/client/newsletter-signup.tsx +4 -4
- package/src/templates/web/ui-auth-payments/template/src/components/client/signup-form.tsx +60 -140
- package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +25 -28
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +229 -230
- package/src/templates/web/ui-auth-payments/template/src/lib/actions/auth.ts +245 -245
- package/src/templates/web/ui-auth-payments/template/src/lib/actions/index.ts +339 -339
- package/src/templates/web/ui-auth-payments-ai/template/src/app/ai/page.tsx +305 -309
- package/src/templates/web/ui-auth-payments-ai/template/src/app/billing/page.tsx +62 -312
- package/src/templates/web/ui-auth-payments-ai/template/src/app/checkout/page.tsx +109 -125
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dashboard/page.tsx +27 -27
- package/src/templates/web/ui-auth-payments-ai/template/src/app/dev-setup/page.tsx +68 -83
- package/src/templates/web/ui-auth-payments-ai/template/src/app/layout.tsx +40 -38
- package/src/templates/web/ui-auth-payments-ai/template/src/app/onboarding/page.tsx +20 -20
- package/src/templates/web/ui-auth-payments-ai/template/src/app/page.tsx +140 -394
- package/src/templates/web/ui-auth-payments-ai/template/src/app/settings/page.tsx +28 -27
- package/src/templates/web/ui-auth-payments-ai/template/src/app/setup/page.tsx +51 -66
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/auth-status.tsx +37 -52
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/login-form.tsx +50 -79
- package/src/templates/web/ui-auth-payments-ai/template/src/components/client/signup-form.tsx +58 -111
- package/src/templates/web/ui-auth-payments-ai/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth-payments-ai/template/src/components/shared/header.tsx +229 -252
- package/src/templates/web/ui-auth-payments-ai/template/src/lib/actions/auth.ts +245 -245
- package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +63 -192
- package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +109 -125
- package/src/templates/web/ui-auth-payments-audio/template/src/app/dashboard/page.tsx +27 -27
- package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +40 -38
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +122 -385
- package/src/templates/web/ui-auth-payments-audio/template/src/app/setup/page.tsx +340 -344
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/auth-status.tsx +37 -52
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/login-form.tsx +49 -103
- package/src/templates/web/ui-auth-payments-audio/template/src/components/client/signup-form.tsx +60 -140
- package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +229 -252
- package/src/templates/web/ui-auth-payments-audio/template/src/lib/actions/auth.ts +3 -3
- package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +63 -192
- package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +109 -125
- package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +38 -36
- package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +9 -109
- package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +132 -392
- package/src/templates/web/ui-auth-payments-video/template/src/app/setup/page.tsx +346 -350
- package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +9 -128
- package/src/templates/web/ui-auth-payments-video/template/src/components/client/login-form.tsx +90 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/client/signup-form.tsx +105 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +8 -3
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +229 -246
- package/src/templates/web/ui-only/template/eslint.config.mjs +14 -0
- package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +2 -2
- package/src/templates/web/ui-only/template/src/app/login/page.tsx +69 -63
- package/src/templates/web/ui-only/template/src/app/page.tsx +69 -91
- package/src/templates/web/ui-only/template/src/app/signup/page.tsx +94 -79
- package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +1 -6
- package/src/templates/web/ui-only/template/src/components/shared/header.tsx +90 -53
- package/src/templates/web/ui-package-test/template/package.json +19 -23
- package/src/templates/web/ui-package-test/template/postcss.config.mjs +8 -0
- package/src/templates/web/ui-package-test/template/src/app/globals.css +88 -0
- package/src/templates/web/ui-package-test/template/src/app/layout.tsx +27 -0
- package/src/templates/web/ui-package-test/template/src/app/page.tsx +46 -106
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
- package/dist/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
- package/dist/templates/web/base/template/.eslintrc.js +0 -8
- package/dist/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/base/template/src/test/setup.ts +0 -74
- package/dist/templates/web/base/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth/template/.eslintrc.js +0 -8
- package/dist/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
- package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
- package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
- package/dist/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
- package/dist/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
- package/dist/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
- package/dist/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
- package/dist/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
- package/dist/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
- package/dist/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
- package/dist/templates/web/ui-only/template/.eslintrc.js +0 -8
- package/dist/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
- package/dist/templates/web/ui-only/template/src/test/setup.ts +0 -74
- package/dist/templates/web/ui-only/template/vitest.config.ts +0 -17
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/README.md +0 -655
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/(tabs)/ai.tsx +0 -683
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/app/_layout.tsx +0 -124
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/app.json +0 -74
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/babel.config.js +0 -25
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/docs/MOBILE-SETUP.md +0 -787
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/eas.json +0 -25
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/expo-env.d.ts +0 -3
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -346
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/jest-setup.ts +0 -37
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -180
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/metro.config.js +0 -11
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/package.json +0 -122
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -599
- package/src/templates/mobile/ui-auth-payments-ai-rag/template/tsconfig.json +0 -32
- package/src/templates/web/base/template/.eslintrc.js +0 -8
- package/src/templates/web/base/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/base/template/src/test/setup.ts +0 -74
- package/src/templates/web/base/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth/template/.eslintrc.js +0 -8
- package/src/templates/web/ui-auth/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments-ai/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments-ai/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments-ai/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments-ai-rag/template/README.md +0 -434
- package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/KnowledgeManager.tsx +0 -642
- package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGAnalytics.tsx +0 -466
- package/src/templates/web/ui-auth-payments-ai-rag/template/components/rag/RAGChatInterface.tsx +0 -393
- package/src/templates/web/ui-auth-payments-ai-rag/template/docs/GETTING-STARTED.md +0 -457
- package/src/templates/web/ui-auth-payments-ai-rag/template/hooks/useRAGSystem.ts +0 -478
- package/src/templates/web/ui-auth-payments-ai-rag/template/lib/rag/config.ts +0 -250
- package/src/templates/web/ui-auth-payments-ai-rag/template/package.json +0 -73
- package/src/templates/web/ui-auth-payments-ai-rag/template/scripts/setup-rag.js +0 -622
- package/src/templates/web/ui-auth-payments-ai-rag/template/src/app/ai/page.tsx +0 -396
- package/src/templates/web/ui-auth-payments-audio/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments-audio/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments-audio/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-auth-payments-video/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-auth-payments-video/template/src/test/setup.ts +0 -74
- package/src/templates/web/ui-auth-payments-video/template/vitest.config.ts +0 -17
- package/src/templates/web/ui-only/template/.eslintrc.js +0 -8
- package/src/templates/web/ui-only/template/src/components/__tests__/example.test.tsx +0 -49
- package/src/templates/web/ui-only/template/src/test/setup.ts +0 -74
- 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
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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="
|
|
77
|
-
<
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
<
|
|
86
|
-
<
|
|
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-
|
|
103
|
-
<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
|
-
<
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
</
|
|
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">💳</span>
|
|
125
|
-
</div>
|
|
126
|
-
<div>
|
|
127
|
-
<p className="font-medium">
|
|
128
|
-
{method.brand.toUpperCase()} •••• {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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
</form>
|
|
256
|
-
</Modal>
|
|
54
|
+
</CardContent>
|
|
55
|
+
</Card>
|
|
56
|
+
</div>
|
|
257
57
|
|
|
258
|
-
|
|
259
|
-
<
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
-
<
|
|
265
|
-
|
|
266
|
-
|
|
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}>✓ {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 {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
35
|
+
export default function CheckoutPage() {
|
|
36
|
+
const [selectedPlan, setSelectedPlan] = useState('pro');
|
|
37
|
+
const [loading, setLoading] = useState(false);
|
|
20
38
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
{
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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-
|
|
52
|
-
<div className="max-w-
|
|
53
|
-
<div className="
|
|
54
|
-
<
|
|
55
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
<
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|