From 41e1c68a2790fa813df339b4d78e87bfa404de1c Mon Sep 17 00:00:00 2001 From: Artem Tarasov Date: Tue, 22 Mar 2022 12:27:06 +0300 Subject: [PATCH] Web: Doceditor: added withDialogs hoc --- web/ASC.Web.Editor/src/helpers/withDialogs.js | 312 ++++++++++++++++++ 1 file changed, 312 insertions(+) create mode 100644 web/ASC.Web.Editor/src/helpers/withDialogs.js diff --git a/web/ASC.Web.Editor/src/helpers/withDialogs.js b/web/ASC.Web.Editor/src/helpers/withDialogs.js new file mode 100644 index 0000000000..6d51abb5e2 --- /dev/null +++ b/web/ASC.Web.Editor/src/helpers/withDialogs.js @@ -0,0 +1,312 @@ +import React, { useState } from "react"; +import DynamicComponent from "../components/dynamic"; +import { getPresignedUri } from "@appserver/common/api/files"; +import { FILES_REMOTE_ENTRY_URL, FILES_SCOPE } from "./constants"; +import Text from "@appserver/components/text"; +import TextInput from "@appserver/components/text-input"; +import Checkbox from "@appserver/components/checkbox"; +import { StyledSelectFolder } from "../StyledEditor"; +import { useTranslation } from "react-i18next"; + +const insertImageAction = "imageFileType"; +const mailMergeAction = "mailMergeFileType"; +const compareFilesAction = "documentsFileType"; + +const withDialogs = (WrappedComponent) => { + return (props) => { + const [isVisible, setIsVisible] = useState(false); + const [filesType, setFilesType] = useState(""); + const [isFileDialogVisible, setIsFileDialogVisible] = useState(false); + const [typeInsertImageAction, setTypeInsertImageAction] = useState(); + const [isFolderDialogVisible, setIsFolderDialogVisible] = useState(false); + const [titleSelectorFolder, setTitleSelectorFolder] = useState(""); + const [urlSelectorFolder, setUrlSelectorFolder] = useState(""); + const [extension, setExtension] = useState(); + const [openNewTab, setNewOpenTab] = useState(false); + + const { t } = useTranslation(); + + const { fileInfo, fileId } = props; + + const onSDKRequestSharingSettings = () => { + setIsVisible(true); + }; + + const onCancel = () => { + setIsVisible(false); + }; + + const loadUsersRightsList = () => { + window.SharingDialog.getSharingSettings(fileId).then( + (sharingSettings) => { + window.docEditor.setSharingSettings({ + sharingSettings, + }); + } + ); + }; + + const onCloseFileDialog = () => { + setIsFileDialogVisible(false); + }; + + const onSDKRequestCompareFile = () => { + setFilesType(compareFilesAction); + setIsFileDialogVisible(true); + }; + + const onSDKRequestMailMergeRecipients = () => { + setFilesType(mailMergeAction); + setIsFileDialogVisible(true); + }; + + const onSDKRequestInsertImage = (event) => { + setTypeInsertImageAction(event.data); + setFilesType(insertImageAction); + setIsFileDialogVisible(true); + }; + + const insertImage = (link) => { + const token = link.token; + + window.docEditor.insertImage({ + ...typeInsertImageAction, + fileType: link.filetype, + ...(token && { token }), + url: link.url, + }); + }; + + const mailMerge = (link) => { + const token = link.token; + + window.docEditor.setMailMergeRecipients({ + fileType: link.filetype, + ...(token && { token }), + url: link.url, + }); + }; + + const compareFiles = (link) => { + const token = link.token; + + window.docEditor.setRevisedFile({ + fileType: link.filetype, + ...(token && { token }), + url: link.url, + }); + }; + + const insertImageActionProps = { + isImageOnly: true, + }; + + const mailMergeActionProps = { + isTablesOnly: true, + searchParam: ".xlsx", + }; + const compareFilesActionProps = { + isDocumentsOnly: true, + }; + + const fileTypeDetection = () => { + if (filesType === insertImageAction) { + return insertImageActionProps; + } + if (filesType === mailMergeAction) { + return mailMergeActionProps; + } + if (filesType === compareFilesAction) { + return compareFilesActionProps; + } + }; + + const onSelectFile = async (file) => { + try { + const link = await getPresignedUri(file.id); + + if (filesType === insertImageAction) insertImage(link); + if (filesType === mailMergeAction) mailMerge(link); + if (filesType === compareFilesAction) compareFiles(link); + } catch (e) { + console.error(e); + } + }; + + const getFileTypeTranslation = () => { + switch (filesType) { + case mailMergeAction: + return t("MailMergeFileType"); + case insertImageAction: + return t("ImageFileType"); + case compareFilesAction: + return t("DocumentsFileType"); + } + }; + + const selectFilesListTitle = () => { + const type = getFileTypeTranslation(); + return filesType === mailMergeAction + ? type + : t("SelectFilesType", { fileType: type }); + }; + + const onSDKRequestSaveAs = (event) => { + setTitleSelectorFolder(event.data.title); + setUrlSelectorFolder(event.data.url); + setExtension(event.data.title.split(".").pop()); + + setIsFolderDialogVisible(true); + }; + + const onCloseFolderDialog = () => { + setIsFolderDialogVisible(false); + setNewOpenTab(false); + }; + + const getSavingInfo = async (title, folderId) => { + const savingInfo = await window.filesUtils.SaveAs( + title, + urlSelectorFolder, + folderId, + openNewTab + ); + + if (savingInfo) { + const convertedInfo = savingInfo.split(": ").pop(); + docEditor.showMessage(convertedInfo); + } + }; + + const onClickSaveSelectFolder = (e, folderId) => { + const currentExst = titleSelectorFolder.split(".").pop(); + + const title = + currentExst !== extension + ? titleSelectorFolder.concat(`.${extension}`) + : titleSelectorFolder; + + if (openNewTab) { + window.filesUtils.SaveAs( + title, + urlSelectorFolder, + folderId, + openNewTab + ); + } else { + getSavingInfo(title, folderId); + } + }; + + const onClickCheckbox = () => { + setNewOpenTab(!openNewTab); + }; + + const onChangeInput = (e) => { + setTitleSelectorFolder(e.target.value); + }; + + const sharingDialog = React.useMemo( + () => ( + + ), + [isVisible] + ); + + const selectFileDialog = React.useMemo( + () => ( + + ), + [isFileDialogVisible] + ); + + const selectFolderDialog = React.useMemo( + () => ( + + {t("FileName")} + + + } + {...(extension !== "fb2" && { + footer: ( + + + + ), + })} + /> + ), + [openNewTab, titleSelectorFolder, isFolderDialogVisible] + ); + + return ( + + ); + }; +}; + +export default withDialogs;