@parca/profile 0.19.140 → 0.19.142

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 (253) hide show
  1. package/CHANGELOG.md +5 -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.d.ts.map +1 -1
  9. package/dist/GraphTooltipArrow/useGraphTooltipMetaInfo/index.js +104 -72
  10. package/dist/MatchersInput/SuggestionItem.js +91 -12
  11. package/dist/MatchersInput/SuggestionsList.d.ts +2 -1
  12. package/dist/MatchersInput/SuggestionsList.d.ts.map +1 -1
  13. package/dist/MatchersInput/SuggestionsList.js +371 -157
  14. package/dist/MatchersInput/SuggestionsList.test.d.ts +2 -0
  15. package/dist/MatchersInput/SuggestionsList.test.d.ts.map +1 -0
  16. package/dist/MatchersInput/index.js +308 -115
  17. package/dist/MetricsCircle/index.js +39 -3
  18. package/dist/MetricsGraph/MetricsContextMenu/index.js +119 -19
  19. package/dist/MetricsGraph/MetricsInfoPanel/index.js +81 -20
  20. package/dist/MetricsGraph/MetricsTooltip/index.d.ts.map +1 -1
  21. package/dist/MetricsGraph/MetricsTooltip/index.js +107 -74
  22. package/dist/MetricsGraph/index.js +552 -203
  23. package/dist/MetricsGraph/useMetricsGraphDimensions.js +46 -25
  24. package/dist/MetricsGraph/utils/colorMapping.js +24 -17
  25. package/dist/MetricsSeries/index.js +70 -7
  26. package/dist/PreSelectedMatchers/index.d.ts.map +1 -1
  27. package/dist/PreSelectedMatchers/index.js +249 -102
  28. package/dist/ProfileExplorer/ProfileExplorerCompare.d.ts.map +1 -1
  29. package/dist/ProfileExplorer/ProfileExplorerCompare.js +241 -45
  30. package/dist/ProfileExplorer/ProfileExplorerSingle.js +98 -11
  31. package/dist/ProfileExplorer/index.js +183 -32
  32. package/dist/ProfileFlameChart/SamplesStrips/SamplesGraph/index.js +333 -148
  33. package/dist/ProfileFlameChart/SamplesStrips/SamplesStrips.stories.js +69 -35
  34. package/dist/ProfileFlameChart/SamplesStrips/index.d.ts +2 -2
  35. package/dist/ProfileFlameChart/SamplesStrips/index.d.ts.map +1 -1
  36. package/dist/ProfileFlameChart/SamplesStrips/index.js +645 -134
  37. package/dist/ProfileFlameChart/SamplesStrips/labelSetUtils.js +114 -55
  38. package/dist/ProfileFlameChart/index.d.ts.map +1 -1
  39. package/dist/ProfileFlameChart/index.js +267 -129
  40. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenu.d.ts.map +1 -1
  41. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenu.js +288 -89
  42. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenuWrapper.js +56 -20
  43. package/dist/ProfileFlameGraph/FlameGraphArrow/FlameGraphNodes.js +211 -140
  44. package/dist/ProfileFlameGraph/FlameGraphArrow/MemoizedTooltip.js +133 -38
  45. package/dist/ProfileFlameGraph/FlameGraphArrow/MiniMap.js +261 -216
  46. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.d.ts.map +1 -1
  47. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.js +72 -47
  48. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.d.ts.map +1 -1
  49. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.js +58 -28
  50. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.d.ts.map +1 -1
  51. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.js +59 -8
  52. package/dist/ProfileFlameGraph/FlameGraphArrow/index.js +396 -179
  53. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.d.ts.map +1 -1
  54. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.js +68 -50
  55. package/dist/ProfileFlameGraph/FlameGraphArrow/useMappingList.js +62 -38
  56. package/dist/ProfileFlameGraph/FlameGraphArrow/useNodeColor.js +14 -6
  57. package/dist/ProfileFlameGraph/FlameGraphArrow/useScrollViewport.js +124 -82
  58. package/dist/ProfileFlameGraph/FlameGraphArrow/useVisibleNodes.js +160 -98
  59. package/dist/ProfileFlameGraph/FlameGraphArrow/useZoom.js +232 -112
  60. package/dist/ProfileFlameGraph/FlameGraphArrow/utils.js +137 -114
  61. package/dist/ProfileFlameGraph/benchmarks/benchdata/populateData.js +85 -0
  62. package/dist/ProfileFlameGraph/index.d.ts.map +1 -1
  63. package/dist/ProfileFlameGraph/index.js +324 -150
  64. package/dist/ProfileMetricsGraph/hooks/useQueryRange.js +140 -32
  65. package/dist/ProfileMetricsGraph/index.d.ts.map +1 -1
  66. package/dist/ProfileMetricsGraph/index.js +519 -258
  67. package/dist/ProfileSelector/CompareButton.js +132 -12
  68. package/dist/ProfileSelector/MetricsGraphSection.d.ts.map +1 -1
  69. package/dist/ProfileSelector/MetricsGraphSection.js +236 -64
  70. package/dist/ProfileSelector/index.d.ts.map +1 -1
  71. package/dist/ProfileSelector/index.js +727 -141
  72. package/dist/ProfileSelector/useAutoQuerySelector.js +249 -130
  73. package/dist/ProfileSource.js +230 -163
  74. package/dist/ProfileTypeSelector/index.js +214 -125
  75. package/dist/ProfileView/components/ActionButtons/GroupByDropdown.js +50 -4
  76. package/dist/ProfileView/components/ActionButtons/SortByDropdown.d.ts.map +1 -1
  77. package/dist/ProfileView/components/ActionButtons/SortByDropdown.js +141 -35
  78. package/dist/ProfileView/components/ColorStackLegend.d.ts.map +1 -1
  79. package/dist/ProfileView/components/ColorStackLegend.js +185 -55
  80. package/dist/ProfileView/components/DashboardItems/index.js +87 -28
  81. package/dist/ProfileView/components/DashboardLayout/index.js +108 -16
  82. package/dist/ProfileView/components/DiffLegend.js +172 -29
  83. package/dist/ProfileView/components/GroupByLabelsDropdown/index.js +199 -55
  84. package/dist/ProfileView/components/InvertCallStack/index.d.ts.map +1 -1
  85. package/dist/ProfileView/components/InvertCallStack/index.js +100 -12
  86. package/dist/ProfileView/components/ProfileFilters/filterPresets.js +260 -315
  87. package/dist/ProfileView/components/ProfileFilters/index.js +518 -215
  88. package/dist/ProfileView/components/ProfileFilters/useProfileFilters.js +370 -306
  89. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.d.ts +2 -1
  90. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.d.ts.map +1 -1
  91. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.js +188 -118
  92. package/dist/ProfileView/components/ProfileHeader/index.js +105 -11
  93. package/dist/ProfileView/components/ShareButton/ResultBox.js +119 -16
  94. package/dist/ProfileView/components/ShareButton/index.js +352 -62
  95. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.d.ts.map +1 -1
  96. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.js +678 -194
  97. package/dist/ProfileView/components/Toolbars/SwitchMenuItem.js +94 -7
  98. package/dist/ProfileView/components/Toolbars/TableColumnsDropdown.d.ts.map +1 -1
  99. package/dist/ProfileView/components/Toolbars/TableColumnsDropdown.js +199 -157
  100. package/dist/ProfileView/components/Toolbars/index.d.ts +2 -2
  101. package/dist/ProfileView/components/Toolbars/index.d.ts.map +1 -1
  102. package/dist/ProfileView/components/Toolbars/index.js +441 -21
  103. package/dist/ProfileView/components/ViewSelector/Dropdown.js +233 -22
  104. package/dist/ProfileView/components/ViewSelector/index.d.ts.map +1 -1
  105. package/dist/ProfileView/components/ViewSelector/index.js +212 -86
  106. package/dist/ProfileView/components/VisualizationContainer/index.d.ts.map +1 -1
  107. package/dist/ProfileView/components/VisualizationContainer/index.js +52 -7
  108. package/dist/ProfileView/components/VisualizationPanel.js +185 -8
  109. package/dist/ProfileView/context/DashboardContext.d.ts.map +1 -1
  110. package/dist/ProfileView/context/DashboardContext.js +85 -29
  111. package/dist/ProfileView/context/ProfileViewContext.js +56 -15
  112. package/dist/ProfileView/hooks/useAutoSelectDimension.js +71 -41
  113. package/dist/ProfileView/hooks/useProfileMetadata.js +50 -18
  114. package/dist/ProfileView/hooks/useResetFlameGraphState.d.ts.map +1 -1
  115. package/dist/ProfileView/hooks/useResetFlameGraphState.js +32 -12
  116. package/dist/ProfileView/hooks/useResetStateOnProfileTypeChange.d.ts.map +1 -1
  117. package/dist/ProfileView/hooks/useResetStateOnProfileTypeChange.js +71 -27
  118. package/dist/ProfileView/hooks/useResetStateOnSeriesChange.d.ts.map +1 -1
  119. package/dist/ProfileView/hooks/useResetStateOnSeriesChange.js +40 -19
  120. package/dist/ProfileView/hooks/useVisualizationState.d.ts +3 -3
  121. package/dist/ProfileView/hooks/useVisualizationState.d.ts.map +1 -1
  122. package/dist/ProfileView/hooks/useVisualizationState.js +258 -67
  123. package/dist/ProfileView/index.js +383 -45
  124. package/dist/ProfileView/types/visualization.js +1 -13
  125. package/dist/ProfileView/utils/colorUtils.js +8 -7
  126. package/dist/ProfileViewWithData.d.ts.map +1 -1
  127. package/dist/ProfileViewWithData.js +332 -228
  128. package/dist/QueryControls/index.js +418 -47
  129. package/dist/Sandwich/components/CalleesSection.js +54 -4
  130. package/dist/Sandwich/components/CallersSection.js +97 -27
  131. package/dist/Sandwich/components/TableSection.js +77 -4
  132. package/dist/Sandwich/index.d.ts.map +1 -1
  133. package/dist/Sandwich/index.js +126 -14
  134. package/dist/Sandwich/utils/processRowData.js +48 -39
  135. package/dist/SelectWithRefresh/index.js +102 -28
  136. package/dist/SimpleMatchers/Select.js +520 -187
  137. package/dist/SimpleMatchers/index.js +590 -288
  138. package/dist/SourceView/Highlighter.js +230 -70
  139. package/dist/SourceView/LineNo.js +72 -17
  140. package/dist/SourceView/index.d.ts.map +1 -1
  141. package/dist/SourceView/index.js +178 -104
  142. package/dist/SourceView/lang-detector/ext-to-lang.json +798 -798
  143. package/dist/SourceView/lang-detector/index.js +28 -14
  144. package/dist/SourceView/useSelectedLineRange.d.ts.map +1 -1
  145. package/dist/SourceView/useSelectedLineRange.js +99 -23
  146. package/dist/Table/ColorCell.js +42 -1
  147. package/dist/Table/ColumnsVisibility.js +114 -6
  148. package/dist/Table/MoreDropdown.d.ts.map +1 -1
  149. package/dist/Table/MoreDropdown.js +122 -25
  150. package/dist/Table/TableContextMenu.d.ts.map +1 -1
  151. package/dist/Table/TableContextMenu.js +151 -137
  152. package/dist/Table/TableContextMenuWrapper.js +59 -14
  153. package/dist/Table/hooks/useColorManagement.js +58 -16
  154. package/dist/Table/hooks/useTableConfiguration.d.ts.map +1 -1
  155. package/dist/Table/hooks/useTableConfiguration.js +333 -169
  156. package/dist/Table/index.d.ts.map +1 -1
  157. package/dist/Table/index.js +222 -128
  158. package/dist/Table/utils/functions.js +169 -144
  159. package/dist/Table/utils/topAndBottomExpandedRowModel.js +69 -52
  160. package/dist/TimelineGuide/index.js +209 -16
  161. package/dist/TopTable/benchmarks/benchdata/populateData.js +91 -0
  162. package/dist/TopTable/index.d.ts.map +1 -1
  163. package/dist/TopTable/index.js +342 -123
  164. package/dist/contexts/LabelsQueryProvider.js +94 -32
  165. package/dist/contexts/UnifiedLabelsContext.js +114 -49
  166. package/dist/contexts/utils.js +37 -15
  167. package/dist/hooks/useCompareModeMeta.d.ts.map +1 -1
  168. package/dist/hooks/useCompareModeMeta.js +158 -64
  169. package/dist/hooks/useLabels.js +295 -52
  170. package/dist/hooks/useQueryState.d.ts +3 -3
  171. package/dist/hooks/useQueryState.d.ts.map +1 -1
  172. package/dist/hooks/useQueryState.js +373 -332
  173. package/dist/index.d.ts +2 -3
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +22 -8
  176. package/dist/testdata/fg-diff.json +3750 -0
  177. package/dist/testdata/fg-simple.json +1879 -0
  178. package/dist/testdata/link_data.json +56 -0
  179. package/dist/testdata/tabular.json +30 -0
  180. package/dist/testdata/test_flamegraph.json +26846 -0
  181. package/dist/testdata/test_graph.json +53 -0
  182. package/dist/useDelayedLoader.js +32 -18
  183. package/dist/useGrpcQuery/index.js +71 -11
  184. package/dist/useHasProfileData.js +90 -12
  185. package/dist/useQuery.js +205 -64
  186. package/dist/useSumBy.d.ts +1 -1
  187. package/dist/useSumBy.d.ts.map +1 -1
  188. package/dist/useSumBy.js +294 -138
  189. package/dist/utils.js +62 -30
  190. package/package.json +9 -10
  191. package/src/GraphTooltipArrow/index.tsx +3 -0
  192. package/src/GraphTooltipArrow/useGraphTooltipMetaInfo/index.ts +13 -11
  193. package/src/MatchersInput/SuggestionsList.test.tsx +70 -0
  194. package/src/MatchersInput/SuggestionsList.tsx +11 -10
  195. package/src/MatchersInput/index.tsx +1 -1
  196. package/src/MetricsGraph/MetricsTooltip/index.tsx +22 -34
  197. package/src/PreSelectedMatchers/index.tsx +3 -0
  198. package/src/ProfileExplorer/ProfileExplorerCompare.tsx +9 -4
  199. package/src/ProfileFlameChart/SamplesStrips/index.tsx +2 -2
  200. package/src/ProfileFlameChart/index.tsx +28 -21
  201. package/src/ProfileFlameGraph/FlameGraphArrow/ContextMenu.tsx +9 -10
  202. package/src/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.tsx +6 -5
  203. package/src/ProfileFlameGraph/FlameGraphArrow/TooltipContext.tsx +3 -0
  204. package/src/ProfileFlameGraph/FlameGraphArrow/ZoomControls.tsx +3 -0
  205. package/src/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.ts +3 -0
  206. package/src/ProfileFlameGraph/index.tsx +9 -6
  207. package/src/ProfileMetricsGraph/index.tsx +8 -6
  208. package/src/ProfileSelector/MetricsGraphSection.tsx +10 -5
  209. package/src/ProfileSelector/index.tsx +61 -39
  210. package/src/ProfileView/components/ActionButtons/SortByDropdown.tsx +6 -10
  211. package/src/ProfileView/components/ColorStackLegend.tsx +4 -2
  212. package/src/ProfileView/components/InvertCallStack/index.tsx +4 -5
  213. package/src/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.test.tsx +192 -94
  214. package/src/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.ts +21 -21
  215. package/src/ProfileView/components/Toolbars/MultiLevelDropdown.tsx +28 -24
  216. package/src/ProfileView/components/Toolbars/TableColumnsDropdown.tsx +5 -4
  217. package/src/ProfileView/components/Toolbars/index.tsx +3 -3
  218. package/src/ProfileView/components/ViewSelector/index.tsx +16 -9
  219. package/src/ProfileView/components/VisualizationContainer/index.tsx +3 -0
  220. package/src/ProfileView/context/DashboardContext.tsx +6 -6
  221. package/src/ProfileView/hooks/useResetFlameGraphState.ts +4 -6
  222. package/src/ProfileView/hooks/useResetStateOnProfileTypeChange.ts +26 -24
  223. package/src/ProfileView/hooks/useResetStateOnSeriesChange.ts +8 -16
  224. package/src/ProfileView/hooks/useVisualizationState.ts +69 -61
  225. package/src/ProfileViewWithData.tsx +35 -29
  226. package/src/Sandwich/index.tsx +3 -4
  227. package/src/SourceView/index.tsx +2 -4
  228. package/src/SourceView/useSelectedLineRange.ts +19 -34
  229. package/src/Table/MoreDropdown.tsx +11 -9
  230. package/src/Table/TableContextMenu.tsx +13 -10
  231. package/src/Table/hooks/useTableConfiguration.tsx +11 -16
  232. package/src/Table/index.tsx +21 -12
  233. package/src/TopTable/index.tsx +4 -3
  234. package/src/hooks/useCompareModeMeta.ts +91 -61
  235. package/src/hooks/useQueryState.test.tsx +345 -275
  236. package/src/hooks/useQueryState.ts +118 -136
  237. package/src/index.tsx +15 -16
  238. package/src/useDelayedLoader.ts +10 -10
  239. package/src/useSumBy.ts +15 -21
  240. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.test.js +0 -455
  241. package/dist/hooks/urlParsers.d.ts +0 -18
  242. package/dist/hooks/urlParsers.d.ts.map +0 -1
  243. package/dist/hooks/urlParsers.js +0 -32
  244. package/dist/hooks/useColorBy.d.ts +0 -5
  245. package/dist/hooks/useColorBy.d.ts.map +0 -1
  246. package/dist/hooks/useColorBy.js +0 -26
  247. package/dist/hooks/useDashboardItems.d.ts +0 -5
  248. package/dist/hooks/useDashboardItems.d.ts.map +0 -1
  249. package/dist/hooks/useDashboardItems.js +0 -27
  250. package/dist/hooks/useQueryState.test.js +0 -868
  251. package/src/hooks/urlParsers.ts +0 -38
  252. package/src/hooks/useColorBy.ts +0 -42
  253. package/src/hooks/useDashboardItems.ts +0 -46
@@ -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,342 +22,371 @@
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.
25
+
13
26
  import { useCallback, useEffect, useMemo, useState } from 'react';
14
- import { useQueryState as useNuqsQueryState, useQueryStates } from 'nuqs';
15
- import { DateTimeRange, useParcaContext } from '@parca/components';
27
+ import { DateTimeRange, useParcaContext, useURLState, useURLStateBatch } from '@parca/components';
16
28
  import { Query } from '@parca/parser';
17
29
  import { ProfileSelectionFromParams } from '../ProfileSource';
18
30
  import { useResetFlameGraphState } from '../ProfileView/hooks/useResetFlameGraphState';
19
31
  import { useResetStateOnProfileTypeChange } from '../ProfileView/hooks/useResetStateOnProfileTypeChange';
20
32
  import { DEFAULT_EMPTY_SUM_BY, sumByToParam, useSumBy, useSumByFromParams } from '../useSumBy';
21
- 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,
38
- }, {
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
- },
50
- });
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);
33
+ export var useQueryState = function useQueryState() {
34
+ var _ref, _ref2;
35
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
36
+ var _useParcaContext = useParcaContext(),
37
+ queryClient = _useParcaContext.queryServiceClient;
38
+ var _options$suffix = options.suffix,
39
+ suffix = _options$suffix === void 0 ? '' : _options$suffix,
40
+ _options$defaultExpre = options.defaultExpression,
41
+ defaultExpression = _options$defaultExpre === void 0 ? '' : _options$defaultExpre,
42
+ _options$defaultTimeS = options.defaultTimeSelection,
43
+ defaultTimeSelection = _options$defaultTimeS === void 0 ? 'relative:minute|15' : _options$defaultTimeS,
44
+ defaultFrom = options.defaultFrom,
45
+ defaultTo = options.defaultTo,
46
+ _options$comparing = options.comparing,
47
+ comparing = _options$comparing === void 0 ? false : _options$comparing,
48
+ onProfileTypeChange = options.onProfileTypeChange;
49
+ var batchUpdates = useURLStateBatch();
50
+ var resetFlameGraphState = useResetFlameGraphState();
51
+ var resetStateOnProfileTypeChange = useResetStateOnProfileTypeChange();
52
+
53
+ // URL state hooks with appropriate suffixes
54
+ var _useURLState = useURLState("expression".concat(suffix), {
55
+ defaultValue: defaultExpression
56
+ }),
57
+ _useURLState2 = _slicedToArray(_useURLState, 2),
58
+ expression = _useURLState2[0],
59
+ setExpressionState = _useURLState2[1];
60
+ var _useURLState3 = useURLState("from".concat(suffix), {
61
+ defaultValue: defaultFrom === null || defaultFrom === void 0 ? void 0 : defaultFrom.toString()
62
+ }),
63
+ _useURLState4 = _slicedToArray(_useURLState3, 2),
64
+ from = _useURLState4[0],
65
+ setFromState = _useURLState4[1];
66
+ var _useURLState5 = useURLState("to".concat(suffix), {
67
+ defaultValue: defaultTo === null || defaultTo === void 0 ? void 0 : defaultTo.toString()
68
+ }),
69
+ _useURLState6 = _slicedToArray(_useURLState5, 2),
70
+ to = _useURLState6[0],
71
+ setToState = _useURLState6[1];
72
+ var _useURLState7 = useURLState("time_selection".concat(suffix), {
73
+ defaultValue: defaultTimeSelection
74
+ }),
75
+ _useURLState8 = _slicedToArray(_useURLState7, 2),
76
+ timeSelection = _useURLState8[0],
77
+ setTimeSelectionState = _useURLState8[1];
78
+ var _useURLState9 = useURLState("sum_by".concat(suffix)),
79
+ _useURLState0 = _slicedToArray(_useURLState9, 2),
80
+ sumByParam = _useURLState0[0],
81
+ setSumByParam = _useURLState0[1];
82
+ var _useURLState1 = useURLState('group_by', {
83
+ alwaysReturnArray: true
84
+ }),
85
+ _useURLState10 = _slicedToArray(_useURLState1, 2),
86
+ setGroupByParam = _useURLState10[1];
87
+ var _useURLState11 = useURLState("merge_from".concat(suffix)),
88
+ _useURLState12 = _slicedToArray(_useURLState11, 2),
89
+ mergeFrom = _useURLState12[0],
90
+ setMergeFromState = _useURLState12[1];
91
+ var _useURLState13 = useURLState("merge_to".concat(suffix)),
92
+ _useURLState14 = _slicedToArray(_useURLState13, 2),
93
+ mergeTo = _useURLState14[0],
94
+ setMergeToState = _useURLState14[1];
95
+
96
+ // ProfileSelection URL state hooks - reuses merge_from/merge_to but adds selection
97
+ var _useURLState15 = useURLState("selection".concat(suffix)),
98
+ _useURLState16 = _slicedToArray(_useURLState15, 2),
99
+ selectionParam = _useURLState16[0],
100
+ setSelectionParam = _useURLState16[1];
101
+
102
+ // Parse sumBy from URL parameter format
103
+ var sumBy = useSumByFromParams(sumByParam);
104
+
105
+ // Draft state management
106
+ var _useState = useState(expression !== null && expression !== void 0 ? expression : defaultExpression),
107
+ _useState2 = _slicedToArray(_useState, 2),
108
+ draftExpression = _useState2[0],
109
+ setDraftExpression = _useState2[1];
110
+ var _useState3 = useState((_ref = from !== null && from !== void 0 ? from : defaultFrom === null || defaultFrom === void 0 ? void 0 : defaultFrom.toString()) !== null && _ref !== void 0 ? _ref : ''),
111
+ _useState4 = _slicedToArray(_useState3, 2),
112
+ draftFrom = _useState4[0],
113
+ setDraftFrom = _useState4[1];
114
+ var _useState5 = useState((_ref2 = to !== null && to !== void 0 ? to : defaultTo === null || defaultTo === void 0 ? void 0 : defaultTo.toString()) !== null && _ref2 !== void 0 ? _ref2 : ''),
115
+ _useState6 = _slicedToArray(_useState5, 2),
116
+ draftTo = _useState6[0],
117
+ setDraftTo = _useState6[1];
118
+ var _useState7 = useState(timeSelection !== null && timeSelection !== void 0 ? timeSelection : defaultTimeSelection),
119
+ _useState8 = _slicedToArray(_useState7, 2),
120
+ draftTimeSelection = _useState8[0],
121
+ setDraftTimeSelection = _useState8[1];
122
+ // Parse the draft query to extract profile information
123
+ var draftQuery = useMemo(function () {
124
+ try {
125
+ return Query.parse(draftExpression !== null && draftExpression !== void 0 ? draftExpression : '');
126
+ } catch (error) {
127
+ console.warn('Failed to parse draft expression', {
128
+ expression: draftExpression,
129
+ error: error instanceof Error ? error.message : String(error)
130
+ });
131
+ return Query.parse('');
132
+ }
133
+ }, [draftExpression]);
134
+ var query = useMemo(function () {
135
+ try {
136
+ return Query.parse(expression !== null && expression !== void 0 ? expression : '');
137
+ } catch (error_0) {
138
+ console.warn('Failed to parse expression', {
139
+ expression: expression,
140
+ error: error_0 instanceof Error ? error_0.message : String(error_0)
141
+ });
142
+ return Query.parse('');
143
+ }
144
+ }, [expression]);
145
+ var draftProfileType = useMemo(function () {
146
+ return draftQuery.profileType();
147
+ }, [draftQuery]);
148
+ var draftProfileName = useMemo(function () {
149
+ return draftQuery.profileName();
150
+ }, [draftQuery]);
151
+ var profileType = useMemo(function () {
152
+ return query.profileType();
153
+ }, [query]);
154
+
155
+ // Compute draft time range for label fetching
156
+ var draftTimeRange = useMemo(function () {
157
+ return DateTimeRange.fromRangeKey(draftTimeSelection !== null && draftTimeSelection !== void 0 ? draftTimeSelection : defaultTimeSelection, draftFrom !== '' ? parseInt(draftFrom) : defaultFrom, draftTo !== '' ? parseInt(draftTo) : defaultTo);
158
+ }, [draftTimeSelection, draftFrom, draftTo, defaultTimeSelection, defaultFrom, defaultTo]);
159
+ // Use combined sumBy hook for fetching labels and computing defaults (based on committed state)
160
+ var _useSumBy = useSumBy(queryClient, (profileType === null || profileType === void 0 ? void 0 : profileType.profileName) !== '' ? profileType : draftProfileType, draftTimeRange, draftProfileType, draftTimeRange, sumBy),
161
+ computedSumByFromURL = _useSumBy.sumBy,
162
+ sumBySelectionLoading = _useSumBy.isLoading,
163
+ draftSumBy = _useSumBy.draftSumBy,
164
+ setDraftSumBy = _useSumBy.setDraftSumBy,
165
+ isDraftSumByLoading = _useSumBy.isDraftSumByLoading;
166
+
167
+ // Sync draft state with URL state when URL changes externally
168
+ useEffect(function () {
169
+ setDraftExpression(expression !== null && expression !== void 0 ? expression : defaultExpression);
170
+ }, [expression, defaultExpression]);
171
+ useEffect(function () {
172
+ var _ref3;
173
+ setDraftFrom((_ref3 = from !== null && from !== void 0 ? from : defaultFrom === null || defaultFrom === void 0 ? void 0 : defaultFrom.toString()) !== null && _ref3 !== void 0 ? _ref3 : '');
174
+ }, [from, defaultFrom]);
175
+ useEffect(function () {
176
+ var _ref4;
177
+ setDraftTo((_ref4 = to !== null && to !== void 0 ? to : defaultTo === null || defaultTo === void 0 ? void 0 : defaultTo.toString()) !== null && _ref4 !== void 0 ? _ref4 : '');
178
+ }, [to, defaultTo]);
179
+ useEffect(function () {
180
+ setDraftTimeSelection(timeSelection !== null && timeSelection !== void 0 ? timeSelection : defaultTimeSelection);
181
+ }, [timeSelection, defaultTimeSelection]);
182
+ useEffect(function () {
183
+ setDraftSumBy(sumBy);
184
+ }, [sumBy, setDraftSumBy]);
185
+
186
+ // Sync computed sumBy to URL if URL doesn't already have a value
187
+ // to ensure the shared URL can always pick it up.
188
+ useEffect(function () {
189
+ if (sumByParam === undefined && computedSumByFromURL !== undefined && !sumBySelectionLoading) {
190
+ setSumByParam(sumByToParam(computedSumByFromURL));
191
+ }
192
+ }, [sumByParam, computedSumByFromURL, sumBySelectionLoading, setSumByParam]);
193
+
194
+ // Construct the QuerySelection object (committed state from URL)
195
+ var querySelection = useMemo(function () {
196
+ var range = DateTimeRange.fromRangeKey(timeSelection !== null && timeSelection !== void 0 ? timeSelection : defaultTimeSelection, from !== undefined && from !== '' ? parseInt(from) : defaultFrom, to !== undefined && to !== '' ? parseInt(to) : defaultTo);
197
+ return _objectSpread({
198
+ expression: expression !== null && expression !== void 0 ? expression : defaultExpression,
199
+ from: range.getFromMs(),
200
+ to: range.getToMs(),
201
+ timeSelection: range.getRangeKey(),
202
+ sumBy: computedSumByFromURL
203
+ }, mergeFrom !== undefined && mergeFrom !== '' && mergeTo !== undefined && mergeTo !== '' ? {
204
+ mergeFrom: mergeFrom,
205
+ mergeTo: mergeTo
206
+ } : {});
207
+ }, [expression, from, to, timeSelection, computedSumByFromURL, mergeFrom, mergeTo, defaultExpression, defaultTimeSelection, defaultFrom, defaultTo]);
208
+
209
+ // Construct the draft QuerySelection object (local draft state)
210
+ var draftSelection = useMemo(function () {
211
+ var isDelta = draftProfileType.delta;
212
+ var draftMergeFrom = isDelta ? (BigInt(draftTimeRange.getFromMs()) * 1000000n).toString() : undefined;
213
+ var draftMergeTo = isDelta ? (BigInt(draftTimeRange.getToMs()) * 1000000n).toString() : undefined;
214
+ var finalSumBy = draftSumBy !== null && draftSumBy !== void 0 ? draftSumBy : computedSumByFromURL;
215
+ return _objectSpread({
216
+ expression: draftExpression !== null && draftExpression !== void 0 ? draftExpression : defaultExpression,
217
+ from: draftTimeRange.getFromMs(),
218
+ to: draftTimeRange.getToMs(),
219
+ timeSelection: draftTimeRange.getRangeKey(),
220
+ sumBy: finalSumBy
221
+ }, draftMergeFrom !== undefined && draftMergeFrom !== '' && draftMergeTo !== undefined && draftMergeTo !== '' ? {
222
+ mergeFrom: draftMergeFrom,
223
+ mergeTo: draftMergeTo
224
+ } : {});
225
+ }, [draftExpression, draftTimeRange, draftSumBy, computedSumByFromURL, draftProfileType.delta, defaultExpression]);
226
+
227
+ // Compute ProfileSelection from URL params
228
+ var profileSelection = useMemo(function () {
229
+ return ProfileSelectionFromParams(mergeFrom, mergeTo, selectionParam);
230
+ }, [mergeFrom, mergeTo, selectionParam]);
231
+
232
+ // Compute ProfileSource from ProfileSelection
233
+ var profileSource = useMemo(function () {
234
+ if (profileSelection === null) return null;
235
+ return profileSelection.ProfileSource();
236
+ }, [profileSelection]);
237
+
238
+ // Commit draft changes to URL
239
+ // Optional refreshedTimeRange parameter allows re-evaluating relative time ranges (e.g., "last 15 minutes")
240
+ // to the current moment when the Search button is clicked
241
+ // Optional expression parameter allows updating the expression before committing
242
+ var commitDraft = useCallback(function (refreshedTimeRange, expression_0) {
243
+ batchUpdates(function () {
244
+ var _refreshedTimeRange$f, _refreshedTimeRange$f2, _refreshedTimeRange$t, _refreshedTimeRange$t2, _refreshedTimeRange$t3;
245
+ // Use provided expression or current draft expression
246
+ var finalExpression = expression_0 !== null && expression_0 !== void 0 ? expression_0 : draftExpression;
247
+
248
+ // Update draft state with new expression if provided
249
+ if (expression_0 !== undefined) {
250
+ setDraftExpression(expression_0);
251
+ }
252
+
253
+ // Calculate the actual from/to values from draftSelection if not provided
254
+ var calculatedFrom = draftSelection.from.toString();
255
+ var calculatedTo = draftSelection.to.toString();
256
+ 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;
257
+ 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;
258
+ var finalTimeSelection = (_refreshedTimeRange$t3 = refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.timeSelection) !== null && _refreshedTimeRange$t3 !== void 0 ? _refreshedTimeRange$t3 : draftTimeSelection;
259
+
260
+ // Update draft state with refreshed time range if provided
261
+ if ((refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.from) !== undefined) {
262
+ setDraftFrom(finalFrom);
263
+ }
264
+ if ((refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.to) !== undefined) {
265
+ setDraftTo(finalTo);
266
+ }
267
+ if ((refreshedTimeRange === null || refreshedTimeRange === void 0 ? void 0 : refreshedTimeRange.timeSelection) !== undefined) {
268
+ setDraftTimeSelection(finalTimeSelection);
269
+ }
270
+ setExpressionState(finalExpression);
271
+ setFromState(finalFrom);
272
+ setToState(finalTo);
273
+ setTimeSelectionState(finalTimeSelection);
274
+
275
+ // Auto-calculate merge parameters for delta profiles
276
+ // Parse the final expression to check if it's a delta profile
277
+ var finalQuery = Query.parse(finalExpression);
278
+ var isDelta_0 = finalQuery.profileType().delta;
279
+ if (isDelta_0) {
280
+ setSumByParam(sumByToParam(draftSumBy));
281
+ } else {
282
+ setSumByParam(DEFAULT_EMPTY_SUM_BY);
283
+ }
284
+ if (isDelta_0 && finalFrom !== '' && finalTo !== '') {
285
+ var fromMs = parseInt(finalFrom);
286
+ var toMs = parseInt(finalTo);
287
+ setMergeFromState((BigInt(fromMs) * 1000000n).toString());
288
+ setMergeToState((BigInt(toMs) * 1000000n).toString());
289
+
290
+ // Auto-select the time range for delta profiles (but not in compare mode)
291
+ // This applies both on initial load AND when Search is clicked
292
+ // The selection will use the final expression and the updated time range
293
+ if (!comparing) {
294
+ setSelectionParam(finalExpression);
295
+ } else {
296
+ setSelectionParam(undefined);
223
297
  }
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
- };
298
+ } else {
299
+ setMergeFromState(undefined);
300
+ setMergeToState(undefined);
301
+ // Clear ProfileSelection for non-delta profiles
302
+ setSelectionParam(undefined);
303
+ }
304
+ resetFlameGraphState();
305
+ if (draftProfileType.toString() !== Query.parse(querySelection.expression).profileType().toString()) {
306
+ resetStateOnProfileTypeChange();
307
+ onProfileTypeChange === null || onProfileTypeChange === void 0 || onProfileTypeChange();
308
+ }
309
+ });
310
+ }, [batchUpdates, draftExpression, draftFrom, draftTo, draftTimeSelection, draftSumBy, draftSelection.from, draftSelection.to, comparing, setExpressionState, setFromState, setToState, setTimeSelectionState, setSumByParam, setMergeFromState, setMergeToState, setSelectionParam, resetFlameGraphState, resetStateOnProfileTypeChange, onProfileTypeChange, draftProfileType, querySelection.expression]);
311
+ var setDraftTimeRange = useCallback(function (newFrom, newTo, newTimeSelection) {
312
+ setDraftFrom(newFrom.toString());
313
+ setDraftTo(newTo.toString());
314
+ setDraftTimeSelection(newTimeSelection);
315
+ }, []);
316
+ var setDraftSumByCallback = useCallback(function (newSumBy) {
317
+ setDraftSumBy(newSumBy);
318
+ }, [setDraftSumBy]);
319
+ var setDraftProfileName = useCallback(function (newProfileName) {
320
+ if (newProfileName === '') return;
321
+ var _draftQuery$setProfil = draftQuery.setProfileName(newProfileName),
322
+ _draftQuery$setProfil2 = _slicedToArray(_draftQuery$setProfil, 2),
323
+ newQuery = _draftQuery$setProfil2[0],
324
+ changed = _draftQuery$setProfil2[1];
325
+ if (changed) {
326
+ setDraftExpression(newQuery.toString());
327
+ setDraftSumBy(undefined);
328
+ }
329
+ }, [draftQuery, setDraftSumBy]);
330
+ var setDraftMatchers = useCallback(function (matchers) {
331
+ var newExpression = "".concat(draftProfileName, "{").concat(matchers, "}");
332
+ setDraftExpression(newExpression);
333
+ }, [draftProfileName]);
334
+
335
+ // Set ProfileSelection (auto-commits to URL immediately)
336
+ var setProfileSelection = useCallback(function (mergeFrom_0, mergeTo_0, query_0) {
337
+ batchUpdates(function () {
338
+ setSelectionParam(query_0.toString());
339
+ setMergeFromState(mergeFrom_0.toString());
340
+ setMergeToState(mergeTo_0.toString());
341
+ });
342
+ }, [batchUpdates, setSelectionParam, setMergeFromState, setMergeToState]);
343
+ var draftParsedQuery = useMemo(function () {
344
+ try {
345
+ var _draftSelection$expre;
346
+ return Query.parse((_draftSelection$expre = draftSelection.expression) !== null && _draftSelection$expre !== void 0 ? _draftSelection$expre : '');
347
+ } catch (error_1) {
348
+ console.warn('Failed to parse draft selection expression', {
349
+ expression: draftSelection.expression,
350
+ error: error_1 instanceof Error ? error_1.message : String(error_1)
351
+ });
352
+ return Query.parse('');
353
+ }
354
+ }, [draftSelection.expression]);
355
+ var parsedQuery = useMemo(function () {
356
+ try {
357
+ var _querySelection$expre;
358
+ return Query.parse((_querySelection$expre = querySelection.expression) !== null && _querySelection$expre !== void 0 ? _querySelection$expre : '');
359
+ } catch (error_2) {
360
+ console.warn('Failed to parse query selection expression', {
361
+ expression: querySelection.expression,
362
+ error: error_2 instanceof Error ? error_2.message : String(error_2)
363
+ });
364
+ return Query.parse('');
365
+ }
366
+ }, [querySelection.expression]);
367
+ return {
368
+ // Current committed state
369
+ querySelection: querySelection,
370
+ // Draft state
371
+ draftSelection: draftSelection,
372
+ // Draft setters
373
+ setDraftExpression: setDraftExpression,
374
+ setDraftTimeRange: setDraftTimeRange,
375
+ setDraftSumBy: setDraftSumByCallback,
376
+ setDraftProfileName: setDraftProfileName,
377
+ setDraftMatchers: setDraftMatchers,
378
+ // Commit function
379
+ commitDraft: commitDraft,
380
+ // ProfileSelection state
381
+ profileSelection: profileSelection,
382
+ profileSource: profileSource,
383
+ setProfileSelection: setProfileSelection,
384
+ // Loading state
385
+ sumByLoading: isDraftSumByLoading || sumBySelectionLoading,
386
+ draftParsedQuery: draftParsedQuery,
387
+ parsedQuery: parsedQuery,
388
+ setExpressionParam: setExpressionState,
389
+ setSumByParam: setSumByParam,
390
+ setGroupByParam: setGroupByParam
391
+ };
392
+ };