-
+
diff --git a/src/hooks/tests/useCreateBlankDashboard.test.ts b/src/hooks/tests/useCreateBlankDashboard.test.ts
index 5545cfa..9ae9e9c 100644
--- a/src/hooks/tests/useCreateBlankDashboard.test.ts
+++ b/src/hooks/tests/useCreateBlankDashboard.test.ts
@@ -6,6 +6,7 @@ jest.mock('../../api/dashboard-templates', () => ({
...jest.requireActual('../../api/dashboard-templates'),
importDashboardTemplate: jest.fn(),
setDefaultTemplate: jest.fn(),
+ getUsersDashboards: jest.fn().mockResolvedValue([]),
}));
const mockedImportDashboardTemplate = importDashboardTemplate as jest.MockedFunction
;
diff --git a/src/hooks/tests/useDuplicateDashboard.test.ts b/src/hooks/tests/useDuplicateDashboard.test.ts
index 63f720b..33b6cdc 100644
--- a/src/hooks/tests/useDuplicateDashboard.test.ts
+++ b/src/hooks/tests/useDuplicateDashboard.test.ts
@@ -6,6 +6,7 @@ jest.mock('../../api/dashboard-templates', () => ({
...jest.requireActual('../../api/dashboard-templates'),
copyDashboardTemplate: jest.fn(),
setDefaultTemplate: jest.fn(),
+ getUsersDashboards: jest.fn().mockResolvedValue([]),
}));
const mockedCopyDashboardTemplate = copyDashboardTemplate as jest.MockedFunction;
diff --git a/src/hooks/tests/useImportDashboard.test.ts b/src/hooks/tests/useImportDashboard.test.ts
index 5e13a1d..b280f3b 100644
--- a/src/hooks/tests/useImportDashboard.test.ts
+++ b/src/hooks/tests/useImportDashboard.test.ts
@@ -4,6 +4,7 @@ import { DashboardTemplate, importDashboardTemplate } from '../../api/dashboard-
jest.mock('../../api/dashboard-templates', () => ({
importDashboardTemplate: jest.fn(),
+ getUsersDashboards: jest.fn().mockResolvedValue([]),
}));
const mockedImportDashboardTemplate = importDashboardTemplate as jest.MockedFunction;
diff --git a/src/hooks/useCreateBlankDashboard.ts b/src/hooks/useCreateBlankDashboard.ts
index f2eb826..cb529a1 100644
--- a/src/hooks/useCreateBlankDashboard.ts
+++ b/src/hooks/useCreateBlankDashboard.ts
@@ -1,5 +1,7 @@
import { useState } from 'react';
-import { DashboardTemplate, DashboardTemplatesError, TemplateConfig, importDashboardTemplate, setDefaultTemplate } from '../api/dashboard-templates';
+import { DashboardTemplate, DashboardTemplatesError, TemplateConfig } from '../api/dashboard-templates';
+import { useSetAtom } from 'jotai';
+import { createDashboardAtom } from '../state/dashboardsAtom';
interface CreateBlankDashboardState {
name: string;
@@ -32,6 +34,7 @@ type UseCreateBlankDashboardReturn = CreateBlankDashboardState & {
export const useCreateBlankDashboard = (): UseCreateBlankDashboardReturn => {
const [state, setState] = useState(initState);
+ const create = useSetAtom(createDashboardAtom);
const isFormValid = state.name.trim() !== '';
@@ -49,19 +52,16 @@ export const useCreateBlankDashboard = (): UseCreateBlankDashboardReturn => {
setState((prev) => ({ ...prev, isLoading: true, error: null }));
try {
- const result = await importDashboardTemplate({
+ const result = await create({
dashboardName: state.name,
templateBase: {
name: 'landingPage',
displayName: 'Landing Page',
},
templateConfig: blankTemplateConfig,
+ setAsHomepage: state.setAsHomepage,
});
- if (state.setAsHomepage) {
- await setDefaultTemplate(result.id);
- }
-
setState((prev) => ({ ...prev, isLoading: false }));
return result;
} catch (err) {
diff --git a/src/hooks/useDuplicateDashboard.ts b/src/hooks/useDuplicateDashboard.ts
index b313359..0a7b350 100644
--- a/src/hooks/useDuplicateDashboard.ts
+++ b/src/hooks/useDuplicateDashboard.ts
@@ -1,5 +1,7 @@
import { useState } from 'react';
-import { DashboardTemplate, DashboardTemplatesError, copyDashboardTemplate, setDefaultTemplate } from '../api/dashboard-templates';
+import { DashboardTemplate, DashboardTemplatesError } from '../api/dashboard-templates';
+import { useSetAtom } from 'jotai';
+import { duplicateDashboardAtom } from '../state/dashboardsAtom';
interface DuplicateDashboardState {
name: string;
@@ -28,6 +30,7 @@ type UseDuplicateDashboardReturn = DuplicateDashboardState & {
export const useDuplicateDashboard = (): UseDuplicateDashboardReturn => {
const [state, setState] = useState(initState);
+ const create = useSetAtom(duplicateDashboardAtom);
const isFormValid = state.name.trim() !== '' && state.selectedDashboardId !== null;
@@ -47,11 +50,7 @@ export const useDuplicateDashboard = (): UseDuplicateDashboardReturn => {
setState((prev) => ({ ...prev, isLoading: true, error: null }));
try {
- const newDashboard = await copyDashboardTemplate(state.selectedDashboardId, { dashboardName: state.name });
-
- if (state.setAsHomepage) {
- await setDefaultTemplate(newDashboard.id);
- }
+ const newDashboard = await create({ id: state.selectedDashboardId, dashboardName: state.name, setAsHomepage: state.setAsHomepage });
setState((prev) => ({ ...prev, isLoading: false }));
return newDashboard;
diff --git a/src/hooks/useImportDashboard.ts b/src/hooks/useImportDashboard.ts
index 7c53d3b..a6782ae 100644
--- a/src/hooks/useImportDashboard.ts
+++ b/src/hooks/useImportDashboard.ts
@@ -1,6 +1,7 @@
import { useState } from 'react';
-import { importDashboardTemplate } from '../api/dashboard-templates';
import { DashboardTemplate } from '../api/dashboard-templates';
+import { useSetAtom } from 'jotai';
+import { importDashboardAtom } from '../state/dashboardsAtom';
interface ImportDashboardState {
configString: string;
@@ -26,6 +27,7 @@ type UseImportDashboardReturn = ImportDashboardState & {
export const useImportDashboard = (): UseImportDashboardReturn => {
const [state, setState] = useState(initState);
+ const create = useSetAtom(importDashboardAtom);
const isFormValid = state.configString.trim() !== '' && state.name.trim() !== '';
@@ -45,7 +47,7 @@ export const useImportDashboard = (): UseImportDashboardReturn => {
dashboardName: state.name,
};
- const result = await importDashboardTemplate(requestData);
+ const result = await create(requestData);
setState((prev) => ({ ...prev, isLoading: false }));
return result;
diff --git a/src/state/dashboardsAtom.ts b/src/state/dashboardsAtom.ts
index b09b6b6..c94c0d9 100644
--- a/src/state/dashboardsAtom.ts
+++ b/src/state/dashboardsAtom.ts
@@ -1,5 +1,13 @@
import { atom } from 'jotai';
-import { DashboardTemplate, deleteDashboardTemplateFromHub, getUsersDashboards, setDefaultTemplate } from '../api/dashboard-templates';
+import {
+ DashboardTemplate,
+ TemplateConfig,
+ copyDashboardTemplate,
+ deleteDashboardTemplateFromHub,
+ getUsersDashboards,
+ importDashboardTemplate,
+ setDefaultTemplate,
+} from '../api/dashboard-templates';
export const dashboardsAtom = atom([]);
@@ -14,3 +22,44 @@ export const setDefaultDashboardAtom = atom(null, async (_get, set, id: Dashboar
const dashboards = await getUsersDashboards();
set(dashboardsAtom, dashboards);
});
+
+export const createDashboardAtom = atom(
+ null,
+ async (
+ _get,
+ set,
+ data: { dashboardName: string; templateBase: { name: string; displayName: string }; templateConfig: TemplateConfig; setAsHomepage?: boolean }
+ ) => {
+ const { setAsHomepage, ...importData } = data;
+ const result = await importDashboardTemplate(importData);
+ if (setAsHomepage) {
+ await setDefaultTemplate(result.id);
+ }
+ const dashboards = await getUsersDashboards();
+ set(dashboardsAtom, dashboards);
+ return result;
+ }
+);
+
+export const importDashboardAtom = atom(
+ null,
+ async (_get, set, data: { dashboardName: string; templateBase: { name: string; displayName: string }; templateConfig: TemplateConfig }) => {
+ const result = await importDashboardTemplate(data);
+ const dashboards = await getUsersDashboards();
+ set(dashboardsAtom, dashboards);
+ return result;
+ }
+);
+
+export const duplicateDashboardAtom = atom(
+ null,
+ async (_get, set, data: { id: DashboardTemplate['id']; dashboardName: string; setAsHomepage?: boolean }) => {
+ const result = await copyDashboardTemplate(data.id, { dashboardName: data.dashboardName });
+ if (data.setAsHomepage) {
+ await setDefaultTemplate(result.id);
+ }
+ const dashboards = await getUsersDashboards();
+ set(dashboardsAtom, dashboards);
+ return result;
+ }
+);