useDevToolbar.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import {useEffect} from 'react';
  2. import * as Sentry from '@sentry/react';
  3. import DevToolbar from 'sentry/components/devtoolbar';
  4. import {rawTrackAnalyticsEvent} from 'sentry/utils/analytics';
  5. import FeatureFlagOverrides from 'sentry/utils/featureFlagOverrides';
  6. import useOrganization from 'sentry/utils/useOrganization';
  7. import {useUser} from 'sentry/utils/useUser';
  8. export default function useDevToolbar({enabled}: {enabled: boolean}) {
  9. const organization = useOrganization();
  10. const {email} = useUser();
  11. useEffect(() => {
  12. if (enabled) {
  13. // TODO: this is insufficient and doesn't take into account control/silo endpoints
  14. const apiPrefix = window.__SENTRY_DEV_UI ? '/region/us/api/0' : '/api/0';
  15. const promise = DevToolbar.init({
  16. rootNode: document.body,
  17. placement: 'right-edge', // Could also be 'bottom-right-corner'
  18. // The Settings we need to talk to the Sentry API
  19. // What org/project/env should we read from?
  20. SentrySDK: Sentry,
  21. apiPrefix,
  22. environment: ['prod'],
  23. organizationSlug: 'sentry',
  24. projectId: 11276,
  25. projectPlatform: 'javascript',
  26. projectSlug: 'javascript',
  27. featureFlags: {
  28. getFeatureFlagMap: () =>
  29. FeatureFlagOverrides.singleton().getFeatureFlagMap(organization),
  30. urlTemplate: flag =>
  31. `https://github.com/search?q=repo%3Agetsentry%2Fsentry-options-automator+OR+repo%3Agetsentry%2Fsentry+${flag}&type=code`,
  32. setOverrideValue: (name, value) => {
  33. // only boolean flags in sentry
  34. if (typeof value === 'boolean') {
  35. FeatureFlagOverrides.singleton().setStoredOverride(name, value);
  36. }
  37. },
  38. clearOverrides: () => {
  39. FeatureFlagOverrides.singleton().clear();
  40. },
  41. },
  42. trackAnalytics: (props: {eventKey: string; eventName: string}) =>
  43. rawTrackAnalyticsEvent({...props, email, organization}),
  44. });
  45. return () => {
  46. promise.then(cleanup => cleanup());
  47. };
  48. }
  49. return () => {};
  50. }, [email, enabled, organization]);
  51. }