@parca/profile 0.19.140 → 0.19.143

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.
Files changed (182) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/dist/GraphTooltipArrow/Content.js +224 -30
  3. package/dist/GraphTooltipArrow/DockedGraphTooltip/index.js +192 -33
  4. package/dist/GraphTooltipArrow/ExpandOnHoverValue.js +53 -3
  5. package/dist/GraphTooltipArrow/index.d.ts.map +1 -1
  6. package/dist/GraphTooltipArrow/index.js +86 -56
  7. package/dist/GraphTooltipArrow/useGraphTooltip/index.js +37 -37
  8. package/dist/GraphTooltipArrow/useGraphTooltipMetaInfo/index.js +94 -68
  9. package/dist/MatchersInput/SuggestionItem.js +91 -12
  10. package/dist/MatchersInput/SuggestionsList.d.ts +2 -1
  11. package/dist/MatchersInput/SuggestionsList.d.ts.map +1 -1
  12. package/dist/MatchersInput/SuggestionsList.js +371 -157
  13. package/dist/MatchersInput/SuggestionsList.test.d.ts +2 -0
  14. package/dist/MatchersInput/SuggestionsList.test.d.ts.map +1 -0
  15. package/dist/MatchersInput/index.js +308 -115
  16. package/dist/MetricsCircle/index.js +39 -3
  17. package/dist/MetricsGraph/MetricsContextMenu/index.js +119 -19
  18. package/dist/MetricsGraph/MetricsInfoPanel/index.js +81 -20
  19. package/dist/MetricsGraph/MetricsTooltip/index.d.ts.map +1 -1
  20. package/dist/MetricsGraph/MetricsTooltip/index.js +107 -74
  21. package/dist/MetricsGraph/index.js +552 -203
  22. package/dist/MetricsGraph/useMetricsGraphDimensions.js +46 -25
  23. package/dist/MetricsGraph/utils/colorMapping.js +24 -17
  24. package/dist/MetricsSeries/index.js +70 -7
  25. package/dist/PreSelectedMatchers/index.d.ts.map +1 -1
  26. package/dist/PreSelectedMatchers/index.js +249 -102
  27. package/dist/ProfileExplorer/ProfileExplorerCompare.d.ts.map +1 -1
  28. package/dist/ProfileExplorer/ProfileExplorerCompare.js +240 -45
  29. package/dist/ProfileExplorer/ProfileExplorerSingle.js +98 -11
  30. package/dist/ProfileExplorer/index.js +183 -32
  31. package/dist/ProfileFlameChart/SamplesStrips/SamplesGraph/index.js +333 -148
  32. package/dist/ProfileFlameChart/SamplesStrips/SamplesStrips.stories.js +69 -35
  33. package/dist/ProfileFlameChart/SamplesStrips/index.js +645 -134
  34. package/dist/ProfileFlameChart/SamplesStrips/labelSetUtils.js +114 -55
  35. package/dist/ProfileFlameChart/index.js +260 -126
  36. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenu.js +283 -85
  37. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenuWrapper.js +56 -20
  38. package/dist/ProfileFlameGraph/FlameGraphArrow/FlameGraphNodes.js +211 -140
  39. package/dist/ProfileFlameGraph/FlameGraphArrow/MemoizedTooltip.js +133 -38
  40. package/dist/ProfileFlameGraph/FlameGraphArrow/MiniMap.js +261 -216
  41. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.d.ts.map +1 -1
  42. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.js +71 -45
  43. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.d.ts.map +1 -1
  44. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.js +58 -28
  45. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.d.ts.map +1 -1
  46. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.js +59 -8
  47. package/dist/ProfileFlameGraph/FlameGraphArrow/index.js +396 -179
  48. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.d.ts.map +1 -1
  49. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.js +68 -50
  50. package/dist/ProfileFlameGraph/FlameGraphArrow/useMappingList.js +62 -38
  51. package/dist/ProfileFlameGraph/FlameGraphArrow/useNodeColor.js +14 -6
  52. package/dist/ProfileFlameGraph/FlameGraphArrow/useScrollViewport.js +124 -82
  53. package/dist/ProfileFlameGraph/FlameGraphArrow/useVisibleNodes.js +160 -98
  54. package/dist/ProfileFlameGraph/FlameGraphArrow/useZoom.js +232 -112
  55. package/dist/ProfileFlameGraph/FlameGraphArrow/utils.js +137 -114
  56. package/dist/ProfileFlameGraph/benchmarks/benchdata/populateData.js +85 -0
  57. package/dist/ProfileFlameGraph/index.js +322 -147
  58. package/dist/ProfileMetricsGraph/hooks/useQueryRange.js +140 -32
  59. package/dist/ProfileMetricsGraph/index.js +515 -256
  60. package/dist/ProfileSelector/CompareButton.js +132 -12
  61. package/dist/ProfileSelector/MetricsGraphSection.js +228 -63
  62. package/dist/ProfileSelector/index.d.ts +1 -1
  63. package/dist/ProfileSelector/index.d.ts.map +1 -1
  64. package/dist/ProfileSelector/index.js +734 -142
  65. package/dist/ProfileSelector/useAutoQuerySelector.d.ts +1 -3
  66. package/dist/ProfileSelector/useAutoQuerySelector.d.ts.map +1 -1
  67. package/dist/ProfileSelector/useAutoQuerySelector.js +280 -132
  68. package/dist/ProfileSource.js +230 -163
  69. package/dist/ProfileTypeSelector/index.js +214 -125
  70. package/dist/ProfileView/components/ActionButtons/GroupByDropdown.js +50 -4
  71. package/dist/ProfileView/components/ActionButtons/SortByDropdown.js +137 -32
  72. package/dist/ProfileView/components/ColorStackLegend.js +182 -54
  73. package/dist/ProfileView/components/DashboardItems/index.js +87 -28
  74. package/dist/ProfileView/components/DashboardLayout/index.js +108 -16
  75. package/dist/ProfileView/components/DiffLegend.js +172 -29
  76. package/dist/ProfileView/components/GroupByLabelsDropdown/index.js +199 -55
  77. package/dist/ProfileView/components/InvertCallStack/index.js +97 -9
  78. package/dist/ProfileView/components/ProfileFilters/filterPresets.js +260 -315
  79. package/dist/ProfileView/components/ProfileFilters/index.js +518 -215
  80. package/dist/ProfileView/components/ProfileFilters/useProfileFilters.js +370 -306
  81. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.js +191 -118
  82. package/dist/ProfileView/components/ProfileHeader/index.js +105 -11
  83. package/dist/ProfileView/components/ShareButton/ResultBox.js +119 -16
  84. package/dist/ProfileView/components/ShareButton/index.js +352 -62
  85. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.d.ts.map +1 -1
  86. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.js +664 -192
  87. package/dist/ProfileView/components/Toolbars/SwitchMenuItem.js +94 -7
  88. package/dist/ProfileView/components/Toolbars/TableColumnsDropdown.js +196 -155
  89. package/dist/ProfileView/components/Toolbars/index.js +441 -21
  90. package/dist/ProfileView/components/ViewSelector/Dropdown.js +233 -22
  91. package/dist/ProfileView/components/ViewSelector/index.js +186 -82
  92. package/dist/ProfileView/components/VisualizationContainer/index.d.ts.map +1 -1
  93. package/dist/ProfileView/components/VisualizationContainer/index.js +52 -7
  94. package/dist/ProfileView/components/VisualizationPanel.js +185 -8
  95. package/dist/ProfileView/context/DashboardContext.js +74 -26
  96. package/dist/ProfileView/context/ProfileViewContext.js +56 -15
  97. package/dist/ProfileView/hooks/useAutoSelectDimension.js +71 -41
  98. package/dist/ProfileView/hooks/useProfileMetadata.js +50 -18
  99. package/dist/ProfileView/hooks/useResetFlameGraphState.js +31 -10
  100. package/dist/ProfileView/hooks/useResetStateOnProfileTypeChange.js +71 -27
  101. package/dist/ProfileView/hooks/useResetStateOnSeriesChange.js +53 -17
  102. package/dist/ProfileView/hooks/useVisualizationState.js +229 -69
  103. package/dist/ProfileView/index.js +383 -45
  104. package/dist/ProfileView/types/visualization.js +1 -13
  105. package/dist/ProfileView/utils/colorUtils.js +8 -7
  106. package/dist/ProfileViewWithData.js +319 -225
  107. package/dist/QueryControls/index.js +418 -47
  108. package/dist/Sandwich/components/CalleesSection.js +54 -4
  109. package/dist/Sandwich/components/CallersSection.js +97 -27
  110. package/dist/Sandwich/components/TableSection.js +77 -4
  111. package/dist/Sandwich/index.js +125 -12
  112. package/dist/Sandwich/utils/processRowData.js +48 -39
  113. package/dist/SelectWithRefresh/index.js +102 -28
  114. package/dist/SimpleMatchers/Select.js +520 -187
  115. package/dist/SimpleMatchers/index.js +590 -288
  116. package/dist/SourceView/Highlighter.js +230 -70
  117. package/dist/SourceView/LineNo.js +72 -17
  118. package/dist/SourceView/index.js +177 -101
  119. package/dist/SourceView/lang-detector/ext-to-lang.json +798 -798
  120. package/dist/SourceView/lang-detector/index.js +28 -14
  121. package/dist/SourceView/useSelectedLineRange.js +72 -20
  122. package/dist/Table/ColorCell.js +42 -1
  123. package/dist/Table/ColumnsVisibility.js +114 -6
  124. package/dist/Table/MoreDropdown.js +107 -21
  125. package/dist/Table/TableContextMenu.js +144 -134
  126. package/dist/Table/TableContextMenuWrapper.js +59 -14
  127. package/dist/Table/hooks/useColorManagement.js +58 -16
  128. package/dist/Table/hooks/useTableConfiguration.d.ts.map +1 -1
  129. package/dist/Table/hooks/useTableConfiguration.js +323 -167
  130. package/dist/Table/index.js +217 -123
  131. package/dist/Table/utils/functions.js +169 -144
  132. package/dist/Table/utils/topAndBottomExpandedRowModel.js +69 -52
  133. package/dist/TimelineGuide/index.js +209 -16
  134. package/dist/TopTable/benchmarks/benchdata/populateData.js +91 -0
  135. package/dist/TopTable/index.js +325 -121
  136. package/dist/contexts/LabelsQueryProvider.js +94 -32
  137. package/dist/contexts/UnifiedLabelsContext.js +114 -49
  138. package/dist/contexts/utils.js +37 -15
  139. package/dist/hooks/urlParsers.js +27 -15
  140. package/dist/hooks/useColorBy.js +47 -10
  141. package/dist/hooks/useCompareModeMeta.js +112 -62
  142. package/dist/hooks/useDashboardItems.js +52 -11
  143. package/dist/hooks/useLabels.js +295 -52
  144. package/dist/hooks/useQueryState.d.ts +1 -1
  145. package/dist/hooks/useQueryState.d.ts.map +1 -1
  146. package/dist/hooks/useQueryState.js +375 -329
  147. package/dist/index.js +11 -6
  148. package/dist/testdata/fg-diff.json +3750 -0
  149. package/dist/testdata/fg-simple.json +1879 -0
  150. package/dist/testdata/link_data.json +56 -0
  151. package/dist/testdata/tabular.json +30 -0
  152. package/dist/testdata/test_flamegraph.json +26846 -0
  153. package/dist/testdata/test_graph.json +53 -0
  154. package/dist/useDelayedLoader.js +32 -18
  155. package/dist/useGrpcQuery/index.js +71 -11
  156. package/dist/useHasProfileData.js +90 -12
  157. package/dist/useQuery.js +205 -64
  158. package/dist/useSumBy.d.ts.map +1 -1
  159. package/dist/useSumBy.js +294 -138
  160. package/dist/utils.js +62 -30
  161. package/package.json +9 -9
  162. package/src/GraphTooltipArrow/index.tsx +3 -0
  163. package/src/MatchersInput/SuggestionsList.test.tsx +70 -0
  164. package/src/MatchersInput/SuggestionsList.tsx +11 -10
  165. package/src/MatchersInput/index.tsx +1 -1
  166. package/src/MetricsGraph/MetricsTooltip/index.tsx +22 -34
  167. package/src/PreSelectedMatchers/index.tsx +3 -0
  168. package/src/ProfileExplorer/ProfileExplorerCompare.tsx +9 -2
  169. package/src/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.tsx +3 -0
  170. package/src/ProfileFlameGraph/FlameGraphArrow/TooltipContext.tsx +3 -0
  171. package/src/ProfileFlameGraph/FlameGraphArrow/ZoomControls.tsx +3 -0
  172. package/src/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.ts +3 -0
  173. package/src/ProfileSelector/index.tsx +31 -9
  174. package/src/ProfileSelector/useAutoQuerySelector.ts +64 -42
  175. package/src/ProfileView/components/Toolbars/MultiLevelDropdown.tsx +3 -0
  176. package/src/ProfileView/components/VisualizationContainer/index.tsx +3 -0
  177. package/src/Table/hooks/useTableConfiguration.tsx +7 -13
  178. package/src/hooks/useQueryState.ts +18 -3
  179. package/src/useDelayedLoader.ts +10 -10
  180. package/src/useSumBy.ts +12 -18
  181. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.test.js +0 -455
  182. package/dist/hooks/useQueryState.test.js +0 -868
@@ -1,3 +1,15 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
8
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
10
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
11
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
12
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
13
  // Copyright 2022 The Parca Authors
2
14
  // Licensed under the Apache License, Version 2.0 (the "License");
3
15
  // you may not use this file except in compliance with the License.
@@ -10,7 +22,8 @@
10
22
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
23
  // See the License for the specific language governing permissions and
12
24
  // limitations under the License.
13
- import { useCallback, useEffect, useMemo, useState } from 'react';
25
+
26
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
14
27
  import { useQueryState as useNuqsQueryState, useQueryStates } from 'nuqs';
15
28
  import { DateTimeRange, useParcaContext } from '@parca/components';
16
29
  import { Query } from '@parca/parser';
@@ -19,333 +32,366 @@ import { useResetFlameGraphState } from '../ProfileView/hooks/useResetFlameGraph
19
32
  import { useResetStateOnProfileTypeChange } from '../ProfileView/hooks/useResetStateOnProfileTypeChange';
20
33
  import { DEFAULT_EMPTY_SUM_BY, sumByToParam, useSumBy, useSumByFromParams } from '../useSumBy';
21
34
  import { commaArrayParam, stringParam } from './urlParsers';
22
- export const useQueryState = (options = {}) => {
23
- const { queryServiceClient: queryClient } = useParcaContext();
24
- const { suffix = '', defaultExpression = '', defaultTimeSelection = 'relative:minute|15', // Default to 15 minutes relative
25
- defaultFrom, defaultTo, comparing = false, onProfileTypeChange, } = options;
26
- const resetFlameGraphState = useResetFlameGraphState();
27
- const resetStateOnProfileTypeChange = useResetStateOnProfileTypeChange();
28
- // URL state hooks with appropriate suffixes via useQueryStates
29
- const [queryParams, setQueryParams] = useQueryStates({
30
- expression: stringParam,
31
- from: stringParam,
32
- to: stringParam,
33
- time_selection: stringParam,
34
- sum_by: stringParam,
35
- merge_from: stringParam,
36
- merge_to: stringParam,
37
- selection: stringParam,
35
+ export var useQueryState = function useQueryState() {
36
+ var _queryParams$expressi, _queryParams$from, _queryParams$to, _queryParams$time_sel, _ref, _ref2;
37
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
38
+ var _useParcaContext = useParcaContext(),
39
+ queryClient = _useParcaContext.queryServiceClient;
40
+ var _options$suffix = options.suffix,
41
+ suffix = _options$suffix === void 0 ? '' : _options$suffix,
42
+ _options$defaultExpre = options.defaultExpression,
43
+ defaultExpression = _options$defaultExpre === void 0 ? '' : _options$defaultExpre,
44
+ _options$defaultTimeS = options.defaultTimeSelection,
45
+ defaultTimeSelection = _options$defaultTimeS === void 0 ? 'relative:minute|15' : _options$defaultTimeS,
46
+ defaultFrom = options.defaultFrom,
47
+ defaultTo = options.defaultTo,
48
+ _options$comparing = options.comparing,
49
+ comparing = _options$comparing === void 0 ? false : _options$comparing,
50
+ onProfileTypeChange = options.onProfileTypeChange;
51
+ var resetFlameGraphState = useResetFlameGraphState();
52
+ var resetStateOnProfileTypeChange = useResetStateOnProfileTypeChange();
53
+
54
+ // URL state hooks with appropriate suffixes via useQueryStates
55
+ var _useQueryStates = useQueryStates({
56
+ expression: stringParam,
57
+ from: stringParam,
58
+ to: stringParam,
59
+ time_selection: stringParam,
60
+ sum_by: stringParam,
61
+ merge_from: stringParam,
62
+ merge_to: stringParam,
63
+ selection: stringParam
38
64
  }, {
39
- history: 'replace',
40
- urlKeys: {
41
- expression: `expression${suffix}`,
42
- from: `from${suffix}`,
43
- to: `to${suffix}`,
44
- time_selection: `time_selection${suffix}`,
45
- sum_by: `sum_by${suffix}`,
46
- merge_from: `merge_from${suffix}`,
47
- merge_to: `merge_to${suffix}`,
48
- selection: `selection${suffix}`,
49
- },
65
+ history: 'replace',
66
+ urlKeys: {
67
+ expression: "expression".concat(suffix),
68
+ from: "from".concat(suffix),
69
+ to: "to".concat(suffix),
70
+ time_selection: "time_selection".concat(suffix),
71
+ sum_by: "sum_by".concat(suffix),
72
+ merge_from: "merge_from".concat(suffix),
73
+ merge_to: "merge_to".concat(suffix),
74
+ selection: "selection".concat(suffix)
75
+ }
76
+ }),
77
+ _useQueryStates2 = _slicedToArray(_useQueryStates, 2),
78
+ queryParams = _useQueryStates2[0],
79
+ setQueryParams = _useQueryStates2[1];
80
+ var expression = (_queryParams$expressi = queryParams.expression) !== null && _queryParams$expressi !== void 0 ? _queryParams$expressi : defaultExpression;
81
+ var from = (_queryParams$from = queryParams.from) !== null && _queryParams$from !== void 0 ? _queryParams$from : defaultFrom === null || defaultFrom === void 0 ? void 0 : defaultFrom.toString();
82
+ var to = (_queryParams$to = queryParams.to) !== null && _queryParams$to !== void 0 ? _queryParams$to : defaultTo === null || defaultTo === void 0 ? void 0 : defaultTo.toString();
83
+ var timeSelection = (_queryParams$time_sel = queryParams.time_selection) !== null && _queryParams$time_sel !== void 0 ? _queryParams$time_sel : defaultTimeSelection;
84
+ var sumByParam = queryParams.sum_by;
85
+ var mergeFrom = queryParams.merge_from;
86
+ var mergeTo = queryParams.merge_to;
87
+ var selectionParam = queryParams.selection;
88
+
89
+ // Individual setters for direct access
90
+ var setExpressionState = useCallback(function (val) {
91
+ return void setQueryParams({
92
+ expression: val
50
93
  });
51
- const expression = queryParams.expression ?? defaultExpression;
52
- const from = queryParams.from ?? defaultFrom?.toString();
53
- const to = queryParams.to ?? defaultTo?.toString();
54
- const timeSelection = queryParams.time_selection ?? defaultTimeSelection;
55
- const sumByParam = queryParams.sum_by;
56
- const mergeFrom = queryParams.merge_from;
57
- const mergeTo = queryParams.merge_to;
58
- const selectionParam = queryParams.selection;
59
- // Individual setters for direct access
60
- const setExpressionState = useCallback((val) => void setQueryParams({ expression: val }), [setQueryParams]);
61
- const setSumByParam = useCallback((val) => void setQueryParams({ sum_by: val }), [setQueryParams]);
62
- const [, setRawGroupByParam] = useNuqsQueryState('group_by', commaArrayParam);
63
- const setGroupByParam = useCallback((val) => {
64
- void setRawGroupByParam(val);
65
- }, [setRawGroupByParam]);
66
- // Parse sumBy from URL parameter format
67
- const sumBy = useSumByFromParams(sumByParam ?? undefined);
68
- // Draft state management
69
- const [draftExpression, setDraftExpression] = useState(expression ?? defaultExpression);
70
- const [draftFrom, setDraftFrom] = useState(from ?? defaultFrom?.toString() ?? '');
71
- const [draftTo, setDraftTo] = useState(to ?? defaultTo?.toString() ?? '');
72
- const [draftTimeSelection, setDraftTimeSelection] = useState(timeSelection ?? defaultTimeSelection);
73
- // Parse the draft query to extract profile information
74
- const draftQuery = useMemo(() => {
75
- try {
76
- return Query.parse(draftExpression ?? '');
77
- }
78
- catch (error) {
79
- console.warn('Failed to parse draft expression', {
80
- expression: draftExpression,
81
- error: error instanceof Error ? error.message : String(error),
82
- });
83
- return Query.parse('');
84
- }
85
- }, [draftExpression]);
86
- const query = useMemo(() => {
87
- try {
88
- return Query.parse(expression ?? '');
89
- }
90
- catch (error) {
91
- console.warn('Failed to parse expression', {
92
- expression,
93
- error: error instanceof Error ? error.message : String(error),
94
- });
95
- return Query.parse('');
96
- }
97
- }, [expression]);
98
- const draftProfileType = useMemo(() => draftQuery.profileType(), [draftQuery]);
99
- const draftProfileName = useMemo(() => draftQuery.profileName(), [draftQuery]);
100
- const profileType = useMemo(() => query.profileType(), [query]);
101
- // Compute draft time range for label fetching
102
- const draftTimeRange = useMemo(() => {
103
- return DateTimeRange.fromRangeKey(draftTimeSelection ?? defaultTimeSelection, draftFrom !== '' ? parseInt(draftFrom) : defaultFrom, draftTo !== '' ? parseInt(draftTo) : defaultTo);
104
- }, [draftTimeSelection, draftFrom, draftTo, defaultTimeSelection, defaultFrom, defaultTo]);
105
- // Use combined sumBy hook for fetching labels and computing defaults (based on committed state)
106
- const { sumBy: computedSumByFromURL, isLoading: sumBySelectionLoading, draftSumBy, setDraftSumBy, isDraftSumByLoading, } = useSumBy(queryClient, profileType?.profileName !== '' ? profileType : draftProfileType, draftTimeRange, draftProfileType, draftTimeRange, sumBy);
107
- // Sync draft state with URL state when URL changes externally
108
- useEffect(() => {
109
- setDraftExpression(expression ?? defaultExpression);
110
- }, [expression, defaultExpression]);
111
- useEffect(() => {
112
- setDraftFrom(from ?? defaultFrom?.toString() ?? '');
113
- }, [from, defaultFrom]);
114
- useEffect(() => {
115
- setDraftTo(to ?? defaultTo?.toString() ?? '');
116
- }, [to, defaultTo]);
117
- useEffect(() => {
118
- setDraftTimeSelection(timeSelection ?? defaultTimeSelection);
119
- }, [timeSelection, defaultTimeSelection]);
120
- useEffect(() => {
121
- setDraftSumBy(sumBy);
122
- }, [sumBy, setDraftSumBy]);
123
- // Sync computed sumBy to URL if URL doesn't already have a value
124
- // to ensure the shared URL can always pick it up.
125
- useEffect(() => {
126
- if (sumByParam === null && computedSumByFromURL !== undefined && !sumBySelectionLoading) {
127
- void setSumByParam(sumByToParam(computedSumByFromURL));
128
- }
129
- }, [sumByParam, computedSumByFromURL, sumBySelectionLoading, setSumByParam]);
130
- // Construct the QuerySelection object (committed state from URL)
131
- const querySelection = useMemo(() => {
132
- const range = DateTimeRange.fromRangeKey(timeSelection ?? defaultTimeSelection, from != null && from !== '' ? parseInt(from) : defaultFrom, to != null && to !== '' ? parseInt(to) : defaultTo);
133
- return {
134
- expression: expression ?? defaultExpression,
135
- from: range.getFromMs(),
136
- to: range.getToMs(),
137
- timeSelection: range.getRangeKey(),
138
- sumBy: computedSumByFromURL,
139
- ...(mergeFrom != null && mergeFrom !== '' && mergeTo != null && mergeTo !== ''
140
- ? { mergeFrom, mergeTo }
141
- : {}),
142
- };
143
- }, [
144
- expression,
145
- from,
146
- to,
147
- timeSelection,
148
- computedSumByFromURL,
149
- mergeFrom,
150
- mergeTo,
151
- defaultExpression,
152
- defaultTimeSelection,
153
- defaultFrom,
154
- defaultTo,
155
- ]);
156
- // Construct the draft QuerySelection object (local draft state)
157
- const draftSelection = useMemo(() => {
158
- const isDelta = draftProfileType.delta;
159
- const draftMergeFrom = isDelta
160
- ? (BigInt(draftTimeRange.getFromMs()) * 1000000n).toString()
161
- : undefined;
162
- const draftMergeTo = isDelta
163
- ? (BigInt(draftTimeRange.getToMs()) * 1000000n).toString()
164
- : undefined;
165
- const finalSumBy = draftSumBy ?? computedSumByFromURL;
166
- return {
167
- expression: draftExpression ?? defaultExpression,
168
- from: draftTimeRange.getFromMs(),
169
- to: draftTimeRange.getToMs(),
170
- timeSelection: draftTimeRange.getRangeKey(),
171
- sumBy: finalSumBy, // Use draft if set, otherwise fallback to computed
172
- ...(draftMergeFrom !== undefined &&
173
- draftMergeFrom !== '' &&
174
- draftMergeTo !== undefined &&
175
- draftMergeTo !== ''
176
- ? { mergeFrom: draftMergeFrom, mergeTo: draftMergeTo }
177
- : {}),
178
- };
179
- }, [
180
- draftExpression,
181
- draftTimeRange,
182
- draftSumBy,
183
- computedSumByFromURL,
184
- draftProfileType.delta,
185
- defaultExpression,
186
- ]);
187
- // Compute ProfileSelection from URL params
188
- const profileSelection = useMemo(() => {
189
- return ProfileSelectionFromParams(mergeFrom ?? undefined, mergeTo ?? undefined, selectionParam ?? undefined);
190
- }, [mergeFrom, mergeTo, selectionParam]);
191
- // Compute ProfileSource from ProfileSelection
192
- const profileSource = useMemo(() => {
193
- if (profileSelection === null)
194
- return null;
195
- return profileSelection.ProfileSource();
196
- }, [profileSelection]);
197
- // Commit draft changes to URL
198
- // Optional refreshedTimeRange parameter allows re-evaluating relative time ranges (e.g., "last 15 minutes")
199
- // to the current moment when the Search button is clicked
200
- // Optional expression parameter allows updating the expression before committing
201
- const commitDraft = useCallback((refreshedTimeRange, expression) => {
202
- // Use provided expression or current draft expression
203
- const finalExpression = expression ?? draftExpression;
204
- // Update draft state with new expression if provided
205
- if (expression !== undefined) {
206
- setDraftExpression(expression);
207
- }
208
- // Calculate the actual from/to values from draftSelection if not provided
209
- const calculatedFrom = draftSelection.from.toString();
210
- const calculatedTo = draftSelection.to.toString();
211
- const finalFrom = refreshedTimeRange?.from?.toString() ?? (draftFrom !== '' ? draftFrom : calculatedFrom);
212
- const finalTo = refreshedTimeRange?.to?.toString() ?? (draftTo !== '' ? draftTo : calculatedTo);
213
- const finalTimeSelection = refreshedTimeRange?.timeSelection ?? draftTimeSelection;
214
- // Update draft state with refreshed time range if provided
215
- if (refreshedTimeRange?.from !== undefined) {
216
- setDraftFrom(finalFrom);
217
- }
218
- if (refreshedTimeRange?.to !== undefined) {
219
- setDraftTo(finalTo);
220
- }
221
- if (refreshedTimeRange?.timeSelection !== undefined) {
222
- setDraftTimeSelection(finalTimeSelection);
223
- }
224
- // Auto-calculate merge parameters for delta profiles
225
- const finalQuery = Query.parse(finalExpression);
226
- const isDelta = finalQuery.profileType().delta;
227
- const sumByValue = isDelta ? sumByToParam(draftSumBy) : sumByToParam(DEFAULT_EMPTY_SUM_BY);
228
- let mergeFromValue = null;
229
- let mergeToValue = null;
230
- let selectionValue = null;
231
- if (isDelta && finalFrom !== '' && finalTo !== '') {
232
- const fromMs = parseInt(finalFrom);
233
- const toMs = parseInt(finalTo);
234
- mergeFromValue = (BigInt(fromMs) * 1000000n).toString();
235
- mergeToValue = (BigInt(toMs) * 1000000n).toString();
236
- if (!comparing) {
237
- selectionValue = finalExpression;
238
- }
239
- }
240
- // Atomic URL update with all params at once
241
- void setQueryParams({
242
- expression: finalExpression,
243
- from: finalFrom,
244
- to: finalTo,
245
- time_selection: finalTimeSelection,
246
- sum_by: sumByValue,
247
- merge_from: mergeFromValue,
248
- merge_to: mergeToValue,
249
- selection: selectionValue,
250
- });
251
- resetFlameGraphState();
252
- if (draftProfileType.toString() !==
253
- Query.parse(querySelection.expression).profileType().toString()) {
254
- resetStateOnProfileTypeChange();
255
- onProfileTypeChange?.();
256
- }
257
- }, [
258
- draftExpression,
259
- draftFrom,
260
- draftTo,
261
- draftTimeSelection,
262
- draftSumBy,
263
- draftSelection.from,
264
- draftSelection.to,
265
- comparing,
266
- setQueryParams,
267
- resetFlameGraphState,
268
- resetStateOnProfileTypeChange,
269
- onProfileTypeChange,
270
- draftProfileType,
271
- querySelection.expression,
272
- ]);
273
- const setDraftTimeRange = useCallback((newFrom, newTo, newTimeSelection) => {
274
- setDraftFrom(newFrom.toString());
275
- setDraftTo(newTo.toString());
276
- setDraftTimeSelection(newTimeSelection);
277
- }, []);
278
- const setDraftSumByCallback = useCallback((newSumBy) => {
279
- setDraftSumBy(newSumBy);
280
- }, [setDraftSumBy]);
281
- const setDraftProfileName = useCallback((newProfileName) => {
282
- if (newProfileName === '')
283
- return;
284
- const [newQuery, changed] = draftQuery.setProfileName(newProfileName);
285
- if (changed) {
286
- setDraftExpression(newQuery.toString());
287
- setDraftSumBy(undefined);
288
- }
289
- }, [draftQuery, setDraftSumBy]);
290
- const setDraftMatchers = useCallback((matchers) => {
291
- const newExpression = `${draftProfileName}{${matchers}}`;
292
- setDraftExpression(newExpression);
293
- }, [draftProfileName]);
294
- // Set ProfileSelection (auto-commits to URL immediately)
295
- const setProfileSelection = useCallback((mergeFrom, mergeTo, query) => {
296
- void setQueryParams({
297
- selection: query.toString(),
298
- merge_from: mergeFrom.toString(),
299
- merge_to: mergeTo.toString(),
300
- });
301
- }, [setQueryParams]);
302
- const draftParsedQuery = useMemo(() => {
303
- try {
304
- return Query.parse(draftSelection.expression ?? '');
305
- }
306
- catch (error) {
307
- console.warn('Failed to parse draft selection expression', {
308
- expression: draftSelection.expression,
309
- error: error instanceof Error ? error.message : String(error),
310
- });
311
- return Query.parse('');
312
- }
313
- }, [draftSelection.expression]);
314
- const parsedQuery = useMemo(() => {
315
- try {
316
- return Query.parse(querySelection.expression ?? '');
317
- }
318
- catch (error) {
319
- console.warn('Failed to parse query selection expression', {
320
- expression: querySelection.expression,
321
- error: error instanceof Error ? error.message : String(error),
322
- });
323
- return Query.parse('');
324
- }
325
- }, [querySelection.expression]);
326
- return {
327
- // Current committed state
328
- querySelection,
329
- // Draft state
330
- draftSelection,
331
- // Draft setters
332
- setDraftExpression,
333
- setDraftTimeRange,
334
- setDraftSumBy: setDraftSumByCallback,
335
- setDraftProfileName,
336
- setDraftMatchers,
337
- // Commit function
338
- commitDraft,
339
- // ProfileSelection state
340
- profileSelection,
341
- profileSource,
342
- setProfileSelection,
343
- // Loading state
344
- sumByLoading: isDraftSumByLoading || sumBySelectionLoading,
345
- draftParsedQuery,
346
- parsedQuery,
347
- setExpressionParam: setExpressionState,
348
- setSumByParam,
349
- setGroupByParam,
350
- };
351
- };
94
+ }, [setQueryParams]);
95
+ var setSumByParam = useCallback(function (val_0) {
96
+ return void setQueryParams({
97
+ sum_by: val_0
98
+ });
99
+ }, [setQueryParams]);
100
+ var _useNuqsQueryState = useNuqsQueryState('group_by', commaArrayParam),
101
+ _useNuqsQueryState2 = _slicedToArray(_useNuqsQueryState, 2),
102
+ setRawGroupByParam = _useNuqsQueryState2[1];
103
+ var setGroupByParam = useCallback(function (val_1) {
104
+ void setRawGroupByParam(val_1);
105
+ }, [setRawGroupByParam]);
106
+
107
+ // Parse sumBy from URL parameter format
108
+ var sumBy = useSumByFromParams(sumByParam !== null && sumByParam !== void 0 ? sumByParam : undefined);
109
+
110
+ // Draft state management
111
+ var _useState = useState(expression !== null && expression !== void 0 ? expression : defaultExpression),
112
+ _useState2 = _slicedToArray(_useState, 2),
113
+ draftExpression = _useState2[0],
114
+ setDraftExpression = _useState2[1];
115
+ var _useState3 = useState((_ref = from !== null && from !== void 0 ? from : defaultFrom === null || defaultFrom === void 0 ? void 0 : defaultFrom.toString()) !== null && _ref !== void 0 ? _ref : ''),
116
+ _useState4 = _slicedToArray(_useState3, 2),
117
+ draftFrom = _useState4[0],
118
+ setDraftFrom = _useState4[1];
119
+ var _useState5 = useState((_ref2 = to !== null && to !== void 0 ? to : defaultTo === null || defaultTo === void 0 ? void 0 : defaultTo.toString()) !== null && _ref2 !== void 0 ? _ref2 : ''),
120
+ _useState6 = _slicedToArray(_useState5, 2),
121
+ draftTo = _useState6[0],
122
+ setDraftTo = _useState6[1];
123
+ var _useState7 = useState(timeSelection !== null && timeSelection !== void 0 ? timeSelection : defaultTimeSelection),
124
+ _useState8 = _slicedToArray(_useState7, 2),
125
+ draftTimeSelection = _useState8[0],
126
+ setDraftTimeSelection = _useState8[1];
127
+ // Parse the draft query to extract profile information
128
+ var draftQuery = useMemo(function () {
129
+ try {
130
+ return Query.parse(draftExpression !== null && draftExpression !== void 0 ? draftExpression : '');
131
+ } catch (error) {
132
+ console.warn('Failed to parse draft expression', {
133
+ expression: draftExpression,
134
+ error: error instanceof Error ? error.message : String(error)
135
+ });
136
+ return Query.parse('');
137
+ }
138
+ }, [draftExpression]);
139
+ var query = useMemo(function () {
140
+ try {
141
+ return Query.parse(expression !== null && expression !== void 0 ? expression : '');
142
+ } catch (error_0) {
143
+ console.warn('Failed to parse expression', {
144
+ expression: expression,
145
+ error: error_0 instanceof Error ? error_0.message : String(error_0)
146
+ });
147
+ return Query.parse('');
148
+ }
149
+ }, [expression]);
150
+ var draftProfileType = useMemo(function () {
151
+ return draftQuery.profileType();
152
+ }, [draftQuery]);
153
+ var draftProfileName = useMemo(function () {
154
+ return draftQuery.profileName();
155
+ }, [draftQuery]);
156
+ var profileType = useMemo(function () {
157
+ return query.profileType();
158
+ }, [query]);
159
+
160
+ // Compute draft time range for label fetching
161
+ var draftTimeRange = useMemo(function () {
162
+ return DateTimeRange.fromRangeKey(draftTimeSelection !== null && draftTimeSelection !== void 0 ? draftTimeSelection : defaultTimeSelection, draftFrom !== '' ? parseInt(draftFrom) : defaultFrom, draftTo !== '' ? parseInt(draftTo) : defaultTo);
163
+ }, [draftTimeSelection, draftFrom, draftTo, defaultTimeSelection, defaultFrom, defaultTo]);
164
+ // Use combined sumBy hook for fetching labels and computing defaults (based on committed state)
165
+ var _useSumBy = useSumBy(queryClient, (profileType === null || profileType === void 0 ? void 0 : profileType.profileName) !== '' ? profileType : draftProfileType, draftTimeRange, draftProfileType, draftTimeRange, sumBy),
166
+ computedSumByFromURL = _useSumBy.sumBy,
167
+ sumBySelectionLoading = _useSumBy.isLoading,
168
+ draftSumBy = _useSumBy.draftSumBy,
169
+ setDraftSumBy = _useSumBy.setDraftSumBy,
170
+ isDraftSumByLoading = _useSumBy.isDraftSumByLoading;
171
+
172
+ // Sync draft state with URL state when URL changes externally
173
+ useEffect(function () {
174
+ setDraftExpression(expression !== null && expression !== void 0 ? expression : defaultExpression);
175
+ }, [expression, defaultExpression]);
176
+ useEffect(function () {
177
+ var _ref3;
178
+ setDraftFrom((_ref3 = from !== null && from !== void 0 ? from : defaultFrom === null || defaultFrom === void 0 ? void 0 : defaultFrom.toString()) !== null && _ref3 !== void 0 ? _ref3 : '');
179
+ }, [from, defaultFrom]);
180
+ useEffect(function () {
181
+ var _ref4;
182
+ setDraftTo((_ref4 = to !== null && to !== void 0 ? to : defaultTo === null || defaultTo === void 0 ? void 0 : defaultTo.toString()) !== null && _ref4 !== void 0 ? _ref4 : '');
183
+ }, [to, defaultTo]);
184
+ useEffect(function () {
185
+ setDraftTimeSelection(timeSelection !== null && timeSelection !== void 0 ? timeSelection : defaultTimeSelection);
186
+ }, [timeSelection, defaultTimeSelection]);
187
+ useEffect(function () {
188
+ setDraftSumBy(sumBy);
189
+ }, [sumBy, setDraftSumBy]);
190
+
191
+ // Sync computed sumBy to URL if URL doesn't already have a value
192
+ // to ensure the shared URL can always pick it up.
193
+ // Only run once (when sumByParam first becomes available), not on every change,
194
+ // to avoid oscillation with external writers (useViewQueryState).
195
+ var hasSyncedSumByRef = useRef(false);
196
+ useEffect(function () {
197
+ if (sumByParam !== null) {
198
+ hasSyncedSumByRef.current = true;
199
+ }
200
+ if (!hasSyncedSumByRef.current && sumByParam === null && computedSumByFromURL !== undefined && !sumBySelectionLoading) {
201
+ hasSyncedSumByRef.current = true;
202
+ void setSumByParam(sumByToParam(computedSumByFromURL));
203
+ }
204
+ }, [sumByParam, computedSumByFromURL, sumBySelectionLoading, setSumByParam]);
205
+
206
+ // Construct the QuerySelection object (committed state from URL)
207
+ var querySelection = useMemo(function () {
208
+ var range = DateTimeRange.fromRangeKey(timeSelection !== null && timeSelection !== void 0 ? timeSelection : defaultTimeSelection, from != null && from !== '' ? parseInt(from) : defaultFrom, to != null && to !== '' ? parseInt(to) : defaultTo);
209
+ return _objectSpread({
210
+ expression: expression !== null && expression !== void 0 ? expression : defaultExpression,
211
+ from: range.getFromMs(),
212
+ to: range.getToMs(),
213
+ timeSelection: range.getRangeKey(),
214
+ sumBy: computedSumByFromURL
215
+ }, mergeFrom != null && mergeFrom !== '' && mergeTo != null && mergeTo !== '' ? {
216
+ mergeFrom: mergeFrom,
217
+ mergeTo: mergeTo
218
+ } : {});
219
+ }, [expression, from, to, timeSelection, computedSumByFromURL, mergeFrom, mergeTo, defaultExpression, defaultTimeSelection, defaultFrom, defaultTo]);
220
+
221
+ // Construct the draft QuerySelection object (local draft state)
222
+ var draftSelection = useMemo(function () {
223
+ var isDelta = draftProfileType.delta;
224
+ var draftMergeFrom = isDelta ? (BigInt(draftTimeRange.getFromMs()) * 1000000n).toString() : undefined;
225
+ var draftMergeTo = isDelta ? (BigInt(draftTimeRange.getToMs()) * 1000000n).toString() : undefined;
226
+ var finalSumBy = draftSumBy !== null && draftSumBy !== void 0 ? draftSumBy : computedSumByFromURL;
227
+ return _objectSpread({
228
+ expression: draftExpression !== null && draftExpression !== void 0 ? draftExpression : defaultExpression,
229
+ from: draftTimeRange.getFromMs(),
230
+ to: draftTimeRange.getToMs(),
231
+ timeSelection: draftTimeRange.getRangeKey(),
232
+ sumBy: finalSumBy
233
+ }, draftMergeFrom !== undefined && draftMergeFrom !== '' && draftMergeTo !== undefined && draftMergeTo !== '' ? {
234
+ mergeFrom: draftMergeFrom,
235
+ mergeTo: draftMergeTo
236
+ } : {});
237
+ }, [draftExpression, draftTimeRange, draftSumBy, computedSumByFromURL, draftProfileType.delta, defaultExpression]);
238
+
239
+ // Compute ProfileSelection from URL params
240
+ var profileSelection = useMemo(function () {
241
+ return ProfileSelectionFromParams(mergeFrom !== null && mergeFrom !== void 0 ? mergeFrom : undefined, mergeTo !== null && mergeTo !== void 0 ? mergeTo : undefined, selectionParam !== null && selectionParam !== void 0 ? selectionParam : undefined);
242
+ }, [mergeFrom, mergeTo, selectionParam]);
243
+
244
+ // Compute ProfileSource from ProfileSelection
245
+ var profileSource = useMemo(function () {
246
+ if (profileSelection === null) return null;
247
+ return profileSelection.ProfileSource();
248
+ }, [profileSelection]);
249
+
250
+ // Commit draft changes to URL
251
+ // Optional refreshedTimeRange parameter allows re-evaluating relative time ranges (e.g., "last 15 minutes")
252
+ // to the current moment when the Search button is clicked
253
+ // Optional expression parameter allows updating the expression before committing
254
+ var commitDraft = useCallback(function (refreshedTimeRange, expression_0) {
255
+ var _refreshedTimeRange$f, _refreshedTimeRange$f2, _refreshedTimeRange$t, _refreshedTimeRange$t2, _refreshedTimeRange$t3;
256
+ // Use provided expression or current draft expression
257
+ var finalExpression = expression_0 !== null && expression_0 !== void 0 ? expression_0 : draftExpression;
258
+
259
+ // Update draft state with new expression if provided
260
+ if (expression_0 !== undefined) {
261
+ setDraftExpression(expression_0);
262
+ }
263
+
264
+ // Calculate the actual from/to values from draftSelection if not provided
265
+ var calculatedFrom = draftSelection.from.toString();
266
+ var calculatedTo = draftSelection.to.toString();
267
+ var finalFrom = (_refreshedTimeRange$f = refreshedTimeRange === null || refreshedTimeRange === void 0 || (_refreshedTimeRange$f2 = refreshedTimeRange.from) === null || _refreshedTimeRange$f2 === void 0 ? void 0 : _refreshedTimeRange$f2.toString()) !== null && _refreshedTimeRange$f !== void 0 ? _refreshedTimeRange$f : draftFrom !== '' ? draftFrom : calculatedFrom;
268
+ var finalTo = (_refreshedTimeRange$t = refreshedTimeRange === null || refreshedTimeRange === void 0 || (_refreshedTimeRange$t2 = refreshedTimeRange.to) === null || _refreshedTimeRange$t2 === void 0 ? void 0 : _refreshedTimeRange$t2.toString()) !== null && _refreshedTimeRange$t !== void 0 ? _refreshedTimeRange$t : draftTo !== '' ? draftTo : calculatedTo;
269
+ var finalTimeSelection = (_refreshedTimeRange$t3 = refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.timeSelection) !== null && _refreshedTimeRange$t3 !== void 0 ? _refreshedTimeRange$t3 : draftTimeSelection;
270
+
271
+ // Update draft state with refreshed time range if provided
272
+ if ((refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.from) !== undefined) {
273
+ setDraftFrom(finalFrom);
274
+ }
275
+ if ((refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.to) !== undefined) {
276
+ setDraftTo(finalTo);
277
+ }
278
+ if ((refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.timeSelection) !== undefined) {
279
+ setDraftTimeSelection(finalTimeSelection);
280
+ }
281
+
282
+ // Auto-calculate merge parameters for delta profiles
283
+ var finalQuery = Query.parse(finalExpression);
284
+ var isDelta_0 = finalQuery.profileType().delta;
285
+ var sumByValue = isDelta_0 ? sumByToParam(draftSumBy) : sumByToParam(DEFAULT_EMPTY_SUM_BY);
286
+ var mergeFromValue = null;
287
+ var mergeToValue = null;
288
+ var selectionValue = null;
289
+ if (isDelta_0 && finalFrom !== '' && finalTo !== '') {
290
+ var fromMs = parseInt(finalFrom);
291
+ var toMs = parseInt(finalTo);
292
+ mergeFromValue = (BigInt(fromMs) * 1000000n).toString();
293
+ mergeToValue = (BigInt(toMs) * 1000000n).toString();
294
+ if (!comparing) {
295
+ selectionValue = finalExpression;
296
+ }
297
+ }
298
+
299
+ // Atomic URL update with all params at once
300
+ void setQueryParams({
301
+ expression: finalExpression,
302
+ from: finalFrom,
303
+ to: finalTo,
304
+ time_selection: finalTimeSelection,
305
+ sum_by: sumByValue,
306
+ merge_from: mergeFromValue,
307
+ merge_to: mergeToValue,
308
+ selection: selectionValue
309
+ });
310
+ resetFlameGraphState();
311
+ if (draftProfileType.toString() !== Query.parse(querySelection.expression).profileType().toString()) {
312
+ resetStateOnProfileTypeChange();
313
+ onProfileTypeChange === null || onProfileTypeChange === void 0 || onProfileTypeChange();
314
+ }
315
+ }, [draftExpression, draftFrom, draftTo, draftTimeSelection, draftSumBy, draftSelection.from, draftSelection.to, comparing, setQueryParams, resetFlameGraphState, resetStateOnProfileTypeChange, onProfileTypeChange, draftProfileType, querySelection.expression]);
316
+ var setDraftTimeRange = useCallback(function (newFrom, newTo, newTimeSelection) {
317
+ setDraftFrom(newFrom.toString());
318
+ setDraftTo(newTo.toString());
319
+ setDraftTimeSelection(newTimeSelection);
320
+ }, []);
321
+ var setDraftSumByCallback = useCallback(function (newSumBy) {
322
+ setDraftSumBy(newSumBy);
323
+ }, [setDraftSumBy]);
324
+ var setDraftProfileName = useCallback(function (newProfileName) {
325
+ if (newProfileName === '') return;
326
+ var _draftQuery$setProfil = draftQuery.setProfileName(newProfileName),
327
+ _draftQuery$setProfil2 = _slicedToArray(_draftQuery$setProfil, 2),
328
+ newQuery = _draftQuery$setProfil2[0],
329
+ changed = _draftQuery$setProfil2[1];
330
+ if (changed) {
331
+ setDraftExpression(newQuery.toString());
332
+ setDraftSumBy(undefined);
333
+ }
334
+ }, [draftQuery, setDraftSumBy]);
335
+ var setDraftMatchers = useCallback(function (matchers) {
336
+ var newExpression = "".concat(draftProfileName, "{").concat(matchers, "}");
337
+ setDraftExpression(newExpression);
338
+ }, [draftProfileName]);
339
+
340
+ // Set ProfileSelection (auto-commits to URL immediately)
341
+ var setProfileSelection = useCallback(function (mergeFrom_0, mergeTo_0, query_0) {
342
+ void setQueryParams({
343
+ selection: query_0.toString(),
344
+ merge_from: mergeFrom_0.toString(),
345
+ merge_to: mergeTo_0.toString()
346
+ });
347
+ }, [setQueryParams]);
348
+ var draftParsedQuery = useMemo(function () {
349
+ try {
350
+ var _draftSelection$expre;
351
+ return Query.parse((_draftSelection$expre = draftSelection.expression) !== null && _draftSelection$expre !== void 0 ? _draftSelection$expre : '');
352
+ } catch (error_1) {
353
+ console.warn('Failed to parse draft selection expression', {
354
+ expression: draftSelection.expression,
355
+ error: error_1 instanceof Error ? error_1.message : String(error_1)
356
+ });
357
+ return Query.parse('');
358
+ }
359
+ }, [draftSelection.expression]);
360
+ var parsedQuery = useMemo(function () {
361
+ try {
362
+ var _querySelection$expre;
363
+ return Query.parse((_querySelection$expre = querySelection.expression) !== null && _querySelection$expre !== void 0 ? _querySelection$expre : '');
364
+ } catch (error_2) {
365
+ console.warn('Failed to parse query selection expression', {
366
+ expression: querySelection.expression,
367
+ error: error_2 instanceof Error ? error_2.message : String(error_2)
368
+ });
369
+ return Query.parse('');
370
+ }
371
+ }, [querySelection.expression]);
372
+ return {
373
+ // Current committed state
374
+ querySelection: querySelection,
375
+ // Draft state
376
+ draftSelection: draftSelection,
377
+ // Draft setters
378
+ setDraftExpression: setDraftExpression,
379
+ setDraftTimeRange: setDraftTimeRange,
380
+ setDraftSumBy: setDraftSumByCallback,
381
+ setDraftProfileName: setDraftProfileName,
382
+ setDraftMatchers: setDraftMatchers,
383
+ // Commit function
384
+ commitDraft: commitDraft,
385
+ // ProfileSelection state
386
+ profileSelection: profileSelection,
387
+ profileSource: profileSource,
388
+ setProfileSelection: setProfileSelection,
389
+ // Loading state
390
+ sumByLoading: isDraftSumByLoading || sumBySelectionLoading,
391
+ draftParsedQuery: draftParsedQuery,
392
+ parsedQuery: parsedQuery,
393
+ setExpressionParam: setExpressionState,
394
+ setSumByParam: setSumByParam,
395
+ setGroupByParam: setGroupByParam
396
+ };
397
+ };