@stratum-hq/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ConfigEditor.d.ts +5 -0
- package/dist/components/ConfigEditor.d.ts.map +1 -0
- package/dist/components/ConfigEditor.js +71 -0
- package/dist/components/ConfigEditor.js.map +1 -0
- package/dist/components/ConfigEditor.stories.d.ts +35 -0
- package/dist/components/ConfigEditor.stories.d.ts.map +1 -0
- package/dist/components/ConfigEditor.stories.js +73 -0
- package/dist/components/ConfigEditor.stories.js.map +1 -0
- package/dist/components/PermissionEditor.d.ts +5 -0
- package/dist/components/PermissionEditor.d.ts.map +1 -0
- package/dist/components/PermissionEditor.js +46 -0
- package/dist/components/PermissionEditor.js.map +1 -0
- package/dist/components/PermissionEditor.stories.d.ts +34 -0
- package/dist/components/PermissionEditor.stories.d.ts.map +1 -0
- package/dist/components/PermissionEditor.stories.js +90 -0
- package/dist/components/PermissionEditor.stories.js.map +1 -0
- package/dist/components/Skeleton.d.ts +14 -0
- package/dist/components/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton.js +25 -0
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/components/Skeleton.stories.d.ts +46 -0
- package/dist/components/Skeleton.stories.d.ts.map +1 -0
- package/dist/components/Skeleton.stories.js +125 -0
- package/dist/components/Skeleton.stories.js.map +1 -0
- package/dist/components/TableSkeleton.d.ts +10 -0
- package/dist/components/TableSkeleton.d.ts.map +1 -0
- package/dist/components/TableSkeleton.js +6 -0
- package/dist/components/TableSkeleton.js.map +1 -0
- package/dist/components/TenantSwitcher.d.ts +7 -0
- package/dist/components/TenantSwitcher.d.ts.map +1 -0
- package/dist/components/TenantSwitcher.js +40 -0
- package/dist/components/TenantSwitcher.js.map +1 -0
- package/dist/components/TenantSwitcher.stories.d.ts +30 -0
- package/dist/components/TenantSwitcher.stories.d.ts.map +1 -0
- package/dist/components/TenantSwitcher.stories.js +76 -0
- package/dist/components/TenantSwitcher.stories.js.map +1 -0
- package/dist/components/TenantTree.d.ts +7 -0
- package/dist/components/TenantTree.d.ts.map +1 -0
- package/dist/components/TenantTree.js +19 -0
- package/dist/components/TenantTree.js.map +1 -0
- package/dist/components/TenantTree.stories.d.ts +28 -0
- package/dist/components/TenantTree.stories.d.ts.map +1 -0
- package/dist/components/TenantTree.stories.js +71 -0
- package/dist/components/TenantTree.stories.js.map +1 -0
- package/dist/components/Toast.d.ts +18 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +22 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Toast.stories.d.ts +36 -0
- package/dist/components/Toast.stories.d.ts.map +1 -0
- package/dist/components/Toast.stories.js +105 -0
- package/dist/components/Toast.stories.js.map +1 -0
- package/dist/components/ToastContainer.d.ts +11 -0
- package/dist/components/ToastContainer.d.ts.map +1 -0
- package/dist/components/ToastContainer.js +9 -0
- package/dist/components/ToastContainer.js.map +1 -0
- package/dist/components/headless/ConfigEditor.d.ts +15 -0
- package/dist/components/headless/ConfigEditor.d.ts.map +1 -0
- package/dist/components/headless/ConfigEditor.js +7 -0
- package/dist/components/headless/ConfigEditor.js.map +1 -0
- package/dist/components/headless/PermissionEditor.d.ts +15 -0
- package/dist/components/headless/PermissionEditor.d.ts.map +1 -0
- package/dist/components/headless/PermissionEditor.js +7 -0
- package/dist/components/headless/PermissionEditor.js.map +1 -0
- package/dist/components/headless/TenantSwitcher.d.ts +39 -0
- package/dist/components/headless/TenantSwitcher.d.ts.map +1 -0
- package/dist/components/headless/TenantSwitcher.js +61 -0
- package/dist/components/headless/TenantSwitcher.js.map +1 -0
- package/dist/components/headless/TenantTree.d.ts +21 -0
- package/dist/components/headless/TenantTree.d.ts.map +1 -0
- package/dist/components/headless/TenantTree.js +22 -0
- package/dist/components/headless/TenantTree.js.map +1 -0
- package/dist/components/storybook-helpers.d.ts +96 -0
- package/dist/components/storybook-helpers.d.ts.map +1 -0
- package/dist/components/storybook-helpers.js +473 -0
- package/dist/components/storybook-helpers.js.map +1 -0
- package/dist/hooks/use-config.d.ts +16 -0
- package/dist/hooks/use-config.d.ts.map +1 -0
- package/dist/hooks/use-config.js +54 -0
- package/dist/hooks/use-config.js.map +1 -0
- package/dist/hooks/use-messages.d.ts +11 -0
- package/dist/hooks/use-messages.d.ts.map +1 -0
- package/dist/hooks/use-messages.js +23 -0
- package/dist/hooks/use-messages.js.map +1 -0
- package/dist/hooks/use-permissions.d.ts +10 -0
- package/dist/hooks/use-permissions.d.ts.map +1 -0
- package/dist/hooks/use-permissions.js +48 -0
- package/dist/hooks/use-permissions.js.map +1 -0
- package/dist/hooks/use-tenant-tree.d.ts +13 -0
- package/dist/hooks/use-tenant-tree.d.ts.map +1 -0
- package/dist/hooks/use-tenant-tree.js +65 -0
- package/dist/hooks/use-tenant-tree.js.map +1 -0
- package/dist/hooks/use-tenant.d.ts +23 -0
- package/dist/hooks/use-tenant.d.ts.map +1 -0
- package/dist/hooks/use-tenant.js +6 -0
- package/dist/hooks/use-tenant.js.map +1 -0
- package/dist/hooks/use-toast.d.ts +14 -0
- package/dist/hooks/use-toast.d.ts.map +1 -0
- package/dist/hooks/use-toast.js +46 -0
- package/dist/hooks/use-toast.js.map +1 -0
- package/dist/i18n.d.ts +57 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +59 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/provider.d.ts +30 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +82 -0
- package/dist/provider.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from "react";
|
|
2
|
+
import { useStratum } from "../provider.js";
|
|
3
|
+
import { useTenant } from "./use-tenant.js";
|
|
4
|
+
export function usePermissions() {
|
|
5
|
+
const { apiCall } = useStratum();
|
|
6
|
+
const { tenant } = useTenant();
|
|
7
|
+
const [permissions, setPermissions] = useState([]);
|
|
8
|
+
const [loading, setLoading] = useState(false);
|
|
9
|
+
const [error, setError] = useState(null);
|
|
10
|
+
const fetchPermissions = useCallback(async () => {
|
|
11
|
+
if (!tenant)
|
|
12
|
+
return;
|
|
13
|
+
setLoading(true);
|
|
14
|
+
setError(null);
|
|
15
|
+
try {
|
|
16
|
+
const result = await apiCall(`/api/v1/tenants/${tenant.id}/permissions`);
|
|
17
|
+
setPermissions(Object.values(result));
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
setLoading(false);
|
|
24
|
+
}
|
|
25
|
+
}, [apiCall, tenant]);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
fetchPermissions();
|
|
28
|
+
}, [fetchPermissions]);
|
|
29
|
+
const createPermission = useCallback(async (key, value, mode, revocationMode) => {
|
|
30
|
+
if (!tenant)
|
|
31
|
+
return;
|
|
32
|
+
await apiCall(`/api/v1/tenants/${tenant.id}/permissions`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
body: JSON.stringify({ key, value, mode, revocation_mode: revocationMode }),
|
|
35
|
+
});
|
|
36
|
+
await fetchPermissions();
|
|
37
|
+
}, [apiCall, tenant, fetchPermissions]);
|
|
38
|
+
const deletePermission = useCallback(async (policyId) => {
|
|
39
|
+
if (!tenant)
|
|
40
|
+
return;
|
|
41
|
+
await apiCall(`/api/v1/tenants/${tenant.id}/permissions/${policyId}`, {
|
|
42
|
+
method: "DELETE",
|
|
43
|
+
});
|
|
44
|
+
await fetchPermissions();
|
|
45
|
+
}, [apiCall, tenant, fetchPermissions]);
|
|
46
|
+
return { permissions, loading, error, refresh: fetchPermissions, createPermission, deletePermission };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=use-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-permissions.js","sourceRoot":"","sources":["../../src/hooks/use-permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAuB,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,mBAAmB,MAAM,CAAC,EAAE,cAAc,CAC3C,CAAC;YACF,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtB,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,GAAW,EAAE,KAAc,EAAE,IAAY,EAAE,cAAsB,EAAE,EAAE;QAC1E,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,OAAO,CAAC,mBAAmB,MAAM,CAAC,EAAE,cAAc,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;SAC5E,CAAC,CAAC;QACH,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC,EACD,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CACpC,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,QAAgB,EAAE,EAAE;QACzB,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,OAAO,CAAC,mBAAmB,MAAM,CAAC,EAAE,gBAAgB,QAAQ,EAAE,EAAE;YACpE,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QACH,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC,EACD,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CACpC,CAAC;IAEF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TenantNode } from "@stratum-hq/core";
|
|
2
|
+
export interface TenantTreeNode extends TenantNode {
|
|
3
|
+
children: TenantTreeNode[];
|
|
4
|
+
expanded: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function useTenantTree(rootId?: string): {
|
|
7
|
+
tree: TenantTreeNode[];
|
|
8
|
+
loading: boolean;
|
|
9
|
+
error: Error | null;
|
|
10
|
+
refresh: () => Promise<void>;
|
|
11
|
+
toggleExpand: (nodeId: string) => void;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=use-tenant-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tenant-tree.d.ts","sourceRoot":"","sources":["../../src/hooks/use-tenant-tree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM;;;;;2BAoDD,MAAM;EAajD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback } from "react";
|
|
2
|
+
import { useStratum } from "../provider.js";
|
|
3
|
+
export function useTenantTree(rootId) {
|
|
4
|
+
const { apiCall } = useStratum();
|
|
5
|
+
const [tree, setTree] = useState([]);
|
|
6
|
+
const [loading, setLoading] = useState(false);
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
const buildTree = useCallback((nodes) => {
|
|
9
|
+
const map = new Map();
|
|
10
|
+
for (const node of nodes) {
|
|
11
|
+
const treeNode = { ...node, children: [], expanded: false };
|
|
12
|
+
const parentKey = node.parent_id;
|
|
13
|
+
if (!map.has(parentKey))
|
|
14
|
+
map.set(parentKey, []);
|
|
15
|
+
map.get(parentKey).push(treeNode);
|
|
16
|
+
}
|
|
17
|
+
function attachChildren(parent) {
|
|
18
|
+
const children = map.get(parent.id) || [];
|
|
19
|
+
parent.children = children;
|
|
20
|
+
for (const child of children) {
|
|
21
|
+
attachChildren(child);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const roots = map.get(rootId || null) || [];
|
|
25
|
+
for (const root of roots) {
|
|
26
|
+
attachChildren(root);
|
|
27
|
+
}
|
|
28
|
+
return roots;
|
|
29
|
+
}, [rootId]);
|
|
30
|
+
const fetchTree = useCallback(async () => {
|
|
31
|
+
setLoading(true);
|
|
32
|
+
setError(null);
|
|
33
|
+
try {
|
|
34
|
+
const path = rootId
|
|
35
|
+
? `/api/v1/tenants/${rootId}/descendants`
|
|
36
|
+
: `/api/v1/tenants`;
|
|
37
|
+
const res = await apiCall(path);
|
|
38
|
+
const nodes = Array.isArray(res) ? res : res.data;
|
|
39
|
+
setTree(buildTree(nodes));
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
setLoading(false);
|
|
46
|
+
}
|
|
47
|
+
}, [apiCall, rootId, buildTree]);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
fetchTree();
|
|
50
|
+
}, [fetchTree]);
|
|
51
|
+
const toggleExpand = useCallback((nodeId) => {
|
|
52
|
+
setTree((prev) => {
|
|
53
|
+
function toggle(nodes) {
|
|
54
|
+
return nodes.map((n) => {
|
|
55
|
+
if (n.id === nodeId)
|
|
56
|
+
return { ...n, expanded: !n.expanded };
|
|
57
|
+
return { ...n, children: toggle(n.children) };
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return toggle(prev);
|
|
61
|
+
});
|
|
62
|
+
}, []);
|
|
63
|
+
return { tree, loading, error, refresh: fetchTree, toggleExpand };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=use-tenant-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tenant-tree.js","sourceRoot":"","sources":["../../src/hooks/use-tenant-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare function useTenant(): {
|
|
2
|
+
tenant: {
|
|
3
|
+
id: string;
|
|
4
|
+
status: "active" | "archived";
|
|
5
|
+
metadata: Record<string, unknown>;
|
|
6
|
+
created_at: string;
|
|
7
|
+
updated_at: string;
|
|
8
|
+
slug: string;
|
|
9
|
+
parent_id: string | null;
|
|
10
|
+
ancestry_path: string;
|
|
11
|
+
depth: number;
|
|
12
|
+
name: string;
|
|
13
|
+
config: Record<string, unknown>;
|
|
14
|
+
isolation_strategy: "SHARED_RLS" | "SCHEMA_PER_TENANT" | "DB_PER_TENANT";
|
|
15
|
+
deleted_at: string | null;
|
|
16
|
+
region_id?: string | null | undefined;
|
|
17
|
+
} | null;
|
|
18
|
+
context: import("@stratum-hq/core").TenantContextLegacy | null;
|
|
19
|
+
loading: boolean;
|
|
20
|
+
error: Error | null;
|
|
21
|
+
switchTenant: (tenantId: string) => Promise<void>;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=use-tenant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tenant.d.ts","sourceRoot":"","sources":["../../src/hooks/use-tenant.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS;;;;;;;;;;;;;;;;;;;;;EAGxB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { useStratum } from "../provider.js";
|
|
2
|
+
export function useTenant() {
|
|
3
|
+
const { currentTenant, tenantContext, loading, error, switchTenant } = useStratum();
|
|
4
|
+
return { tenant: currentTenant, context: tenantContext, loading, error, switchTenant };
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=use-tenant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tenant.js","sourceRoot":"","sources":["../../src/hooks/use-tenant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,UAAU,SAAS;IACvB,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,UAAU,EAAE,CAAC;IACpF,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ToastData } from "../components/Toast.js";
|
|
2
|
+
export interface UseToastReturn {
|
|
3
|
+
toasts: ToastData[];
|
|
4
|
+
toast: {
|
|
5
|
+
success: (message: string) => string;
|
|
6
|
+
error: (message: string) => string;
|
|
7
|
+
warning: (message: string) => string;
|
|
8
|
+
info: (message: string) => string;
|
|
9
|
+
};
|
|
10
|
+
dismiss: (id: string) => void;
|
|
11
|
+
dismissAll: () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function useToast(): UseToastReturn;
|
|
14
|
+
//# sourceMappingURL=use-toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-toast.d.ts","sourceRoot":"","sources":["../../src/hooks/use-toast.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,wBAAwB,CAAC;AASnE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE;QACL,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;QACrC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;QACnC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;KACnC,CAAC;IACF,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,QAAQ,IAAI,cAAc,CAiDzC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useState, useCallback, useRef } from "react";
|
|
2
|
+
let toastCounter = 0;
|
|
3
|
+
function generateId() {
|
|
4
|
+
toastCounter += 1;
|
|
5
|
+
return `stratum-toast-${toastCounter}-${Date.now()}`;
|
|
6
|
+
}
|
|
7
|
+
export function useToast() {
|
|
8
|
+
const [toasts, setToasts] = useState([]);
|
|
9
|
+
const timersRef = useRef(new Map());
|
|
10
|
+
const dismiss = useCallback((id) => {
|
|
11
|
+
const timer = timersRef.current.get(id);
|
|
12
|
+
if (timer) {
|
|
13
|
+
clearTimeout(timer);
|
|
14
|
+
timersRef.current.delete(id);
|
|
15
|
+
}
|
|
16
|
+
setToasts((prev) => prev.filter((t) => t.id !== id));
|
|
17
|
+
}, []);
|
|
18
|
+
const dismissAll = useCallback(() => {
|
|
19
|
+
for (const timer of timersRef.current.values()) {
|
|
20
|
+
clearTimeout(timer);
|
|
21
|
+
}
|
|
22
|
+
timersRef.current.clear();
|
|
23
|
+
setToasts([]);
|
|
24
|
+
}, []);
|
|
25
|
+
const addToast = useCallback((message, type) => {
|
|
26
|
+
const id = generateId();
|
|
27
|
+
const newToast = { id, message, type };
|
|
28
|
+
setToasts((prev) => [newToast, ...prev]);
|
|
29
|
+
// Auto-dismiss non-error toasts after 4 seconds
|
|
30
|
+
if (type !== "error") {
|
|
31
|
+
const timer = setTimeout(() => {
|
|
32
|
+
dismiss(id);
|
|
33
|
+
}, 4000);
|
|
34
|
+
timersRef.current.set(id, timer);
|
|
35
|
+
}
|
|
36
|
+
return id;
|
|
37
|
+
}, [dismiss]);
|
|
38
|
+
const toast = {
|
|
39
|
+
success: useCallback((message) => addToast(message, "success"), [addToast]),
|
|
40
|
+
error: useCallback((message) => addToast(message, "error"), [addToast]),
|
|
41
|
+
warning: useCallback((message) => addToast(message, "warning"), [addToast]),
|
|
42
|
+
info: useCallback((message) => addToast(message, "info"), [addToast]),
|
|
43
|
+
};
|
|
44
|
+
return { toasts, toast, dismiss, dismissAll };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=use-toast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-toast.js","sourceRoot":"","sources":["../../src/hooks/use-toast.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default i18n messages for all Stratum React UI components.
|
|
3
|
+
*
|
|
4
|
+
* Keys use dot-separated component namespaces. Values may contain
|
|
5
|
+
* `{param}` placeholders that are interpolated at runtime by `t()`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const defaultMessages: {
|
|
8
|
+
readonly "tenantSwitcher.loading": "Loading tenants...";
|
|
9
|
+
readonly "tenantSwitcher.placeholder": "Select tenant...";
|
|
10
|
+
readonly "tenantSwitcher.searchPlaceholder": "Search tenants...";
|
|
11
|
+
readonly "tenantSwitcher.searchLabel": "Search tenants";
|
|
12
|
+
readonly "tenantTree.loading": "Loading tree...";
|
|
13
|
+
readonly "tenantTree.error": "Error: {message}";
|
|
14
|
+
readonly "tenantTree.collapse": "Collapse";
|
|
15
|
+
readonly "tenantTree.expand": "Expand";
|
|
16
|
+
readonly "tenantTree.badgeRls": "RLS";
|
|
17
|
+
readonly "tenantTree.archived": " (archived)";
|
|
18
|
+
readonly "configEditor.loading": "Loading config...";
|
|
19
|
+
readonly "configEditor.error": "Error: {message}";
|
|
20
|
+
readonly "configEditor.columnKey": "Key";
|
|
21
|
+
readonly "configEditor.columnValue": "Value";
|
|
22
|
+
readonly "configEditor.columnSource": "Source";
|
|
23
|
+
readonly "configEditor.columnStatus": "Status";
|
|
24
|
+
readonly "configEditor.columnActions": "Actions";
|
|
25
|
+
readonly "configEditor.editLabel": "Edit value for {key}";
|
|
26
|
+
readonly "configEditor.locked": "Locked";
|
|
27
|
+
readonly "configEditor.inherited": "Inherited";
|
|
28
|
+
readonly "configEditor.own": "Own";
|
|
29
|
+
readonly "configEditor.saveButton": "Save";
|
|
30
|
+
readonly "configEditor.cancelButton": "Cancel";
|
|
31
|
+
readonly "configEditor.editButton": "Edit";
|
|
32
|
+
readonly "configEditor.removeButton": "Remove";
|
|
33
|
+
readonly "configEditor.keyPlaceholder": "New key";
|
|
34
|
+
readonly "configEditor.keyLabel": "New config key";
|
|
35
|
+
readonly "configEditor.valuePlaceholder": "Value (JSON or string)";
|
|
36
|
+
readonly "configEditor.valueLabel": "New config value";
|
|
37
|
+
readonly "configEditor.addButton": "Add";
|
|
38
|
+
readonly "permissionEditor.loading": "Loading permissions...";
|
|
39
|
+
readonly "permissionEditor.error": "Error: {message}";
|
|
40
|
+
readonly "permissionEditor.columnKey": "Key";
|
|
41
|
+
readonly "permissionEditor.columnValue": "Value";
|
|
42
|
+
readonly "permissionEditor.columnMode": "Mode";
|
|
43
|
+
readonly "permissionEditor.columnSource": "Source";
|
|
44
|
+
readonly "permissionEditor.columnStatus": "Status";
|
|
45
|
+
readonly "permissionEditor.columnActions": "Actions";
|
|
46
|
+
readonly "permissionEditor.locked": "Locked";
|
|
47
|
+
readonly "permissionEditor.delegated": "Delegated";
|
|
48
|
+
readonly "permissionEditor.removeButton": "Remove";
|
|
49
|
+
readonly "permissionEditor.keyPlaceholder": "Permission key";
|
|
50
|
+
readonly "permissionEditor.keyLabel": "New permission key";
|
|
51
|
+
readonly "permissionEditor.modeLabel": "Permission mode";
|
|
52
|
+
readonly "permissionEditor.revocationModeLabel": "Revocation mode";
|
|
53
|
+
readonly "permissionEditor.addButton": "Add";
|
|
54
|
+
};
|
|
55
|
+
export type MessageKey = keyof typeof defaultMessages;
|
|
56
|
+
export type Messages = Partial<Record<MessageKey, string>>;
|
|
57
|
+
//# sourceMappingURL=i18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDlB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,eAAe,CAAC;AACtD,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC"}
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default i18n messages for all Stratum React UI components.
|
|
3
|
+
*
|
|
4
|
+
* Keys use dot-separated component namespaces. Values may contain
|
|
5
|
+
* `{param}` placeholders that are interpolated at runtime by `t()`.
|
|
6
|
+
*/
|
|
7
|
+
export const defaultMessages = {
|
|
8
|
+
// TenantSwitcher
|
|
9
|
+
"tenantSwitcher.loading": "Loading tenants...",
|
|
10
|
+
"tenantSwitcher.placeholder": "Select tenant...",
|
|
11
|
+
"tenantSwitcher.searchPlaceholder": "Search tenants...",
|
|
12
|
+
"tenantSwitcher.searchLabel": "Search tenants",
|
|
13
|
+
// TenantTree
|
|
14
|
+
"tenantTree.loading": "Loading tree...",
|
|
15
|
+
"tenantTree.error": "Error: {message}",
|
|
16
|
+
"tenantTree.collapse": "Collapse",
|
|
17
|
+
"tenantTree.expand": "Expand",
|
|
18
|
+
"tenantTree.badgeRls": "RLS",
|
|
19
|
+
"tenantTree.archived": " (archived)",
|
|
20
|
+
// ConfigEditor
|
|
21
|
+
"configEditor.loading": "Loading config...",
|
|
22
|
+
"configEditor.error": "Error: {message}",
|
|
23
|
+
"configEditor.columnKey": "Key",
|
|
24
|
+
"configEditor.columnValue": "Value",
|
|
25
|
+
"configEditor.columnSource": "Source",
|
|
26
|
+
"configEditor.columnStatus": "Status",
|
|
27
|
+
"configEditor.columnActions": "Actions",
|
|
28
|
+
"configEditor.editLabel": "Edit value for {key}",
|
|
29
|
+
"configEditor.locked": "Locked",
|
|
30
|
+
"configEditor.inherited": "Inherited",
|
|
31
|
+
"configEditor.own": "Own",
|
|
32
|
+
"configEditor.saveButton": "Save",
|
|
33
|
+
"configEditor.cancelButton": "Cancel",
|
|
34
|
+
"configEditor.editButton": "Edit",
|
|
35
|
+
"configEditor.removeButton": "Remove",
|
|
36
|
+
"configEditor.keyPlaceholder": "New key",
|
|
37
|
+
"configEditor.keyLabel": "New config key",
|
|
38
|
+
"configEditor.valuePlaceholder": "Value (JSON or string)",
|
|
39
|
+
"configEditor.valueLabel": "New config value",
|
|
40
|
+
"configEditor.addButton": "Add",
|
|
41
|
+
// PermissionEditor
|
|
42
|
+
"permissionEditor.loading": "Loading permissions...",
|
|
43
|
+
"permissionEditor.error": "Error: {message}",
|
|
44
|
+
"permissionEditor.columnKey": "Key",
|
|
45
|
+
"permissionEditor.columnValue": "Value",
|
|
46
|
+
"permissionEditor.columnMode": "Mode",
|
|
47
|
+
"permissionEditor.columnSource": "Source",
|
|
48
|
+
"permissionEditor.columnStatus": "Status",
|
|
49
|
+
"permissionEditor.columnActions": "Actions",
|
|
50
|
+
"permissionEditor.locked": "Locked",
|
|
51
|
+
"permissionEditor.delegated": "Delegated",
|
|
52
|
+
"permissionEditor.removeButton": "Remove",
|
|
53
|
+
"permissionEditor.keyPlaceholder": "Permission key",
|
|
54
|
+
"permissionEditor.keyLabel": "New permission key",
|
|
55
|
+
"permissionEditor.modeLabel": "Permission mode",
|
|
56
|
+
"permissionEditor.revocationModeLabel": "Revocation mode",
|
|
57
|
+
"permissionEditor.addButton": "Add",
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB;IACjB,wBAAwB,EAAE,oBAAoB;IAC9C,4BAA4B,EAAE,kBAAkB;IAChD,kCAAkC,EAAE,mBAAmB;IACvD,4BAA4B,EAAE,gBAAgB;IAE9C,aAAa;IACb,oBAAoB,EAAE,iBAAiB;IACvC,kBAAkB,EAAE,kBAAkB;IACtC,qBAAqB,EAAE,UAAU;IACjC,mBAAmB,EAAE,QAAQ;IAC7B,qBAAqB,EAAE,KAAK;IAC5B,qBAAqB,EAAE,aAAa;IAEpC,eAAe;IACf,sBAAsB,EAAE,mBAAmB;IAC3C,oBAAoB,EAAE,kBAAkB;IACxC,wBAAwB,EAAE,KAAK;IAC/B,0BAA0B,EAAE,OAAO;IACnC,2BAA2B,EAAE,QAAQ;IACrC,2BAA2B,EAAE,QAAQ;IACrC,4BAA4B,EAAE,SAAS;IACvC,wBAAwB,EAAE,sBAAsB;IAChD,qBAAqB,EAAE,QAAQ;IAC/B,wBAAwB,EAAE,WAAW;IACrC,kBAAkB,EAAE,KAAK;IACzB,yBAAyB,EAAE,MAAM;IACjC,2BAA2B,EAAE,QAAQ;IACrC,yBAAyB,EAAE,MAAM;IACjC,2BAA2B,EAAE,QAAQ;IACrC,6BAA6B,EAAE,SAAS;IACxC,uBAAuB,EAAE,gBAAgB;IACzC,+BAA+B,EAAE,wBAAwB;IACzD,yBAAyB,EAAE,kBAAkB;IAC7C,wBAAwB,EAAE,KAAK;IAE/B,mBAAmB;IACnB,0BAA0B,EAAE,wBAAwB;IACpD,wBAAwB,EAAE,kBAAkB;IAC5C,4BAA4B,EAAE,KAAK;IACnC,8BAA8B,EAAE,OAAO;IACvC,6BAA6B,EAAE,MAAM;IACrC,+BAA+B,EAAE,QAAQ;IACzC,+BAA+B,EAAE,QAAQ;IACzC,gCAAgC,EAAE,SAAS;IAC3C,yBAAyB,EAAE,QAAQ;IACnC,4BAA4B,EAAE,WAAW;IACzC,+BAA+B,EAAE,QAAQ;IACzC,iCAAiC,EAAE,gBAAgB;IACnD,2BAA2B,EAAE,oBAAoB;IACjD,4BAA4B,EAAE,iBAAiB;IAC/C,sCAAsC,EAAE,iBAAiB;IACzD,4BAA4B,EAAE,KAAK;CAC3B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export { StratumProvider, useStratum } from "./provider.js";
|
|
2
|
+
export type { StratumProviderProps, StratumContextValue } from "./provider.js";
|
|
3
|
+
export { defaultMessages } from "./i18n.js";
|
|
4
|
+
export type { MessageKey, Messages } from "./i18n.js";
|
|
5
|
+
export { useMessages } from "./hooks/use-messages.js";
|
|
6
|
+
export { useTenant } from "./hooks/use-tenant.js";
|
|
7
|
+
export { useTenantTree } from "./hooks/use-tenant-tree.js";
|
|
8
|
+
export type { TenantTreeNode } from "./hooks/use-tenant-tree.js";
|
|
9
|
+
export { useConfig } from "./hooks/use-config.js";
|
|
10
|
+
export type { ConfigWithInheritance } from "./hooks/use-config.js";
|
|
11
|
+
export { usePermissions } from "./hooks/use-permissions.js";
|
|
12
|
+
export { useToast } from "./hooks/use-toast.js";
|
|
13
|
+
export type { UseToastReturn } from "./hooks/use-toast.js";
|
|
14
|
+
export { TenantSwitcher } from "./components/TenantSwitcher.js";
|
|
15
|
+
export type { TenantSwitcherProps } from "./components/TenantSwitcher.js";
|
|
16
|
+
export { TenantTree } from "./components/TenantTree.js";
|
|
17
|
+
export type { TenantTreeProps } from "./components/TenantTree.js";
|
|
18
|
+
export { ConfigEditor } from "./components/ConfigEditor.js";
|
|
19
|
+
export type { ConfigEditorProps } from "./components/ConfigEditor.js";
|
|
20
|
+
export { PermissionEditor } from "./components/PermissionEditor.js";
|
|
21
|
+
export type { PermissionEditorProps } from "./components/PermissionEditor.js";
|
|
22
|
+
export { Skeleton } from "./components/Skeleton.js";
|
|
23
|
+
export type { SkeletonProps } from "./components/Skeleton.js";
|
|
24
|
+
export { TableSkeleton } from "./components/TableSkeleton.js";
|
|
25
|
+
export type { TableSkeletonProps } from "./components/TableSkeleton.js";
|
|
26
|
+
export { Toast } from "./components/Toast.js";
|
|
27
|
+
export type { ToastProps, ToastData, ToastType } from "./components/Toast.js";
|
|
28
|
+
export { ToastContainer } from "./components/ToastContainer.js";
|
|
29
|
+
export type { ToastContainerProps } from "./components/ToastContainer.js";
|
|
30
|
+
export { HeadlessTenantSwitcher } from "./components/headless/TenantSwitcher.js";
|
|
31
|
+
export type { HeadlessTenantSwitcherProps, HeadlessTenantSwitcherAPI } from "./components/headless/TenantSwitcher.js";
|
|
32
|
+
export { HeadlessTenantTree } from "./components/headless/TenantTree.js";
|
|
33
|
+
export type { HeadlessTenantTreeProps, HeadlessTenantTreeAPI } from "./components/headless/TenantTree.js";
|
|
34
|
+
export { HeadlessConfigEditor } from "./components/headless/ConfigEditor.js";
|
|
35
|
+
export type { HeadlessConfigEditorProps, HeadlessConfigEditorAPI } from "./components/headless/ConfigEditor.js";
|
|
36
|
+
export { HeadlessPermissionEditor } from "./components/headless/PermissionEditor.js";
|
|
37
|
+
export type { HeadlessPermissionEditorProps, HeadlessPermissionEditorAPI } from "./components/headless/PermissionEditor.js";
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAG/E,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAG1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,YAAY,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACtH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChH,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,YAAY,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Provider
|
|
2
|
+
export { StratumProvider, useStratum } from "./provider.js";
|
|
3
|
+
// i18n
|
|
4
|
+
export { defaultMessages } from "./i18n.js";
|
|
5
|
+
export { useMessages } from "./hooks/use-messages.js";
|
|
6
|
+
// Hooks
|
|
7
|
+
export { useTenant } from "./hooks/use-tenant.js";
|
|
8
|
+
export { useTenantTree } from "./hooks/use-tenant-tree.js";
|
|
9
|
+
export { useConfig } from "./hooks/use-config.js";
|
|
10
|
+
export { usePermissions } from "./hooks/use-permissions.js";
|
|
11
|
+
export { useToast } from "./hooks/use-toast.js";
|
|
12
|
+
// Styled Components
|
|
13
|
+
export { TenantSwitcher } from "./components/TenantSwitcher.js";
|
|
14
|
+
export { TenantTree } from "./components/TenantTree.js";
|
|
15
|
+
export { ConfigEditor } from "./components/ConfigEditor.js";
|
|
16
|
+
export { PermissionEditor } from "./components/PermissionEditor.js";
|
|
17
|
+
export { Skeleton } from "./components/Skeleton.js";
|
|
18
|
+
export { TableSkeleton } from "./components/TableSkeleton.js";
|
|
19
|
+
export { Toast } from "./components/Toast.js";
|
|
20
|
+
export { ToastContainer } from "./components/ToastContainer.js";
|
|
21
|
+
// Headless Components
|
|
22
|
+
export { HeadlessTenantSwitcher } from "./components/headless/TenantSwitcher.js";
|
|
23
|
+
export { HeadlessTenantTree } from "./components/headless/TenantTree.js";
|
|
24
|
+
export { HeadlessConfigEditor } from "./components/headless/ConfigEditor.js";
|
|
25
|
+
export { HeadlessPermissionEditor } from "./components/headless/PermissionEditor.js";
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO;AACP,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,sBAAsB;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React, { type ReactNode } from "react";
|
|
2
|
+
import type { TenantNode, TenantContextLegacy } from "@stratum-hq/core";
|
|
3
|
+
import { type Messages } from "./i18n.js";
|
|
4
|
+
import type { UseToastReturn } from "./hooks/use-toast.js";
|
|
5
|
+
export interface StratumProviderProps {
|
|
6
|
+
controlPlaneUrl: string;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
initialTenantId?: string;
|
|
9
|
+
/** Partial message overrides merged on top of `defaultMessages`. */
|
|
10
|
+
messages?: Messages;
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export interface StratumContextValue {
|
|
14
|
+
currentTenant: TenantNode | null;
|
|
15
|
+
tenantContext: TenantContextLegacy | null;
|
|
16
|
+
loading: boolean;
|
|
17
|
+
error: Error | null;
|
|
18
|
+
switchTenant: (tenantId: string) => Promise<void>;
|
|
19
|
+
apiCall: <T>(path: string, options?: RequestInit) => Promise<T>;
|
|
20
|
+
/** Resolved messages (user overrides merged with defaults). */
|
|
21
|
+
messages: Record<string, string>;
|
|
22
|
+
/** Toast notification system */
|
|
23
|
+
toast: UseToastReturn["toast"];
|
|
24
|
+
}
|
|
25
|
+
declare const StratumContext: React.Context<StratumContextValue | null>;
|
|
26
|
+
/** @internal Exported for Storybook / testing mock providers. */
|
|
27
|
+
export { StratumContext };
|
|
28
|
+
export declare function StratumProvider({ controlPlaneUrl, apiKey, initialTenantId, messages: userMessages, children, }: StratumProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export declare function useStratum(): StratumContextValue;
|
|
30
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAwE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpH,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAsC,MAAM,kBAAkB,CAAC;AAC5G,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gCAAgC;IAChC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CAChC;AAED,QAAA,MAAM,cAAc,2CAAkD,CAAC;AAEvE,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,wBAAgB,eAAe,CAAC,EAC9B,eAAe,EACf,MAAM,EACN,eAAe,EACf,QAAQ,EAAE,YAAY,EACtB,QAAQ,GACT,EAAE,oBAAoB,2CAsFtB;AAED,wBAAgB,UAAU,IAAI,mBAAmB,CAMhD"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useState, useCallback, useEffect, useMemo } from "react";
|
|
3
|
+
import { defaultMessages } from "./i18n.js";
|
|
4
|
+
import { useToast } from "./hooks/use-toast.js";
|
|
5
|
+
import { ToastContainer } from "./components/ToastContainer.js";
|
|
6
|
+
const StratumContext = createContext(null);
|
|
7
|
+
/** @internal Exported for Storybook / testing mock providers. */
|
|
8
|
+
export { StratumContext };
|
|
9
|
+
export function StratumProvider({ controlPlaneUrl, apiKey, initialTenantId, messages: userMessages, children, }) {
|
|
10
|
+
const { toasts, toast, dismiss } = useToast();
|
|
11
|
+
const [currentTenant, setCurrentTenant] = useState(null);
|
|
12
|
+
const [tenantContext, setTenantContext] = useState(null);
|
|
13
|
+
const [loading, setLoading] = useState(false);
|
|
14
|
+
const [error, setError] = useState(null);
|
|
15
|
+
const mergedMessages = useMemo(() => ({ ...defaultMessages, ...userMessages }), [userMessages]);
|
|
16
|
+
const baseUrl = controlPlaneUrl.replace(/\/$/, "");
|
|
17
|
+
const apiCall = useCallback(async (path, options) => {
|
|
18
|
+
const headers = {
|
|
19
|
+
"X-API-Key": apiKey,
|
|
20
|
+
};
|
|
21
|
+
// Only set Content-Type for requests that have a body
|
|
22
|
+
if (options?.body) {
|
|
23
|
+
headers["Content-Type"] = "application/json";
|
|
24
|
+
}
|
|
25
|
+
const res = await fetch(`${baseUrl}${path}`, {
|
|
26
|
+
...options,
|
|
27
|
+
headers: {
|
|
28
|
+
...headers,
|
|
29
|
+
...options?.headers,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
const body = await res.json().catch(() => ({ error: { message: res.statusText } }));
|
|
34
|
+
throw new Error(body.error?.message || `API error: ${res.status}`);
|
|
35
|
+
}
|
|
36
|
+
// 204 No Content — return empty object instead of trying to parse JSON
|
|
37
|
+
if (res.status === 204) {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
return res.json();
|
|
41
|
+
}, [baseUrl, apiKey]);
|
|
42
|
+
const switchTenant = useCallback(async (tenantId) => {
|
|
43
|
+
setLoading(true);
|
|
44
|
+
setError(null);
|
|
45
|
+
try {
|
|
46
|
+
const tenant = await apiCall(`/api/v1/tenants/${tenantId}`);
|
|
47
|
+
const [config, permissions] = await Promise.all([
|
|
48
|
+
apiCall(`/api/v1/tenants/${tenantId}/config`),
|
|
49
|
+
apiCall(`/api/v1/tenants/${tenantId}/permissions`),
|
|
50
|
+
]);
|
|
51
|
+
setCurrentTenant(tenant);
|
|
52
|
+
setTenantContext({
|
|
53
|
+
tenant_id: tenant.id,
|
|
54
|
+
ancestry_path: tenant.ancestry_path,
|
|
55
|
+
depth: tenant.depth,
|
|
56
|
+
resolved_config: config,
|
|
57
|
+
resolved_permissions: permissions,
|
|
58
|
+
isolation_strategy: tenant.isolation_strategy,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
setError(err instanceof Error ? err : new Error(String(err)));
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
setLoading(false);
|
|
66
|
+
}
|
|
67
|
+
}, [apiCall]);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (initialTenantId) {
|
|
70
|
+
switchTenant(initialTenantId);
|
|
71
|
+
}
|
|
72
|
+
}, [initialTenantId, switchTenant]);
|
|
73
|
+
return (_jsxs(StratumContext.Provider, { value: { currentTenant, tenantContext, loading, error, switchTenant, apiCall, messages: mergedMessages, toast }, children: [children, _jsx(ToastContainer, { toasts: toasts, onDismiss: dismiss })] }));
|
|
74
|
+
}
|
|
75
|
+
export function useStratum() {
|
|
76
|
+
const ctx = useContext(StratumContext);
|
|
77
|
+
if (!ctx) {
|
|
78
|
+
throw new Error("useStratum must be used within a <StratumProvider>");
|
|
79
|
+
}
|
|
80
|
+
return ctx;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
|