1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-24 20:36:40 +07:00
vault-frontend/src/containers/dialogs/EditorDialog/index.tsx
2022-01-02 18:17:09 +07:00

87 lines
3 KiB
TypeScript

import React, { createElement, FC, useCallback, useMemo, useState } from 'react';
import { IDialogProps } from '~/redux/modal/constants';
import styles from './styles.module.scss';
import { NODE_EDITORS } from '~/redux/node/constants';
import { BetterScrollDialog } from '../BetterScrollDialog';
import { CoverBackdrop } from '~/components/containers/CoverBackdrop';
import { prop } from 'ramda';
import { useNodeFormFormik } from '~/hooks/node/useNodeFormFormik';
import { EditorButtons } from '~/components/editors/EditorButtons';
import { FileUploaderProvider, useFileUploader } from '~/hooks/data/useFileUploader';
import { UPLOAD_SUBJECTS, UPLOAD_TARGETS } from '~/redux/uploads/constants';
import { FormikProvider } from 'formik';
import { INode } from '~/redux/types';
import { ModalWrapper } from '~/components/dialogs/ModalWrapper';
import { useTranslatedError } from '~/hooks/data/useTranslatedError';
import { useCloseOnEscape } from '~/hooks';
import { EditorConfirmClose } from '~/components/editors/EditorConfirmClose';
import { on } from 'cluster';
interface Props extends IDialogProps {
node: INode;
onSubmit: (node: INode) => Promise<unknown>;
}
const EditorDialog: FC<Props> = ({ node, onRequestClose, onSubmit }) => {
const [isConfirmModalShown, setConfirmModalShown] = useState(false);
const uploader = useFileUploader(UPLOAD_SUBJECTS.EDITOR, UPLOAD_TARGETS.NODES, node.files);
const formik = useNodeFormFormik(node, uploader, onRequestClose, onSubmit);
const { values, handleSubmit, dirty, status } = formik;
const component = useMemo(() => node.type && prop(node.type, NODE_EDITORS), [node.type]);
const closeConfirmModal = useCallback(() => {
setConfirmModalShown(false);
}, [setConfirmModalShown]);
const onClose = useCallback(() => {
if (!dirty) {
onRequestClose();
return;
}
if (isConfirmModalShown) {
closeConfirmModal();
return;
}
setConfirmModalShown(true);
}, [dirty, isConfirmModalShown, onRequestClose, closeConfirmModal]);
const error = useTranslatedError(status);
useCloseOnEscape(onClose);
if (!component) {
return null;
}
return (
<ModalWrapper onOverlayClick={onClose}>
<FileUploaderProvider value={uploader}>
<FormikProvider value={formik}>
<form onSubmit={handleSubmit} className={styles.form}>
<BetterScrollDialog
footer={<EditorButtons />}
backdrop={<CoverBackdrop cover={values.cover} />}
width={860}
error={error}
onClose={onClose}
>
<>
{isConfirmModalShown && (
<EditorConfirmClose onApprove={onRequestClose} onDecline={closeConfirmModal} />
)}
<div className={styles.editor}>{createElement(component)}</div>
</>
</BetterScrollDialog>
</form>
</FormikProvider>
</FileUploaderProvider>
</ModalWrapper>
);
};
export { EditorDialog };