useReplayOnboarding.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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 usePageFilters from 'sentry/utils/usePageFilters';
  8. import useProjects from 'sentry/utils/useProjects';
  9. import {useRouteContext} from 'sentry/utils/useRouteContext';
  10. function getSelectedProjectList(
  11. selectedProjects: PageFilters['projects'],
  12. projects: Project[]
  13. ) {
  14. if (selectedProjects[0] === ALL_ACCESS_PROJECTS || selectedProjects.length === 0) {
  15. return projects;
  16. }
  17. const projectsByProjectId = projects.reduce<Record<string, Project>>((acc, project) => {
  18. acc[project.id] = project;
  19. return acc;
  20. }, {});
  21. return selectedProjects.map(id => projectsByProjectId[id]).filter(Boolean);
  22. }
  23. export function useHaveSelectedProjectsSentAnyReplayEvents() {
  24. const {projects} = useProjects();
  25. const {selection} = usePageFilters();
  26. const orgSentOneOrMoreReplayEvent = useMemo(() => {
  27. const selectedProjects = getSelectedProjectList(selection.projects, projects);
  28. const hasSentOneReplay = selectedProjects.some(project => project.hasReplays);
  29. return hasSentOneReplay;
  30. }, [selection.projects, projects]);
  31. return orgSentOneOrMoreReplayEvent;
  32. }
  33. export function useReplayOnboardingSidebarPanel() {
  34. const {location} = useRouteContext();
  35. const hasSentOneReplay = useHaveSelectedProjectsSentAnyReplayEvents();
  36. useEffect(() => {
  37. if (hasSentOneReplay && location.hash === '#replay-sidequest') {
  38. SidebarPanelStore.activatePanel(SidebarPanelKey.ReplaysOnboarding);
  39. }
  40. }, [hasSentOneReplay, location.hash]);
  41. const activateSidebar = useCallback((event: {preventDefault: () => void}) => {
  42. event.preventDefault();
  43. window.location.hash = 'replay-sidequest';
  44. SidebarPanelStore.activatePanel(SidebarPanelKey.ReplaysOnboarding);
  45. }, []);
  46. return {hasSentOneReplay, activateSidebar};
  47. }