@flowselections/admin-installatietechniek 1.0.3 → 1.0.4
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-lib/components/AdminForInstallatieTechniek.d.ts +4 -0
- package/dist-lib/components/AdminForInstallatieTechniek.d.ts.map +1 -1
- package/dist-lib/components/AdminForInstallatieTechniek.js +212 -197
- package/dist-lib/hooks/useModulePermission.d.ts +4 -3
- package/dist-lib/hooks/useModulePermission.d.ts.map +1 -1
- package/dist-lib/hooks/useModulePermission.js +10 -6
- package/dist-lib/index.d.ts +1 -3
- package/dist-lib/index.d.ts.map +1 -1
- package/dist-lib/index.js +0 -1
- package/dist-lib/integrations/supabase/auth-middleware.d.ts +407 -0
- package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.d.ts +407 -0
- package/dist-lib/integrations/supabase/client.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/client.server.d.ts +407 -0
- package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -1
- package/dist-lib/integrations/supabase/types.d.ts +411 -0
- package/dist-lib/integrations/supabase/types.d.ts.map +1 -1
- package/dist-lib/lib/admin.functions.d.ts +48897 -1136
- package/dist-lib/lib/admin.functions.d.ts.map +1 -1
- package/dist-lib/lib/admin.functions.js +340 -181
- package/dist-lib/lib/moduleDiscovery.d.ts +7 -2
- package/dist-lib/lib/moduleDiscovery.d.ts.map +1 -1
- package/dist-lib/lib/moduleDiscovery.js +26 -11
- package/package.json +87 -87
- package/dist-lib/hooks/useModuleOrder.d.ts +0 -30
- package/dist-lib/hooks/useModuleOrder.d.ts.map +0 -1
- package/dist-lib/hooks/useModuleOrder.js +0 -99
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
export interface DiscoveredFeature {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
}
|
|
1
5
|
export interface DiscoveredModule {
|
|
2
6
|
id: string;
|
|
3
7
|
name: string;
|
|
8
|
+
features?: DiscoveredFeature[];
|
|
4
9
|
}
|
|
5
10
|
/**
|
|
6
|
-
* Leidt de modulelijst af uit de routeboom
|
|
7
|
-
*
|
|
11
|
+
* Leidt de modulelijst (inclusief onderdelen/subpagina's) af uit de routeboom
|
|
12
|
+
* van de draaiende shell. Geen hardcoded modules of onderdelen.
|
|
8
13
|
*/
|
|
9
14
|
export declare function useDiscoveredModules(): DiscoveredModule[];
|
|
10
15
|
//# sourceMappingURL=moduleDiscovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"moduleDiscovery.d.ts","sourceRoot":"","sources":["../../src/lib/moduleDiscovery.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"moduleDiscovery.d.ts","sourceRoot":"","sources":["../../src/lib/moduleDiscovery.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAiBD;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,EAAE,CAqDzD"}
|
|
@@ -15,17 +15,17 @@ function prettify(segment) {
|
|
|
15
15
|
return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
|
-
* Leidt de modulelijst af uit de routeboom
|
|
19
|
-
*
|
|
18
|
+
* Leidt de modulelijst (inclusief onderdelen/subpagina's) af uit de routeboom
|
|
19
|
+
* van de draaiende shell. Geen hardcoded modules of onderdelen.
|
|
20
20
|
*/
|
|
21
21
|
export function useDiscoveredModules() {
|
|
22
22
|
const router = useRouter();
|
|
23
23
|
const routesById = (router?.routesById ?? {});
|
|
24
24
|
const ids = Object.keys(routesById).sort().join("|");
|
|
25
25
|
return useMemo(() => {
|
|
26
|
-
const
|
|
26
|
+
const names = new Map();
|
|
27
|
+
const features = new Map();
|
|
27
28
|
for (const routeId of Object.keys(routesById)) {
|
|
28
|
-
// Alleen routes binnen de beveiligde shell-omgeving.
|
|
29
29
|
if (!routeId.startsWith("/_authenticated/"))
|
|
30
30
|
continue;
|
|
31
31
|
const path = routeId.slice("/_authenticated/".length);
|
|
@@ -39,16 +39,31 @@ export function useDiscoveredModules() {
|
|
|
39
39
|
continue;
|
|
40
40
|
const route = routesById[routeId];
|
|
41
41
|
const title = route?.options?.staticData?.title;
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
|
|
42
|
+
const rest = segments.slice(1).filter((s) => s !== "index");
|
|
43
|
+
const isTopLevel = rest.length === 0;
|
|
44
|
+
const existing = names.get(first);
|
|
45
45
|
if (!existing || (isTopLevel && typeof title === "string" && title.trim())) {
|
|
46
|
-
|
|
46
|
+
names.set(first, (isTopLevel && title?.trim()) || existing || prettify(first));
|
|
47
|
+
}
|
|
48
|
+
if (!isTopLevel) {
|
|
49
|
+
// Dynamische segmenten ($id) zijn detailpagina's, geen los onderdeel.
|
|
50
|
+
if (rest.some((s) => s.startsWith("$")))
|
|
51
|
+
continue;
|
|
52
|
+
const featureId = rest.join("/");
|
|
53
|
+
const map = features.get(first) ?? new Map();
|
|
54
|
+
map.set(featureId, title?.trim() || rest.map(prettify).join(" › "));
|
|
55
|
+
features.set(first, map);
|
|
47
56
|
}
|
|
48
57
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
58
|
+
return Array.from(names.entries())
|
|
59
|
+
.map(([id, name]) => ({
|
|
60
|
+
id,
|
|
61
|
+
name,
|
|
62
|
+
features: Array.from(features.get(id)?.entries() ?? [])
|
|
63
|
+
.map(([fid, fname]) => ({ id: fid, name: fname }))
|
|
64
|
+
.sort((a, b) => a.name.localeCompare(b.name, "nl")),
|
|
65
|
+
}))
|
|
66
|
+
.sort((a, b) => a.name.localeCompare(b.name, "nl"));
|
|
52
67
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
53
68
|
}, [ids]);
|
|
54
69
|
}
|
package/package.json
CHANGED
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@flowselections/admin-installatietechniek",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"flowselections": {
|
|
5
|
-
"moduleId": "admin-installatietechniek",
|
|
6
|
-
"pages": [
|
|
7
|
-
{
|
|
8
|
-
"export": "AdminForInstallatieTechniek",
|
|
9
|
-
"route": "admin-installatietechniek",
|
|
10
|
-
"title": "Rollen & machtigingen"
|
|
11
|
-
}
|
|
12
|
-
]
|
|
13
|
-
},
|
|
14
|
-
"private": false,
|
|
15
|
-
"sideEffects": false,
|
|
16
|
-
"type": "module",
|
|
17
|
-
"main": "./dist-lib/index.js",
|
|
18
|
-
"types": "./dist-lib/index.d.ts",
|
|
19
|
-
"exports": {
|
|
20
|
-
".": {
|
|
21
|
-
"types": "./dist-lib/index.d.ts",
|
|
22
|
-
"default": "./dist-lib/index.js"
|
|
23
|
-
},
|
|
24
|
-
"./styles": "./dist-lib/styles.css"
|
|
25
|
-
},
|
|
26
|
-
"files": [
|
|
27
|
-
"dist-lib",
|
|
28
|
-
"public"
|
|
29
|
-
],
|
|
30
|
-
"publishConfig": {
|
|
31
|
-
"access": "public"
|
|
32
|
-
},
|
|
33
|
-
"scripts": {
|
|
34
|
-
"dev": "vite dev",
|
|
35
|
-
"build": "vite build",
|
|
36
|
-
"build:lib": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node -e \"require('fs').writeFileSync('dist-lib/styles.css', '@source \\\"./\\\";\\n')\"",
|
|
37
|
-
"build:lib:watch": "tsc -p tsconfig.build.json --watch",
|
|
38
|
-
"build:dev": "vite build --mode development",
|
|
39
|
-
"preview": "vite preview",
|
|
40
|
-
"lint": "eslint ."
|
|
41
|
-
},
|
|
42
|
-
"peerDependencies": {
|
|
43
|
-
"@flowselections/core": "*",
|
|
44
|
-
"@tanstack/react-query": "^5.0.0",
|
|
45
|
-
"@tanstack/react-router": "^1.0.0",
|
|
46
|
-
"@tanstack/react-start": "^1.0.0",
|
|
47
|
-
"lucide-react": "^0.400.0",
|
|
48
|
-
"react": "^18 || ^19",
|
|
49
|
-
"react-dom": "^18 || ^19",
|
|
50
|
-
"sonner": "^2.0.0"
|
|
51
|
-
},
|
|
52
|
-
"dependencies": {
|
|
53
|
-
"@supabase/supabase-js": "^2.110.7"
|
|
54
|
-
},
|
|
55
|
-
"devDependencies": {
|
|
56
|
-
"@cloudflare/vite-plugin": "^1.25.5",
|
|
57
|
-
"@eslint/js": "^9.32.0",
|
|
58
|
-
"@flowselections/core": "1.0.16",
|
|
59
|
-
"@lovable.dev/vite-tanstack-config": "2.13.1",
|
|
60
|
-
"@rsbuild/core": "^1.0.0",
|
|
61
|
-
"@tailwindcss/vite": "^4.2.1",
|
|
62
|
-
"@tanstack/react-query": "^5.83.0",
|
|
63
|
-
"@tanstack/react-router": "^1.168.0",
|
|
64
|
-
"@tanstack/react-start": "^1.167.14",
|
|
65
|
-
"@tanstack/router-plugin": "^1.167.10",
|
|
66
|
-
"@types/node": "^22.16.5",
|
|
67
|
-
"@types/react": "^19.2.0",
|
|
68
|
-
"@types/react-dom": "^19.2.0",
|
|
69
|
-
"@vitejs/plugin-react": "^5.0.4",
|
|
70
|
-
"eslint": "^9.32.0",
|
|
71
|
-
"eslint-plugin-react-hooks": "^5.2.0",
|
|
72
|
-
"eslint-plugin-react-refresh": "^0.4.20",
|
|
73
|
-
"globals": "^15.15.0",
|
|
74
|
-
"lucide-react": "^0.575.0",
|
|
75
|
-
"react": "^19.2.0",
|
|
76
|
-
"react-dom": "^19.2.0",
|
|
77
|
-
"sonner": "^2.0.7",
|
|
78
|
-
"tailwindcss": "^4.2.1",
|
|
79
|
-
"tw-animate-css": "^1.3.4",
|
|
80
|
-
"typescript": "^5.8.3",
|
|
81
|
-
"tsc-alias": "^1.8.10",
|
|
82
|
-
"typescript-eslint": "^8.56.1",
|
|
83
|
-
"vite": "^7.3.1",
|
|
84
|
-
"vite-tsconfig-paths": "^6.0.2",
|
|
85
|
-
"nitro": "3.0.260603-beta"
|
|
86
|
-
}
|
|
87
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@flowselections/admin-installatietechniek",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"flowselections": {
|
|
5
|
+
"moduleId": "admin-installatietechniek",
|
|
6
|
+
"pages": [
|
|
7
|
+
{
|
|
8
|
+
"export": "AdminForInstallatieTechniek",
|
|
9
|
+
"route": "admin-installatietechniek",
|
|
10
|
+
"title": "Rollen & machtigingen"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
},
|
|
14
|
+
"private": false,
|
|
15
|
+
"sideEffects": false,
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "./dist-lib/index.js",
|
|
18
|
+
"types": "./dist-lib/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist-lib/index.d.ts",
|
|
22
|
+
"default": "./dist-lib/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./styles": "./dist-lib/styles.css"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist-lib",
|
|
28
|
+
"public"
|
|
29
|
+
],
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"dev": "vite dev",
|
|
35
|
+
"build": "vite build",
|
|
36
|
+
"build:lib": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node -e \"require('fs').writeFileSync('dist-lib/styles.css', '@source \\\"./\\\";\\n')\"",
|
|
37
|
+
"build:lib:watch": "tsc -p tsconfig.build.json --watch",
|
|
38
|
+
"build:dev": "vite build --mode development",
|
|
39
|
+
"preview": "vite preview",
|
|
40
|
+
"lint": "eslint ."
|
|
41
|
+
},
|
|
42
|
+
"peerDependencies": {
|
|
43
|
+
"@flowselections/core": "*",
|
|
44
|
+
"@tanstack/react-query": "^5.0.0",
|
|
45
|
+
"@tanstack/react-router": "^1.0.0",
|
|
46
|
+
"@tanstack/react-start": "^1.0.0",
|
|
47
|
+
"lucide-react": "^0.400.0",
|
|
48
|
+
"react": "^18 || ^19",
|
|
49
|
+
"react-dom": "^18 || ^19",
|
|
50
|
+
"sonner": "^2.0.0"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@supabase/supabase-js": "^2.110.7"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@cloudflare/vite-plugin": "^1.25.5",
|
|
57
|
+
"@eslint/js": "^9.32.0",
|
|
58
|
+
"@flowselections/core": "1.0.16",
|
|
59
|
+
"@lovable.dev/vite-tanstack-config": "2.13.1",
|
|
60
|
+
"@rsbuild/core": "^1.0.0",
|
|
61
|
+
"@tailwindcss/vite": "^4.2.1",
|
|
62
|
+
"@tanstack/react-query": "^5.83.0",
|
|
63
|
+
"@tanstack/react-router": "^1.168.0",
|
|
64
|
+
"@tanstack/react-start": "^1.167.14",
|
|
65
|
+
"@tanstack/router-plugin": "^1.167.10",
|
|
66
|
+
"@types/node": "^22.16.5",
|
|
67
|
+
"@types/react": "^19.2.0",
|
|
68
|
+
"@types/react-dom": "^19.2.0",
|
|
69
|
+
"@vitejs/plugin-react": "^5.0.4",
|
|
70
|
+
"eslint": "^9.32.0",
|
|
71
|
+
"eslint-plugin-react-hooks": "^5.2.0",
|
|
72
|
+
"eslint-plugin-react-refresh": "^0.4.20",
|
|
73
|
+
"globals": "^15.15.0",
|
|
74
|
+
"lucide-react": "^0.575.0",
|
|
75
|
+
"react": "^19.2.0",
|
|
76
|
+
"react-dom": "^19.2.0",
|
|
77
|
+
"sonner": "^2.0.7",
|
|
78
|
+
"tailwindcss": "^4.2.1",
|
|
79
|
+
"tw-animate-css": "^1.3.4",
|
|
80
|
+
"typescript": "^5.8.3",
|
|
81
|
+
"tsc-alias": "^1.8.10",
|
|
82
|
+
"typescript-eslint": "^8.56.1",
|
|
83
|
+
"vite": "^7.3.1",
|
|
84
|
+
"vite-tsconfig-paths": "^6.0.2",
|
|
85
|
+
"nitro": "3.0.260603-beta"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export interface ModuleOrderEntry {
|
|
2
|
-
id: string;
|
|
3
|
-
name: string;
|
|
4
|
-
sortOrder: number | null;
|
|
5
|
-
}
|
|
6
|
-
interface OrderableModule {
|
|
7
|
-
id: string;
|
|
8
|
-
name?: string;
|
|
9
|
-
}
|
|
10
|
-
/** Laat elke actieve `useModuleOrder()` de volgorde direct opnieuw ophalen. */
|
|
11
|
-
export declare function notifyModuleOrderChanged(): void;
|
|
12
|
-
/**
|
|
13
|
-
* Sorteert een modulelijst volgens de opgeslagen volgorde.
|
|
14
|
-
* Modules zonder opgeslagen positie behouden hun oorspronkelijke plek
|
|
15
|
-
* (de bronvolgorde van de shell) — geen alfabetische herschikking.
|
|
16
|
-
*/
|
|
17
|
-
export declare function sortModulesByOrder<T extends OrderableModule>(modules: T[], order: ModuleOrderEntry[]): T[];
|
|
18
|
-
/**
|
|
19
|
-
* Haalt de opgeslagen zijbalk-volgorde op en levert een sorteerfunctie
|
|
20
|
-
* die shells op hun modulelijst kunnen toepassen. Werkt realtime bij
|
|
21
|
-
* zodra de adminpagina een nieuwe volgorde opslaat.
|
|
22
|
-
*/
|
|
23
|
-
export declare function useModuleOrder(): {
|
|
24
|
-
order: ModuleOrderEntry[];
|
|
25
|
-
loading: boolean;
|
|
26
|
-
sortModules: <T extends OrderableModule>(modules: T[]) => T[];
|
|
27
|
-
reload: () => Promise<void>;
|
|
28
|
-
};
|
|
29
|
-
export {};
|
|
30
|
-
//# sourceMappingURL=useModuleOrder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useModuleOrder.d.ts","sourceRoot":"","sources":["../../src/hooks/useModuleOrder.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,+EAA+E;AAC/E,wBAAgB,wBAAwB,SAGvC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAC1D,OAAO,EAAE,CAAC,EAAE,EACZ,KAAK,EAAE,gBAAgB,EAAE,GACxB,CAAC,EAAE,CAyBL;AAED;;;;GAIG;AACH,wBAAgB,cAAc;;;kBA6CzB,CAAC,SAAS,eAAe,WAAW,CAAC,EAAE;;EAK3C"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { useCallback, useEffect, useState } from "react";
|
|
2
|
-
import { getModuleOrder } from "../lib/admin.functions";
|
|
3
|
-
const MODULE_ORDER_EVENT = "flowselections:module-order-changed";
|
|
4
|
-
/** Laat elke actieve `useModuleOrder()` de volgorde direct opnieuw ophalen. */
|
|
5
|
-
export function notifyModuleOrderChanged() {
|
|
6
|
-
if (typeof window === "undefined")
|
|
7
|
-
return;
|
|
8
|
-
window.dispatchEvent(new CustomEvent(MODULE_ORDER_EVENT));
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Sorteert een modulelijst volgens de opgeslagen volgorde.
|
|
12
|
-
* Modules zonder opgeslagen positie behouden hun oorspronkelijke plek
|
|
13
|
-
* (de bronvolgorde van de shell) — geen alfabetische herschikking.
|
|
14
|
-
*/
|
|
15
|
-
export function sortModulesByOrder(modules, order) {
|
|
16
|
-
const safeModules = Array.isArray(modules) ? modules : [];
|
|
17
|
-
const safeOrder = Array.isArray(order) ? order : [];
|
|
18
|
-
if (safeOrder.length === 0)
|
|
19
|
-
return safeModules;
|
|
20
|
-
const positions = new Map();
|
|
21
|
-
safeOrder.forEach((entry) => {
|
|
22
|
-
if (entry?.id && typeof entry.sortOrder === "number") {
|
|
23
|
-
positions.set(entry.id, entry.sortOrder);
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
if (positions.size === 0)
|
|
27
|
-
return safeModules;
|
|
28
|
-
return safeModules
|
|
29
|
-
.map((mod, index) => ({ mod, index }))
|
|
30
|
-
.sort((a, b) => {
|
|
31
|
-
const ao = positions.get(a.mod.id);
|
|
32
|
-
const bo = positions.get(b.mod.id);
|
|
33
|
-
if (ao !== undefined && bo !== undefined)
|
|
34
|
-
return ao - bo;
|
|
35
|
-
// Zonder positie: originele volgorde behouden, ná gepositioneerde modules.
|
|
36
|
-
if (ao !== undefined)
|
|
37
|
-
return -1;
|
|
38
|
-
if (bo !== undefined)
|
|
39
|
-
return 1;
|
|
40
|
-
return a.index - b.index;
|
|
41
|
-
})
|
|
42
|
-
.map((entry) => entry.mod);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Haalt de opgeslagen zijbalk-volgorde op en levert een sorteerfunctie
|
|
46
|
-
* die shells op hun modulelijst kunnen toepassen. Werkt realtime bij
|
|
47
|
-
* zodra de adminpagina een nieuwe volgorde opslaat.
|
|
48
|
-
*/
|
|
49
|
-
export function useModuleOrder() {
|
|
50
|
-
const [order, setOrder] = useState([]);
|
|
51
|
-
const [loading, setLoading] = useState(true);
|
|
52
|
-
const reload = useCallback(async () => {
|
|
53
|
-
try {
|
|
54
|
-
const result = await getModuleOrder();
|
|
55
|
-
setOrder(Array.isArray(result?.modules) ? result.modules : []);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
setOrder([]);
|
|
59
|
-
}
|
|
60
|
-
finally {
|
|
61
|
-
setLoading(false);
|
|
62
|
-
}
|
|
63
|
-
}, []);
|
|
64
|
-
useEffect(() => {
|
|
65
|
-
let cancelled = false;
|
|
66
|
-
const load = async () => {
|
|
67
|
-
try {
|
|
68
|
-
const result = await getModuleOrder();
|
|
69
|
-
if (cancelled)
|
|
70
|
-
return;
|
|
71
|
-
setOrder(Array.isArray(result?.modules) ? result.modules : []);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
if (!cancelled)
|
|
75
|
-
setOrder([]);
|
|
76
|
-
}
|
|
77
|
-
finally {
|
|
78
|
-
if (!cancelled)
|
|
79
|
-
setLoading(false);
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
load();
|
|
83
|
-
const onChanged = () => {
|
|
84
|
-
if (!cancelled)
|
|
85
|
-
load();
|
|
86
|
-
};
|
|
87
|
-
if (typeof window !== "undefined") {
|
|
88
|
-
window.addEventListener(MODULE_ORDER_EVENT, onChanged);
|
|
89
|
-
}
|
|
90
|
-
return () => {
|
|
91
|
-
cancelled = true;
|
|
92
|
-
if (typeof window !== "undefined") {
|
|
93
|
-
window.removeEventListener(MODULE_ORDER_EVENT, onChanged);
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
}, []);
|
|
97
|
-
const sortModules = useCallback((modules) => sortModulesByOrder(modules, order), [order]);
|
|
98
|
-
return { order, loading, sortModules, reload };
|
|
99
|
-
}
|