Rev 3697 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useState } from 'react';
import { Controller, useForm } from 'react-hook-form';
import { useDispatch, useSelector } from 'react-redux';
import { useShareModal } from '@hooks';
import { addFeed } from '@store/feed/feed.actions';
import { feedTypes } from '@store/feed/feed.types';
import { addNotification } from '@store/notification/notification.actions';
import { shareModalTypes } from '@store/share-modal/shareModal.types';
import Form from '@components/common/form';
import Modal from '@components/UI/modal/Modal';
import Select from '@components/UI/inputs/Select';
import Ckeditor from '@components/common/ckeditor/Ckeditor';
import DropzoneComponent from '@components/dropzone/DropzoneComponent';
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback';
import ConfirmModal from './ConfirmModal';
const recomendationText = {
[shareModalTypes.IMAGE]: 'Tamaño recomendado: 720x720',
[shareModalTypes.FILE]: 'solo documentos PDF',
[shareModalTypes.VIDEO]: 'Video de extensión mp4, mpeg, webm, mov'
};
const ShareModal = () => {
const [showConfirm, setShowConfirm] = useState(false);
const labels = useSelector(({ intl }) => intl.labels);
const dispatch = useDispatch();
const { show, modalType, feedType, feedSharedId, postUrl, closeModal, openModal } =
useShareModal();
const {
control,
formState: { errors, isSubmitting },
handleSubmit,
reset,
watch
} = useForm({
defaultValues: {
shared_with: 'p',
description: ''
}
});
const description = watch('description');
const file = watch('file');
const toggleConfirm = () => setShowConfirm(!showConfirm);
const onSubmit = handleSubmit(async (feed) => {
try {
feed.posted_or_shared = modalType === shareModalTypes.SHARE ? 's' : 'p';
await dispatch(addFeed(postUrl, feed, feedSharedId));
dispatch(
addNotification({
style: 'success',
msg: 'Post publicado correctamente'
})
);
reset();
closeModal();
} catch (error) {
dispatch(addNotification({ style: 'danger', msg: error.message }));
}
});
const handleClose = () => {
if (description || file) toggleConfirm();
closeModal();
};
const handleConfirm = () => {
reset();
toggleConfirm();
closeModal();
};
const handleCancel = () => {
toggleConfirm();
openModal({ url: postUrl, modalType, feedType });
};
return (
<>
<Modal
show={show}
title={labels.share_a_post}
labelAccept={labels.send}
labelReject={labels.cancel}
loading={isSubmitting}
onClose={handleClose}
formId='share_modal-form'
>
<Form onSubmit={onSubmit} id='share_modal-form'>
{feedType === feedTypes.DASHBOARD && (
<Select
name='shared_with'
defaultValue='p'
control={control}
options={[
{ label: labels.public, value: 'p' },
{ label: labels.connections, value: 'c' }
]}
/>
)}
<Ckeditor
name='description'
control={control}
rules={{ required: 'La descripción es requerida' }}
error={errors.description?.message}
/>
{![shareModalTypes.POST, shareModalTypes.SHARE].includes(modalType) && (
<Controller
name='file'
control={control}
rules={{ required: 'El archivo es requerido' }}
render={({ field: { value, onChange }, fieldState: { error } }) => (
<>
<DropzoneComponent
type={modalType}
onUploaded={onChange}
settedFile={value}
recomendationText={recomendationText[modalType] ?? ''}
/>
{error && <FormErrorFeedback>{error.message}</FormErrorFeedback>}
</>
)}
/>
)}
</Form>
</Modal>
<ConfirmModal
show={showConfirm}
onAccept={handleConfirm}
onClose={handleCancel}
message='¿Estás seguro de que quieres salir sin publicar tu post?'
/>
</>
);
};
export default ShareModal;