@viasoftbr/shared-ui 0.0.4 → 0.0.6
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/components/encoder/DvB.d.ts +5 -2
- package/dist/components/encoder/Livecast.d.ts +4 -2
- package/dist/components/index.d.ts +2 -3
- package/dist/components/network/index.d.ts +5 -4
- package/dist/components.cjs +318 -384
- package/dist/components.js +329 -395
- package/dist/context/AuthContext.d.ts +10 -2
- package/dist/context/ThemeContext.d.ts +3 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/context.cjs +52 -91
- package/dist/context.js +54 -93
- package/dist/hooks.cjs +0 -73
- package/dist/hooks.js +0 -63
- package/dist/index.cjs +380 -425
- package/dist/index.js +386 -431
- package/dist/services/api.d.ts +2 -1
- package/dist/services/index.d.ts +0 -2
- package/dist/services.cjs +51 -149
- package/dist/services.js +51 -139
- package/dist/types/index.d.ts +6 -6
- package/dist/types/websocket.d.ts +7 -0
- package/package.json +18 -38
|
@@ -10,9 +10,17 @@ interface AuthContextType {
|
|
|
10
10
|
logout: () => Promise<void>;
|
|
11
11
|
hasRole: (roles: Role | Role[]) => boolean;
|
|
12
12
|
}
|
|
13
|
-
export declare const
|
|
13
|
+
export declare const AuthContext: React.Context<AuthContextType | undefined>;
|
|
14
|
+
export interface AuthProviderProps {
|
|
14
15
|
children: React.ReactNode;
|
|
15
16
|
onNavigate?: (path: string) => void;
|
|
16
|
-
|
|
17
|
+
/** Optional storage for federated/SSR environments (defaults to window.localStorage when available) */
|
|
18
|
+
storage?: Storage | null;
|
|
19
|
+
/** Optional auth service to allow injection in remotes/tests */
|
|
20
|
+
authService?: any;
|
|
21
|
+
initialUser?: User | null;
|
|
22
|
+
initialAccessToken?: string | null;
|
|
23
|
+
}
|
|
24
|
+
export declare const AuthProvider: React.FC<AuthProviderProps>;
|
|
17
25
|
export declare function useAuth(): AuthContextType;
|
|
18
26
|
export {};
|
|
@@ -4,8 +4,10 @@ interface ThemeContextType {
|
|
|
4
4
|
theme: Theme;
|
|
5
5
|
toggleTheme: () => void;
|
|
6
6
|
}
|
|
7
|
-
export declare
|
|
7
|
+
export declare const ThemeContext: React.Context<ThemeContextType | undefined>;
|
|
8
|
+
export declare function ThemeProvider({ children, storage }: {
|
|
8
9
|
children: React.ReactNode;
|
|
10
|
+
storage?: Storage | null;
|
|
9
11
|
}): import("react/jsx-runtime").JSX.Element;
|
|
10
12
|
export declare function useTheme(): ThemeContextType;
|
|
11
13
|
export {};
|
package/dist/context/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ThemeProvider } from './ThemeContext';
|
|
2
|
-
import { AuthProvider, useAuth } from './AuthContext';
|
|
1
|
+
import { ThemeProvider, ThemeContext } from './ThemeContext';
|
|
2
|
+
import { AuthProvider, useAuth, AuthContext } from './AuthContext';
|
|
3
3
|
import { SharedUiProvider } from './SharedUiProvider';
|
|
4
|
-
export { ThemeProvider, AuthProvider, useAuth, SharedUiProvider, };
|
|
4
|
+
export { ThemeProvider, ThemeContext, AuthProvider, AuthContext, useAuth, SharedUiProvider, };
|
package/dist/context.cjs
CHANGED
|
@@ -35,8 +35,10 @@ var __publicField = (obj, key, value) => {
|
|
|
35
35
|
// src/context/index.ts
|
|
36
36
|
var context_exports = {};
|
|
37
37
|
__export(context_exports, {
|
|
38
|
+
AuthContext: () => AuthContext,
|
|
38
39
|
AuthProvider: () => AuthProvider,
|
|
39
40
|
SharedUiProvider: () => SharedUiProvider,
|
|
41
|
+
ThemeContext: () => ThemeContext,
|
|
40
42
|
ThemeProvider: () => ThemeProvider,
|
|
41
43
|
useAuth: () => useAuth
|
|
42
44
|
});
|
|
@@ -46,25 +48,33 @@ module.exports = __toCommonJS(context_exports);
|
|
|
46
48
|
var import_react = require("react");
|
|
47
49
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
48
50
|
var ThemeContext = (0, import_react.createContext)(void 0);
|
|
49
|
-
function ThemeProvider({ children }) {
|
|
51
|
+
function ThemeProvider({ children, storage }) {
|
|
52
|
+
const resolvedStorage = storage ?? (typeof window !== "undefined" ? window.localStorage : null);
|
|
50
53
|
const [theme, setTheme] = (0, import_react.useState)(() => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
try {
|
|
55
|
+
if (!resolvedStorage)
|
|
56
|
+
return "light";
|
|
57
|
+
const savedTheme = resolvedStorage.getItem("theme");
|
|
58
|
+
const systemPreference = typeof window !== "undefined" && window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
59
|
+
return savedTheme ?? systemPreference;
|
|
60
|
+
} catch {
|
|
61
|
+
return "light";
|
|
62
|
+
}
|
|
54
63
|
});
|
|
55
64
|
(0, import_react.useEffect)(() => {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
root.classList.
|
|
59
|
-
} else {
|
|
60
|
-
root.classList.remove("dark");
|
|
65
|
+
if (typeof document !== "undefined") {
|
|
66
|
+
const root = document.documentElement;
|
|
67
|
+
root.classList.toggle("dark", theme === "dark");
|
|
61
68
|
}
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
try {
|
|
70
|
+
resolvedStorage?.setItem("theme", theme);
|
|
71
|
+
} catch {
|
|
72
|
+
}
|
|
73
|
+
}, [theme, resolvedStorage]);
|
|
64
74
|
const toggleTheme = () => {
|
|
65
|
-
setTheme((
|
|
75
|
+
setTheme((prev) => prev === "light" ? "dark" : "light");
|
|
66
76
|
};
|
|
67
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext
|
|
77
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext, { value: { theme, toggleTheme }, children });
|
|
68
78
|
}
|
|
69
79
|
|
|
70
80
|
// src/context/AuthContext.tsx
|
|
@@ -2854,69 +2864,6 @@ var authService = {
|
|
|
2854
2864
|
}
|
|
2855
2865
|
};
|
|
2856
2866
|
|
|
2857
|
-
// src/services/loadRemoteModule.ts
|
|
2858
|
-
var React2 = __toESM(require("react"), 1);
|
|
2859
|
-
var ReactDOM = __toESM(require("react-dom"), 1);
|
|
2860
|
-
|
|
2861
|
-
// src/services/metadataLoader.ts
|
|
2862
|
-
var MetadataLoader = class {
|
|
2863
|
-
constructor() {
|
|
2864
|
-
__publicField(this, "metadataCache", /* @__PURE__ */ new Map());
|
|
2865
|
-
}
|
|
2866
|
-
async loadMetadata(metadataUrl) {
|
|
2867
|
-
if (this.metadataCache.has(metadataUrl)) {
|
|
2868
|
-
return this.metadataCache.get(metadataUrl) || [];
|
|
2869
|
-
}
|
|
2870
|
-
try {
|
|
2871
|
-
const response = await fetch(metadataUrl);
|
|
2872
|
-
console.log(response);
|
|
2873
|
-
if (!response.ok) {
|
|
2874
|
-
throw new Error(`Failed to fetch metadata: ${response.statusText}`);
|
|
2875
|
-
}
|
|
2876
|
-
const data = await response.json();
|
|
2877
|
-
let metadata;
|
|
2878
|
-
if (Array.isArray(data)) {
|
|
2879
|
-
metadata = data;
|
|
2880
|
-
} else if (data.pages && Array.isArray(data.pages)) {
|
|
2881
|
-
metadata = data.pages;
|
|
2882
|
-
} else {
|
|
2883
|
-
throw new Error(
|
|
2884
|
-
"Invalid metadata format: expected array or object with pages property"
|
|
2885
|
-
);
|
|
2886
|
-
}
|
|
2887
|
-
metadata.forEach((page, index) => {
|
|
2888
|
-
if (!page.id || !page.name || !page.path || !page.url) {
|
|
2889
|
-
throw new Error(
|
|
2890
|
-
`Invalid page metadata at index ${index}: missing required fields`
|
|
2891
|
-
);
|
|
2892
|
-
}
|
|
2893
|
-
});
|
|
2894
|
-
this.metadataCache.set(metadataUrl, metadata);
|
|
2895
|
-
return metadata;
|
|
2896
|
-
} catch (error) {
|
|
2897
|
-
console.warn(`Failed to load metadata from ${metadataUrl}:`, error);
|
|
2898
|
-
return [];
|
|
2899
|
-
}
|
|
2900
|
-
}
|
|
2901
|
-
async loadFromDirectory(directoryUrl) {
|
|
2902
|
-
try {
|
|
2903
|
-
const manifestUrl = `${directoryUrl}/manifest.json`;
|
|
2904
|
-
return await this.loadMetadata(manifestUrl);
|
|
2905
|
-
} catch (error) {
|
|
2906
|
-
throw new Error(
|
|
2907
|
-
`Directory manifest not found at ${directoryUrl}/manifest.json: ${error}`
|
|
2908
|
-
);
|
|
2909
|
-
}
|
|
2910
|
-
}
|
|
2911
|
-
clearCache() {
|
|
2912
|
-
this.metadataCache.clear();
|
|
2913
|
-
}
|
|
2914
|
-
getCachedMetadata(metadataUrl) {
|
|
2915
|
-
return this.metadataCache.get(metadataUrl);
|
|
2916
|
-
}
|
|
2917
|
-
};
|
|
2918
|
-
var metadataLoader = new MetadataLoader();
|
|
2919
|
-
|
|
2920
2867
|
// src/services/registry.ts
|
|
2921
2868
|
var PluginRegistryImpl = class {
|
|
2922
2869
|
constructor() {
|
|
@@ -3001,20 +2948,27 @@ var hostConfigLoader = new HostConfigLoader();
|
|
|
3001
2948
|
// src/context/AuthContext.tsx
|
|
3002
2949
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
3003
2950
|
var AuthContext = (0, import_react2.createContext)(void 0);
|
|
3004
|
-
var AuthProvider = ({
|
|
3005
|
-
|
|
3006
|
-
|
|
2951
|
+
var AuthProvider = ({
|
|
2952
|
+
children,
|
|
2953
|
+
onNavigate,
|
|
2954
|
+
storage = typeof window !== "undefined" ? window.localStorage : null,
|
|
2955
|
+
authService: authService2 = authService,
|
|
2956
|
+
initialUser = null,
|
|
2957
|
+
initialAccessToken = null
|
|
2958
|
+
}) => {
|
|
2959
|
+
const [user, setUser] = (0, import_react2.useState)(initialUser);
|
|
2960
|
+
const [accessToken, setToken] = (0, import_react2.useState)(initialAccessToken ?? null);
|
|
3007
2961
|
const [loading, setLoading] = (0, import_react2.useState)(true);
|
|
3008
2962
|
(0, import_react2.useEffect)(() => {
|
|
3009
2963
|
try {
|
|
3010
|
-
const storedUser =
|
|
2964
|
+
const storedUser = storage?.getItem("user");
|
|
3011
2965
|
if (storedUser)
|
|
3012
2966
|
setUser(JSON.parse(storedUser));
|
|
3013
2967
|
} catch {
|
|
3014
2968
|
}
|
|
3015
2969
|
try {
|
|
3016
|
-
const savedAccess =
|
|
3017
|
-
const savedRefresh =
|
|
2970
|
+
const savedAccess = storage?.getItem("accessToken");
|
|
2971
|
+
const savedRefresh = storage?.getItem("refreshToken");
|
|
3018
2972
|
if (savedAccess) {
|
|
3019
2973
|
setToken(savedAccess);
|
|
3020
2974
|
setAccessToken(savedAccess);
|
|
@@ -3025,15 +2979,17 @@ var AuthProvider = ({ children, onNavigate }) => {
|
|
|
3025
2979
|
} catch {
|
|
3026
2980
|
}
|
|
3027
2981
|
setLoading(false);
|
|
3028
|
-
}, []);
|
|
2982
|
+
}, [storage]);
|
|
3029
2983
|
const login = async (username, password, options) => {
|
|
3030
|
-
const resp = await
|
|
2984
|
+
const resp = await authService2.login(username, password);
|
|
3031
2985
|
setToken(resp.accessToken);
|
|
3032
2986
|
setAccessToken(resp.accessToken);
|
|
3033
2987
|
setRefreshToken(resp.refreshToken);
|
|
3034
2988
|
setUser(resp.user);
|
|
3035
2989
|
try {
|
|
3036
|
-
|
|
2990
|
+
storage?.setItem("user", JSON.stringify(resp.user));
|
|
2991
|
+
storage?.setItem("accessToken", resp.accessToken);
|
|
2992
|
+
storage?.setItem("refreshToken", resp.refreshToken);
|
|
3037
2993
|
} catch {
|
|
3038
2994
|
}
|
|
3039
2995
|
if (options?.redirect !== false)
|
|
@@ -3041,13 +2997,15 @@ var AuthProvider = ({ children, onNavigate }) => {
|
|
|
3041
2997
|
};
|
|
3042
2998
|
const logout = async () => {
|
|
3043
2999
|
try {
|
|
3044
|
-
await
|
|
3000
|
+
await authService2.logout();
|
|
3045
3001
|
} finally {
|
|
3046
3002
|
setToken(null);
|
|
3047
3003
|
clearTokens();
|
|
3048
3004
|
setUser(null);
|
|
3049
3005
|
try {
|
|
3050
|
-
|
|
3006
|
+
storage?.removeItem("user");
|
|
3007
|
+
storage?.removeItem("accessToken");
|
|
3008
|
+
storage?.removeItem("refreshToken");
|
|
3051
3009
|
} catch {
|
|
3052
3010
|
}
|
|
3053
3011
|
onNavigate?.("/login");
|
|
@@ -3059,20 +3017,23 @@ var AuthProvider = ({ children, onNavigate }) => {
|
|
|
3059
3017
|
const want = Array.isArray(roles) ? roles : [roles];
|
|
3060
3018
|
return want.some((r) => user.role === r);
|
|
3061
3019
|
};
|
|
3062
|
-
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AuthContext
|
|
3020
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AuthContext, { value: { user, accessToken, loading, login, logout, hasRole }, children });
|
|
3063
3021
|
};
|
|
3064
3022
|
function useAuth() {
|
|
3065
|
-
const ctx = (0, import_react2.
|
|
3023
|
+
const ctx = (0, import_react2.use)(AuthContext);
|
|
3066
3024
|
if (!ctx)
|
|
3067
3025
|
throw new Error("useAuth must be used within AuthProvider");
|
|
3068
3026
|
return ctx;
|
|
3069
3027
|
}
|
|
3070
3028
|
|
|
3071
3029
|
// src/context/SharedUiProvider.tsx
|
|
3072
|
-
var import_react3 = __toESM(require("react")
|
|
3030
|
+
var import_react3 = __toESM(require("react"));
|
|
3073
3031
|
var import_react_query = require("@tanstack/react-query");
|
|
3074
3032
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
3075
3033
|
function SharedUiProvider({ children, client }) {
|
|
3076
|
-
const
|
|
3034
|
+
const ref = import_react3.default.useRef(null);
|
|
3035
|
+
if (!ref.current)
|
|
3036
|
+
ref.current = client ?? new import_react_query.QueryClient();
|
|
3037
|
+
const internal = ref.current;
|
|
3077
3038
|
return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_query.QueryClientProvider, { client: internal, children });
|
|
3078
3039
|
}
|
package/dist/context.js
CHANGED
|
@@ -10,32 +10,40 @@ var __publicField = (obj, key, value) => {
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
// src/context/ThemeContext.tsx
|
|
13
|
-
import { createContext,
|
|
13
|
+
import { createContext, use, useEffect, useState } from "react";
|
|
14
14
|
import { jsx } from "react/jsx-runtime";
|
|
15
15
|
var ThemeContext = createContext(void 0);
|
|
16
|
-
function ThemeProvider({ children }) {
|
|
16
|
+
function ThemeProvider({ children, storage }) {
|
|
17
|
+
const resolvedStorage = storage ?? (typeof window !== "undefined" ? window.localStorage : null);
|
|
17
18
|
const [theme, setTheme] = useState(() => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
try {
|
|
20
|
+
if (!resolvedStorage)
|
|
21
|
+
return "light";
|
|
22
|
+
const savedTheme = resolvedStorage.getItem("theme");
|
|
23
|
+
const systemPreference = typeof window !== "undefined" && window.matchMedia?.("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
24
|
+
return savedTheme ?? systemPreference;
|
|
25
|
+
} catch {
|
|
26
|
+
return "light";
|
|
27
|
+
}
|
|
21
28
|
});
|
|
22
29
|
useEffect(() => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
root.classList.
|
|
26
|
-
} else {
|
|
27
|
-
root.classList.remove("dark");
|
|
30
|
+
if (typeof document !== "undefined") {
|
|
31
|
+
const root = document.documentElement;
|
|
32
|
+
root.classList.toggle("dark", theme === "dark");
|
|
28
33
|
}
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
try {
|
|
35
|
+
resolvedStorage?.setItem("theme", theme);
|
|
36
|
+
} catch {
|
|
37
|
+
}
|
|
38
|
+
}, [theme, resolvedStorage]);
|
|
31
39
|
const toggleTheme = () => {
|
|
32
|
-
setTheme((
|
|
40
|
+
setTheme((prev) => prev === "light" ? "dark" : "light");
|
|
33
41
|
};
|
|
34
|
-
return /* @__PURE__ */ jsx(ThemeContext
|
|
42
|
+
return /* @__PURE__ */ jsx(ThemeContext, { value: { theme, toggleTheme }, children });
|
|
35
43
|
}
|
|
36
44
|
|
|
37
45
|
// src/context/AuthContext.tsx
|
|
38
|
-
import { createContext as createContext2,
|
|
46
|
+
import { createContext as createContext2, use as use2, useEffect as useEffect2, useState as useState2 } from "react";
|
|
39
47
|
|
|
40
48
|
// node_modules/.pnpm/axios@1.13.4/node_modules/axios/lib/helpers/bind.js
|
|
41
49
|
function bind(fn, thisArg) {
|
|
@@ -2820,69 +2828,6 @@ var authService = {
|
|
|
2820
2828
|
}
|
|
2821
2829
|
};
|
|
2822
2830
|
|
|
2823
|
-
// src/services/loadRemoteModule.ts
|
|
2824
|
-
import * as React2 from "react";
|
|
2825
|
-
import * as ReactDOM from "react-dom";
|
|
2826
|
-
|
|
2827
|
-
// src/services/metadataLoader.ts
|
|
2828
|
-
var MetadataLoader = class {
|
|
2829
|
-
constructor() {
|
|
2830
|
-
__publicField(this, "metadataCache", /* @__PURE__ */ new Map());
|
|
2831
|
-
}
|
|
2832
|
-
async loadMetadata(metadataUrl) {
|
|
2833
|
-
if (this.metadataCache.has(metadataUrl)) {
|
|
2834
|
-
return this.metadataCache.get(metadataUrl) || [];
|
|
2835
|
-
}
|
|
2836
|
-
try {
|
|
2837
|
-
const response = await fetch(metadataUrl);
|
|
2838
|
-
console.log(response);
|
|
2839
|
-
if (!response.ok) {
|
|
2840
|
-
throw new Error(`Failed to fetch metadata: ${response.statusText}`);
|
|
2841
|
-
}
|
|
2842
|
-
const data = await response.json();
|
|
2843
|
-
let metadata;
|
|
2844
|
-
if (Array.isArray(data)) {
|
|
2845
|
-
metadata = data;
|
|
2846
|
-
} else if (data.pages && Array.isArray(data.pages)) {
|
|
2847
|
-
metadata = data.pages;
|
|
2848
|
-
} else {
|
|
2849
|
-
throw new Error(
|
|
2850
|
-
"Invalid metadata format: expected array or object with pages property"
|
|
2851
|
-
);
|
|
2852
|
-
}
|
|
2853
|
-
metadata.forEach((page, index) => {
|
|
2854
|
-
if (!page.id || !page.name || !page.path || !page.url) {
|
|
2855
|
-
throw new Error(
|
|
2856
|
-
`Invalid page metadata at index ${index}: missing required fields`
|
|
2857
|
-
);
|
|
2858
|
-
}
|
|
2859
|
-
});
|
|
2860
|
-
this.metadataCache.set(metadataUrl, metadata);
|
|
2861
|
-
return metadata;
|
|
2862
|
-
} catch (error) {
|
|
2863
|
-
console.warn(`Failed to load metadata from ${metadataUrl}:`, error);
|
|
2864
|
-
return [];
|
|
2865
|
-
}
|
|
2866
|
-
}
|
|
2867
|
-
async loadFromDirectory(directoryUrl) {
|
|
2868
|
-
try {
|
|
2869
|
-
const manifestUrl = `${directoryUrl}/manifest.json`;
|
|
2870
|
-
return await this.loadMetadata(manifestUrl);
|
|
2871
|
-
} catch (error) {
|
|
2872
|
-
throw new Error(
|
|
2873
|
-
`Directory manifest not found at ${directoryUrl}/manifest.json: ${error}`
|
|
2874
|
-
);
|
|
2875
|
-
}
|
|
2876
|
-
}
|
|
2877
|
-
clearCache() {
|
|
2878
|
-
this.metadataCache.clear();
|
|
2879
|
-
}
|
|
2880
|
-
getCachedMetadata(metadataUrl) {
|
|
2881
|
-
return this.metadataCache.get(metadataUrl);
|
|
2882
|
-
}
|
|
2883
|
-
};
|
|
2884
|
-
var metadataLoader = new MetadataLoader();
|
|
2885
|
-
|
|
2886
2831
|
// src/services/registry.ts
|
|
2887
2832
|
var PluginRegistryImpl = class {
|
|
2888
2833
|
constructor() {
|
|
@@ -2967,20 +2912,27 @@ var hostConfigLoader = new HostConfigLoader();
|
|
|
2967
2912
|
// src/context/AuthContext.tsx
|
|
2968
2913
|
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
2969
2914
|
var AuthContext = createContext2(void 0);
|
|
2970
|
-
var AuthProvider = ({
|
|
2971
|
-
|
|
2972
|
-
|
|
2915
|
+
var AuthProvider = ({
|
|
2916
|
+
children,
|
|
2917
|
+
onNavigate,
|
|
2918
|
+
storage = typeof window !== "undefined" ? window.localStorage : null,
|
|
2919
|
+
authService: authService2 = authService,
|
|
2920
|
+
initialUser = null,
|
|
2921
|
+
initialAccessToken = null
|
|
2922
|
+
}) => {
|
|
2923
|
+
const [user, setUser] = useState2(initialUser);
|
|
2924
|
+
const [accessToken, setToken] = useState2(initialAccessToken ?? null);
|
|
2973
2925
|
const [loading, setLoading] = useState2(true);
|
|
2974
2926
|
useEffect2(() => {
|
|
2975
2927
|
try {
|
|
2976
|
-
const storedUser =
|
|
2928
|
+
const storedUser = storage?.getItem("user");
|
|
2977
2929
|
if (storedUser)
|
|
2978
2930
|
setUser(JSON.parse(storedUser));
|
|
2979
2931
|
} catch {
|
|
2980
2932
|
}
|
|
2981
2933
|
try {
|
|
2982
|
-
const savedAccess =
|
|
2983
|
-
const savedRefresh =
|
|
2934
|
+
const savedAccess = storage?.getItem("accessToken");
|
|
2935
|
+
const savedRefresh = storage?.getItem("refreshToken");
|
|
2984
2936
|
if (savedAccess) {
|
|
2985
2937
|
setToken(savedAccess);
|
|
2986
2938
|
setAccessToken(savedAccess);
|
|
@@ -2991,15 +2943,17 @@ var AuthProvider = ({ children, onNavigate }) => {
|
|
|
2991
2943
|
} catch {
|
|
2992
2944
|
}
|
|
2993
2945
|
setLoading(false);
|
|
2994
|
-
}, []);
|
|
2946
|
+
}, [storage]);
|
|
2995
2947
|
const login = async (username, password, options) => {
|
|
2996
|
-
const resp = await
|
|
2948
|
+
const resp = await authService2.login(username, password);
|
|
2997
2949
|
setToken(resp.accessToken);
|
|
2998
2950
|
setAccessToken(resp.accessToken);
|
|
2999
2951
|
setRefreshToken(resp.refreshToken);
|
|
3000
2952
|
setUser(resp.user);
|
|
3001
2953
|
try {
|
|
3002
|
-
|
|
2954
|
+
storage?.setItem("user", JSON.stringify(resp.user));
|
|
2955
|
+
storage?.setItem("accessToken", resp.accessToken);
|
|
2956
|
+
storage?.setItem("refreshToken", resp.refreshToken);
|
|
3003
2957
|
} catch {
|
|
3004
2958
|
}
|
|
3005
2959
|
if (options?.redirect !== false)
|
|
@@ -3007,13 +2961,15 @@ var AuthProvider = ({ children, onNavigate }) => {
|
|
|
3007
2961
|
};
|
|
3008
2962
|
const logout = async () => {
|
|
3009
2963
|
try {
|
|
3010
|
-
await
|
|
2964
|
+
await authService2.logout();
|
|
3011
2965
|
} finally {
|
|
3012
2966
|
setToken(null);
|
|
3013
2967
|
clearTokens();
|
|
3014
2968
|
setUser(null);
|
|
3015
2969
|
try {
|
|
3016
|
-
|
|
2970
|
+
storage?.removeItem("user");
|
|
2971
|
+
storage?.removeItem("accessToken");
|
|
2972
|
+
storage?.removeItem("refreshToken");
|
|
3017
2973
|
} catch {
|
|
3018
2974
|
}
|
|
3019
2975
|
onNavigate?.("/login");
|
|
@@ -3025,26 +2981,31 @@ var AuthProvider = ({ children, onNavigate }) => {
|
|
|
3025
2981
|
const want = Array.isArray(roles) ? roles : [roles];
|
|
3026
2982
|
return want.some((r) => user.role === r);
|
|
3027
2983
|
};
|
|
3028
|
-
return /* @__PURE__ */ jsx2(AuthContext
|
|
2984
|
+
return /* @__PURE__ */ jsx2(AuthContext, { value: { user, accessToken, loading, login, logout, hasRole }, children });
|
|
3029
2985
|
};
|
|
3030
2986
|
function useAuth() {
|
|
3031
|
-
const ctx =
|
|
2987
|
+
const ctx = use2(AuthContext);
|
|
3032
2988
|
if (!ctx)
|
|
3033
2989
|
throw new Error("useAuth must be used within AuthProvider");
|
|
3034
2990
|
return ctx;
|
|
3035
2991
|
}
|
|
3036
2992
|
|
|
3037
2993
|
// src/context/SharedUiProvider.tsx
|
|
3038
|
-
import
|
|
2994
|
+
import React3 from "react";
|
|
3039
2995
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
3040
2996
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
3041
2997
|
function SharedUiProvider({ children, client }) {
|
|
3042
|
-
const
|
|
2998
|
+
const ref = React3.useRef(null);
|
|
2999
|
+
if (!ref.current)
|
|
3000
|
+
ref.current = client ?? new QueryClient();
|
|
3001
|
+
const internal = ref.current;
|
|
3043
3002
|
return /* @__PURE__ */ jsx3(QueryClientProvider, { client: internal, children });
|
|
3044
3003
|
}
|
|
3045
3004
|
export {
|
|
3005
|
+
AuthContext,
|
|
3046
3006
|
AuthProvider,
|
|
3047
3007
|
SharedUiProvider,
|
|
3008
|
+
ThemeContext,
|
|
3048
3009
|
ThemeProvider,
|
|
3049
3010
|
useAuth
|
|
3050
3011
|
};
|
package/dist/hooks.cjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
7
|
var __export = (target, all3) => {
|
|
@@ -18,14 +16,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
16
|
}
|
|
19
17
|
return to;
|
|
20
18
|
};
|
|
21
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
-
mod
|
|
28
|
-
));
|
|
29
19
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
20
|
var __publicField = (obj, key, value) => {
|
|
31
21
|
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
@@ -2871,69 +2861,6 @@ var fetchApi = {
|
|
|
2871
2861
|
}
|
|
2872
2862
|
};
|
|
2873
2863
|
|
|
2874
|
-
// src/services/loadRemoteModule.ts
|
|
2875
|
-
var React = __toESM(require("react"), 1);
|
|
2876
|
-
var ReactDOM = __toESM(require("react-dom"), 1);
|
|
2877
|
-
|
|
2878
|
-
// src/services/metadataLoader.ts
|
|
2879
|
-
var MetadataLoader = class {
|
|
2880
|
-
constructor() {
|
|
2881
|
-
__publicField(this, "metadataCache", /* @__PURE__ */ new Map());
|
|
2882
|
-
}
|
|
2883
|
-
async loadMetadata(metadataUrl) {
|
|
2884
|
-
if (this.metadataCache.has(metadataUrl)) {
|
|
2885
|
-
return this.metadataCache.get(metadataUrl) || [];
|
|
2886
|
-
}
|
|
2887
|
-
try {
|
|
2888
|
-
const response = await fetch(metadataUrl);
|
|
2889
|
-
console.log(response);
|
|
2890
|
-
if (!response.ok) {
|
|
2891
|
-
throw new Error(`Failed to fetch metadata: ${response.statusText}`);
|
|
2892
|
-
}
|
|
2893
|
-
const data = await response.json();
|
|
2894
|
-
let metadata;
|
|
2895
|
-
if (Array.isArray(data)) {
|
|
2896
|
-
metadata = data;
|
|
2897
|
-
} else if (data.pages && Array.isArray(data.pages)) {
|
|
2898
|
-
metadata = data.pages;
|
|
2899
|
-
} else {
|
|
2900
|
-
throw new Error(
|
|
2901
|
-
"Invalid metadata format: expected array or object with pages property"
|
|
2902
|
-
);
|
|
2903
|
-
}
|
|
2904
|
-
metadata.forEach((page, index) => {
|
|
2905
|
-
if (!page.id || !page.name || !page.path || !page.url) {
|
|
2906
|
-
throw new Error(
|
|
2907
|
-
`Invalid page metadata at index ${index}: missing required fields`
|
|
2908
|
-
);
|
|
2909
|
-
}
|
|
2910
|
-
});
|
|
2911
|
-
this.metadataCache.set(metadataUrl, metadata);
|
|
2912
|
-
return metadata;
|
|
2913
|
-
} catch (error) {
|
|
2914
|
-
console.warn(`Failed to load metadata from ${metadataUrl}:`, error);
|
|
2915
|
-
return [];
|
|
2916
|
-
}
|
|
2917
|
-
}
|
|
2918
|
-
async loadFromDirectory(directoryUrl) {
|
|
2919
|
-
try {
|
|
2920
|
-
const manifestUrl = `${directoryUrl}/manifest.json`;
|
|
2921
|
-
return await this.loadMetadata(manifestUrl);
|
|
2922
|
-
} catch (error) {
|
|
2923
|
-
throw new Error(
|
|
2924
|
-
`Directory manifest not found at ${directoryUrl}/manifest.json: ${error}`
|
|
2925
|
-
);
|
|
2926
|
-
}
|
|
2927
|
-
}
|
|
2928
|
-
clearCache() {
|
|
2929
|
-
this.metadataCache.clear();
|
|
2930
|
-
}
|
|
2931
|
-
getCachedMetadata(metadataUrl) {
|
|
2932
|
-
return this.metadataCache.get(metadataUrl);
|
|
2933
|
-
}
|
|
2934
|
-
};
|
|
2935
|
-
var metadataLoader = new MetadataLoader();
|
|
2936
|
-
|
|
2937
2864
|
// src/services/registry.ts
|
|
2938
2865
|
var PluginRegistryImpl = class {
|
|
2939
2866
|
constructor() {
|
package/dist/hooks.js
CHANGED
|
@@ -2838,69 +2838,6 @@ var fetchApi = {
|
|
|
2838
2838
|
}
|
|
2839
2839
|
};
|
|
2840
2840
|
|
|
2841
|
-
// src/services/loadRemoteModule.ts
|
|
2842
|
-
import * as React from "react";
|
|
2843
|
-
import * as ReactDOM from "react-dom";
|
|
2844
|
-
|
|
2845
|
-
// src/services/metadataLoader.ts
|
|
2846
|
-
var MetadataLoader = class {
|
|
2847
|
-
constructor() {
|
|
2848
|
-
__publicField(this, "metadataCache", /* @__PURE__ */ new Map());
|
|
2849
|
-
}
|
|
2850
|
-
async loadMetadata(metadataUrl) {
|
|
2851
|
-
if (this.metadataCache.has(metadataUrl)) {
|
|
2852
|
-
return this.metadataCache.get(metadataUrl) || [];
|
|
2853
|
-
}
|
|
2854
|
-
try {
|
|
2855
|
-
const response = await fetch(metadataUrl);
|
|
2856
|
-
console.log(response);
|
|
2857
|
-
if (!response.ok) {
|
|
2858
|
-
throw new Error(`Failed to fetch metadata: ${response.statusText}`);
|
|
2859
|
-
}
|
|
2860
|
-
const data = await response.json();
|
|
2861
|
-
let metadata;
|
|
2862
|
-
if (Array.isArray(data)) {
|
|
2863
|
-
metadata = data;
|
|
2864
|
-
} else if (data.pages && Array.isArray(data.pages)) {
|
|
2865
|
-
metadata = data.pages;
|
|
2866
|
-
} else {
|
|
2867
|
-
throw new Error(
|
|
2868
|
-
"Invalid metadata format: expected array or object with pages property"
|
|
2869
|
-
);
|
|
2870
|
-
}
|
|
2871
|
-
metadata.forEach((page, index) => {
|
|
2872
|
-
if (!page.id || !page.name || !page.path || !page.url) {
|
|
2873
|
-
throw new Error(
|
|
2874
|
-
`Invalid page metadata at index ${index}: missing required fields`
|
|
2875
|
-
);
|
|
2876
|
-
}
|
|
2877
|
-
});
|
|
2878
|
-
this.metadataCache.set(metadataUrl, metadata);
|
|
2879
|
-
return metadata;
|
|
2880
|
-
} catch (error) {
|
|
2881
|
-
console.warn(`Failed to load metadata from ${metadataUrl}:`, error);
|
|
2882
|
-
return [];
|
|
2883
|
-
}
|
|
2884
|
-
}
|
|
2885
|
-
async loadFromDirectory(directoryUrl) {
|
|
2886
|
-
try {
|
|
2887
|
-
const manifestUrl = `${directoryUrl}/manifest.json`;
|
|
2888
|
-
return await this.loadMetadata(manifestUrl);
|
|
2889
|
-
} catch (error) {
|
|
2890
|
-
throw new Error(
|
|
2891
|
-
`Directory manifest not found at ${directoryUrl}/manifest.json: ${error}`
|
|
2892
|
-
);
|
|
2893
|
-
}
|
|
2894
|
-
}
|
|
2895
|
-
clearCache() {
|
|
2896
|
-
this.metadataCache.clear();
|
|
2897
|
-
}
|
|
2898
|
-
getCachedMetadata(metadataUrl) {
|
|
2899
|
-
return this.metadataCache.get(metadataUrl);
|
|
2900
|
-
}
|
|
2901
|
-
};
|
|
2902
|
-
var metadataLoader = new MetadataLoader();
|
|
2903
|
-
|
|
2904
2841
|
// src/services/registry.ts
|
|
2905
2842
|
var PluginRegistryImpl = class {
|
|
2906
2843
|
constructor() {
|