saveButton.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import {useCallback, useState} from 'react';
  2. import {validateWidget} from 'sentry/actionCreators/dashboards';
  3. import {
  4. addErrorMessage,
  5. addLoadingMessage,
  6. clearIndicators,
  7. } from 'sentry/actionCreators/indicator';
  8. import {Button} from 'sentry/components/button';
  9. import {t} from 'sentry/locale';
  10. import {trackAnalytics} from 'sentry/utils/analytics';
  11. import {WidgetBuilderVersion} from 'sentry/utils/analytics/dashboardsAnalyticsEvents';
  12. import useApi from 'sentry/utils/useApi';
  13. import useOrganization from 'sentry/utils/useOrganization';
  14. import {useParams} from 'sentry/utils/useParams';
  15. import type {Widget} from 'sentry/views/dashboards/types';
  16. import {useWidgetBuilderContext} from 'sentry/views/dashboards/widgetBuilder/contexts/widgetBuilderContext';
  17. import {convertBuilderStateToWidget} from 'sentry/views/dashboards/widgetBuilder/utils/convertBuilderStateToWidget';
  18. interface SaveButtonProps {
  19. isEditing: boolean;
  20. onSave: ({index, widget}: {index: number; widget: Widget}) => void;
  21. setError: (error: Record<string, any>) => void;
  22. }
  23. function SaveButton({isEditing, onSave, setError}: SaveButtonProps) {
  24. const {state} = useWidgetBuilderContext();
  25. const {widgetIndex} = useParams();
  26. const api = useApi();
  27. const organization = useOrganization();
  28. const [isSaving, setIsSaving] = useState(false);
  29. const handleSave = useCallback(async () => {
  30. trackAnalytics('dashboards_views.widget_builder.save', {
  31. builder_version: WidgetBuilderVersion.SLIDEOUT,
  32. data_set: state.dataset ?? '',
  33. new_widget: !isEditing,
  34. organization: organization.slug,
  35. });
  36. const widget = convertBuilderStateToWidget(state);
  37. setIsSaving(true);
  38. try {
  39. await validateWidget(api, organization.slug, widget);
  40. addLoadingMessage(t('Saving widget'));
  41. onSave({index: Number(widgetIndex), widget});
  42. } catch (error) {
  43. setIsSaving(false);
  44. clearIndicators();
  45. const errorDetails = error.responseJSON || error;
  46. setError(errorDetails);
  47. addErrorMessage(t('Unable to save widget'));
  48. }
  49. }, [api, onSave, organization.slug, state, widgetIndex, setError, isEditing]);
  50. return (
  51. <Button priority="primary" onClick={handleSave} busy={isSaving}>
  52. {isEditing ? t('Update Widget') : t('Add Widget')}
  53. </Button>
  54. );
  55. }
  56. export default SaveButton;