diff --git a/src/data/repositories/InstanceDhisRepository.ts b/src/data/repositories/InstanceDhisRepository.ts index d7fd00a..bcdf7cb 100644 --- a/src/data/repositories/InstanceDhisRepository.ts +++ b/src/data/repositories/InstanceDhisRepository.ts @@ -132,7 +132,7 @@ async function transformFile(blob: Blob, mime: string): Promise { }); } else if (process.env.NODE_ENV === "development" && mime === "image/gif") { try { - const ffmpeg = createFFmpeg({ corePath: "https://unpkg.com/@ffmpeg/core/dist/ffmpeg-core.js" }); + const ffmpeg = createFFmpeg({ corePath: "https://unpkg.com/@ffmpeg/core@0.12.6" }); await ffmpeg.load(); ffmpeg.FS("writeFile", "file.gif", await fetchFile(blob)); @@ -151,6 +151,7 @@ async function transformFile(blob: Blob, mime: string): Promise { const data = ffmpeg.FS("readFile", "file.mp4"); return new Blob([data.buffer], { type: "video/mp4" }); } catch (error: any) { + console.error(error); return blob; } } diff --git a/src/domain/usecases/ImportActionsUseCase.ts b/src/domain/usecases/ImportActionsUseCase.ts index e35b42a..3cd49fa 100644 --- a/src/domain/usecases/ImportActionsUseCase.ts +++ b/src/domain/usecases/ImportActionsUseCase.ts @@ -14,19 +14,15 @@ export class ImportActionsUseCase implements UseCase { public async execute(files: File[]): Promise { const items = await this.importExportClient.import(files); - if ( - items.every(async action => { - if (action.type !== "page") return true; - const landing = await this.landingRepository.getById(action.launchPageId); - if (!landing) return false; - if (landing.actions.some(actionId => actionId === action.id)) return false; - return true; - }) - ) - return this.actionRepository.save(items); - else - throw Error( - i18n.t("Unable to import actions. Some landing page action is referencing the landing itself.") - ); + const nodes = await this.landingRepository.getAll(); + const valid = items.every(action => { + if (action.type !== "page") return true; + const landing = nodes.find(node => node.id === action.launchPageId); + if (!landing) return false; + return !landing.actions.some(actionId => actionId === action.id); + }); + + if (valid) return this.actionRepository.save(items); + else return Promise.reject(i18n.t("Unable to import actions. Some action is referencing an invalid page.")); } } diff --git a/src/domain/usecases/UpdateActionUseCase.ts b/src/domain/usecases/UpdateActionUseCase.ts index 5f3ec43..9d941dd 100644 --- a/src/domain/usecases/UpdateActionUseCase.ts +++ b/src/domain/usecases/UpdateActionUseCase.ts @@ -10,9 +10,9 @@ export class UpdateActionUseCase implements UseCase { public async execute(action: PartialAction): Promise { if (action.type !== "page") return this.actionRepository.update(action); const landing = await this.landingRepository.getById(action.launchPageId); - if (!landing) throw Error(i18n.t("Landing page not found")); + if (!landing) return Promise.reject(i18n.t("Landing page not found")); if (landing.actions.some(actionId => actionId === action.id)) - throw Error(i18n.t("Landing page cannot have an action to launch the landing page itself")); + return Promise.reject(i18n.t("Landing page cannot have an action to launch the landing page itself")); else return this.actionRepository.update(action); } } diff --git a/src/webapp/components/action-list-table/ActionListTable.tsx b/src/webapp/components/action-list-table/ActionListTable.tsx index d0cb0fe..2b94b0c 100644 --- a/src/webapp/components/action-list-table/ActionListTable.tsx +++ b/src/webapp/components/action-list-table/ActionListTable.tsx @@ -54,8 +54,10 @@ export const ActionListTable: React.FC = props => { } else { loading.show(true, i18n.t("Importing action(s)")); try { - const actions = await compositionRoot.actions.import(files); - snackbar.success(i18n.t("Imported {{n}} actions", { n: actions.length })); + await compositionRoot.actions + .import(files) + .then(actions => snackbar.success(i18n.t("Imported {{n}} actions", { n: actions.length }))) + .catch(snackbar.error); await refreshRows(); } catch (err: any) { snackbar.error((err && err.message) || err.toString()); diff --git a/src/webapp/pages/action-detail/ActionDetailPage.tsx b/src/webapp/pages/action-detail/ActionDetailPage.tsx index 3fddb09..c186570 100644 --- a/src/webapp/pages/action-detail/ActionDetailPage.tsx +++ b/src/webapp/pages/action-detail/ActionDetailPage.tsx @@ -1,4 +1,4 @@ -import { ConfirmationDialog, ConfirmationDialogProps } from "@eyeseetea/d2-ui-components"; +import { ConfirmationDialog, ConfirmationDialogProps, useSnackbar } from "@eyeseetea/d2-ui-components"; import _ from "lodash"; import React, { useCallback, useEffect, useState } from "react"; import styled from "styled-components"; @@ -30,6 +30,7 @@ export const ActionDetailPage: React.FC = ({ mode }) => { const { compositionRoot, reload } = useAppContext(); const { id } = useParams(); const navigate = useNavigate(); + const snackbar = useSnackbar(); const [stateAction, updateStateAction] = useState(defaultAction); @@ -51,9 +52,9 @@ export const ActionDetailPage: React.FC = ({ mode }) => { }, [navigate]); const saveAction = useCallback(async () => { - await compositionRoot.actions.update({ ...stateAction, id: _.kebabCase(stateAction.id) }); + await compositionRoot.actions.update({ ...stateAction, id: _.kebabCase(stateAction.id) }).catch(snackbar.error); await reload(); - }, [stateAction, compositionRoot, reload]); + }, [stateAction, compositionRoot, reload, snackbar]); const onChange = useCallback((update: Parameters[0]) => { updateStateAction(update);