@digilogiclabs/create-saas-app 1.1.2 → 1.3.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 +7 -7
- package/bin/index.js +36 -36
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +56 -12
- package/dist/index.js.map +1 -1
- package/dist/templates/mobile/base/template/.env.example +15 -15
- package/dist/templates/mobile/base/template/app/checkout.tsx +20 -20
- package/dist/templates/web/base/template/src/app/checkout/page.tsx +28 -28
- package/dist/templates/web/ui-auth/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth/template/package.json +40 -0
- package/dist/templates/web/ui-auth/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth/template/src/app/auth/callback/route.ts +12 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth}/template/src/app/checkout/page.tsx +25 -28
- package/dist/templates/web/ui-auth/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-auth/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-auth/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth/template/src/app/page.tsx +129 -0
- package/dist/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +25 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth}/template/src/components/shared/header.tsx +17 -8
- package/dist/templates/web/ui-auth/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-auth/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments/template/README.md +165 -0
- package/dist/templates/web/ui-auth-payments/template/next.config.js +12 -0
- package/dist/templates/web/ui-auth-payments/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/page.tsx +143 -0
- package/dist/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +60 -0
- package/dist/templates/web/ui-auth-payments/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-auth-payments/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-auth-payments/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-auth-payments/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-auth-payments-audio/template/README.md +187 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-audio}/template/next.config.js +0 -3
- package/dist/templates/web/ui-auth-payments-audio/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +181 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +60 -0
- package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-audio}/template/tailwind.config.js +1 -1
- package/dist/templates/web/ui-auth-payments-video/template/README.md +190 -0
- package/dist/templates/web/{web-ui-package → ui-auth-payments-video}/template/next.config.js +0 -3
- package/dist/templates/web/ui-auth-payments-video/template/package.json +42 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +211 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +142 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +109 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/page.tsx +187 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +128 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +28 -0
- package/dist/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +60 -0
- package/dist/templates/web/{web-ui-package → ui-auth-payments-video}/template/tailwind.config.js +1 -1
- package/dist/templates/web/ui-only/template/next.config.js +12 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/package.json +3 -3
- package/dist/templates/web/ui-only/template/postcss.config.js +7 -0
- package/dist/templates/web/ui-only/template/src/app/auth/callback/route.ts +12 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/src/app/checkout/page.tsx +25 -28
- package/dist/templates/web/ui-only/template/src/app/globals.css +42 -0
- package/dist/templates/web/ui-only/template/src/app/layout.tsx +29 -0
- package/dist/templates/web/ui-only/template/src/app/login/page.tsx +63 -0
- package/dist/templates/web/ui-only/template/src/app/signup/page.tsx +79 -0
- package/dist/templates/web/ui-only/template/src/components/providers/app-providers.tsx +22 -0
- package/dist/templates/web/{web-ui-package → ui-only}/template/src/components/shared/header.tsx +17 -8
- package/dist/templates/web/ui-only/template/src/components/ui/badge.tsx +36 -0
- package/dist/templates/web/ui-only/template/src/lib/utils.ts +7 -0
- package/dist/templates/web/ui-only/template/tailwind.config.js +77 -0
- package/dist/templates/web/ui-only/template/tsconfig.json +33 -0
- package/dist/templates/web/ui-package-test/template/package.json +2 -2
- package/package.json +1 -1
- package/src/templates/mobile/base/template/.env.example +15 -15
- package/src/templates/mobile/base/template/app/checkout.tsx +20 -20
- package/src/templates/web/base/template/src/app/checkout/page.tsx +28 -28
- package/src/templates/web/ui-auth/template/README.md +68 -0
- package/src/templates/web/ui-auth/template/next.config.js +12 -0
- package/src/templates/web/ui-auth/template/package.json +40 -0
- package/src/templates/web/ui-auth/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth/template/src/app/checkout/page.tsx +25 -0
- package/src/templates/web/ui-auth/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth/template/src/app/page.tsx +129 -0
- package/src/templates/web/ui-auth/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth/template/src/components/providers/app-providers.tsx +25 -0
- package/src/templates/web/ui-auth/template/src/components/shared/header.tsx +51 -0
- package/src/templates/web/ui-auth/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments/template/README.md +165 -0
- package/src/templates/web/ui-auth-payments/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments/template/src/app/page.tsx +143 -0
- package/src/templates/web/ui-auth-payments/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-audio/template/README.md +187 -0
- package/src/templates/web/ui-auth-payments-audio/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-audio/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments-audio/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/page.tsx +181 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-audio/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments-audio/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-audio/template/tsconfig.json +33 -0
- package/src/templates/web/ui-auth-payments-video/template/README.md +190 -0
- package/src/templates/web/ui-auth-payments-video/template/next.config.js +12 -0
- package/src/templates/web/ui-auth-payments-video/template/package.json +42 -0
- package/src/templates/web/ui-auth-payments-video/template/postcss.config.js +7 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/billing/page.tsx +211 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/checkout/page.tsx +142 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/login/page.tsx +109 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/page.tsx +187 -0
- package/src/templates/web/ui-auth-payments-video/template/src/app/signup/page.tsx +128 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/providers/app-providers.tsx +28 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/shared/header.tsx +60 -0
- package/src/templates/web/ui-auth-payments-video/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-auth-payments-video/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-auth-payments-video/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-auth-payments-video/template/tsconfig.json +33 -0
- package/src/templates/web/ui-only/template/.env.example +15 -0
- package/src/templates/web/ui-only/template/README.md +68 -0
- package/src/templates/web/ui-only/template/next.config.js +12 -0
- package/src/templates/web/{web-ui-package → ui-only}/template/package.json +3 -3
- package/src/templates/web/ui-only/template/postcss.config.js +7 -0
- package/src/templates/web/ui-only/template/src/app/auth/callback/route.ts +12 -0
- package/src/templates/web/ui-only/template/src/app/checkout/page.tsx +25 -0
- package/src/templates/web/ui-only/template/src/app/globals.css +42 -0
- package/src/templates/web/ui-only/template/src/app/layout.tsx +29 -0
- package/src/templates/web/ui-only/template/src/app/login/page.tsx +63 -0
- package/src/templates/web/ui-only/template/src/app/signup/page.tsx +79 -0
- package/src/templates/web/ui-only/template/src/components/providers/app-providers.tsx +22 -0
- package/src/templates/web/ui-only/template/src/components/shared/header.tsx +51 -0
- package/src/templates/web/ui-only/template/src/components/ui/badge.tsx +36 -0
- package/src/templates/web/ui-only/template/src/lib/utils.ts +7 -0
- package/src/templates/web/ui-only/template/tailwind.config.js +77 -0
- package/src/templates/web/ui-only/template/tsconfig.json +33 -0
- package/src/templates/web/ui-only/template.backup/.env.example +15 -0
- package/{dist/mobile/base/template → src/templates/web/ui-only/template.backup.20250817}/.env.example +15 -15
- package/src/templates/web/ui-package-test/template/package.json +2 -2
- package/dist/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +0 -18
- package/dist/templates/web/web-ui-package/template/src/app/login/page.tsx +0 -39
- package/dist/templates/web/web-ui-package/template/src/app/signup/page.tsx +0 -39
- package/dist/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +0 -29
- package/src/templates/web/web-ui-package/template/.eslintrc.js +0 -8
- package/src/templates/web/web-ui-package/template/src/app/auth/callback/route.ts +0 -18
- package/src/templates/web/web-ui-package/template/src/app/login/page.tsx +0 -39
- package/src/templates/web/web-ui-package/template/src/app/signup/page.tsx +0 -39
- package/src/templates/web/web-ui-package/template/src/components/providers/app-providers.tsx +0 -29
- /package/dist/{web/base → templates/web/ui-auth}/template/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth}/template/.eslintrc.js +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth}/template/README.md +0 -0
- /package/dist/{web/base → templates/web/ui-auth}/template.backup/.env.example +0 -0
- /package/dist/{web/base → templates/web/ui-auth}/template.backup.20250817/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments}/template/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package/template.backup.20250817 → ui-auth-payments-audio/template}/.env.example +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/postcss.config.js +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/app/globals.css +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/app/layout.tsx +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/components/ui/badge.tsx +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/src/lib/utils.ts +0 -0
- /package/dist/templates/web/{web-ui-package → ui-auth-payments-audio}/template/tsconfig.json +0 -0
- /package/dist/templates/web/{web-ui-package/template.backup → ui-auth-payments-video/template}/.env.example +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/postcss.config.js +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/app/globals.css +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/app/layout.tsx +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/components/ui/badge.tsx +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/src/lib/utils.ts +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-auth-payments-video}/template/tsconfig.json +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template/.env.example +0 -0
- /package/dist/{web/base → templates/web/ui-only}/template/.eslintrc.js +0 -0
- /package/{src/templates/web/web-ui-package → dist/templates/web/ui-only}/template/README.md +0 -0
- /package/dist/templates/web/{web-ui-package → ui-only}/template/src/app/page.tsx +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template.backup/.env.example +0 -0
- /package/dist/{web/ui-package-test → templates/web/ui-only}/template.backup.20250817/.env.example +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template/.env.example +0 -0
- /package/{dist/web/ui-package-test → src/templates/web/ui-auth}/template/.eslintrc.js +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template.backup/.env.example +0 -0
- /package/src/templates/web/{web-ui-package → ui-auth}/template.backup.20250817/.env.example +0 -0
- /package/{dist/web/web-ui-package → src/templates/web/ui-auth-payments}/template/.env.example +0 -0
- /package/{dist/web/web-ui-package/template.backup.20250817 → src/templates/web/ui-auth-payments-audio/template}/.env.example +0 -0
- /package/{dist/web/web-ui-package/template.backup → src/templates/web/ui-auth-payments-video/template}/.env.example +0 -0
- /package/{dist/web/web-ui-package → src/templates/web/ui-only}/template/.eslintrc.js +0 -0
- /package/src/templates/web/{web-ui-package → ui-only}/template/src/app/page.tsx +0 -0
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import Link from 'next/link';
|
|
5
|
-
import { useAuth } from '@digilogiclabs/saas-factory-auth';
|
|
6
|
-
import { Button } from '@/components/ui/button';
|
|
7
5
|
import { LogOut } from 'lucide-react';
|
|
8
6
|
|
|
9
7
|
export function Header() {
|
|
10
|
-
const
|
|
8
|
+
const user = null; // Placeholder for auth state
|
|
9
|
+
|
|
10
|
+
const handleSignOut = () => {
|
|
11
|
+
alert('Sign out functionality requires @digilogiclabs/saas-factory-auth package');
|
|
12
|
+
};
|
|
11
13
|
|
|
12
14
|
return (
|
|
13
15
|
<header className="bg-white dark:bg-gray-800 shadow-md">
|
|
@@ -21,18 +23,24 @@ export function Header() {
|
|
|
21
23
|
<Link href="/dashboard" className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white">
|
|
22
24
|
Dashboard
|
|
23
25
|
</Link>
|
|
24
|
-
<
|
|
26
|
+
<button
|
|
27
|
+
onClick={handleSignOut}
|
|
28
|
+
className="p-2 text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white"
|
|
29
|
+
>
|
|
25
30
|
<LogOut className="h-5 w-5" />
|
|
26
|
-
</
|
|
31
|
+
</button>
|
|
27
32
|
</>
|
|
28
33
|
) : (
|
|
29
34
|
<>
|
|
30
35
|
<Link href="/login" className="text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white">
|
|
31
36
|
Login
|
|
32
37
|
</Link>
|
|
33
|
-
<
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
<Link
|
|
39
|
+
href="/signup"
|
|
40
|
+
className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700"
|
|
41
|
+
>
|
|
42
|
+
Sign Up
|
|
43
|
+
</Link>
|
|
36
44
|
</>
|
|
37
45
|
)}
|
|
38
46
|
</nav>
|
|
@@ -40,3 +48,4 @@ export function Header() {
|
|
|
40
48
|
</header>
|
|
41
49
|
);
|
|
42
50
|
}
|
|
51
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from "react"
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
3
|
+
import { cn } from "@/lib/utils"
|
|
4
|
+
|
|
5
|
+
const badgeVariants = cva(
|
|
6
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
default:
|
|
11
|
+
"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
|
|
12
|
+
secondary:
|
|
13
|
+
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
14
|
+
destructive:
|
|
15
|
+
"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
|
|
16
|
+
outline: "text-foreground",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
defaultVariants: {
|
|
20
|
+
variant: "default",
|
|
21
|
+
},
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
export interface BadgeProps
|
|
26
|
+
extends React.HTMLAttributes<HTMLDivElement>,
|
|
27
|
+
VariantProps<typeof badgeVariants> {}
|
|
28
|
+
|
|
29
|
+
function Badge({ className, variant, ...props }: BadgeProps) {
|
|
30
|
+
return (
|
|
31
|
+
<div className={cn(badgeVariants({ variant }), className)} {...props} />
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { Badge, badgeVariants }
|
|
36
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
darkMode: ["class"],
|
|
4
|
+
content: [
|
|
5
|
+
'./pages/**/*.{ts,tsx}',
|
|
6
|
+
'./components/**/*.{ts,tsx}',
|
|
7
|
+
'./app/**/*.{ts,tsx}',
|
|
8
|
+
'./src/**/*.{ts,tsx}',
|
|
9
|
+
'../../node_modules/@digilogiclabs/saas-factory-ui/dist/**/*.{js,ts,jsx,tsx}',
|
|
10
|
+
],
|
|
11
|
+
theme: {
|
|
12
|
+
container: {
|
|
13
|
+
center: true,
|
|
14
|
+
padding: "2rem",
|
|
15
|
+
screens: {
|
|
16
|
+
"2xl": "1400px",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
extend: {
|
|
20
|
+
colors: {
|
|
21
|
+
border: "hsl(var(--border))",
|
|
22
|
+
input: "hsl(var(--input))",
|
|
23
|
+
ring: "hsl(var(--ring))",
|
|
24
|
+
background: "hsl(var(--background))",
|
|
25
|
+
foreground: "hsl(var(--foreground))",
|
|
26
|
+
primary: {
|
|
27
|
+
DEFAULT: "hsl(var(--primary))",
|
|
28
|
+
foreground: "hsl(var(--primary-foreground))",
|
|
29
|
+
},
|
|
30
|
+
secondary: {
|
|
31
|
+
DEFAULT: "hsl(var(--secondary))",
|
|
32
|
+
foreground: "hsl(var(--secondary-foreground))",
|
|
33
|
+
},
|
|
34
|
+
destructive: {
|
|
35
|
+
DEFAULT: "hsl(var(--destructive))",
|
|
36
|
+
foreground: "hsl(var(--destructive-foreground))",
|
|
37
|
+
},
|
|
38
|
+
muted: {
|
|
39
|
+
DEFAULT: "hsl(var(--muted))",
|
|
40
|
+
foreground: "hsl(var(--muted-foreground))",
|
|
41
|
+
},
|
|
42
|
+
accent: {
|
|
43
|
+
DEFAULT: "hsl(var(--accent))",
|
|
44
|
+
foreground: "hsl(var(--accent-foreground))",
|
|
45
|
+
},
|
|
46
|
+
popover: {
|
|
47
|
+
DEFAULT: "hsl(var(--popover))",
|
|
48
|
+
foreground: "hsl(var(--popover-foreground))",
|
|
49
|
+
},
|
|
50
|
+
card: {
|
|
51
|
+
DEFAULT: "hsl(var(--card))",
|
|
52
|
+
foreground: "hsl(var(--card-foreground))",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
borderRadius: {
|
|
56
|
+
lg: "var(--radius)",
|
|
57
|
+
md: "calc(var(--radius) - 2px)",
|
|
58
|
+
sm: "calc(var(--radius) - 4px)",
|
|
59
|
+
},
|
|
60
|
+
keyframes: {
|
|
61
|
+
"accordion-down": {
|
|
62
|
+
from: { height: 0 },
|
|
63
|
+
to: { height: "var(--radix-accordion-content-height)" },
|
|
64
|
+
},
|
|
65
|
+
"accordion-up": {
|
|
66
|
+
from: { height: "var(--radix-accordion-content-height)" },
|
|
67
|
+
to: { height: 0 },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
animation: {
|
|
71
|
+
"accordion-down": "accordion-down 0.2s ease-out",
|
|
72
|
+
"accordion-up": "accordion-up 0.2s ease-out",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
plugins: [],
|
|
77
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es5",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "es6"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [
|
|
17
|
+
{
|
|
18
|
+
"name": "next"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"baseUrl": ".",
|
|
22
|
+
"paths": {
|
|
23
|
+
"@/*": ["./src/*"],
|
|
24
|
+
"@/components/*": ["./src/components/*"],
|
|
25
|
+
"@/lib/*": ["./src/lib/*"],
|
|
26
|
+
"@/hooks/*": ["./src/hooks/*"],
|
|
27
|
+
"@/types/*": ["./src/types/*"]
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
31
|
+
"exclude": ["node_modules"]
|
|
32
|
+
}
|
|
33
|
+
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# {{titleCaseName}}
|
|
2
|
+
|
|
3
|
+
{{description}}
|
|
4
|
+
|
|
5
|
+
This is a Next.js 15 project created with the **UI + Auth + Payments** template from `@digilogiclabs/create-saas-app`. It includes:
|
|
6
|
+
|
|
7
|
+
- 🎨 **UI Components** - @digilogiclabs/saas-factory-ui v0.7.3
|
|
8
|
+
- 🔐 **Authentication** - @digilogiclabs/saas-factory-auth v0.4.4
|
|
9
|
+
- 💳 **Payments** - @digilogiclabs/saas-factory-payments v0.3.0
|
|
10
|
+
- ⚡ **Next.js 15** - Latest React framework
|
|
11
|
+
- 🎯 **TypeScript** - Full type safety
|
|
12
|
+
- 🎨 **Tailwind CSS** - Utility-first styling
|
|
13
|
+
- 🌙 **Dark Mode** - Built-in theme support
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
### Authentication
|
|
18
|
+
- User registration and login
|
|
19
|
+
- Protected routes
|
|
20
|
+
- Session management
|
|
21
|
+
- Sign out functionality
|
|
22
|
+
|
|
23
|
+
### Payments Integration
|
|
24
|
+
- Subscription plans display
|
|
25
|
+
- Payment form with Stripe integration
|
|
26
|
+
- Billing history
|
|
27
|
+
- Payment method management
|
|
28
|
+
- Subscription management
|
|
29
|
+
|
|
30
|
+
### UI Components
|
|
31
|
+
- Modern, accessible components
|
|
32
|
+
- Dark/light theme support
|
|
33
|
+
- Responsive design
|
|
34
|
+
- TypeScript definitions
|
|
35
|
+
|
|
36
|
+
## Getting Started
|
|
37
|
+
|
|
38
|
+
### Prerequisites
|
|
39
|
+
- Node.js 18+
|
|
40
|
+
- npm, yarn, or pnpm
|
|
41
|
+
|
|
42
|
+
### Installation
|
|
43
|
+
|
|
44
|
+
1. Install dependencies:
|
|
45
|
+
```bash
|
|
46
|
+
npm install
|
|
47
|
+
# or
|
|
48
|
+
yarn install
|
|
49
|
+
# or
|
|
50
|
+
pnpm install
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
2. Set up environment variables:
|
|
54
|
+
```bash
|
|
55
|
+
cp .env.example .env.local
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Edit `.env.local` with your configuration:
|
|
59
|
+
```env
|
|
60
|
+
# Authentication (choose one)
|
|
61
|
+
NEXT_PUBLIC_FIREBASE_API_KEY=your_firebase_api_key
|
|
62
|
+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your_project.firebaseapp.com
|
|
63
|
+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your_project_id
|
|
64
|
+
|
|
65
|
+
# OR
|
|
66
|
+
|
|
67
|
+
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
|
|
68
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
|
|
69
|
+
|
|
70
|
+
# Payments
|
|
71
|
+
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=your_stripe_publishable_key
|
|
72
|
+
STRIPE_SECRET_KEY=your_stripe_secret_key
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
3. Run the development server:
|
|
76
|
+
```bash
|
|
77
|
+
npm run dev
|
|
78
|
+
# or
|
|
79
|
+
yarn dev
|
|
80
|
+
# or
|
|
81
|
+
pnpm dev
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
85
|
+
|
|
86
|
+
## Available Pages
|
|
87
|
+
|
|
88
|
+
- `/` - Home page with feature showcase
|
|
89
|
+
- `/login` - User authentication
|
|
90
|
+
- `/signup` - User registration
|
|
91
|
+
- `/checkout` - Subscription plans and payment
|
|
92
|
+
- `/billing` - Subscription and billing management
|
|
93
|
+
|
|
94
|
+
## Package Integration
|
|
95
|
+
|
|
96
|
+
### UI Package (@digilogiclabs/saas-factory-ui)
|
|
97
|
+
```tsx
|
|
98
|
+
import { Button, Card } from '@digilogiclabs/saas-factory-ui'
|
|
99
|
+
|
|
100
|
+
<Button variant="primary">Click me</Button>
|
|
101
|
+
<Card>Content here</Card>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Auth Package (@digilogiclabs/saas-factory-auth)
|
|
105
|
+
```tsx
|
|
106
|
+
import { useAuth } from '@digilogiclabs/saas-factory-auth'
|
|
107
|
+
|
|
108
|
+
const { user, signIn, signOut, loading } = useAuth()
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Payments Package (@digilogiclabs/saas-factory-payments)
|
|
112
|
+
```tsx
|
|
113
|
+
import {
|
|
114
|
+
PaymentForm,
|
|
115
|
+
SubscriptionPlans,
|
|
116
|
+
SubscriptionManager
|
|
117
|
+
} from '@digilogiclabs/saas-factory-payments'
|
|
118
|
+
|
|
119
|
+
<SubscriptionPlans onPlanSelect={handlePlanSelect} />
|
|
120
|
+
<PaymentForm onSuccess={handleSuccess} onError={handleError} />
|
|
121
|
+
<SubscriptionManager onSubscriptionChange={handleChange} />
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Project Structure
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
src/
|
|
128
|
+
├── app/ # Next.js 15 app directory
|
|
129
|
+
│ ├── billing/ # Billing and subscription management
|
|
130
|
+
│ ├── checkout/ # Payment and subscription selection
|
|
131
|
+
│ ├── login/ # Authentication pages
|
|
132
|
+
│ ├── signup/
|
|
133
|
+
│ └── layout.tsx # Root layout with providers
|
|
134
|
+
├── components/
|
|
135
|
+
│ ├── providers/ # App-wide providers (Auth, Payments, Theme)
|
|
136
|
+
│ ├── shared/ # Shared components (Header, etc.)
|
|
137
|
+
│ └── ui/ # UI components
|
|
138
|
+
└── lib/ # Utilities and configurations
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Deployment
|
|
142
|
+
|
|
143
|
+
### Vercel (Recommended)
|
|
144
|
+
1. Push your code to GitHub
|
|
145
|
+
2. Connect your repository to Vercel
|
|
146
|
+
3. Add environment variables in Vercel dashboard
|
|
147
|
+
4. Deploy
|
|
148
|
+
|
|
149
|
+
### Other Platforms
|
|
150
|
+
This is a standard Next.js application and can be deployed to any platform that supports Node.js.
|
|
151
|
+
|
|
152
|
+
## Learn More
|
|
153
|
+
|
|
154
|
+
- [Next.js Documentation](https://nextjs.org/docs)
|
|
155
|
+
- [Digi Logic Labs Documentation](https://docs.digilogiclabs.com)
|
|
156
|
+
- [SaaS Factory UI Components](https://ui.digilogiclabs.com)
|
|
157
|
+
- [SaaS Factory Auth Guide](https://auth.digilogiclabs.com)
|
|
158
|
+
- [SaaS Factory Payments Guide](https://payments.digilogiclabs.com)
|
|
159
|
+
|
|
160
|
+
## Support
|
|
161
|
+
|
|
162
|
+
- 📚 [Documentation](https://docs.digilogiclabs.com)
|
|
163
|
+
- 💬 [Discord Community](https://discord.gg/digilogiclabs)
|
|
164
|
+
- 🐛 [Report Issues](https://github.com/DigiLogicLabs/create-saas-app/issues)
|
|
165
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{packageName}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "{{description}} (with UI Package v0.11.1 + Auth v1.0.0 + Payments)",
|
|
5
|
+
"private": true,
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "next dev",
|
|
8
|
+
"build": "next build",
|
|
9
|
+
"start": "next start",
|
|
10
|
+
"lint": "next lint",
|
|
11
|
+
"type-check": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"next": "^15.0.0",
|
|
15
|
+
"react": "^19.0.0",
|
|
16
|
+
"react-dom": "^19.0.0",
|
|
17
|
+
"@digilogiclabs/saas-factory-ui": "^0.11.1",
|
|
18
|
+
"@digilogiclabs/saas-factory-auth": "^1.0.0",
|
|
19
|
+
"@digilogiclabs/saas-factory-payments": "^1.0.0",
|
|
20
|
+
"stripe": "^14.0.0",
|
|
21
|
+
"tailwindcss": "^3.3.0",
|
|
22
|
+
"autoprefixer": "^10.4.16",
|
|
23
|
+
"postcss": "^8.4.31",
|
|
24
|
+
"clsx": "^2.0.0",
|
|
25
|
+
"class-variance-authority": "^0.7.0",
|
|
26
|
+
"tailwind-merge": "^2.0.0",
|
|
27
|
+
"next-themes": "^0.2.1",
|
|
28
|
+
"lucide-react": "^0.542.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"typescript": "^5.0.0",
|
|
32
|
+
"@types/node": "^20.0.0",
|
|
33
|
+
"@types/react": "^19.0.0",
|
|
34
|
+
"@types/react-dom": "^19.0.0",
|
|
35
|
+
"eslint": "^8.0.0",
|
|
36
|
+
"eslint-config-next": "^15.0.0",
|
|
37
|
+
"prettier": "^3.0.0"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import type { NextRequest } from 'next/server';
|
|
3
|
+
|
|
4
|
+
export async function GET(request: NextRequest) {
|
|
5
|
+
const requestUrl = new URL(request.url);
|
|
6
|
+
|
|
7
|
+
// Placeholder auth callback - requires @digilogiclabs/saas-factory-auth package
|
|
8
|
+
console.log('Auth callback triggered - requires auth package for full functionality');
|
|
9
|
+
|
|
10
|
+
// URL to redirect to after sign in process completes
|
|
11
|
+
return NextResponse.redirect(requestUrl.origin);
|
|
12
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { usePayments, formatCurrency, formatDate } from '@digilogiclabs/saas-factory-payments';
|
|
5
|
+
import { Button, Card } from '@digilogiclabs/saas-factory-ui';
|
|
6
|
+
|
|
7
|
+
export default function BillingPage() {
|
|
8
|
+
const { loading } = usePayments();
|
|
9
|
+
|
|
10
|
+
const handleSubscriptionChange = () => {
|
|
11
|
+
console.log('Subscription change requested');
|
|
12
|
+
// Handle subscription changes (upgrade, downgrade, cancel, resume)
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const handlePaymentMethodUpdate = () => {
|
|
16
|
+
console.log('Payment method update requested');
|
|
17
|
+
// Handle payment method updates (add, edit, delete, set default)
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const handleInvoiceDownload = (invoiceId: string) => {
|
|
21
|
+
console.log('Download invoice:', invoiceId);
|
|
22
|
+
// Handle invoice download
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Mock current subscription data - in real app this would come from your backend
|
|
26
|
+
const currentSubscription = {
|
|
27
|
+
plan: 'Pro Plan',
|
|
28
|
+
price: 1999,
|
|
29
|
+
interval: 'month',
|
|
30
|
+
status: 'active',
|
|
31
|
+
nextBilling: new Date(Date.now() + 15 * 24 * 60 * 60 * 1000)
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Mock payment methods - in real app this would come from your backend
|
|
35
|
+
const paymentMethods = [
|
|
36
|
+
{
|
|
37
|
+
id: 'pm_123',
|
|
38
|
+
type: 'card',
|
|
39
|
+
last4: '4242',
|
|
40
|
+
brand: 'visa',
|
|
41
|
+
expiryMonth: 12,
|
|
42
|
+
expiryYear: 2025,
|
|
43
|
+
isDefault: true
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'pm_456',
|
|
47
|
+
type: 'card',
|
|
48
|
+
last4: '0005',
|
|
49
|
+
brand: 'mastercard',
|
|
50
|
+
expiryMonth: 8,
|
|
51
|
+
expiryYear: 2026,
|
|
52
|
+
isDefault: false
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
// Mock billing history - in real app this would come from your backend
|
|
57
|
+
const invoices = [
|
|
58
|
+
{
|
|
59
|
+
id: 'inv_123',
|
|
60
|
+
amount: 1999,
|
|
61
|
+
currency: 'usd',
|
|
62
|
+
status: 'paid',
|
|
63
|
+
date: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),
|
|
64
|
+
description: 'Pro Plan - Monthly'
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'inv_456',
|
|
68
|
+
amount: 1999,
|
|
69
|
+
currency: 'usd',
|
|
70
|
+
status: 'paid',
|
|
71
|
+
date: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000),
|
|
72
|
+
description: 'Pro Plan - Monthly'
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: 'inv_789',
|
|
76
|
+
amount: 999,
|
|
77
|
+
currency: 'usd',
|
|
78
|
+
status: 'paid',
|
|
79
|
+
date: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000),
|
|
80
|
+
description: 'Basic Plan - Monthly'
|
|
81
|
+
}
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className="min-h-screen bg-gray-100 py-8">
|
|
86
|
+
<div className="max-w-7xl mx-auto px-4">
|
|
87
|
+
<div className="mb-8">
|
|
88
|
+
<h1 className="text-4xl font-bold text-gray-900 mb-2">Billing & Subscription</h1>
|
|
89
|
+
<p className="text-xl text-gray-600">Manage your subscription and billing information</p>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
|
|
93
|
+
{/* Current Subscription */}
|
|
94
|
+
<Card className="p-6">
|
|
95
|
+
<h2 className="text-2xl font-bold mb-6">Current Subscription</h2>
|
|
96
|
+
<div className="space-y-4">
|
|
97
|
+
<div>
|
|
98
|
+
<h3 className="font-semibold">{currentSubscription.plan}</h3>
|
|
99
|
+
<p className="text-2xl font-bold">
|
|
100
|
+
{formatCurrency(currentSubscription.price)}
|
|
101
|
+
<span className="text-sm font-normal">/{currentSubscription.interval}</span>
|
|
102
|
+
</p>
|
|
103
|
+
</div>
|
|
104
|
+
<div>
|
|
105
|
+
<p className="text-sm text-gray-600">Status</p>
|
|
106
|
+
<span className="inline-block px-2 py-1 bg-green-100 text-green-800 rounded text-sm">
|
|
107
|
+
{currentSubscription.status}
|
|
108
|
+
</span>
|
|
109
|
+
</div>
|
|
110
|
+
<div>
|
|
111
|
+
<p className="text-sm text-gray-600">Next billing date</p>
|
|
112
|
+
<p>{formatDate(currentSubscription.nextBilling)}</p>
|
|
113
|
+
</div>
|
|
114
|
+
<Button
|
|
115
|
+
onClick={handleSubscriptionChange}
|
|
116
|
+
disabled={loading}
|
|
117
|
+
variant="outline"
|
|
118
|
+
className="w-full"
|
|
119
|
+
>
|
|
120
|
+
Change Plan
|
|
121
|
+
</Button>
|
|
122
|
+
</div>
|
|
123
|
+
</Card>
|
|
124
|
+
|
|
125
|
+
{/* Payment Methods */}
|
|
126
|
+
<Card className="p-6">
|
|
127
|
+
<h2 className="text-2xl font-bold mb-6">Payment Methods</h2>
|
|
128
|
+
<div className="space-y-4">
|
|
129
|
+
{paymentMethods.map((method) => (
|
|
130
|
+
<div key={method.id} className="flex items-center justify-between p-3 border rounded-lg">
|
|
131
|
+
<div className="flex items-center">
|
|
132
|
+
<div className="w-8 h-8 bg-blue-100 rounded flex items-center justify-center mr-3">
|
|
133
|
+
💳
|
|
134
|
+
</div>
|
|
135
|
+
<div>
|
|
136
|
+
<p className="font-medium">
|
|
137
|
+
{method.brand.toUpperCase()} •••• {method.last4}
|
|
138
|
+
</p>
|
|
139
|
+
<p className="text-sm text-gray-600">
|
|
140
|
+
Expires {method.expiryMonth}/{method.expiryYear}
|
|
141
|
+
{method.isDefault && <span className="ml-2 text-blue-600">(Default)</span>}
|
|
142
|
+
</p>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<Button
|
|
146
|
+
onClick={handlePaymentMethodUpdate}
|
|
147
|
+
disabled={loading}
|
|
148
|
+
variant="outline"
|
|
149
|
+
size="sm"
|
|
150
|
+
>
|
|
151
|
+
Edit
|
|
152
|
+
</Button>
|
|
153
|
+
</div>
|
|
154
|
+
))}
|
|
155
|
+
<Button
|
|
156
|
+
onClick={handlePaymentMethodUpdate}
|
|
157
|
+
disabled={loading}
|
|
158
|
+
variant="outline"
|
|
159
|
+
className="w-full"
|
|
160
|
+
>
|
|
161
|
+
Add Payment Method
|
|
162
|
+
</Button>
|
|
163
|
+
</div>
|
|
164
|
+
</Card>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
{/* Billing History */}
|
|
168
|
+
<Card className="p-6">
|
|
169
|
+
<h2 className="text-2xl font-bold mb-6">Billing History</h2>
|
|
170
|
+
<div className="overflow-x-auto">
|
|
171
|
+
<table className="w-full">
|
|
172
|
+
<thead>
|
|
173
|
+
<tr className="border-b">
|
|
174
|
+
<th className="text-left py-2">Date</th>
|
|
175
|
+
<th className="text-left py-2">Description</th>
|
|
176
|
+
<th className="text-left py-2">Amount</th>
|
|
177
|
+
<th className="text-left py-2">Status</th>
|
|
178
|
+
<th className="text-left py-2">Actions</th>
|
|
179
|
+
</tr>
|
|
180
|
+
</thead>
|
|
181
|
+
<tbody>
|
|
182
|
+
{invoices.map((invoice) => (
|
|
183
|
+
<tr key={invoice.id} className="border-b">
|
|
184
|
+
<td className="py-3">{formatDate(invoice.date)}</td>
|
|
185
|
+
<td className="py-3">{invoice.description}</td>
|
|
186
|
+
<td className="py-3">{formatCurrency(invoice.amount)}</td>
|
|
187
|
+
<td className="py-3">
|
|
188
|
+
<span className="inline-block px-2 py-1 bg-green-100 text-green-800 rounded text-sm">
|
|
189
|
+
{invoice.status}
|
|
190
|
+
</span>
|
|
191
|
+
</td>
|
|
192
|
+
<td className="py-3">
|
|
193
|
+
<Button
|
|
194
|
+
onClick={() => handleInvoiceDownload(invoice.id)}
|
|
195
|
+
variant="outline"
|
|
196
|
+
size="sm"
|
|
197
|
+
>
|
|
198
|
+
Download
|
|
199
|
+
</Button>
|
|
200
|
+
</td>
|
|
201
|
+
</tr>
|
|
202
|
+
))}
|
|
203
|
+
</tbody>
|
|
204
|
+
</table>
|
|
205
|
+
</div>
|
|
206
|
+
</Card>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
|