create-next-pro-cli 0.1.4 → 0.1.5
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/package.json +1 -1
- package/templates/Page/loading.tsx +2 -7
- package/templates/Page/not-found.tsx +11 -0
- package/templates/Page/page-ui.tsx +1 -1
- package/templates/Projects/default/messages/en/{dashboard.json → Dashboard.json} +2 -1
- package/templates/Projects/default/messages/en/_global_ui.json +4 -0
- package/templates/Projects/default/messages/fr/{dashboard.json → Dashboard.json} +2 -1
- package/templates/Projects/default/messages/fr/_global_ui.json +4 -0
- package/templates/Projects/default/package.json +8 -2
- package/templates/Projects/default/src/app/[locale]/(public)/Login/page.tsx +6 -0
- package/templates/Projects/default/src/app/[locale]/(public)/Register/page.tsx +6 -0
- package/templates/Projects/default/src/app/[locale]/(public)/_home/loading.tsx +5 -1
- package/templates/Projects/default/src/app/[locale]/(public)/_home/page.tsx +3 -13
- package/templates/Projects/default/src/app/[locale]/(public)/layout.tsx +0 -2
- package/templates/Projects/default/src/app/[locale]/(user)/Dashboard/loading.tsx +10 -0
- package/templates/Projects/default/src/app/[locale]/(user)/Dashboard/page.tsx +5 -0
- package/templates/Projects/default/src/app/[locale]/(user)/Settings/page.tsx +6 -0
- package/templates/Projects/default/src/app/[locale]/(user)/UserInfo/page.tsx +6 -0
- package/templates/Projects/default/src/app/[locale]/(user)/layout.tsx +0 -3
- package/templates/Projects/default/src/app/[locale]/layout.tsx +3 -4
- package/templates/Projects/default/src/app/[locale]/loading.tsx +3 -6
- package/templates/Projects/default/src/app/[locale]/page.tsx +1 -111
- package/templates/Projects/default/src/app/api/auth/[...nextauth]/route.ts +6 -25
- package/templates/Projects/default/src/app/api/auth/post-login/route.ts +1 -2
- package/templates/Projects/default/src/app/styles/globals.css +295 -16
- package/templates/Projects/default/src/lib/auth/disconnect.ts +11 -0
- package/templates/Projects/default/src/lib/auth/isConnected.ts +5 -3
- package/templates/Projects/default/src/lib/utils.ts +6 -0
- package/templates/Projects/default/src/ui/Dashboard/LogoutButton.tsx +27 -0
- package/templates/Projects/default/src/ui/{dashboard/page.tsx → Dashboard/page-ui.tsx} +5 -4
- package/templates/Projects/default/src/{app/[locale]/(public)/login/page.tsx → ui/Login/page-ui.tsx} +7 -4
- package/templates/Projects/default/src/{app/[locale]/(public)/register/page.tsx → ui/Register/page-ui.tsx} +7 -4
- package/templates/Projects/default/src/ui/Settings/page-ui.tsx +17 -0
- package/templates/Projects/default/src/ui/UserInfo/page-ui.tsx +17 -0
- package/templates/Projects/default/src/ui/_global/BackButton.tsx +5 -3
- package/templates/Projects/default/src/ui/_global/Button.tsx +75 -0
- package/templates/Projects/default/src/ui/_global/GlobalHeader.tsx +42 -21
- package/templates/Projects/default/src/ui/_global/GlobalMain.tsx +3 -3
- package/templates/Projects/default/src/ui/_global/Loading.tsx +13 -0
- package/templates/Projects/default/src/ui/_global/LocaleSwitcher.tsx +1 -1
- package/templates/Projects/default/src/ui/_global/PublicNav.tsx +74 -13
- package/templates/Projects/default/src/ui/_global/ThemeToggle.tsx +53 -0
- package/templates/Projects/default/src/ui/_global/UserNav.tsx +8 -5
- package/templates/Projects/default/src/ui/_home/page-ui.tsx +27 -0
- package/templates/Projects/default/public/cnp-logo.ico +0 -0
- package/templates/Projects/default/public/file.svg +0 -1
- package/templates/Projects/default/public/globe.svg +0 -1
- package/templates/Projects/default/public/next.svg +0 -1
- package/templates/Projects/default/public/vercel.svg +0 -1
- package/templates/Projects/default/public/window.svg +0 -1
- package/templates/Projects/default/src/app/[locale]/(user)/dashboard/loading.tsx +0 -17
- package/templates/Projects/default/src/app/[locale]/(user)/dashboard/page.tsx +0 -12
- package/templates/Projects/default/src/app/[locale]/(user)/settings/page.tsx +0 -12
- package/templates/Projects/default/src/app/[locale]/(user)/user_info/page.tsx +0 -12
- package/templates/Projects/default/src/app/api/auth/[...nextauth].ts +0 -0
- package/templates/Projects/default/src/app/api/me/route.ts +0 -15
- /package/templates/Projects/default/messages/en/{login.json → Login.json} +0 -0
- /package/templates/Projects/default/messages/en/{register.json → Register.json} +0 -0
- /package/templates/Projects/default/messages/en/{settings.json → Settings.json} +0 -0
- /package/templates/Projects/default/messages/en/{user_info.json → UserInfo.json} +0 -0
- /package/templates/Projects/default/messages/fr/{login.json → Login.json} +0 -0
- /package/templates/Projects/default/messages/fr/{register.json → Register.json} +0 -0
- /package/templates/Projects/default/messages/fr/{settings.json → Settings.json} +0 -0
- /package/templates/Projects/default/messages/fr/{user_info.json → UserInfo.json} +0 -0
- /package/templates/Projects/default/src/app/[locale]/(user)/{dashboard → Dashboard}/error.tsx +0 -0
- /package/templates/Projects/default/src/app/[locale]/(user)/{settings → Settings}/loading.tsx +0 -0
- /package/templates/Projects/default/src/app/[locale]/(user)/{user_info → UserInfo}/loading.tsx +0 -0
- /package/templates/Projects/default/src/ui/{dashboard → Dashboard}/StatsCard.tsx +0 -0
- /package/templates/Projects/default/src/ui/{dashboard → Dashboard}/WelcomeCard.tsx +0 -0
package/package.json
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
// app/[locale]/template/loading.tsx
|
|
2
|
-
|
|
2
|
+
import LoadingUI from "@/ui/_global/Loading";
|
|
3
3
|
|
|
4
4
|
export default function Loading() {
|
|
5
|
-
|
|
6
|
-
return (
|
|
7
|
-
<div className="flex flex-col flex-1 items-center justify-center">
|
|
8
|
-
<p className="text-gray-500">{t("common.loading")}</p>
|
|
9
|
-
</div>
|
|
10
|
-
);
|
|
5
|
+
return <LoadingUI />;
|
|
11
6
|
}
|
|
12
7
|
// This component is used to show a loading state while the page is being prepared
|
|
13
8
|
// You can customize it with a spinner, skeletons, or any loading UI you prefer
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "my-next-
|
|
2
|
+
"name": "my-next-pro",
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"scripts": {
|
|
@@ -9,13 +9,19 @@
|
|
|
9
9
|
"lint": "next lint"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
+
"@radix-ui/react-slot": "^1.2.3",
|
|
13
|
+
"class-variance-authority": "^0.7.1",
|
|
14
|
+
"clsx": "^2.1.1",
|
|
12
15
|
"cookie": "^1.0.2",
|
|
13
16
|
"jsonwebtoken": "^9.0.2",
|
|
17
|
+
"lucide-react": "^0.539.0",
|
|
14
18
|
"next": "15.4.5",
|
|
15
19
|
"next-auth": "^4.24.11",
|
|
16
20
|
"next-intl": "^4.3.4",
|
|
17
21
|
"react": "19.1.0",
|
|
18
|
-
"react-dom": "19.1.0"
|
|
22
|
+
"react-dom": "19.1.0",
|
|
23
|
+
"tailwind-merge": "^3.3.1",
|
|
24
|
+
"tailwindcss-animate": "^1.0.7"
|
|
19
25
|
},
|
|
20
26
|
"devDependencies": {
|
|
21
27
|
"@eslint/eslintrc": "^3",
|
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
// import Test from "@/ui/_home/test/page";
|
|
1
|
+
// src/app/[locale]/(public)/_home/page.tsx
|
|
2
|
+
import HomePageUI from "@/ui/_home/page-ui";
|
|
4
3
|
|
|
5
4
|
export default function HomePage() {
|
|
6
|
-
|
|
7
|
-
return (
|
|
8
|
-
<main className="py-8 px-4 max-w-3xl mx-auto">
|
|
9
|
-
{/* <Test /> */}
|
|
10
|
-
<div className="flex items-center justify-between mb-6">
|
|
11
|
-
<h1 className="text-2xl font-bold">{t("title")}</h1>
|
|
12
|
-
</div>
|
|
13
|
-
<p className="text-muted mt-2">{t("description")}</p>
|
|
14
|
-
</main>
|
|
15
|
-
);
|
|
5
|
+
return <HomePageUI />;
|
|
16
6
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// app/[locale]/layout.tsx
|
|
2
|
+
import { NextIntlClientProvider } from "next-intl";
|
|
2
3
|
import { setRequestLocale } from "next-intl/server";
|
|
3
|
-
import { NextIntlClientProvider, hasLocale, Locale } from "next-intl";
|
|
4
4
|
import React from "react";
|
|
5
5
|
import "@/app/styles/globals.css"; // Import global styles
|
|
6
6
|
import GlobalHeader from "@/ui/_global/GlobalHeader";
|
|
@@ -16,14 +16,13 @@ export default async function LocaleLayout({
|
|
|
16
16
|
}) {
|
|
17
17
|
const { locale } = await params;
|
|
18
18
|
setRequestLocale(locale);
|
|
19
|
-
|
|
20
|
-
const isConnectedValue = await isConnected();
|
|
19
|
+
const isConnectedInitial = await isConnected();
|
|
21
20
|
|
|
22
21
|
return (
|
|
23
22
|
<html lang={locale}>
|
|
24
23
|
<body>
|
|
25
24
|
<NextIntlClientProvider>
|
|
26
|
-
<GlobalHeader
|
|
25
|
+
<GlobalHeader isConnectedInitial={isConnectedInitial} />
|
|
27
26
|
<GlobalMain>{children}</GlobalMain>
|
|
28
27
|
</NextIntlClientProvider>
|
|
29
28
|
</body>
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
// app/[locale]/dashboard/loading.tsx
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
import LoadingUI from "@/ui/_global/Loading";
|
|
3
4
|
|
|
4
5
|
export default function Loading() {
|
|
5
|
-
return
|
|
6
|
-
<div className="flex flex-col flex-1 items-center justify-center">
|
|
7
|
-
<p className="text-gray-500">Loading ROOT...</p>
|
|
8
|
-
</div>
|
|
9
|
-
);
|
|
6
|
+
return <LoadingUI />;
|
|
10
7
|
}
|
|
11
8
|
// This component is used to show a loading state while the dashboard is being prepared
|
|
12
9
|
// You can customize it with a spinner, skeletons, or any loading UI you prefer
|
|
@@ -1,116 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import Image from "next/image";
|
|
3
2
|
import HomePage from "@/app/[locale]/(public)/_home/page";
|
|
4
|
-
import DashboardPage from "@/app/[locale]/(user)/dashboard/page";
|
|
5
|
-
import PublicNav from "@/ui/_global/PublicNav";
|
|
6
|
-
import UserNav from "@/ui/_global/UserNav";
|
|
7
|
-
import LocaleSwitcher from "@/ui/_global/LocaleSwitcher";
|
|
8
|
-
import { cookies } from "next/headers";
|
|
9
|
-
import { verify } from "jsonwebtoken";
|
|
10
3
|
|
|
11
4
|
export default async function FallbackPage() {
|
|
12
|
-
|
|
13
|
-
const cookieStore = await cookies();
|
|
14
|
-
const appToken = cookieStore.get("app_token")?.value;
|
|
15
|
-
if (appToken) {
|
|
16
|
-
try {
|
|
17
|
-
verify(appToken, process.env.APP_JWT_SECRET!);
|
|
18
|
-
isConnected = true;
|
|
19
|
-
} catch {
|
|
20
|
-
isConnected = false;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<HomePage />
|
|
26
|
-
/* <main className="min-h-screen bg-neutral-50 font-sans text-gray-900">
|
|
27
|
-
<header className="sticky top-0 z-30 w-full border-b bg-white/80 backdrop-blur supports-[backdrop-filter]:bg-white/60 shadow-sm">
|
|
28
|
-
<div className="mx-auto flex h-16 max-w-6xl items-center justify-between px-6">
|
|
29
|
-
<div className="flex items-center gap-3">
|
|
30
|
-
<Image
|
|
31
|
-
src="/cnp-logo.svg"
|
|
32
|
-
alt="Logo"
|
|
33
|
-
width={63}
|
|
34
|
-
height={63}
|
|
35
|
-
className="mr-2"
|
|
36
|
-
/>
|
|
37
|
-
<span className="text-lg font-semibold tracking-tight select-none">
|
|
38
|
-
Create Next Pro
|
|
39
|
-
</span>
|
|
40
|
-
</div>
|
|
41
|
-
<nav className="flex items-center gap-4">
|
|
42
|
-
{isConnected ? <UserNav /> : <PublicNav />}
|
|
43
|
-
<LocaleSwitcher />
|
|
44
|
-
</nav>
|
|
45
|
-
</div>
|
|
46
|
-
</header>
|
|
47
|
-
|
|
48
|
-
<section className="mx-auto w-full max-w-3xl py-16 px-6">
|
|
49
|
-
{isConnected ? <DashboardPage /> : <HomePage />}
|
|
50
|
-
</section>
|
|
51
|
-
</main> */
|
|
52
|
-
);
|
|
5
|
+
return <HomePage />;
|
|
53
6
|
}
|
|
54
|
-
|
|
55
|
-
// Design inspiré de nextjs.org avec Tailwind CSS.
|
|
56
|
-
|
|
57
|
-
// import React from "react";
|
|
58
|
-
// import HomePage from "@/app/[locale]/(public)/_home/page";
|
|
59
|
-
// import DashboardPage from "@/app/[locale]/(user)/dashboard/page";
|
|
60
|
-
// import PublicNav from "@/ui/_global/PublicNav";
|
|
61
|
-
// import UserNav from "@/ui/_global/UserNav";
|
|
62
|
-
// import LocaleSwitcher from "@/ui/_global/LocaleSwitcher";
|
|
63
|
-
|
|
64
|
-
// export default async function FallbackPage({
|
|
65
|
-
// params,
|
|
66
|
-
// }: {
|
|
67
|
-
// params: Promise<{ locale: string }>;
|
|
68
|
-
// }) {
|
|
69
|
-
// // TODO: Remplacer par la logique réelle d'authentification (next-auth)
|
|
70
|
-
// const isConnected = false;
|
|
71
|
-
// const { locale } = await params;
|
|
72
|
-
|
|
73
|
-
// return (
|
|
74
|
-
// <main className="min-h-screen bg-neutral-50 font-sans text-gray-900">
|
|
75
|
-
// {/* Header sticky façon nextjs.org */}
|
|
76
|
-
// <header className="sticky top-0 z-30 w-full border-b bg-white/80 backdrop-blur supports-[backdrop-filter]:bg-white/60 shadow-sm">
|
|
77
|
-
// <div className="mx-auto flex h-16 max-w-6xl items-center justify-between px-6">
|
|
78
|
-
// <div className="flex items-center gap-3">
|
|
79
|
-
// {/* Logo Next.js SVG */}
|
|
80
|
-
// <svg
|
|
81
|
-
// width="32"
|
|
82
|
-
// height="32"
|
|
83
|
-
// viewBox="0 0 32 32"
|
|
84
|
-
// fill="none"
|
|
85
|
-
// xmlns="http://www.w3.org/2000/svg"
|
|
86
|
-
// className="mr-2"
|
|
87
|
-
// >
|
|
88
|
-
// <rect width="32" height="32" rx="16" fill="#000" />
|
|
89
|
-
// <path
|
|
90
|
-
// d="M16.018 29.917c7.66 0 13.899-6.238 13.899-13.899 0-7.66-6.239-13.899-13.899-13.899-7.66 0-13.899 6.239-13.899 13.899 0 7.661 6.239 13.899 13.899 13.899Z"
|
|
91
|
-
// fill="#fff"
|
|
92
|
-
// />
|
|
93
|
-
// <path
|
|
94
|
-
// d="M23.635 22.295 12.7 10.36h-1.68v11.28h1.44v-9.12l10.08 10.08 1.095-1.095ZM19.36 21.64h1.44V10.36h-1.44v11.28Z"
|
|
95
|
-
// fill="#000"
|
|
96
|
-
// />
|
|
97
|
-
// </svg>
|
|
98
|
-
// <span className="text-lg font-semibold tracking-tight select-none">
|
|
99
|
-
// Create Next Pro
|
|
100
|
-
// </span>
|
|
101
|
-
// </div>
|
|
102
|
-
// <nav className="flex items-center gap-4">
|
|
103
|
-
// {isConnected ? <UserNav /> : <PublicNav />}
|
|
104
|
-
// <LocaleSwitcher />
|
|
105
|
-
// </nav>
|
|
106
|
-
// </div>
|
|
107
|
-
// </header>
|
|
108
|
-
// {/* Main content */}
|
|
109
|
-
// <section className="mx-auto w-full max-w-3xl py-16 px-6">
|
|
110
|
-
// {isConnected ? <DashboardPage /> : <HomePage />}
|
|
111
|
-
// </section>
|
|
112
|
-
// </main>
|
|
113
|
-
// );
|
|
114
|
-
// }
|
|
115
|
-
|
|
116
|
-
// // Design inspiré de nextjs.org avec Tailwind CSS.
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { sign } from "jsonwebtoken";
|
|
2
1
|
import NextAuth from "next-auth";
|
|
3
|
-
//import { authOptions } from "@/auth.config";
|
|
4
2
|
import type {
|
|
5
3
|
NextAuthOptions,
|
|
6
4
|
Session,
|
|
@@ -10,8 +8,6 @@ import type {
|
|
|
10
8
|
} from "next-auth";
|
|
11
9
|
import GoogleProvider from "next-auth/providers/google";
|
|
12
10
|
import type { JWT } from "next-auth/jwt";
|
|
13
|
-
import { getToken } from "next-auth/jwt";
|
|
14
|
-
import { NextRequest, NextResponse } from "next/server";
|
|
15
11
|
|
|
16
12
|
const authOptions: NextAuthOptions = {
|
|
17
13
|
providers: [
|
|
@@ -28,20 +24,14 @@ const authOptions: NextAuthOptions = {
|
|
|
28
24
|
token.name = user.name;
|
|
29
25
|
}
|
|
30
26
|
console.log("JWT Callback:", token);
|
|
31
|
-
|
|
32
|
-
// Le token JWT applicatif est géré dans le middleware
|
|
33
|
-
// et dans le callback de la route d'authentification
|
|
34
|
-
// pour éviter de le stocker dans la session NextAuth
|
|
35
|
-
// et de le renvoyer au client.
|
|
36
|
-
// Il est uniquement utilisé côté serveur pour vérifier l'authentification.
|
|
37
|
-
// On peut ajouter des données supplémentaires si nécessaire
|
|
38
|
-
// mais pour l'instant, on garde le token minimaliste.
|
|
39
|
-
// Exemple d'ajout de données :
|
|
40
|
-
// token.customData = "some data";
|
|
27
|
+
|
|
41
28
|
return token;
|
|
42
29
|
},
|
|
43
30
|
async session({ session, token }: { session: Session; token: JWT }) {
|
|
44
|
-
|
|
31
|
+
if (session.user) {
|
|
32
|
+
session.user.email = token.email;
|
|
33
|
+
session.user.name = token.name;
|
|
34
|
+
}
|
|
45
35
|
return session;
|
|
46
36
|
},
|
|
47
37
|
async signIn({
|
|
@@ -60,22 +50,13 @@ const authOptions: NextAuthOptions = {
|
|
|
60
50
|
return true;
|
|
61
51
|
},
|
|
62
52
|
async redirect({ url, baseUrl }: { url: string; baseUrl: string }) {
|
|
63
|
-
// Après login, redirige vers l'endpoint qui pose le cookie JWT applicatif
|
|
64
|
-
// console.log("Before Redirect Callback :", { url: url, baseUrl: baseUrl });
|
|
65
53
|
const customCallbackRoute = "/api/auth/post-login";
|
|
66
|
-
|
|
67
|
-
console.log("Redirecting to post-login endpoint");
|
|
68
|
-
return "/api/auth/post-login";
|
|
69
|
-
} */
|
|
70
|
-
// console.log("Redirecting to base URL + customCallbackRoute");
|
|
54
|
+
|
|
71
55
|
return baseUrl + customCallbackRoute;
|
|
72
56
|
},
|
|
73
57
|
},
|
|
74
|
-
// Ajoute ici d'autres options/callbacks si besoin
|
|
75
58
|
};
|
|
76
59
|
|
|
77
|
-
// Suppression de customJwtCookie : la pose du cookie se fait dans /api/auth/post-login
|
|
78
|
-
|
|
79
60
|
const handler = NextAuth(authOptions);
|
|
80
61
|
|
|
81
62
|
export { handler as GET, handler as POST };
|
|
@@ -2,7 +2,6 @@ import { getToken } from "next-auth/jwt";
|
|
|
2
2
|
import { sign } from "jsonwebtoken";
|
|
3
3
|
import { NextResponse, NextRequest } from "next/server";
|
|
4
4
|
import { redirect } from "@/lib/i18n/navigation";
|
|
5
|
-
// import { NextURL } from "next/dist/server/web/next-url";
|
|
6
5
|
|
|
7
6
|
export async function GET(req: NextRequest) {
|
|
8
7
|
const token = await getToken({ req, secret: process.env.NEXTAUTH_SECRET });
|
|
@@ -13,7 +12,7 @@ export async function GET(req: NextRequest) {
|
|
|
13
12
|
{ expiresIn: "7d" }
|
|
14
13
|
);
|
|
15
14
|
const res = NextResponse.redirect(req.nextUrl.origin + "/");
|
|
16
|
-
res.cookies.set("
|
|
15
|
+
res.cookies.set("access_token", appJwt, {
|
|
17
16
|
httpOnly: true,
|
|
18
17
|
secure: process.env.NODE_ENV === "production",
|
|
19
18
|
sameSite: "strict",
|