saveButton.tsx 2.1 KB

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