mirror of
https://github.com/grafana/grafana.git
synced 2025-09-28 09:23:57 +08:00
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import { t } from '@lingui/macro';
|
|
import { useEffect } from 'react';
|
|
import { useDispatch } from 'react-redux';
|
|
import useAsyncFn from 'react-use/lib/useAsyncFn';
|
|
|
|
import { isFetchError } from '@grafana/runtime';
|
|
import { notifyApp } from 'app/core/actions';
|
|
import { PanelModel } from 'app/features/dashboard/state';
|
|
|
|
import {
|
|
createPanelLibraryErrorNotification,
|
|
createPanelLibrarySuccessNotification,
|
|
saveAndRefreshLibraryPanel,
|
|
} from '../utils';
|
|
|
|
export const usePanelSave = () => {
|
|
const dispatch = useDispatch();
|
|
const [state, saveLibraryPanel] = useAsyncFn(async (panel: PanelModel, folderId: number) => {
|
|
try {
|
|
return await saveAndRefreshLibraryPanel(panel, folderId);
|
|
} catch (err) {
|
|
if (isFetchError(err)) {
|
|
err.isHandled = true;
|
|
throw new Error(err.data.message);
|
|
}
|
|
throw err;
|
|
}
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
if (state.error) {
|
|
const errorMsg = state.error.message;
|
|
dispatch(
|
|
notifyApp(
|
|
createPanelLibraryErrorNotification(
|
|
t({ id: 'library-panels.save.error', message: `Error saving library panel: "${errorMsg}"` })
|
|
)
|
|
)
|
|
);
|
|
}
|
|
if (state.value) {
|
|
dispatch(
|
|
notifyApp(
|
|
createPanelLibrarySuccessNotification(
|
|
t({ id: 'library-panels.save.success', message: 'Library panel saved' })
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}, [dispatch, state]);
|
|
|
|
return { state, saveLibraryPanel };
|
|
};
|