onboardingContext.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {createContext, useCallback} from 'react';
  2. import {OnboardingProjectStatus, OnboardingSelectedSDK} from 'sentry/types';
  3. import {useSessionStorage} from 'sentry/utils/useSessionStorage';
  4. type Project = {
  5. slug: string;
  6. status: OnboardingProjectStatus;
  7. firstIssueId?: string;
  8. };
  9. type Data = {
  10. projects: Record<string, Project>;
  11. selectedSDK?: OnboardingSelectedSDK;
  12. };
  13. export type OnboardingContextProps = {
  14. data: Data;
  15. removeProject: (id: string) => void;
  16. setProject: (props: Project & {id: string}) => void;
  17. setSelectedSDK: (props: Data['selectedSDK']) => void;
  18. };
  19. export const OnboardingContext = createContext<OnboardingContextProps>({
  20. setProject: () => {},
  21. setSelectedSDK: () => {},
  22. removeProject: () => {},
  23. data: {
  24. projects: {},
  25. selectedSDK: undefined,
  26. },
  27. });
  28. type ProviderProps = {
  29. children: React.ReactNode;
  30. };
  31. export function OnboardingContextProvider({children}: ProviderProps) {
  32. const [sessionStorage, setSessionStorage] = useSessionStorage<Data>('onboarding', {
  33. projects: {},
  34. selectedSDK: undefined,
  35. });
  36. const setSelectedSDK = useCallback(
  37. (selectedSDK: Data['selectedSDK']) => {
  38. setSessionStorage({
  39. ...sessionStorage,
  40. selectedSDK,
  41. });
  42. },
  43. [setSessionStorage, sessionStorage]
  44. );
  45. const setProject = useCallback(
  46. (props: Project & {id: string}) => {
  47. setSessionStorage({
  48. ...sessionStorage,
  49. projects: {
  50. ...sessionStorage.projects,
  51. [props.id]: {
  52. status: props.status,
  53. firstIssueId: props.firstIssueId,
  54. slug: props.slug,
  55. },
  56. },
  57. });
  58. },
  59. [setSessionStorage, sessionStorage]
  60. );
  61. const removeProject = useCallback(
  62. (id: string) => {
  63. const newProjects = Object.keys(sessionStorage.projects).reduce((acc, key) => {
  64. if (key !== id) {
  65. acc[key] = sessionStorage.projects[key];
  66. }
  67. return acc;
  68. }, {});
  69. setSessionStorage({
  70. ...sessionStorage,
  71. projects: newProjects,
  72. });
  73. },
  74. [setSessionStorage, sessionStorage]
  75. );
  76. return (
  77. <OnboardingContext.Provider
  78. value={{
  79. data: sessionStorage,
  80. setProject,
  81. removeProject,
  82. setSelectedSDK,
  83. }}
  84. >
  85. {children}
  86. </OnboardingContext.Provider>
  87. );
  88. }