@lunora/studio 1.0.0-alpha.8 → 1.0.0-alpha.9
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/index.js +7 -7
- package/dist/mount.js +1 -1
- package/dist/packem_shared/{DataBrowser-Ck_7QwNK.js → DataBrowser-BtT2NYcR.js} +2 -2
- package/dist/packem_shared/{InsightsPanel-DzNtoz7k.js → InsightsPanel-B1BaHaPL.js} +25 -17
- package/dist/packem_shared/{MailPanel-CoEfWkCh.js → MailPanel-DozizrvV.js} +4 -4
- package/dist/packem_shared/{SecurityAdvisorPanel-DHr_bI38.js → SecurityAdvisorPanel-Bn2yq05G.js} +4 -4
- package/dist/packem_shared/{Studio-DkgODWD3.js → Studio-CccqZ-J1.js} +5 -5
- package/dist/packem_shared/{StudioApp-ColQCvC_.js → StudioApp-CQbULfaH.js} +1 -1
- package/dist/packem_shared/{TableEditor-B8K5nUna.js → TableEditor-Df_5NPaF.js} +1 -1
- package/dist/packem_shared/{studio-Be28OqIx.js → studio-D93XGB-i.js} +18 -18
- package/dist/standalone/studio.js +82 -82
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
export { StudioApp } from './packem_shared/StudioApp-
|
|
1
|
+
export { StudioApp } from './packem_shared/StudioApp-CQbULfaH.js';
|
|
2
2
|
export { CommandPalette, openCommandPalette } from './packem_shared/CommandPalette-BtgkBzZI.js';
|
|
3
|
-
export { S as Studio } from './packem_shared/studio-
|
|
3
|
+
export { S as Studio } from './packem_shared/studio-D93XGB-i.js';
|
|
4
4
|
export { ConfirmButton } from './packem_shared/ConfirmButton-C2eVi2Qv.js';
|
|
5
5
|
export { default as ConnectionBadge } from './packem_shared/ConnectionBadge-B2DDM2Tn.js';
|
|
6
6
|
export { ErrorBoundary } from './packem_shared/ErrorBoundary-BzAApI7J.js';
|
|
7
7
|
export { ShardInput } from './packem_shared/ShardInput-gx_DZXXn.js';
|
|
8
8
|
export { DEFAULT_INSIGHT_THRESHOLDS, deriveInsights } from './packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js';
|
|
9
|
-
export { InsightsPanel } from './packem_shared/InsightsPanel-
|
|
10
|
-
export { default as SecurityAdvisorPanel } from './packem_shared/SecurityAdvisorPanel-
|
|
9
|
+
export { InsightsPanel } from './packem_shared/InsightsPanel-B1BaHaPL.js';
|
|
10
|
+
export { default as SecurityAdvisorPanel } from './packem_shared/SecurityAdvisorPanel-Bn2yq05G.js';
|
|
11
11
|
export { default as ApiDocsPanel } from './packem_shared/ApiDocsPanel-yVSGHK3H.js';
|
|
12
12
|
export { default as ApiReferencePanel } from './packem_shared/ApiReferencePanel-1vubqG5s.js';
|
|
13
13
|
export { default as ApiTab } from './packem_shared/ApiTab-rwttyQ1-.js';
|
|
14
14
|
export { default as OpenRpcReferencePanel } from './packem_shared/OpenRpcReferencePanel-vbcYbv3V.js';
|
|
15
|
-
export { DataBrowser } from './packem_shared/DataBrowser-
|
|
15
|
+
export { DataBrowser } from './packem_shared/DataBrowser-BtT2NYcR.js';
|
|
16
16
|
export { DataFilters, toFilterClauses } from './packem_shared/DataFilters-FNquMaiu.js';
|
|
17
17
|
export { GlobalDataBrowser } from './packem_shared/GlobalDataBrowser-BTEmGrph.js';
|
|
18
|
-
export { TableEditor } from './packem_shared/TableEditor-
|
|
18
|
+
export { TableEditor } from './packem_shared/TableEditor-Df_5NPaF.js';
|
|
19
19
|
export { ExportImportPanel } from './packem_shared/ExportImportPanel-Dq6rj0tI.js';
|
|
20
20
|
export { MigrationsPanel } from './packem_shared/MigrationsPanel-RX5qIFSr.js';
|
|
21
21
|
export { PitrPanel } from './packem_shared/PitrPanel-LJGNP_IX.js';
|
|
@@ -24,7 +24,7 @@ export { FunctionStatsPanel } from './packem_shared/FunctionStatsPanel-Cn_EBpDy.
|
|
|
24
24
|
export { HomePanel } from './packem_shared/HomePanel-CP0lN1eF.js';
|
|
25
25
|
export { AuditPanel } from './packem_shared/AuditPanel-BqXZAsu_.js';
|
|
26
26
|
export { LogsPanel } from './packem_shared/LogsPanel-C3W0mabf.js';
|
|
27
|
-
export { MailPanel } from './packem_shared/MailPanel-
|
|
27
|
+
export { MailPanel } from './packem_shared/MailPanel-DozizrvV.js';
|
|
28
28
|
export { ScheduledJobs } from './packem_shared/ScheduledJobs-CabfKbyM.js';
|
|
29
29
|
export { HealthPanel } from './packem_shared/HealthPanel-CQ4LzVET.js';
|
|
30
30
|
export { aggregateMetrics, shardsToAggregate } from './packem_shared/aggregateMetrics-D4nUHEKU.js';
|
package/dist/mount.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRoot } from 'react-dom/client';
|
|
2
|
-
import { StudioApp } from './packem_shared/StudioApp-
|
|
2
|
+
import { StudioApp } from './packem_shared/StudioApp-CQbULfaH.js';
|
|
3
3
|
import { jsxDEV } from 'react/jsx-dev-runtime';
|
|
4
4
|
|
|
5
5
|
const mountStudio = (options = {}) => {
|
|
@@ -2817,14 +2817,14 @@ const NO_COLUMNS = [];
|
|
|
2817
2817
|
const useMaskPolicies = () => {
|
|
2818
2818
|
const client = useLunora();
|
|
2819
2819
|
const [columns, setColumns] = useState(NO_COLUMNS);
|
|
2820
|
-
const refresh = async () => {
|
|
2820
|
+
const refresh = useCallback(async () => {
|
|
2821
2821
|
try {
|
|
2822
2822
|
const result = await client.query(MASK_POLICIES, {}, callOptions(""));
|
|
2823
2823
|
setColumns(Array.isArray(result.columns) ? result.columns : NO_COLUMNS);
|
|
2824
2824
|
} catch {
|
|
2825
2825
|
setColumns(NO_COLUMNS);
|
|
2826
2826
|
}
|
|
2827
|
-
};
|
|
2827
|
+
}, [client]);
|
|
2828
2828
|
useEffect(() => {
|
|
2829
2829
|
fireAndForget(refresh());
|
|
2830
2830
|
}, [refresh]);
|
|
@@ -294,6 +294,28 @@ const InsightsPanel = ({
|
|
|
294
294
|
const [shardTraffic, setShardTraffic] = useState(null);
|
|
295
295
|
const [error, setError] = useState(null);
|
|
296
296
|
const fanShardTraffic = loadShardTraffic ?? ((table) => client.shardTraffic(table));
|
|
297
|
+
const loadShardTrafficFeed = async (tableNames) => {
|
|
298
|
+
const seedTable = tableNames[0];
|
|
299
|
+
if (seedTable === void 0 || seedTable === "") {
|
|
300
|
+
setShardTraffic(null);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
try {
|
|
304
|
+
const traffic = await fanShardTraffic(seedTable);
|
|
305
|
+
const byShard = /* @__PURE__ */ new Map();
|
|
306
|
+
for (const entry of traffic.shards) {
|
|
307
|
+
if (!byShard.has(entry.shardKey)) {
|
|
308
|
+
byShard.set(entry.shardKey, {
|
|
309
|
+
requests: entry.requests,
|
|
310
|
+
shardKey: entry.shardKey
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
setShardTraffic([...byShard.values()]);
|
|
315
|
+
} catch {
|
|
316
|
+
setShardTraffic(null);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
297
319
|
const refresh = async (shard) => {
|
|
298
320
|
const [snapshot, stats, advisorySnapshot] = await Promise.allSettled([client.query(GET_METRICS, {}, callOptions(shard)), client.query(GET_FUNCTION_STATS, {}, callOptions(shard)), client.query(GET_ADVISORIES, {}, callOptions(shard))]);
|
|
299
321
|
if (snapshot.status === "rejected" && stats.status === "rejected") {
|
|
@@ -306,10 +328,10 @@ const InsightsPanel = ({
|
|
|
306
328
|
setFunctions(stats.status === "fulfilled" ? stats.value.functions : null);
|
|
307
329
|
setAdvisories(advisorySnapshot.status === "fulfilled" ? advisorySnapshot.value.advisories : null);
|
|
308
330
|
setIndexHits(snapshot.status === "fulfilled" ? snapshot.value.indexHits ?? null : null);
|
|
309
|
-
let
|
|
331
|
+
let tableNames_0 = [];
|
|
310
332
|
try {
|
|
311
333
|
const tables = await client.query(LIST_TABLES, {}, callOptions(shard));
|
|
312
|
-
|
|
334
|
+
tableNames_0 = tables.map((table_0) => table_0.name);
|
|
313
335
|
const indexResults = await Promise.allSettled(tables.map(async (table_1) => [table_1.name, await client.query(LIST_TABLE_INDEXES, {
|
|
314
336
|
table: table_1.name
|
|
315
337
|
}, callOptions(shard))]));
|
|
@@ -324,21 +346,7 @@ const InsightsPanel = ({
|
|
|
324
346
|
} catch {
|
|
325
347
|
setDeclaredIndexes(null);
|
|
326
348
|
}
|
|
327
|
-
|
|
328
|
-
const traffic = await fanShardTraffic(tableNames[0] ?? "");
|
|
329
|
-
const byShard = /* @__PURE__ */ new Map();
|
|
330
|
-
for (const entry of traffic.shards) {
|
|
331
|
-
if (!byShard.has(entry.shardKey)) {
|
|
332
|
-
byShard.set(entry.shardKey, {
|
|
333
|
-
requests: entry.requests,
|
|
334
|
-
shardKey: entry.shardKey
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
setShardTraffic([...byShard.values()]);
|
|
339
|
-
} catch {
|
|
340
|
-
setShardTraffic(null);
|
|
341
|
-
}
|
|
349
|
+
await loadShardTrafficFeed(tableNames_0);
|
|
342
350
|
};
|
|
343
351
|
useLiveShardSeed(shardKey, refresh);
|
|
344
352
|
useEffect(() => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useLunora } from '@lunora/react';
|
|
3
|
-
import { useState, useEffect, useMemo } from 'react';
|
|
3
|
+
import { useState, useCallback, useEffect, useMemo } from 'react';
|
|
4
4
|
import { B as Badge } from './badge-B2PKA1-5.js';
|
|
5
5
|
import { B as Button } from './button-BhsN2uZH.js';
|
|
6
6
|
import { E as EmptyState } from './empty-state-DY_oe0k6.js';
|
|
@@ -13,7 +13,7 @@ import { Separator as Separator$1 } from '@base-ui/react/separator';
|
|
|
13
13
|
import { useAutoRefresh } from './DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
|
|
14
14
|
import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
|
|
15
15
|
import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-DjXgvJb6.js';
|
|
16
|
-
import {
|
|
16
|
+
import { c as callOptions, e as errorMessage, f as fireAndForget, b as formatTimestamp, a as adminRef, g as copyToClipboard } from './internal-rXJEAhXS.js';
|
|
17
17
|
|
|
18
18
|
function Separator({
|
|
19
19
|
className,
|
|
@@ -149,7 +149,7 @@ const MailPanel = ({
|
|
|
149
149
|
const [selectedId, setSelectedId] = useState(null);
|
|
150
150
|
const [tab, setTab] = useState("html");
|
|
151
151
|
const [filter, setFilter] = useState("");
|
|
152
|
-
const refresh = async () => {
|
|
152
|
+
const refresh = useCallback(async () => {
|
|
153
153
|
setError(null);
|
|
154
154
|
try {
|
|
155
155
|
const next = await client.query(GET_CAPTURED_MAIL, {
|
|
@@ -160,7 +160,7 @@ const MailPanel = ({
|
|
|
160
160
|
setEntries([]);
|
|
161
161
|
setError(errorMessage(error_));
|
|
162
162
|
}
|
|
163
|
-
};
|
|
163
|
+
}, [client, limit]);
|
|
164
164
|
const clearInbox = async () => {
|
|
165
165
|
setError(null);
|
|
166
166
|
try {
|
package/dist/packem_shared/{SecurityAdvisorPanel-DHr_bI38.js → SecurityAdvisorPanel-Bn2yq05G.js}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useLunora } from '@lunora/react';
|
|
2
|
-
import { useState, useEffect } from 'react';
|
|
2
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
3
3
|
import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
|
|
4
4
|
import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-DjXgvJb6.js';
|
|
5
|
-
import {
|
|
5
|
+
import { c as callOptions, e as errorMessage, f as fireAndForget, a as adminRef } from './internal-rXJEAhXS.js';
|
|
6
6
|
import { A as AdvisorView } from './advisor-view-CGcfMiPq.js';
|
|
7
7
|
import { jsxDEV } from 'react/jsx-dev-runtime';
|
|
8
8
|
|
|
@@ -48,7 +48,7 @@ const SecurityAdvisorPanel = () => {
|
|
|
48
48
|
const t = useT();
|
|
49
49
|
const [findings, setFindings] = useState(null);
|
|
50
50
|
const [error, setError] = useState(null);
|
|
51
|
-
const refresh = async () => {
|
|
51
|
+
const refresh = useCallback(async () => {
|
|
52
52
|
try {
|
|
53
53
|
const result = await client.query(GET_SECURITY_AUDIT, {}, callOptions(""));
|
|
54
54
|
setFindings(Array.isArray(result.findings) ? result.findings : []);
|
|
@@ -56,7 +56,7 @@ const SecurityAdvisorPanel = () => {
|
|
|
56
56
|
} catch (error_) {
|
|
57
57
|
setError(errorMessage(error_));
|
|
58
58
|
}
|
|
59
|
-
};
|
|
59
|
+
}, [client]);
|
|
60
60
|
useEffect(() => {
|
|
61
61
|
fireAndForget(refresh());
|
|
62
62
|
}, [refresh]);
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import 'react/compiler-runtime';
|
|
2
2
|
import '@tanstack/react-router';
|
|
3
3
|
import 'react';
|
|
4
|
-
export { S as Studio } from './studio-
|
|
4
|
+
export { S as Studio } from './studio-D93XGB-i.js';
|
|
5
5
|
import './ErrorBoundary-BzAApI7J.js';
|
|
6
6
|
import './badge-B2PKA1-5.js';
|
|
7
7
|
import './input-XH4r1Pt1.js';
|
|
8
8
|
import './reference-view-B4E49Lip.js';
|
|
9
|
-
import './InsightsPanel-
|
|
10
|
-
import './SecurityAdvisorPanel-
|
|
9
|
+
import './InsightsPanel-B1BaHaPL.js';
|
|
10
|
+
import './SecurityAdvisorPanel-Bn2yq05G.js';
|
|
11
11
|
import './ApiTab-rwttyQ1-.js';
|
|
12
|
-
import './TableEditor-
|
|
12
|
+
import './TableEditor-Df_5NPaF.js';
|
|
13
13
|
import './ExportImportPanel-Dq6rj0tI.js';
|
|
14
14
|
import './MigrationsPanel-RX5qIFSr.js';
|
|
15
15
|
import './PitrPanel-LJGNP_IX.js';
|
|
@@ -18,7 +18,7 @@ import './FunctionStatsPanel-Cn_EBpDy.js';
|
|
|
18
18
|
import './HomePanel-CP0lN1eF.js';
|
|
19
19
|
import './AuditPanel-BqXZAsu_.js';
|
|
20
20
|
import './LogsPanel-C3W0mabf.js';
|
|
21
|
-
import './MailPanel-
|
|
21
|
+
import './MailPanel-DozizrvV.js';
|
|
22
22
|
import './HealthPanel-CQ4LzVET.js';
|
|
23
23
|
import './MetricsPanel-CujtUfpl.js';
|
|
24
24
|
import './SchemaViewer-Bam6ylvw.js';
|
|
@@ -3,7 +3,7 @@ import { LunoraClient } from '@lunora/client';
|
|
|
3
3
|
import { LunoraProvider } from '@lunora/react';
|
|
4
4
|
import { useState, useEffect } from 'react';
|
|
5
5
|
import { ErrorBoundary } from './ErrorBoundary-BzAApI7J.js';
|
|
6
|
-
import { u as useTheme, B as BrandMark, T as ThemeProvider, a as TooltipProvider, S as Studio } from './studio-
|
|
6
|
+
import { u as useTheme, B as BrandMark, T as ThemeProvider, a as TooltipProvider, S as Studio } from './studio-D93XGB-i.js';
|
|
7
7
|
import useDebounced from './useDebounced-Dxncpg6z.js';
|
|
8
8
|
import { useT, createStudioI18n } from './DEFAULT_LOCALE-CiX4W7Kr.js';
|
|
9
9
|
import { StudioI18nProvider } from './StudioI18nProvider-B-tDCZIi.js';
|
|
@@ -5,7 +5,7 @@ import { useRef, useState, useEffect } from 'react';
|
|
|
5
5
|
import { T as TIER_META } from './storage-tier-CL98eOvn.js';
|
|
6
6
|
import { useT } from './DEFAULT_LOCALE-CiX4W7Kr.js';
|
|
7
7
|
import { f as fireAndForget } from './internal-rXJEAhXS.js';
|
|
8
|
-
import { DataBrowser } from './DataBrowser-
|
|
8
|
+
import { DataBrowser } from './DataBrowser-BtT2NYcR.js';
|
|
9
9
|
import { GlobalDataBrowser } from './GlobalDataBrowser-BTEmGrph.js';
|
|
10
10
|
import { jsxDEV } from 'react/jsx-dev-runtime';
|
|
11
11
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { c } from 'react/compiler-runtime';
|
|
3
3
|
import { createRootRoute, createRoute, createBrowserHistory, createMemoryHistory, createRouter, useNavigate, useRouterState, useSearch, Outlet, RouterProvider } from '@tanstack/react-router';
|
|
4
4
|
import * as React from 'react';
|
|
5
|
-
import { useState, useEffect, createContext, use, useMemo, useRef
|
|
5
|
+
import { useState, useEffect, createContext, use, useCallback, useMemo, useRef } from 'react';
|
|
6
6
|
import { c as cn } from './utils-B05Dmz_H.js';
|
|
7
7
|
import { jsxDEV, Fragment } from 'react/jsx-dev-runtime';
|
|
8
8
|
import { ErrorBoundary } from './ErrorBoundary-BzAApI7J.js';
|
|
@@ -20,21 +20,21 @@ import { B as Button } from './button-BhsN2uZH.js';
|
|
|
20
20
|
import { Dialog } from '@base-ui/react/dialog';
|
|
21
21
|
import { Tooltip as Tooltip$1 } from '@base-ui/react/tooltip';
|
|
22
22
|
import { S as Skeleton } from './reference-view-B4E49Lip.js';
|
|
23
|
-
import { InsightsPanel } from './InsightsPanel-
|
|
23
|
+
import { InsightsPanel } from './InsightsPanel-B1BaHaPL.js';
|
|
24
24
|
import { useLunora } from '@lunora/react';
|
|
25
25
|
import { C as Card, a as CardContent, b as CardHeader, c as CardTitle, d as CardDescription } from './card-DURq3ElK.js';
|
|
26
26
|
import { E as EmptyState } from './empty-state-DY_oe0k6.js';
|
|
27
27
|
import { T as Table, a as TableHeader, b as TableRow, c as TableHead, d as TableBody, e as TableCell } from './table-_RzNvy3R.js';
|
|
28
28
|
import { ADMIN_FUNCTIONS } from './ADMIN_FUNCTIONS-DjXgvJb6.js';
|
|
29
|
-
import {
|
|
30
|
-
import SecurityAdvisorPanel from './SecurityAdvisorPanel-
|
|
29
|
+
import { c as callOptions, e as errorMessage, f as fireAndForget, a as adminRef, h as formatCell, b as formatTimestamp, g as copyToClipboard } from './internal-rXJEAhXS.js';
|
|
30
|
+
import SecurityAdvisorPanel from './SecurityAdvisorPanel-Bn2yq05G.js';
|
|
31
31
|
import { createAnalyticsSqlClient } from '@lunora/bindings/analytics';
|
|
32
32
|
import ApiTab from './ApiTab-rwttyQ1-.js';
|
|
33
33
|
import { useAutoRefresh } from './DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
|
|
34
34
|
import useDebounced from './useDebounced-Dxncpg6z.js';
|
|
35
35
|
import { L as Label } from './label-D8ykjn5J.js';
|
|
36
36
|
import { M as ModalShell } from './grid-features-CzUfqgsM.js';
|
|
37
|
-
import { TableEditor } from './TableEditor-
|
|
37
|
+
import { TableEditor } from './TableEditor-Df_5NPaF.js';
|
|
38
38
|
import { ExportImportPanel } from './ExportImportPanel-Dq6rj0tI.js';
|
|
39
39
|
import { MigrationsPanel } from './MigrationsPanel-RX5qIFSr.js';
|
|
40
40
|
import { PitrPanel } from './PitrPanel-LJGNP_IX.js';
|
|
@@ -44,7 +44,7 @@ import { HomePanel } from './HomePanel-CP0lN1eF.js';
|
|
|
44
44
|
import { AuditPanel } from './AuditPanel-BqXZAsu_.js';
|
|
45
45
|
import { C as CLOUDFLARE_OBSERVABILITY_URL } from './cf-links-2cktDedA.js';
|
|
46
46
|
import { LogsPanel } from './LogsPanel-C3W0mabf.js';
|
|
47
|
-
import { MailPanel } from './MailPanel-
|
|
47
|
+
import { MailPanel } from './MailPanel-DozizrvV.js';
|
|
48
48
|
import { ConfirmButton } from './ConfirmButton-C2eVi2Qv.js';
|
|
49
49
|
import { ScheduledJobs } from './ScheduledJobs-CabfKbyM.js';
|
|
50
50
|
import { ShardInput } from './ShardInput-gx_DZXXn.js';
|
|
@@ -1677,7 +1677,7 @@ const RlsPanel = () => {
|
|
|
1677
1677
|
const t = useT();
|
|
1678
1678
|
const [data, setData] = useState(null);
|
|
1679
1679
|
const [error, setError] = useState(null);
|
|
1680
|
-
const refresh = async () => {
|
|
1680
|
+
const refresh = useCallback(async () => {
|
|
1681
1681
|
try {
|
|
1682
1682
|
const result = await client.query(RLS_POLICIES$1, {}, callOptions(""));
|
|
1683
1683
|
setData({
|
|
@@ -1688,7 +1688,7 @@ const RlsPanel = () => {
|
|
|
1688
1688
|
} catch (error_) {
|
|
1689
1689
|
setError(errorMessage(error_));
|
|
1690
1690
|
}
|
|
1691
|
-
};
|
|
1691
|
+
}, [client]);
|
|
1692
1692
|
useEffect(() => {
|
|
1693
1693
|
fireAndForget(refresh());
|
|
1694
1694
|
}, [refresh]);
|
|
@@ -1972,7 +1972,7 @@ const AnalyticsPanel = ({
|
|
|
1972
1972
|
});
|
|
1973
1973
|
return (sql) => client.query(sql);
|
|
1974
1974
|
}, [config, runQuery]);
|
|
1975
|
-
const load = async (token) => {
|
|
1975
|
+
const load = useCallback(async (token) => {
|
|
1976
1976
|
if (run === null) {
|
|
1977
1977
|
return;
|
|
1978
1978
|
}
|
|
@@ -2019,7 +2019,7 @@ const AnalyticsPanel = ({
|
|
|
2019
2019
|
}
|
|
2020
2020
|
}
|
|
2021
2021
|
}
|
|
2022
|
-
};
|
|
2022
|
+
}, [run, dataset]);
|
|
2023
2023
|
useEffect(() => {
|
|
2024
2024
|
const token_0 = {
|
|
2025
2025
|
cancelled: false
|
|
@@ -4102,7 +4102,7 @@ const UsersPanel = ({
|
|
|
4102
4102
|
const {
|
|
4103
4103
|
capabilities
|
|
4104
4104
|
} = useAuthCapabilities();
|
|
4105
|
-
const fetchUsers = async () => {
|
|
4105
|
+
const fetchUsers = useCallback(async () => {
|
|
4106
4106
|
setUsersError(null);
|
|
4107
4107
|
const trimmedSearch = debouncedSearch.trim();
|
|
4108
4108
|
const trimmedRole = roleFilter.trim();
|
|
@@ -4118,7 +4118,7 @@ const UsersPanel = ({
|
|
|
4118
4118
|
setUsers(null);
|
|
4119
4119
|
setUsersError(errorMessage(error_));
|
|
4120
4120
|
}
|
|
4121
|
-
};
|
|
4121
|
+
}, [client, debouncedSearch, roleFilter, pageSize]);
|
|
4122
4122
|
const reloadUsers = () => {
|
|
4123
4123
|
fireAndForget(fetchUsers());
|
|
4124
4124
|
};
|
|
@@ -5489,7 +5489,7 @@ const PaymentsPanel = ({
|
|
|
5489
5489
|
const [subscriptions, setSubscriptions] = useState([]);
|
|
5490
5490
|
const [events, setEvents] = useState([]);
|
|
5491
5491
|
const [error, setError] = useState(null);
|
|
5492
|
-
const refresh = async () => {
|
|
5492
|
+
const refresh = useCallback(async () => {
|
|
5493
5493
|
setError(null);
|
|
5494
5494
|
try {
|
|
5495
5495
|
const [subscriptionRows, eventRows] = await Promise.all([readRows(client, "subscriptions", limit), readRows(client, "events", 25)]);
|
|
@@ -5500,7 +5500,7 @@ const PaymentsPanel = ({
|
|
|
5500
5500
|
setEvents([]);
|
|
5501
5501
|
setError(errorMessage(error_));
|
|
5502
5502
|
}
|
|
5503
|
-
};
|
|
5503
|
+
}, [client, limit]);
|
|
5504
5504
|
useEffect(() => {
|
|
5505
5505
|
fireAndForget(refresh());
|
|
5506
5506
|
}, [refresh]);
|
|
@@ -5695,7 +5695,7 @@ const PermissionsMatrix = ({
|
|
|
5695
5695
|
const [advisories, setAdvisories] = useState(null);
|
|
5696
5696
|
const [error, setError] = useState(null);
|
|
5697
5697
|
const [liveError, setLiveError] = useState(void 0);
|
|
5698
|
-
const refresh = async () => {
|
|
5698
|
+
const refresh = useCallback(async () => {
|
|
5699
5699
|
const queryRls = client.query(RLS_POLICIES, {}, callOptions(""));
|
|
5700
5700
|
const queryMasks = client.query(MASK_POLICIES, {}, callOptions(""));
|
|
5701
5701
|
const queryAdvisories = client.query(GET_ADVISORIES, {}, callOptions(""));
|
|
@@ -5716,7 +5716,7 @@ const PermissionsMatrix = ({
|
|
|
5716
5716
|
} catch (error_) {
|
|
5717
5717
|
setError(errorMessage(error_));
|
|
5718
5718
|
}
|
|
5719
|
-
};
|
|
5719
|
+
}, [client]);
|
|
5720
5720
|
useEffect(() => {
|
|
5721
5721
|
fireAndForget(refresh());
|
|
5722
5722
|
}, [refresh]);
|
|
@@ -7234,7 +7234,7 @@ const StorageRulesPanel = () => {
|
|
|
7234
7234
|
const t = useT();
|
|
7235
7235
|
const [data, setData] = useState(null);
|
|
7236
7236
|
const [error, setError] = useState(null);
|
|
7237
|
-
const refresh = async () => {
|
|
7237
|
+
const refresh = useCallback(async () => {
|
|
7238
7238
|
try {
|
|
7239
7239
|
const result = await client.query(STORAGE_RULES, {}, callOptions(""));
|
|
7240
7240
|
setData({
|
|
@@ -7244,7 +7244,7 @@ const StorageRulesPanel = () => {
|
|
|
7244
7244
|
} catch (error_) {
|
|
7245
7245
|
setError(errorMessage(error_));
|
|
7246
7246
|
}
|
|
7247
|
-
};
|
|
7247
|
+
}, [client]);
|
|
7248
7248
|
useEffect(() => {
|
|
7249
7249
|
fireAndForget(refresh());
|
|
7250
7250
|
}, [refresh]);
|