12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import { useEffect } from 'react';
- import { useDispatch } from 'react-redux';
- import useAsyncFn from 'react-use/lib/useAsyncFn';
- import { locationUtil } from '@grafana/data';
- import { locationService, reportInteraction } from '@grafana/runtime';
- import appEvents from 'app/core/app_events';
- import { useAppNotification } from 'app/core/copy/appNotification';
- import { contextSrv } from 'app/core/core';
- import { updateDashboardName } from 'app/core/reducers/navBarTree';
- import { DashboardModel } from 'app/features/dashboard/state';
- import { saveDashboard as saveDashboardApiCall } from 'app/features/manage-dashboards/state/actions';
- import { DashboardSavedEvent } from 'app/types/events';
- import { SaveDashboardOptions } from './types';
- const saveDashboard = async (saveModel: any, options: SaveDashboardOptions, dashboard: DashboardModel) => {
- let folderId = options.folderId;
- if (folderId === undefined) {
- folderId = dashboard.meta.folderId ?? saveModel.folderId;
- }
- const result = await saveDashboardApiCall({ ...options, folderId, dashboard: saveModel });
- // fetch updated access control permissions
- await contextSrv.fetchUserPermissions();
- return result;
- };
- export const useDashboardSave = (dashboard: DashboardModel) => {
- const [state, onDashboardSave] = useAsyncFn(
- async (clone: any, options: SaveDashboardOptions, dashboard: DashboardModel) =>
- await saveDashboard(clone, options, dashboard),
- []
- );
- const dispatch = useDispatch();
- const notifyApp = useAppNotification();
- useEffect(() => {
- if (state.value) {
- dashboard.version = state.value.version;
- dashboard.clearUnsavedChanges();
- // important that these happen before location redirect below
- appEvents.publish(new DashboardSavedEvent());
- notifyApp.success('Dashboard saved');
- reportInteraction(`Dashboard ${dashboard.id ? 'saved' : 'created'}`, {
- name: dashboard.title,
- url: state.value.url,
- });
- const currentPath = locationService.getLocation().pathname;
- const newUrl = locationUtil.stripBaseFromUrl(state.value.url);
- if (newUrl !== currentPath) {
- setTimeout(() => locationService.replace(newUrl));
- }
- if (dashboard.meta.isStarred) {
- dispatch(
- updateDashboardName({
- id: dashboard.uid,
- title: dashboard.title,
- url: newUrl,
- })
- );
- }
- }
- }, [dashboard, state, notifyApp, dispatch]);
- return { state, onDashboardSave };
- };
|