@localstack/appinspector-ui 1.0.112 → 1.0.114

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 CHANGED
@@ -2414,9 +2414,16 @@ var init_event_streams = __esm({
2414
2414
 
2415
2415
  // src/pages/spans-list-page.tsx
2416
2416
  import { Box as Box20 } from "@mui/material";
2417
- import { useCallback as useCallback11, useState as useState18 } from "react";
2417
+ import { useCallback as useCallback12, useState as useState18 } from "react";
2418
2418
 
2419
2419
  // src/api/errors.ts
2420
+ var AppInspectorDisabledError = class extends Error {
2421
+ constructor(message, cause) {
2422
+ super(message);
2423
+ this.name = "AppInspectorDisabledError";
2424
+ this.cause = cause;
2425
+ }
2426
+ };
2420
2427
  var AppInspectorNotFoundError = class extends Error {
2421
2428
  localstackVersion;
2422
2429
  constructor(message, cause, localstackVersion) {
@@ -15025,7 +15032,7 @@ var LoadSpansRow = ({ colSpan, fetching, label, onFetch }) => /* @__PURE__ */ js
15025
15032
  fetching && /* @__PURE__ */ jsx127(CircularProgress, { size: 24, sx: { m: 2 } })
15026
15033
  ] }) });
15027
15034
  var SpansDataGridRow = memo8(
15028
- ({ row }) => {
15035
+ ({ onSpanClick, row }) => {
15029
15036
  const theme = useTheme2();
15030
15037
  return /* @__PURE__ */ jsx127(
15031
15038
  TableRow,
@@ -15038,7 +15045,11 @@ var SpansDataGridRow = memo8(
15038
15045
  initial: {
15039
15046
  backgroundColor: theme.palette.mode === "light" ? newSpanBackgroundColor.light.from : newSpanBackgroundColor.dark.from
15040
15047
  },
15048
+ onClick: () => {
15049
+ onSpanClick(row.original);
15050
+ },
15041
15051
  sx: {
15052
+ cursor: "pointer",
15042
15053
  transition: "background-color 1200ms ease-in"
15043
15054
  },
15044
15055
  children: row.getVisibleCells().map((cell) => {
@@ -15155,7 +15166,8 @@ var SpansDataGrid = ({
15155
15166
  Button2,
15156
15167
  {
15157
15168
  "data-testid": VIEW_SPAN_DETAILS_TEST_ID,
15158
- onClick: () => {
15169
+ onClick: (event) => {
15170
+ event.stopPropagation();
15159
15171
  onSpanClick(props.row.original);
15160
15172
  },
15161
15173
  size: "small",
@@ -15316,7 +15328,7 @@ var SpansDataGrid = ({
15316
15328
  for (let index = rows.length - 1; index >= 0; index--) {
15317
15329
  const row = rows.at(index);
15318
15330
  reversed.push(
15319
- /* @__PURE__ */ jsx127(SpansDataGridRow, { row }, row.original.span_id)
15331
+ /* @__PURE__ */ jsx127(SpansDataGridRow, { onSpanClick, row }, row.original.span_id)
15320
15332
  );
15321
15333
  }
15322
15334
  return reversed;
@@ -15327,7 +15339,7 @@ var SpansDataGrid = ({
15327
15339
  !clearingSpans && order2 === "oldest_first" && /* @__PURE__ */ jsxs121(Fragment5, { children: [
15328
15340
  hasRows && !hasMoreBackward && /* @__PURE__ */ jsx127(StreamBoundaryRow, { colSpan: columnCount, label: LABEL_BEGINNING_OF_STREAM }),
15329
15341
  hasRows && hasMoreBackward && /* @__PURE__ */ jsx127(LoadSpansRow, { colSpan: columnCount, fetching: fetchingBackward, label: LABEL_LOAD_OLDER, onFetch: onFetchBackward }),
15330
- hasRows && /* @__PURE__ */ jsx127(AnimatePresence, { initial: false, children: rows.map((row) => /* @__PURE__ */ jsx127(SpansDataGridRow, { row }, row.original.span_id)) }),
15342
+ hasRows && /* @__PURE__ */ jsx127(AnimatePresence, { initial: false, children: rows.map((row) => /* @__PURE__ */ jsx127(SpansDataGridRow, { onSpanClick, row }, row.original.span_id)) }),
15331
15343
  hasRows && hasMoreForward && /* @__PURE__ */ jsx127(LoadSpansRow, { colSpan: columnCount, fetching: fetchingForward, label: LABEL_LOAD_NEWER, onFetch: onFetchForward }),
15332
15344
  hasRows && !hasMoreForward && /* @__PURE__ */ jsx127(StreamBoundaryRow, { colSpan: columnCount, label: LABEL_END_OF_STREAM })
15333
15345
  ] })
@@ -15523,7 +15535,7 @@ var StatusMessage = ({
15523
15535
  }
15524
15536
  );
15525
15537
  }
15526
- if (status?.status === "DISABLED") {
15538
+ if (error instanceof AppInspectorDisabledError || status?.status === "DISABLED") {
15527
15539
  return /* @__PURE__ */ jsx129(
15528
15540
  Box6,
15529
15541
  {
@@ -15630,7 +15642,7 @@ var StatusMessage = ({
15630
15642
  };
15631
15643
 
15632
15644
  // src/hooks/status-provider.tsx
15633
- import { createContext as createContext8, useContext as useContext15, useMemo as useMemo6 } from "react";
15645
+ import { createContext as createContext8, useCallback as useCallback5, useContext as useContext15, useMemo as useMemo6 } from "react";
15634
15646
 
15635
15647
  // src/hooks/use-status.tsx
15636
15648
  import { useCallback as useCallback4, useEffect as useEffect11, useRef as useRef9, useState as useState6 } from "react";
@@ -15679,9 +15691,12 @@ import { jsx as jsx130 } from "react/jsx-runtime";
15679
15691
  var AppInspectorStatusContext = createContext8(void 0);
15680
15692
  var StatusProvider = ({ children }) => {
15681
15693
  const { checking, checkStatus, error, status } = useStatus();
15694
+ const reportDisabled = useCallback5(() => {
15695
+ void checkStatus();
15696
+ }, [checkStatus]);
15682
15697
  const value = useMemo6(
15683
- () => ({ checking, checkStatus, status, statusError: error }),
15684
- [checking, checkStatus, status, error]
15698
+ () => ({ checking, checkStatus, reportDisabled, status, statusError: error }),
15699
+ [checking, checkStatus, reportDisabled, status, error]
15685
15700
  );
15686
15701
  return /* @__PURE__ */ jsx130(AppInspectorStatusContext.Provider, { value, children });
15687
15702
  };
@@ -15694,7 +15709,7 @@ var useAppInspectorStatus = () => {
15694
15709
  };
15695
15710
 
15696
15711
  // src/hooks/use-local-storage.tsx
15697
- import { useCallback as useCallback5, useEffect as useEffect12, useState as useState7 } from "react";
15712
+ import { useCallback as useCallback6, useEffect as useEffect12, useState as useState7 } from "react";
15698
15713
  function useLocalStorage(key, initialValue) {
15699
15714
  const [storedValue, setStoredValue] = useState7(() => {
15700
15715
  try {
@@ -15705,7 +15720,7 @@ function useLocalStorage(key, initialValue) {
15705
15720
  return initialValue;
15706
15721
  }
15707
15722
  });
15708
- const setValue = useCallback5((value) => {
15723
+ const setValue = useCallback6((value) => {
15709
15724
  try {
15710
15725
  setStoredValue((previousState) => {
15711
15726
  const next = typeof value === "function" ? value(previousState) : value;
@@ -15739,7 +15754,7 @@ function useLocalStorage(key, initialValue) {
15739
15754
  }
15740
15755
 
15741
15756
  // src/hooks/use-spans.ts
15742
- import { useCallback as useCallback8, useEffect as useEffect16, useRef as useRef13, useState as useState10 } from "react";
15757
+ import { useCallback as useCallback9, useEffect as useEffect16, useRef as useRef13, useState as useState10 } from "react";
15743
15758
 
15744
15759
  // src/utils/pagination-buffer.ts
15745
15760
  var insertSorted = (array, item, compareFunction, hint = "back") => {
@@ -15920,7 +15935,7 @@ var createPaginationBuffer = (options) => {
15920
15935
  };
15921
15936
 
15922
15937
  // src/hooks/use-spans-ws.tsx
15923
- import { useCallback as useCallback7, useEffect as useEffect14, useRef as useRef11, useState as useState8 } from "react";
15938
+ import { useCallback as useCallback8, useEffect as useEffect14, useRef as useRef11, useState as useState8 } from "react";
15924
15939
 
15925
15940
  // src/config.ts
15926
15941
  var APPINSPECTOR_API_PREFIX = "/_localstack/appinspector";
@@ -15950,7 +15965,7 @@ var LOCALSTACK_INFO_PATH = "/_localstack/info";
15950
15965
 
15951
15966
  // src/context.tsx
15952
15967
  import { createContext as createContext9, useContext as useContext16 } from "react";
15953
- import { useCallback as useCallback6, useMemo as useMemo7 } from "react";
15968
+ import { useCallback as useCallback7, useMemo as useMemo7 } from "react";
15954
15969
 
15955
15970
  // src/api/client.ts
15956
15971
  var import_semver2 = __toESM(require_semver2(), 1);
@@ -16039,17 +16054,19 @@ var makeRequest = async (options) => {
16039
16054
  new Error(`404 from ${url}: ${response.statusText}`)
16040
16055
  );
16041
16056
  }
16057
+ if (response.status === 503) {
16058
+ throw new AppInspectorDisabledError(
16059
+ ERROR_MESSAGES.APP_INSPECTOR_DISABLED,
16060
+ new Error(`503 from ${url}: ${response.statusText}`)
16061
+ );
16062
+ }
16042
16063
  throw new Error(`API request failed: ${response.status.toString()} ${response.statusText}`);
16043
16064
  }
16044
16065
  options.captureHeaders?.(response.headers);
16045
16066
  return await response.json();
16046
16067
  } catch (error) {
16047
16068
  if (error instanceof TypeError) {
16048
- const message = error.message.toLowerCase();
16049
- const isNetworkError = message.includes("fetch") || message.includes("network") || message.includes("failed to fetch");
16050
- if (isNetworkError) {
16051
- throw new ConnectionError(ERROR_MESSAGES.CONNECTION_FAILED, error);
16052
- }
16069
+ throw new ConnectionError(ERROR_MESSAGES.CONNECTION_FAILED, error);
16053
16070
  }
16054
16071
  if (error instanceof Error) {
16055
16072
  throw error;
@@ -18118,7 +18135,7 @@ var AppInspectorContextProvider = (props) => {
18118
18135
  () => createApiClient({ localstackEndpoint: props.localstackEndpoint }),
18119
18136
  [props.localstackEndpoint]
18120
18137
  );
18121
- const resolveLink = useCallback6(
18138
+ const resolveLink = useCallback7(
18122
18139
  (options) => {
18123
18140
  if (options.to === "settings") {
18124
18141
  return `${props.routePrefix}/settings`;
@@ -18157,7 +18174,7 @@ function useSpansWebSocket(options) {
18157
18174
  const wsRef = useRef11(void 0);
18158
18175
  const reconnectRef = useRef11(void 0);
18159
18176
  const { localstackEndpoint } = useAppInspector();
18160
- const connect = useCallback7(() => {
18177
+ const connect = useCallback8(() => {
18161
18178
  if (wsRef.current !== void 0) return;
18162
18179
  const url = new URL(getAppInspectorApiUrl(localstackEndpoint, API_ENDPOINTS.WEBSOCKET_SPANS));
18163
18180
  url.protocol = globalThis.location.protocol === "https:" ? "wss" : "ws";
@@ -18296,6 +18313,7 @@ function useThrottledItems(items, getId, catchUpIncrement = 10) {
18296
18313
  var PAGE_SIZE = 30;
18297
18314
  var useSpans = () => {
18298
18315
  const api = useAppInspectorApi();
18316
+ const { reportDisabled } = useAppInspectorStatus();
18299
18317
  const [spans, setSpans] = useState10();
18300
18318
  const throttledSpans = useThrottledItems(spans, (span) => span.span_id);
18301
18319
  const [fetchError, setFetchError] = useState10();
@@ -18347,17 +18365,17 @@ var useSpans = () => {
18347
18365
  const [warningCount, setWarningCount] = useState10();
18348
18366
  const [hasMoreBackward, setHasMoreBackward] = useState10();
18349
18367
  const [hasMoreForward, setHasMoreForward] = useState10();
18350
- const fetchForward = useCallback8(() => {
18368
+ const fetchForward = useCallback9(() => {
18351
18369
  void paginationBufferRef.current.fetchForward();
18352
18370
  }, []);
18353
- const fetchBackward = useCallback8(() => {
18371
+ const fetchBackward = useCallback9(() => {
18354
18372
  void paginationBufferRef.current.fetchBackward();
18355
18373
  }, []);
18356
18374
  useEffect16(() => {
18357
18375
  fetchForward();
18358
18376
  }, [fetchForward]);
18359
18377
  const [clearingSpans, setClearingSpans] = useState10(false);
18360
- const clearSpans = useCallback8(async () => {
18378
+ const clearSpans = useCallback9(async () => {
18361
18379
  if (clearingSpans) {
18362
18380
  return;
18363
18381
  }
@@ -18375,7 +18393,7 @@ var useSpans = () => {
18375
18393
  }
18376
18394
  }, [clearingSpans, api]);
18377
18395
  const [streamPaused, setStreamPaused] = useState10(false);
18378
- const toggleStream = useCallback8(() => {
18396
+ const toggleStream = useCallback9(() => {
18379
18397
  setStreamPaused((previous) => !previous);
18380
18398
  }, []);
18381
18399
  useEffect16(() => {
@@ -18397,9 +18415,14 @@ var useSpans = () => {
18397
18415
  }
18398
18416
  }
18399
18417
  });
18400
- const clearFetchError = useCallback8(() => {
18418
+ const clearFetchError = useCallback9(() => {
18401
18419
  setFetchError(void 0);
18402
18420
  }, []);
18421
+ useEffect16(() => {
18422
+ if (fetchError instanceof AppInspectorDisabledError || fetchError instanceof ConnectionError) {
18423
+ reportDisabled();
18424
+ }
18425
+ }, [fetchError, reportDisabled]);
18403
18426
  return {
18404
18427
  clearFetchError,
18405
18428
  clearingSpans,
@@ -18427,7 +18450,7 @@ import { ArrowBack } from "@mui/icons-material";
18427
18450
  import { Box as Box19, Button as Button6, Drawer, Paper as Paper3 } from "@mui/material";
18428
18451
  import { styled } from "@mui/material/styles";
18429
18452
  import { ReactFlowProvider } from "@xyflow/react";
18430
- import { useCallback as useCallback10, useEffect as useEffect21, useRef as useRef17, useState as useState17 } from "react";
18453
+ import { useCallback as useCallback11, useEffect as useEffect21, useRef as useRef17, useState as useState17 } from "react";
18431
18454
 
18432
18455
  // src/components/event-details/event-details.tsx
18433
18456
  import { Close as Close2 } from "@mui/icons-material";
@@ -18798,7 +18821,7 @@ import { Box as Box11, useTheme as useTheme3 } from "@mui/material";
18798
18821
  var import_copy_to_clipboard = __toESM(require_copy_to_clipboard(), 1);
18799
18822
  import { jsx as jsx135, jsxs as jsxs126, Fragment as Fragment8 } from "react/jsx-runtime";
18800
18823
  import { Box as Box10, InputBase, NoSsr, SvgIcon, createTheme, ThemeProvider, Paper as Paper2 } from "@mui/material";
18801
- import { createContext as createContext10, useContext as useContext17, useState as useState12, useRef as useRef14, useCallback as useCallback9, useMemo as useMemo9, useEffect as useEffect17, memo as memo9 } from "react";
18824
+ import { createContext as createContext10, useContext as useContext17, useState as useState12, useRef as useRef14, useCallback as useCallback10, useMemo as useMemo9, useEffect as useEffect17, memo as memo9 } from "react";
18802
18825
  import { create, useStore, createStore } from "zustand";
18803
18826
  function r(e2) {
18804
18827
  var t2, f2, n2 = "";
@@ -19044,7 +19067,7 @@ function useClipboard() {
19044
19067
  let { timeout = 2e3 } = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
19045
19068
  const [copied, setCopied] = useState12(false);
19046
19069
  const copyTimeout = useRef14(null);
19047
- const handleCopyResult = useCallback9((value) => {
19070
+ const handleCopyResult = useCallback10((value) => {
19048
19071
  const current = copyTimeout.current;
19049
19072
  if (current) {
19050
19073
  window.clearTimeout(current);
@@ -19055,7 +19078,7 @@ function useClipboard() {
19055
19078
  timeout
19056
19079
  ]);
19057
19080
  const onCopy = useJsonViewerStore((store) => store.onCopy);
19058
- const copy = useCallback9(async (path, value) => {
19081
+ const copy = useCallback10(async (path, value) => {
19059
19082
  if (typeof onCopy === "function") {
19060
19083
  try {
19061
19084
  await onCopy(path, value, copyString);
@@ -19076,7 +19099,7 @@ function useClipboard() {
19076
19099
  handleCopyResult,
19077
19100
  onCopy
19078
19101
  ]);
19079
- const reset = useCallback9(() => {
19102
+ const reset = useCallback10(() => {
19080
19103
  setCopied(false);
19081
19104
  if (copyTimeout.current) {
19082
19105
  clearTimeout(copyTimeout.current);
@@ -19135,7 +19158,7 @@ function useInspect(path, value, nestedIndex) {
19135
19158
  }
19136
19159
  return isTrap ? false : typeof defaultInspectControl === "function" ? defaultInspectControl(path, value) : depth < defaultInspectDepth;
19137
19160
  });
19138
- const setInspect = useCallback9((apply) => {
19161
+ const setInspect = useCallback10((apply) => {
19139
19162
  set((oldState) => {
19140
19163
  const newState = typeof apply === "boolean" ? apply : apply(oldState);
19141
19164
  setInspectCache(path, newState, nestedIndex);
@@ -19212,7 +19235,7 @@ function defineEasyType(param) {
19212
19235
  const EasyTypeEditor = (param2) => {
19213
19236
  let { value, setValue, abortEditing, commitEditing } = param2;
19214
19237
  const color2 = useJsonViewerStore((store) => store.colorspace[colorKey]);
19215
- const handleKeyDown = useCallback9((event) => {
19238
+ const handleKeyDown = useCallback10((event) => {
19216
19239
  if (event.key === "Enter") {
19217
19240
  event.preventDefault();
19218
19241
  commitEditing(value);
@@ -19226,7 +19249,7 @@ function defineEasyType(param) {
19226
19249
  commitEditing,
19227
19250
  value
19228
19251
  ]);
19229
- const handleChange = useCallback9((event) => {
19252
+ const handleChange = useCallback10((event) => {
19230
19253
  setValue(event.target.value);
19231
19254
  }, [
19232
19255
  setValue
@@ -20139,7 +20162,7 @@ var DataKeyPair = (props) => {
20139
20162
  prevValue,
20140
20163
  value
20141
20164
  ]);
20142
- const startEditing = useCallback9((event) => {
20165
+ const startEditing = useCallback10((event) => {
20143
20166
  event.preventDefault();
20144
20167
  if (serialize) setTempValue(serialize(value));
20145
20168
  setEditing(true);
@@ -20147,14 +20170,14 @@ var DataKeyPair = (props) => {
20147
20170
  serialize,
20148
20171
  value
20149
20172
  ]);
20150
- const abortEditing = useCallback9(() => {
20173
+ const abortEditing = useCallback10(() => {
20151
20174
  setEditing(false);
20152
20175
  setTempValue("");
20153
20176
  }, [
20154
20177
  setEditing,
20155
20178
  setTempValue
20156
20179
  ]);
20157
- const commitEditing = useCallback9((newValue) => {
20180
+ const commitEditing = useCallback10((newValue) => {
20158
20181
  setEditing(false);
20159
20182
  if (!deserialize) return;
20160
20183
  try {
@@ -20290,7 +20313,7 @@ var DataKeyPair = (props) => {
20290
20313
  sx: {
20291
20314
  userSelect: "text"
20292
20315
  },
20293
- onMouseEnter: useCallback9(() => setHover(path, nestedIndex), [
20316
+ onMouseEnter: useCallback10(() => setHover(path, nestedIndex), [
20294
20317
  setHover,
20295
20318
  path,
20296
20319
  nestedIndex
@@ -20305,7 +20328,7 @@ var DataKeyPair = (props) => {
20305
20328
  letterSpacing: 0.5,
20306
20329
  opacity: 0.8
20307
20330
  },
20308
- onClick: useCallback9((event) => {
20331
+ onClick: useCallback10((event) => {
20309
20332
  if (event.isDefaultPrevented()) {
20310
20333
  return;
20311
20334
  }
@@ -20521,7 +20544,7 @@ var JsonViewerInner = (props) => {
20521
20544
  const prevValue = useJsonViewerStore((store) => store.prevValue);
20522
20545
  const emptyPath = useMemo9(() => [], []);
20523
20546
  const setHover = useJsonViewerStore((store) => store.setHover);
20524
- const onMouseLeave = useCallback9(() => setHover(null), [
20547
+ const onMouseLeave = useCallback10(() => setHover(null), [
20525
20548
  setHover
20526
20549
  ]);
20527
20550
  return /* @__PURE__ */ jsx135(Paper2, {
@@ -31350,7 +31373,7 @@ var TraceGraphPage = ({ onClose, spanId, traceId }) => {
31350
31373
  const [spans, setSpans] = useState17();
31351
31374
  const [loading, setLoading] = useState17(false);
31352
31375
  const [fetchError, setFetchError] = useState17();
31353
- const fetchSpans = useCallback10(async () => {
31376
+ const fetchSpans = useCallback11(async () => {
31354
31377
  setLoading(true);
31355
31378
  try {
31356
31379
  const spans2 = await fetchConnectedTraces(api, [traceId]);
@@ -31375,20 +31398,25 @@ var TraceGraphPage = ({ onClose, spanId, traceId }) => {
31375
31398
  spansReference.current = spans;
31376
31399
  }
31377
31400
  }, [spans, setSelectedEvent, spanId]);
31378
- const { checkStatus, status, statusError } = useAppInspectorStatus();
31379
- const handleEnable = useCallback10(async () => {
31401
+ const { checkStatus, reportDisabled, status, statusError } = useAppInspectorStatus();
31402
+ useEffect21(() => {
31403
+ if (fetchError instanceof AppInspectorDisabledError || fetchError instanceof ConnectionError) {
31404
+ reportDisabled();
31405
+ }
31406
+ }, [fetchError, reportDisabled]);
31407
+ const handleEnable = useCallback11(async () => {
31380
31408
  await api.setStatus({ status: "ENABLED" });
31381
31409
  void checkStatus();
31382
31410
  }, [api, checkStatus]);
31383
- const handleEventSelect = useCallback10((spanId2) => {
31411
+ const handleEventSelect = useCallback11((spanId2) => {
31384
31412
  const span = spans?.find((s2) => s2.span_id === spanId2);
31385
31413
  setSelectedEvent(span);
31386
31414
  setOpen(true);
31387
31415
  }, [spans]);
31388
- const handleRetry = useCallback10(() => {
31416
+ const handleRetry = useCallback11(() => {
31389
31417
  void checkStatus();
31390
31418
  }, [checkStatus]);
31391
- const navigateToSpansList = useCallback10(() => {
31419
+ const navigateToSpansList = useCallback11(() => {
31392
31420
  onClose?.();
31393
31421
  }, [onClose]);
31394
31422
  return /* @__PURE__ */ jsx145(
@@ -31440,7 +31468,7 @@ var SpansListPage = () => {
31440
31468
  warningCount
31441
31469
  } = useSpans();
31442
31470
  const { checking, checkStatus, status, statusError } = useAppInspectorStatus();
31443
- const clearSpansSync = useCallback11(() => {
31471
+ const clearSpansSync = useCallback12(() => {
31444
31472
  void clearSpans();
31445
31473
  }, [clearSpans]);
31446
31474
  const localstackVersion = status?.localstackVersion ?? (statusError instanceof AppInspectorNotFoundError ? statusError.localstackVersion : void 0);
@@ -31449,15 +31477,15 @@ var SpansListPage = () => {
31449
31477
  const [order2, setOrder] = useLocalStorage("spans-order", "oldest_first");
31450
31478
  const [selectedTraceId, setSelectedTraceId] = useState18();
31451
31479
  const [selectedSpanId, setSelectedSpanId] = useState18();
31452
- const navigateToSpan = useCallback11((span) => {
31480
+ const navigateToSpan = useCallback12((span) => {
31453
31481
  setSelectedTraceId(span.trace_id);
31454
31482
  setSelectedSpanId(span.span_id);
31455
31483
  }, []);
31456
- const handleRetry = useCallback11(() => {
31484
+ const handleRetry = useCallback12(() => {
31457
31485
  void checkStatus();
31458
31486
  fetchForward();
31459
31487
  }, [checkStatus, fetchForward]);
31460
- const handleEnable = useCallback11(async () => {
31488
+ const handleEnable = useCallback12(async () => {
31461
31489
  await api.setStatus({ status: "ENABLED" });
31462
31490
  clearFetchError();
31463
31491
  void checkStatus();