@lastbrain/app 2.0.31 → 2.0.35
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/dist/analytics/registry.d.ts +7 -0
- package/dist/analytics/registry.d.ts.map +1 -0
- package/dist/analytics/registry.js +11 -0
- package/dist/auth/useAuthSession.d.ts.map +1 -1
- package/dist/auth/useAuthSession.js +85 -1
- package/dist/cli.js +19 -3
- package/dist/components/LanguageSwitcher.d.ts.map +1 -1
- package/dist/components/LanguageSwitcher.js +89 -5
- package/dist/config/version.d.ts.map +1 -1
- package/dist/config/version.js +30 -19
- package/dist/i18n/useLink.d.ts.map +1 -1
- package/dist/i18n/useLink.js +15 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/layouts/AdminLayoutWithSidebar.d.ts +3 -1
- package/dist/layouts/AdminLayoutWithSidebar.d.ts.map +1 -1
- package/dist/layouts/AdminLayoutWithSidebar.js +2 -2
- package/dist/layouts/AppProviders.d.ts +7 -1
- package/dist/layouts/AppProviders.d.ts.map +1 -1
- package/dist/layouts/AppProviders.js +24 -3
- package/dist/layouts/AuthLayout.js +1 -1
- package/dist/layouts/PublicLayout.js +1 -1
- package/dist/layouts/RootLayout.d.ts.map +1 -1
- package/dist/scripts/init-app.d.ts.map +1 -1
- package/dist/scripts/init-app.js +301 -138
- package/dist/scripts/module-build.d.ts.map +1 -1
- package/dist/scripts/module-build.js +402 -67
- package/dist/scripts/module-create.d.ts.map +1 -1
- package/dist/scripts/module-create.js +227 -10
- package/dist/scripts/sitemap-flat-generator.d.ts +39 -0
- package/dist/scripts/sitemap-flat-generator.d.ts.map +1 -0
- package/dist/scripts/sitemap-flat-generator.js +231 -0
- package/dist/scripts/sitemap-manifest-generator.d.ts +59 -0
- package/dist/scripts/sitemap-manifest-generator.d.ts.map +1 -0
- package/dist/scripts/sitemap-manifest-generator.js +290 -0
- package/dist/sitemap/manifest.d.ts +8 -0
- package/dist/sitemap/manifest.d.ts.map +1 -0
- package/dist/sitemap/manifest.js +6 -0
- package/dist/styles.css +2 -2
- package/dist/templates/AuthGuidePage.js +2 -0
- package/dist/templates/DefaultDoc.d.ts.map +1 -1
- package/dist/templates/DefaultDoc.js +9 -5
- package/dist/templates/DocPage.d.ts.map +1 -1
- package/dist/templates/DocPage.js +40 -0
- package/dist/templates/MigrationsGuidePage.js +2 -0
- package/dist/templates/ModuleGuidePage.d.ts.map +1 -1
- package/dist/templates/ModuleGuidePage.js +4 -1
- package/dist/templates/SimpleHomePage.js +2 -0
- package/package.json +11 -4
- package/src/analytics/registry.ts +14 -0
- package/src/auth/useAuthSession.ts +91 -1
- package/src/cli.ts +19 -3
- package/src/components/LanguageSwitcher.tsx +113 -23
- package/src/config/version.ts +30 -19
- package/src/i18n/useLink.ts +15 -0
- package/src/index.ts +17 -0
- package/src/layouts/AdminLayoutWithSidebar.tsx +4 -0
- package/src/layouts/AppProviders.tsx +66 -8
- package/src/layouts/AuthLayout.tsx +1 -1
- package/src/layouts/PublicLayout.tsx +1 -1
- package/src/layouts/RootLayout.tsx +0 -1
- package/src/scripts/init-app.ts +360 -149
- package/src/scripts/module-build.ts +458 -72
- package/src/scripts/module-create.ts +260 -10
- package/src/scripts/sitemap-flat-generator.ts +313 -0
- package/src/scripts/sitemap-manifest-generator.ts +476 -0
- package/src/sitemap/manifest.ts +17 -0
- package/src/templates/AuthGuidePage.tsx +1 -1
- package/src/templates/DefaultDoc.tsx +397 -6
- package/src/templates/DocPage.tsx +40 -0
- package/src/templates/MigrationsGuidePage.tsx +1 -1
- package/src/templates/ModuleGuidePage.tsx +3 -2
- package/src/templates/SimpleHomePage.tsx +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Analytics Registry
|
|
3
|
+
* Permet aux apps d'enregistrer un composant analytics global
|
|
4
|
+
*/
|
|
5
|
+
export declare function registerAnalyticsComponent(component: React.ComponentType): void;
|
|
6
|
+
export declare function getAnalyticsComponent(): React.ComponentType | null;
|
|
7
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/analytics/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,KAAK,CAAC,aAAa,QAExE;AAED,wBAAgB,qBAAqB,IAAI,KAAK,CAAC,aAAa,GAAG,IAAI,CAElE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Analytics Registry
|
|
3
|
+
* Permet aux apps d'enregistrer un composant analytics global
|
|
4
|
+
*/
|
|
5
|
+
let globalAnalyticsComponent = null;
|
|
6
|
+
export function registerAnalyticsComponent(component) {
|
|
7
|
+
globalAnalyticsComponent = component;
|
|
8
|
+
}
|
|
9
|
+
export function getAnalyticsComponent() {
|
|
10
|
+
return globalAnalyticsComponent;
|
|
11
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthSession.d.ts","sourceRoot":"","sources":["../../src/auth/useAuthSession.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"useAuthSession.d.ts","sourceRoot":"","sources":["../../src/auth/useAuthSession.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAMlD,wBAAgB,cAAc;;;;EAyI7B"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
|
-
import { supabaseBrowserClient } from "@lastbrain/core";
|
|
3
|
+
import { supabaseBrowserClient, useRealtimeListener } from "@lastbrain/core";
|
|
4
|
+
// Note: this hook also listens to `user_profile_updated` realtime broadcasts
|
|
5
|
+
// and centralises cookie + redirect logic so the app reacts to profile language
|
|
6
|
+
// changes in a single place.
|
|
4
7
|
export function useAuthSession() {
|
|
5
8
|
const [user, setUser] = useState(null);
|
|
6
9
|
const [loading, setLoading] = useState(true);
|
|
@@ -45,5 +48,86 @@ export function useAuthSession() {
|
|
|
45
48
|
});
|
|
46
49
|
return () => subscription.unsubscribe();
|
|
47
50
|
}, []);
|
|
51
|
+
// Realtime listener for user_profile updates (broadcast from RealtimeProvider)
|
|
52
|
+
// This keeps NEXT_LOCALE in sync and performs a single, centralised redirect
|
|
53
|
+
// when the user's language changes remotely.
|
|
54
|
+
useRealtimeListener({
|
|
55
|
+
table: "user_profil",
|
|
56
|
+
// broadcast event produced by RealtimeProvider is `user_profile_updated`
|
|
57
|
+
eventName: "user_profile_updated",
|
|
58
|
+
onUpdate(payload) {
|
|
59
|
+
try {
|
|
60
|
+
// Recherche robuste d'un objet contenant la propriété `language` ou `locale`
|
|
61
|
+
const findLangRecord = (obj) => {
|
|
62
|
+
if (!obj || typeof obj !== "object")
|
|
63
|
+
return null;
|
|
64
|
+
const seen = new WeakSet();
|
|
65
|
+
const queue = [obj];
|
|
66
|
+
while (queue.length) {
|
|
67
|
+
const cur = queue.shift();
|
|
68
|
+
if (!cur || typeof cur !== "object" || seen.has(cur))
|
|
69
|
+
continue;
|
|
70
|
+
seen.add(cur);
|
|
71
|
+
if ("language" in cur || "locale" in cur)
|
|
72
|
+
return cur;
|
|
73
|
+
for (const k of Object.keys(cur)) {
|
|
74
|
+
const v = cur[k];
|
|
75
|
+
if (v && typeof v === "object")
|
|
76
|
+
queue.push(v);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
};
|
|
81
|
+
const candidate = findLangRecord(payload) ||
|
|
82
|
+
payload?.new ||
|
|
83
|
+
payload?.record?.new ||
|
|
84
|
+
payload?.payload?.new ||
|
|
85
|
+
payload?.after ||
|
|
86
|
+
payload?.data ||
|
|
87
|
+
null;
|
|
88
|
+
const newLang = candidate?.language || candidate?.locale || null;
|
|
89
|
+
if (!newLang) {
|
|
90
|
+
console.debug("useAuthSession: realtime payload did not contain language", payload);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Read current cookie
|
|
94
|
+
const cookie = document.cookie
|
|
95
|
+
.split("; ")
|
|
96
|
+
.find((c) => c.startsWith("NEXT_LOCALE="));
|
|
97
|
+
const cookieLang = cookie ? cookie.split("=")[1] : null;
|
|
98
|
+
if (cookieLang === newLang)
|
|
99
|
+
return;
|
|
100
|
+
// Set cookie and navigate to the language-prefixed URL
|
|
101
|
+
try {
|
|
102
|
+
const maxAge = 365 * 24 * 60 * 60;
|
|
103
|
+
document.cookie = `NEXT_LOCALE=${newLang}; Path=/; Max-Age=${maxAge}; SameSite=Lax`;
|
|
104
|
+
}
|
|
105
|
+
catch (_e) {
|
|
106
|
+
// ignore
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
sessionStorage.setItem("locale-change-ts", Date.now().toString());
|
|
110
|
+
}
|
|
111
|
+
catch (_e) {
|
|
112
|
+
/* ignore */
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const pathname = window.location.pathname;
|
|
116
|
+
const pathWithoutLang = pathname.replace(/^\/[a-z]{2}(?=\/|$)/, "") || "/";
|
|
117
|
+
const safePath = pathWithoutLang.startsWith("/api")
|
|
118
|
+
? "/"
|
|
119
|
+
: pathWithoutLang;
|
|
120
|
+
const search = window.location.search || "";
|
|
121
|
+
window.location.href = `/${newLang}${safePath}${search}`;
|
|
122
|
+
}
|
|
123
|
+
catch (_e) {
|
|
124
|
+
// ignore navigation errors
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
console.debug("useAuthSession: error handling realtime payload", e);
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
});
|
|
48
132
|
return { user, loading, isSuperAdmin };
|
|
49
133
|
}
|
package/dist/cli.js
CHANGED
|
@@ -20,9 +20,25 @@ program
|
|
|
20
20
|
.option("--no-interactive", "Mode non-interactif (skip la sélection des modules)")
|
|
21
21
|
.action(async (directory, options) => {
|
|
22
22
|
try {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
let targetDir;
|
|
24
|
+
if (directory) {
|
|
25
|
+
// Si on est dans un monorepo (détecté par pnpm-workspace.yaml à la racine)
|
|
26
|
+
const fs = await import("fs-extra");
|
|
27
|
+
const cwd = process.cwd();
|
|
28
|
+
const workspaceFile = path.join(cwd, "pnpm-workspace.yaml");
|
|
29
|
+
const isMonorepo = await fs.pathExists(workspaceFile);
|
|
30
|
+
if (isMonorepo) {
|
|
31
|
+
// Dans un monorepo, créer dans apps/
|
|
32
|
+
targetDir = path.resolve(cwd, "apps", directory);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
// Hors monorepo, créer où demandé
|
|
36
|
+
targetDir = path.resolve(cwd, directory);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
targetDir = process.cwd();
|
|
41
|
+
}
|
|
26
42
|
await initApp({
|
|
27
43
|
force: options.force || false,
|
|
28
44
|
targetDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LanguageSwitcher.d.ts","sourceRoot":"","sources":["../../src/components/LanguageSwitcher.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LanguageSwitcher.d.ts","sourceRoot":"","sources":["../../src/components/LanguageSwitcher.tsx"],"names":[],"mappings":"AAgBA,UAAU,qBAAqB;IAC7B,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAmB,EACnB,SAAc,EACd,kBAAiC,EACjC,SAAwC,GACzC,EAAE,qBAAqB,2CA0PvB"}
|
|
@@ -3,6 +3,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { useEffect, useState } from "react";
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
5
|
import { useLanguage } from "../i18n/LanguageProvider";
|
|
6
|
+
import { eventBus } from "@lastbrain/core";
|
|
7
|
+
import { useAuth } from "@lastbrain/core";
|
|
6
8
|
import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Spinner, } from "@lastbrain/ui";
|
|
7
9
|
export function LanguageSwitcher({ variant = "default", className = "", availableLanguages = ["fr", "en"], localeMap = { fr: "fr_FR", en: "en_US" }, }) {
|
|
8
10
|
const { lang, setLang: setLangFromContext } = useLanguage();
|
|
@@ -15,7 +17,8 @@ export function LanguageSwitcher({ variant = "default", className = "", availabl
|
|
|
15
17
|
setIsHydrated(true);
|
|
16
18
|
}, []);
|
|
17
19
|
// Fonction pour changer la langue avec redirection correcte
|
|
18
|
-
const
|
|
20
|
+
const { user } = useAuth();
|
|
21
|
+
const handleLanguageChange = async (newLang) => {
|
|
19
22
|
const currentPath = window.location.pathname;
|
|
20
23
|
// Extraire les segments du chemin
|
|
21
24
|
const segments = currentPath.split("/").filter(Boolean);
|
|
@@ -27,8 +30,77 @@ export function LanguageSwitcher({ variant = "default", className = "", availabl
|
|
|
27
30
|
// Reconstruire le path avec la nouvelle langue
|
|
28
31
|
const pathWithoutLang = segments.length > 0 ? "/" + segments.join("/") : "";
|
|
29
32
|
const newPath = `/${newLang}${pathWithoutLang}`;
|
|
30
|
-
//
|
|
31
|
-
|
|
33
|
+
// Si l'utilisateur est connecté, mettre à jour sa préférence en BDD
|
|
34
|
+
if (user) {
|
|
35
|
+
try {
|
|
36
|
+
const resp = await fetch("/api/auth/profile", {
|
|
37
|
+
method: "PATCH",
|
|
38
|
+
headers: { "Content-Type": "application/json" },
|
|
39
|
+
credentials: "include",
|
|
40
|
+
body: JSON.stringify({ language: newLang }),
|
|
41
|
+
});
|
|
42
|
+
// attendre la confirmation du serveur que la locale a bien été mise à jour
|
|
43
|
+
// afin d'éviter un reload avant que le cookie soit appliqué côté serveur.
|
|
44
|
+
try {
|
|
45
|
+
const json = await resp.json();
|
|
46
|
+
if (json && json.data) {
|
|
47
|
+
// émettre localement l'événement realtime pour propager immédiatement
|
|
48
|
+
try {
|
|
49
|
+
eventBus.emit("user_profile_updated", { new: json.data });
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
/* ignore */
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// si serveur n'a pas renvoyé de données attendues, on continue
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
// ignore json parse errors
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.debug("language switch: failed to update profile language", e);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Mettre à jour le contexte local immédiatement (UX local)
|
|
68
|
+
try {
|
|
69
|
+
setLangFromContext(newLang);
|
|
70
|
+
}
|
|
71
|
+
catch (_e) {
|
|
72
|
+
// ignore
|
|
73
|
+
}
|
|
74
|
+
// Si l'utilisateur n'est pas authentifié, écrire immédiatement
|
|
75
|
+
// le cookie NEXT_LOCALE et forcer un refresh pour que Next.js
|
|
76
|
+
// prenne en compte la nouvelle locale côté serveur.
|
|
77
|
+
if (!user) {
|
|
78
|
+
try {
|
|
79
|
+
// 1 an
|
|
80
|
+
document.cookie = `NEXT_LOCALE=${newLang}; Path=/; Max-Age=${31536000}; SameSite=Lax`;
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
// ignore
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
// Navigate to the same path prefixed with the new locale,
|
|
87
|
+
// preserving search and hash.
|
|
88
|
+
const target = `${newPath}${window.location.search || ""}${window.location.hash || ""}`;
|
|
89
|
+
router.push(target);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
// fallback: navigate to the same path but with the new locale
|
|
93
|
+
try {
|
|
94
|
+
window.location.assign(`${newPath}${window.location.search || ""}${window.location.hash || ""}`);
|
|
95
|
+
}
|
|
96
|
+
catch (_err) {
|
|
97
|
+
/* ignore */
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
// Pour utilisateurs authentifiés, la redirection et l'écriture
|
|
103
|
+
// du cookie NEXT_LOCALE sont gérées par le listener realtime centralisé.
|
|
32
104
|
};
|
|
33
105
|
useEffect(() => {
|
|
34
106
|
let canceled = false;
|
|
@@ -85,7 +157,19 @@ export function LanguageSwitcher({ variant = "default", className = "", availabl
|
|
|
85
157
|
return (_jsx("span", { className: "inline-flex h-4 w-6 items-center justify-center rounded-sm bg-slate-200 text-[10px] font-semibold text-slate-600", children: lang.toUpperCase() }));
|
|
86
158
|
}
|
|
87
159
|
if (variant === "minimal") {
|
|
88
|
-
return (_jsxs(Dropdown, { size: "sm", className: "px-0 m-0", children: [_jsx(DropdownTrigger, { className: "px-0 m-0", children: renderFlag(lang) }), _jsx(DropdownMenu, { children: availableLanguages.map((code) => (_jsxs(DropdownItem, { onPress: () => handleLanguageChange(code), startContent: renderFlag(code), className: lang === code ? "bg-primary/10" : "", children: [code === "fr"
|
|
160
|
+
return (_jsx("div", { className: "", children: _jsxs(Dropdown, { size: "sm", className: "px-0 m-0", children: [_jsx(DropdownTrigger, { className: "px-0 m-0", children: renderFlag(lang) }), _jsx(DropdownMenu, { children: availableLanguages.map((code) => (_jsxs(DropdownItem, { onPress: () => handleLanguageChange(code), startContent: renderFlag(code), className: lang === code ? "bg-primary/10" : "", children: [code === "fr"
|
|
161
|
+
? "Français"
|
|
162
|
+
: code === "en"
|
|
163
|
+
? "English"
|
|
164
|
+
: code === "es"
|
|
165
|
+
? "Spanish"
|
|
166
|
+
: code, isHydrated && lang === code && " ✓"] }, code))) })] }) }));
|
|
89
167
|
}
|
|
90
|
-
return (_jsxs(Dropdown, { size: "sm", className: "px-0", children: [_jsx(DropdownTrigger, { className: "px-0 m-0", children: _jsx(Button, { variant: "light", size: "sm", className: "px-0 m-0", "aria-label": `Switch language (current: ${lang})`, startContent: renderFlag(lang), endContent: loading ? _jsx(Spinner, { size: "sm" }) : null }) }), _jsx(DropdownMenu, { children: availableLanguages.map((code) => (_jsxs(DropdownItem, { onPress: () => handleLanguageChange(code), className: lang === code ? "bg-primary/10" : "", children: [renderFlag(code), " ", code === "fr"
|
|
168
|
+
return (_jsxs(Dropdown, { size: "sm", className: "px-0 ", children: [_jsx(DropdownTrigger, { className: "px-0 m-0", children: _jsx(Button, { variant: "light", size: "sm", className: "px-0 m-0", "aria-label": `Switch language (current: ${lang})`, startContent: renderFlag(lang), endContent: loading ? _jsx(Spinner, { size: "sm" }) : null }) }), _jsx(DropdownMenu, { children: availableLanguages.map((code) => (_jsxs(DropdownItem, { onPress: () => handleLanguageChange(code), className: lang === code ? "bg-primary/10" : "", children: [renderFlag(code), " ", code === "fr"
|
|
169
|
+
? "Français"
|
|
170
|
+
: code === "en"
|
|
171
|
+
? "English"
|
|
172
|
+
: code === "es"
|
|
173
|
+
? "Spanish"
|
|
174
|
+
: code, isHydrated && lang === code && " ✓"] }, code))) })] }));
|
|
91
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/config/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/config/version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+BnD,CAAC"}
|
package/dist/config/version.js
CHANGED
|
@@ -4,23 +4,34 @@
|
|
|
4
4
|
* Mise à jour automatique lors de pnpm version:patch/minor/major
|
|
5
5
|
*/
|
|
6
6
|
export const PACKAGE_VERSIONS = {
|
|
7
|
-
"@lastbrain-labs/
|
|
8
|
-
"@lastbrain-labs/module-
|
|
9
|
-
"@lastbrain-labs/module-
|
|
10
|
-
"@lastbrain-labs/module-
|
|
11
|
-
"@lastbrain-labs/module-core-
|
|
12
|
-
"@lastbrain-labs/module-core-
|
|
13
|
-
"@lastbrain-labs/module-core-
|
|
14
|
-
"@lastbrain-labs/module-
|
|
15
|
-
"@lastbrain-labs/module-
|
|
16
|
-
"@lastbrain/
|
|
17
|
-
"@lastbrain/
|
|
18
|
-
"@lastbrain/module-
|
|
19
|
-
"@lastbrain/
|
|
20
|
-
"@lastbrain/
|
|
21
|
-
"@lastbrain/
|
|
22
|
-
"@lastbrain/
|
|
23
|
-
"@lastbrain/
|
|
24
|
-
"
|
|
25
|
-
"lastbrain": "^
|
|
7
|
+
"@lastbrain-labs/metrics-ui": "^1.0.2",
|
|
8
|
+
"@lastbrain-labs/module-billing-pro": "^2.0.29",
|
|
9
|
+
"@lastbrain-labs/module-cj-analyzer-pro": "^0.1.21",
|
|
10
|
+
"@lastbrain-labs/module-contact-pro": "^0.1.2",
|
|
11
|
+
"@lastbrain-labs/module-core-cart-pro": "^2.0.29",
|
|
12
|
+
"@lastbrain-labs/module-core-commerce-pro": "^2.0.29",
|
|
13
|
+
"@lastbrain-labs/module-core-order-pro": "^2.0.29",
|
|
14
|
+
"@lastbrain-labs/module-core-payment-pro": "^2.0.29",
|
|
15
|
+
"@lastbrain-labs/module-core-product-pro": "^2.0.29",
|
|
16
|
+
"@lastbrain-labs/module-metrics-pro": "^0.1.2",
|
|
17
|
+
"@lastbrain-labs/module-recipes-pro": "^2.0.31",
|
|
18
|
+
"@lastbrain-labs/module-shop-pro": "^0.1.21",
|
|
19
|
+
"@lastbrain/ai-ui-core": "^1.0.2",
|
|
20
|
+
"@lastbrain/ai-ui-react": "^1.0.2",
|
|
21
|
+
"@lastbrain/ai-ui-theme-heroui": "^1.0.2",
|
|
22
|
+
"@lastbrain/app": "^2.0.34",
|
|
23
|
+
"@lastbrain/core": "^2.0.30",
|
|
24
|
+
"@lastbrain/module-ai": "^2.0.29",
|
|
25
|
+
"@lastbrain/module-audit-pro": "^0.1.2",
|
|
26
|
+
"@lastbrain/module-auth": "^2.0.30",
|
|
27
|
+
"@lastbrain/module-blog": "^0.1.2",
|
|
28
|
+
"@lastbrain/module-legal": "^2.0.29",
|
|
29
|
+
"@lastbrain/module-project-board": "^2.0.29",
|
|
30
|
+
"@lastbrain/module-tasks": "^2.0.29",
|
|
31
|
+
"@lastbrain/module-tools": "^0.1.2",
|
|
32
|
+
"@lastbrain/ui": "^2.0.30",
|
|
33
|
+
"audit": "^2.0.14",
|
|
34
|
+
"prompt": "^0.1.1",
|
|
35
|
+
"recipe": "^2.0.14",
|
|
36
|
+
"tools": "^2.0.14",
|
|
26
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLink.d.ts","sourceRoot":"","sources":["../../src/i18n/useLink.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"useLink.d.ts","sourceRoot":"","sources":["../../src/i18n/useLink.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYxC;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAqB7D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,OAAO,KAGb,MAAM,MAAM,KAAG,MAAM,CAG9B"}
|
package/dist/i18n/useLink.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useLanguage } from "./LanguageProvider";
|
|
3
|
+
/**
|
|
4
|
+
* Détecte si un chemin commence par un code de langue ISO 639-1 (2 lettres)
|
|
5
|
+
* Ex: /fr/auth/billing -> true, /auth/billing -> false
|
|
6
|
+
*/
|
|
7
|
+
function startsWithLocale(href) {
|
|
8
|
+
// Pattern: /XX/ ou /XX où XX est un code langue de 2 lettres minuscules
|
|
9
|
+
const localePattern = /^\/[a-z]{2}(\/|$)/;
|
|
10
|
+
return localePattern.test(href);
|
|
11
|
+
}
|
|
3
12
|
/**
|
|
4
13
|
* Helper pour transformer un URL avec le paramètre [lang]
|
|
5
14
|
* Utile pour les transformations statiques avant le rendu React
|
|
@@ -14,12 +23,18 @@ export function langHref(href, lang) {
|
|
|
14
23
|
const normalizedHref = String(href);
|
|
15
24
|
const isAbsolute = normalizedHref.startsWith("http");
|
|
16
25
|
const hasLangPrefix = normalizedHref.startsWith(`/${lang}/`);
|
|
26
|
+
const hasAnyLangPrefix = startsWithLocale(normalizedHref);
|
|
17
27
|
if (isAbsolute) {
|
|
18
28
|
return normalizedHref;
|
|
19
29
|
}
|
|
20
30
|
else if (hasLangPrefix) {
|
|
31
|
+
// Déjà préfixé avec la bonne langue
|
|
21
32
|
return normalizedHref;
|
|
22
33
|
}
|
|
34
|
+
else if (hasAnyLangPrefix) {
|
|
35
|
+
// Préfixé avec une autre langue - remplacer par la langue courante
|
|
36
|
+
return `/${lang}${normalizedHref.slice(3)}`;
|
|
37
|
+
}
|
|
23
38
|
else if (normalizedHref === "/") {
|
|
24
39
|
return `/${lang}`;
|
|
25
40
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export { AuthLayoutWithSidebar, type AuthLayoutWithSidebarProps, type MenuIgnore
|
|
|
11
11
|
export { AdminLayout } from "./layouts/AdminLayout";
|
|
12
12
|
export { AdminLayoutWithSidebar } from "./layouts/AdminLayoutWithSidebar";
|
|
13
13
|
export { getModuleConfigs } from "./modules/module-loader";
|
|
14
|
+
export { registerAnalyticsComponent } from "./analytics/registry";
|
|
14
15
|
export { LanguageProvider, useLanguage, type Language, } from "./i18n/LanguageProvider";
|
|
15
16
|
export { useLink, langHref } from "./i18n/useLink";
|
|
16
17
|
export { useLangRouter } from "./i18n/useLangRouter";
|
|
@@ -18,6 +19,7 @@ export { useModuleTranslation } from "@lastbrain/core";
|
|
|
18
19
|
export { transformLangHrefs, transformLangHref } from "./i18n/langHrefHelper";
|
|
19
20
|
export { LanguageSwitcher } from "./components/LanguageSwitcher";
|
|
20
21
|
export type { TranslationKey, Translations, I18nConfig, LangParams, LangIdParams, ModuleTranslations, } from "./i18n/types";
|
|
22
|
+
export type { ModuleBuildConfig, ModuleApiConfig, ModuleMenuItemConfig, ModulePageConfig, ModuleSection, ModuleRealtimeConfig, ModuleSitemapConfig, } from "@lastbrain/core";
|
|
21
23
|
export { AppAside } from "@lastbrain/ui";
|
|
22
24
|
export type { AppAsideMenuItem, AppAsideMenuConfig } from "@lastbrain/ui";
|
|
23
25
|
export { SimpleHomePage } from "./templates/SimpleHomePage";
|
|
@@ -26,4 +28,5 @@ export { SimpleDocPage } from "./templates/SimpleDocPage";
|
|
|
26
28
|
export { ModuleGuidePage } from "./templates/ModuleGuidePage";
|
|
27
29
|
export { AuthGuidePage } from "./templates/AuthGuidePage";
|
|
28
30
|
export { MigrationsGuidePage } from "./templates/MigrationsGuidePage";
|
|
31
|
+
export { sitemapManifest } from "./sitemap/manifest";
|
|
29
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,UAAU,EACV,gBAAgB,IAAI,uBAAuB,GAC5C,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,KAAK,QAAQ,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,YAAY,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,OAAO,EACP,UAAU,EACV,gBAAgB,IAAI,uBAAuB,GAC5C,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAGlE,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,KAAK,QAAQ,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,YAAY,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,8 @@ export { AuthLayoutWithSidebar, } from "./layouts/AuthLayoutWithSidebar";
|
|
|
11
11
|
export { AdminLayout } from "./layouts/AdminLayout";
|
|
12
12
|
export { AdminLayoutWithSidebar } from "./layouts/AdminLayoutWithSidebar";
|
|
13
13
|
export { getModuleConfigs } from "./modules/module-loader";
|
|
14
|
+
// Analytics
|
|
15
|
+
export { registerAnalyticsComponent } from "./analytics/registry";
|
|
14
16
|
// i18n
|
|
15
17
|
export { LanguageProvider, useLanguage, } from "./i18n/LanguageProvider";
|
|
16
18
|
export { useLink, langHref } from "./i18n/useLink";
|
|
@@ -27,3 +29,5 @@ export { SimpleDocPage } from "./templates/SimpleDocPage";
|
|
|
27
29
|
export { ModuleGuidePage } from "./templates/ModuleGuidePage";
|
|
28
30
|
export { AuthGuidePage } from "./templates/AuthGuidePage";
|
|
29
31
|
export { MigrationsGuidePage } from "./templates/MigrationsGuidePage";
|
|
32
|
+
// Sitemap manifest
|
|
33
|
+
export { sitemapManifest } from "./sitemap/manifest";
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { type MenuConfig, type MenuItem } from "@lastbrain/ui";
|
|
2
|
+
import type { MenuIgnored } from "../types/menu";
|
|
2
3
|
interface AdminLayoutWithSidebarProps {
|
|
3
4
|
children: React.ReactNode;
|
|
4
5
|
menuConfig?: MenuConfig;
|
|
5
6
|
className?: string;
|
|
6
7
|
menuCustom?: MenuItem[];
|
|
8
|
+
menuIgnored?: MenuIgnored;
|
|
7
9
|
}
|
|
8
|
-
export declare function AdminLayoutWithSidebar({ children, menuConfig, className, menuCustom, }: AdminLayoutWithSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function AdminLayoutWithSidebar({ children, menuConfig, className, menuCustom, menuIgnored, }: AdminLayoutWithSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
9
11
|
export {};
|
|
10
12
|
//# sourceMappingURL=AdminLayoutWithSidebar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminLayoutWithSidebar.d.ts","sourceRoot":"","sources":["../../src/layouts/AdminLayoutWithSidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"AdminLayoutWithSidebar.d.ts","sourceRoot":"","sources":["../../src/layouts/AdminLayoutWithSidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAIvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,UAAU,2BAA2B;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,UAAU,EACV,SAAc,EACd,UAAU,EACV,WAAW,GACZ,EAAE,2BAA2B,2CAmG7B"}
|
|
@@ -5,7 +5,7 @@ import { AppAside, AppAsideSkeleton, } from "@lastbrain/ui";
|
|
|
5
5
|
import { useAuthSession } from "../auth/useAuthSession";
|
|
6
6
|
import { usePathname } from "next/navigation";
|
|
7
7
|
import { useEffect, useState } from "react";
|
|
8
|
-
export function AdminLayoutWithSidebar({ children, menuConfig, className = "", menuCustom, }) {
|
|
8
|
+
export function AdminLayoutWithSidebar({ children, menuConfig, className = "", menuCustom, menuIgnored, }) {
|
|
9
9
|
const { isSuperAdmin, loading, user } = useAuthSession();
|
|
10
10
|
const pathname = usePathname();
|
|
11
11
|
const [isCollapsed, setIsCollapsed] = useState(() => {
|
|
@@ -58,5 +58,5 @@ export function AdminLayoutWithSidebar({ children, menuConfig, className = "", m
|
|
|
58
58
|
safeMenuConfig.public.length > 0);
|
|
59
59
|
// Afficher le skeleton pendant le chargement de la session ou si pas de menuConfig valide
|
|
60
60
|
const shouldShowSkeleton = loading || !hasValidMenuConfig;
|
|
61
|
-
return (_jsxs("div", { className: "flex min-h-screen", children: [shouldShowSkeleton ? (_jsx(AppAsideSkeleton, { className: className, isAdminSection: isAdminSection })) : (_jsx(AppAside, { menuConfig: safeMenuConfig, isSuperAdmin: isSuperAdmin, isAuthenticated: !!user, className: className, ...(menuCustom ? { menuCustom } : {}) })), _jsx("div", { className: `flex-1 transition-all duration-300 ${!mounted ? "lg:ml-72" : isCollapsed ? "lg:ml-20" : "lg:ml-72"}`, children: _jsx(AdminLayout, { children: children }) })] }));
|
|
61
|
+
return (_jsxs("div", { className: "flex min-h-screen", children: [shouldShowSkeleton ? (_jsx(AppAsideSkeleton, { className: className, isAdminSection: isAdminSection })) : (_jsx(AppAside, { menuConfig: safeMenuConfig, isSuperAdmin: isSuperAdmin, isAuthenticated: !!user, className: className, ...(menuIgnored ? { menuIgnored } : {}), ...(menuCustom ? { menuCustom } : {}) })), _jsx("div", { className: `flex-1 transition-all duration-300 ${!mounted ? "lg:ml-72" : isCollapsed ? "lg:ml-20" : "lg:ml-72"}`, children: _jsx(AdminLayout, { children: children }) })] }));
|
|
62
62
|
}
|
|
@@ -21,12 +21,18 @@ export declare function useAuth(): {
|
|
|
21
21
|
loading: boolean;
|
|
22
22
|
isSuperAdmin: boolean;
|
|
23
23
|
};
|
|
24
|
-
export declare function AppProviders({ children, realtimeConfig, lang, translations, availableLanguages, }: {
|
|
24
|
+
export declare function AppProviders({ children, realtimeConfig, lang, translations, availableLanguages, EntitlementsProviderComponent, AnalyticsListenerComponent, }: {
|
|
25
25
|
children: React.ReactNode;
|
|
26
26
|
realtimeConfig?: ModuleRealtimeConfig[];
|
|
27
27
|
lang?: Language;
|
|
28
28
|
translations?: Record<string, string>;
|
|
29
29
|
/** Liste des langues disponibles depuis locales.generated.ts */
|
|
30
30
|
availableLanguages?: string[];
|
|
31
|
+
/** Provider optionnel pour les entitlements (billing) */
|
|
32
|
+
EntitlementsProviderComponent?: React.ComponentType<{
|
|
33
|
+
children: React.ReactNode;
|
|
34
|
+
}>;
|
|
35
|
+
/** Composant optionnel pour le tracking analytics */
|
|
36
|
+
AnalyticsListenerComponent?: React.ComponentType;
|
|
31
37
|
}): import("react/jsx-runtime").JSX.Element;
|
|
32
38
|
//# sourceMappingURL=AppProviders.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppProviders.d.ts","sourceRoot":"","sources":["../../src/layouts/AppProviders.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"AppProviders.d.ts","sourceRoot":"","sources":["../../src/layouts/AppProviders.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAqEnE,wBAAgB,UAAU,kDAEzB;AAED,wBAAgB,gBAAgB;UAvCxB,iBAAiB;aACd,OAAO;WACT,MAAM,GAAG,IAAI;aACX,MAAM,OAAO,CAAC,IAAI,CAAC;gBAChB,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;mBAC1B,MAAM,OAAO,CAAC,IAAI,CAAC;wBACd,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;aACxC,OAAO;eACL,OAAO;oBACF,OAAO;yBACF,OAAO;EA+B7B;AAED,wBAAgB,OAAO;UAjBf,IAAI,GAAG,IAAI;aACR,OAAO;kBACF,OAAO;EAiBtB;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,cAAmB,EACnB,IAAW,EACX,YAAiB,EACjB,kBAAiC,EACjC,6BAA6B,EAC7B,0BAA0B,GAC3B,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACxC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,yDAAyD;IACzD,6BAA6B,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAClD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;KAC3B,CAAC,CAAC;IACH,qDAAqD;IACrD,0BAA0B,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAClD,2CAkEA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { createContext, useContext, useMemo } from "react";
|
|
4
4
|
import { getModuleConfigs } from "../modules/module-loader";
|
|
5
5
|
import { ToastProvider, AppLinkProvider } from "@lastbrain/ui";
|
|
@@ -7,6 +7,20 @@ import { RealtimeProvider } from "@lastbrain/core";
|
|
|
7
7
|
import { useAuthSession } from "../auth/useAuthSession";
|
|
8
8
|
import { useNotifications as useNotificationsHook } from "../hooks/useNotifications";
|
|
9
9
|
import { LanguageProvider } from "../i18n/LanguageProvider";
|
|
10
|
+
// Wrapper for optional EntitlementsProvider passed via props
|
|
11
|
+
function OptionalEntitlementsWrapper({ children, EntitlementsProviderComponent, }) {
|
|
12
|
+
if (EntitlementsProviderComponent) {
|
|
13
|
+
return (_jsx(EntitlementsProviderComponent, { children: children }));
|
|
14
|
+
}
|
|
15
|
+
return _jsx(_Fragment, { children: children });
|
|
16
|
+
}
|
|
17
|
+
// Wrapper for optional AnalyticsListener
|
|
18
|
+
function OptionalAnalyticsListener({ AnalyticsListenerComponent, }) {
|
|
19
|
+
if (AnalyticsListenerComponent) {
|
|
20
|
+
return _jsx(AnalyticsListenerComponent, {});
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
10
24
|
const ModuleContext = createContext(getModuleConfigs());
|
|
11
25
|
const NotificationContext = createContext({
|
|
12
26
|
data: { notifications: [], unreadCount: 0 },
|
|
@@ -35,7 +49,7 @@ export function useNotifications() {
|
|
|
35
49
|
export function useAuth() {
|
|
36
50
|
return useContext(AuthContext);
|
|
37
51
|
}
|
|
38
|
-
export function AppProviders({ children, realtimeConfig = [], lang = "fr", translations = {}, availableLanguages = ["fr", "en"], }) {
|
|
52
|
+
export function AppProviders({ children, realtimeConfig = [], lang = "fr", translations = {}, availableLanguages = ["fr", "en"], EntitlementsProviderComponent, AnalyticsListenerComponent, }) {
|
|
39
53
|
const modules = useMemo(() => getModuleConfigs(), []);
|
|
40
54
|
const { user, loading: authLoading, isSuperAdmin } = useAuthSession();
|
|
41
55
|
// Hook de notifications seulement quand l'auth est prête
|
|
@@ -54,5 +68,12 @@ export function AppProviders({ children, realtimeConfig = [], lang = "fr", trans
|
|
|
54
68
|
// Ne retourner un objet vide que si vraiment rien n'est disponible
|
|
55
69
|
return {};
|
|
56
70
|
}, [translations]);
|
|
57
|
-
return (_jsx(LanguageProvider, { initialLang: lang, translations: memoizedTranslations, availableLanguages: availableLanguages, children: _jsx(AppLinkProvider, { lang: lang || "fr", children: _jsx(AuthContext.Provider, { value: authValue, children: _jsx(ModuleContext.Provider, { value: modules, children: _jsx(NotificationContext.Provider, { value: notificationsData, children: _jsxs(RealtimeProvider, { userId: user?.id, config: realtimeConfig, children: [
|
|
71
|
+
return (_jsx(LanguageProvider, { initialLang: lang, translations: memoizedTranslations, availableLanguages: availableLanguages, children: _jsx(AppLinkProvider, { lang: lang || "fr", children: _jsx(AuthContext.Provider, { value: authValue, children: _jsx(OptionalEntitlementsWrapper, { EntitlementsProviderComponent: EntitlementsProviderComponent, children: _jsx(ModuleContext.Provider, { value: modules, children: _jsx(NotificationContext.Provider, { value: notificationsData, children: _jsxs(RealtimeProvider, { userId: user?.id, config: realtimeConfig, children: [_jsx(OptionalAnalyticsListener, { AnalyticsListenerComponent: AnalyticsListenerComponent }), children, _jsx(ToastProvider, { toastProps: {
|
|
72
|
+
variant: "flat",
|
|
73
|
+
timeout: 5000,
|
|
74
|
+
shouldShowTimeoutProgress: true,
|
|
75
|
+
classNames: {
|
|
76
|
+
closeButton: "opacity-100 absolute right-4 top-1/2 -translate-y-1/2",
|
|
77
|
+
},
|
|
78
|
+
}, placement: "bottom-right", toastOffset: 5 })] }) }) }) }) }) }) }));
|
|
58
79
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
export function AuthLayout({ children }) {
|
|
3
|
-
return _jsx("div", { className: "pt-
|
|
3
|
+
return _jsx("div", { className: "pt-16 px-2 md:px-5 max-w-screen", children: children });
|
|
4
4
|
}
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Footer } from "@lastbrain/ui";
|
|
4
4
|
export function PublicLayout({ children, footerConfig }) {
|
|
5
|
-
return (_jsxs(_Fragment, { children: [_jsx("section", { className: "
|
|
5
|
+
return (_jsxs(_Fragment, { children: [_jsx("section", { className: " min-h-[calc(100vh)] max-w-screen", children: children }), footerConfig && _jsx(Footer, { config: footerConfig })] }));
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/RootLayout.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"RootLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/RootLayout.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAGzD,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,cAAmB,EACnB,IAAW,EACX,YAAiB,GAClB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACxC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,2CAqBA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-app.d.ts","sourceRoot":"","sources":["../../src/scripts/init-app.ts"],"names":[],"mappings":"AAWA,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"init-app.d.ts","sourceRoot":"","sources":["../../src/scripts/init-app.ts"],"names":[],"mappings":"AAWA,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,iBA8TpD"}
|