useReplayOnboarding.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {useCallback, useEffect, useMemo} from 'react';
  2. import {SidebarPanelKey} from 'sentry/components/sidebar/types';
  3. import {ALL_ACCESS_PROJECTS} from 'sentry/constants/pageFilters';
  4. import SidebarPanelStore from 'sentry/stores/sidebarPanelStore';
  5. import {Project} from 'sentry/types';
  6. import {PageFilters} from 'sentry/types/core';
  7. import {trackAnalytics} from 'sentry/utils/analytics';
  8. import useOrganization from 'sentry/utils/useOrganization';
  9. import usePageFilters from 'sentry/utils/usePageFilters';
  10. import useProjects from 'sentry/utils/useProjects';
  11. import {useRouteContext} from 'sentry/utils/useRouteContext';
  12. function getSelectedProjectList(
  13. selectedProjects: PageFilters['projects'],
  14. projects: Project[]
  15. ) {
  16. if (selectedProjects[0] === ALL_ACCESS_PROJECTS || selectedProjects.length === 0) {
  17. return projects;
  18. }
  19. const projectsByProjectId = projects.reduce<Record<string, Project>>((acc, project) => {
  20. acc[project.id] = project;
  21. return acc;
  22. }, {});
  23. return selectedProjects.map(id => projectsByProjectId[id]).filter(Boolean);
  24. }
  25. export function useHasOrganizationSentAnyReplayEvents() {
  26. const {projects, fetching} = useProjects();
  27. const hasOrgSentReplays = useMemo(() => projects.some(p => p.hasReplays), [projects]);
  28. return {hasOrgSentReplays, fetching};
  29. }
  30. export function useHaveSelectedProjectsSentAnyReplayEvents() {
  31. const {projects, fetching} = useProjects();
  32. const {selection} = usePageFilters();
  33. const orgSentOneOrMoreReplayEvent = useMemo(() => {
  34. const selectedProjects = getSelectedProjectList(selection.projects, projects);
  35. const hasSentOneReplay = selectedProjects.some(project => project.hasReplays);
  36. return hasSentOneReplay;
  37. }, [selection.projects, projects]);
  38. return {
  39. hasSentOneReplay: orgSentOneOrMoreReplayEvent,
  40. fetching,
  41. };
  42. }
  43. export function useReplayOnboardingSidebarPanel() {
  44. const {location} = useRouteContext();
  45. const organization = useOrganization();
  46. useEffect(() => {
  47. if (location.hash === '#replay-sidequest') {
  48. SidebarPanelStore.activatePanel(SidebarPanelKey.REPLAYS_ONBOARDING);
  49. trackAnalytics('replay.list-view-setup-sidebar', {
  50. organization,
  51. });
  52. }
  53. }, [location.hash, organization]);
  54. const activateSidebar = useCallback((event: {preventDefault: () => void}) => {
  55. event.preventDefault();
  56. window.location.hash = 'replay-sidequest';
  57. SidebarPanelStore.activatePanel(SidebarPanelKey.REPLAYS_ONBOARDING);
  58. }, []);
  59. return {activateSidebar};
  60. }