saveButton.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import {useCallback} 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 useApi from 'sentry/utils/useApi';
  7. import useOrganization from 'sentry/utils/useOrganization';
  8. import {useParams} from 'sentry/utils/useParams';
  9. import type {Widget} from 'sentry/views/dashboards/types';
  10. import {useWidgetBuilderContext} from 'sentry/views/dashboards/widgetBuilder/contexts/widgetBuilderContext';
  11. import {convertBuilderStateToWidget} from 'sentry/views/dashboards/widgetBuilder/utils/convertBuilderStateToWidget';
  12. interface SaveButtonProps {
  13. isEditing: boolean;
  14. onSave: ({index, widget}: {index: number; widget: Widget}) => void;
  15. setError: (error: Record<string, any>) => void;
  16. }
  17. function SaveButton({isEditing, onSave, setError}: SaveButtonProps) {
  18. const {state} = useWidgetBuilderContext();
  19. const {widgetIndex} = useParams();
  20. const api = useApi();
  21. const organization = useOrganization();
  22. const handleSave = useCallback(async () => {
  23. const widget = convertBuilderStateToWidget(state);
  24. try {
  25. await validateWidget(api, organization.slug, widget);
  26. onSave({index: Number(widgetIndex), widget});
  27. } catch (error) {
  28. const errorDetails = error.responseJSON || error;
  29. setError(errorDetails);
  30. addErrorMessage(t('Unable to save widget'));
  31. }
  32. }, [api, onSave, organization.slug, state, widgetIndex, setError]);
  33. return (
  34. <Button priority="primary" onClick={handleSave}>
  35. {isEditing ? t('Update Widget') : t('Add Widget')}
  36. </Button>
  37. );
  38. }
  39. export default SaveButton;