profilingFeedbackButton.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import {useEffect, useRef} from 'react';
  2. import {Feedback, getCurrentHub} from '@sentry/react';
  3. import {Button} from 'sentry/components/button';
  4. import {IconMegaphone} from 'sentry/icons/iconMegaphone';
  5. import {t} from 'sentry/locale';
  6. import ConfigStore from 'sentry/stores/configStore';
  7. import {useLegacyStore} from 'sentry/stores/useLegacyStore';
  8. function ProfilingFeedbackButton() {
  9. const buttonRef = useRef<HTMLButtonElement | null>(null);
  10. const config = useLegacyStore(ConfigStore);
  11. const hub = getCurrentHub();
  12. const feedback = hub.getIntegration(Feedback);
  13. useEffect(() => {
  14. if (!buttonRef.current || !feedback) {
  15. return undefined;
  16. }
  17. const widget = feedback.attachTo(buttonRef.current, {
  18. colorScheme: config.theme === 'dark' ? 'dark' : 'light',
  19. formTitle: t('Give Feedback'),
  20. submitButtonLabel: t('Send Feedback'),
  21. messagePlaceholder: t('What did you expect?'),
  22. });
  23. return () => {
  24. if (widget && feedback) {
  25. feedback.removeWidget(widget);
  26. }
  27. };
  28. }, [feedback, config.theme]);
  29. if (!feedback) {
  30. return null;
  31. }
  32. return (
  33. <Button ref={buttonRef} data-feedback="profiling" size="sm" icon={<IconMegaphone />}>
  34. {t('Give Feedback')}
  35. </Button>
  36. );
  37. }
  38. export default ProfilingFeedbackButton;