useActiveReplayTab.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {useCallback, useMemo} from 'react';
  2. import {parseSearch} from 'sentry/components/searchSyntax/parser';
  3. import type {Organization} from 'sentry/types';
  4. import {decodeScalar} from 'sentry/utils/queryString';
  5. import {useLocation} from 'sentry/utils/useLocation';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import useUrlParams from 'sentry/utils/useUrlParams';
  8. export enum TabKey {
  9. CONSOLE = 'console',
  10. DOM = 'dom',
  11. ERRORS = 'errors',
  12. ISSUES = 'issues',
  13. MEMORY = 'memory',
  14. NETWORK = 'network',
  15. TRACE = 'trace',
  16. }
  17. function isReplayTab(tab: string, organization: Organization): tab is TabKey {
  18. const hasErrorTab = organization.features.includes('session-replay-errors-tab');
  19. if (tab === TabKey.ERRORS) {
  20. // If the errors tab feature is enabled, then TabKey.ERRORS is valid.
  21. return hasErrorTab;
  22. }
  23. if (tab === TabKey.ISSUES) {
  24. // If the errors tab is enabled, then then Issues tab is invalid
  25. return !hasErrorTab;
  26. }
  27. return Object.values<string>(TabKey).includes(tab);
  28. }
  29. function useDefaultTab() {
  30. const location = useLocation();
  31. const hasClickSearch = useMemo(() => {
  32. const parsed = parseSearch(decodeScalar(location.query.query) || '');
  33. return parsed?.some(
  34. token => token.type === 'filter' && token.key.text.startsWith('click.')
  35. );
  36. }, [location.query.query]);
  37. if (hasClickSearch) {
  38. return TabKey.DOM;
  39. }
  40. return TabKey.CONSOLE;
  41. }
  42. function useActiveReplayTab() {
  43. const defaultTab = useDefaultTab();
  44. const organization = useOrganization();
  45. const {getParamValue, setParamValue} = useUrlParams('t_main', defaultTab);
  46. const paramValue = getParamValue()?.toLowerCase() ?? '';
  47. return {
  48. getActiveTab: useCallback(
  49. () => (isReplayTab(paramValue, organization) ? (paramValue as TabKey) : defaultTab),
  50. [organization, paramValue, defaultTab]
  51. ),
  52. setActiveTab: useCallback(
  53. (value: string) => {
  54. setParamValue(
  55. isReplayTab(value.toLowerCase(), organization)
  56. ? value.toLowerCase()
  57. : defaultTab
  58. );
  59. },
  60. [organization, setParamValue, defaultTab]
  61. ),
  62. };
  63. }
  64. export default useActiveReplayTab;