Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15353 | Rev 16671 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
11166 stevensc 1
import React, { useState, useEffect } from 'react'
2
import axios from 'axios'
15214 stevensc 3
import { Modal } from 'react-bootstrap'
11166 stevensc 4
import { useForm } from 'react-hook-form'
5
import { shareModalTypes } from '../redux/share-modal/shareModal.types'
6
import { closeShareModal } from '../redux/share-modal/shareModal.actions'
7
import { useDispatch, useSelector } from 'react-redux'
8
import DropzoneComponent from './Dropzone/DropzoneComponent'
9
import { addFeed, fetchFeeds } from '../redux/feed/feed.actions'
10
import { addNotification } from '../redux/notification/notification.actions'
11
import Spinner from './Spinner'
14864 stevensc 12
import { CKEditor } from 'ckeditor4-react'
13
import { config } from './helpers/ckeditor_config'
7386 stevensc 14
 
7387 stevensc 15
const ShareModal = () => {
7386 stevensc 16
 
11166 stevensc 17
	const [loading, setLoading] = useState(false)
18
	const { postUrl, isOpen, modalType } = useSelector(state => state.shareModal)
19
	const { currentPage, timelineUrl, feedSharedId } = useSelector(state => state.feed)
7388 stevensc 20
 
11166 stevensc 21
	const dispatch = useDispatch()
7386 stevensc 22
 
11166 stevensc 23
	const {
24
		register,
25
		unregister,
26
		errors,
27
		handleSubmit,
28
		setValue,
29
		getValues,
30
		clearErrors,
15354 stevensc 31
		reset
11166 stevensc 32
	} = useForm({
33
		defaultValues: {
34
			description: '',
35
			share_width: '',
36
		}
37
	})
7386 stevensc 38
 
11166 stevensc 39
	useEffect(() => {
15353 stevensc 40
		register('description', { required: 'El campo es requerido' })
11166 stevensc 41
		register('posted_or_shared')
15354 stevensc 42
		setValue('posted_or_shared', shareModalTypes.POST)
15353 stevensc 43
 
44
		if (modalType !== shareModalTypes.POST) {
45
			register('file', { required: 'El campo es requerido' })
46
		}
47
 
48
		if (modalType === shareModalTypes.POST) {
15354 stevensc 49
			unregister('file')
11166 stevensc 50
		}
51
	}, [modalType])
7386 stevensc 52
 
11166 stevensc 53
	const recomendationText = {
54
		IMAGE: 'Tamaño recomendado: 720x720',
55
		FILE: 'solo documentos PDF',
56
		VIDEO: 'Video de extensión mp4, mpeg, webm'
57
	}
7386 stevensc 58
 
15214 stevensc 59
	const closeModal = () => dispatch(closeShareModal())
7390 stevensc 60
 
15214 stevensc 61
	useEffect(() => clearErrors(), [isOpen])
7386 stevensc 62
 
15215 stevensc 63
	const onSubmit = (data) => {
11166 stevensc 64
		setLoading(true)
65
		const currentFormData = new FormData()
7386 stevensc 66
 
15215 stevensc 67
		Object.entries(data)
68
			.map(([entry, value]) => currentFormData.append(entry, value))
69
 
11166 stevensc 70
		axios.post(postUrl, currentFormData)
71
			.then(({ data }) => {
14865 stevensc 72
				const newFeed = data.data
15215 stevensc 73
				if (!data.success) {
74
					typeof data.data === 'string'
75
						? dispatch(addNotification({
76
							style: 'danger',
77
							msg: data.data
78
						}))
79
						: Object.entries(data.data).map(([key, value]) =>
80
							value.map(err =>
81
								dispatch(addNotification({
82
									style: 'danger',
83
									msg: `${key}: ${err}`
84
								}))
85
							))
15354 stevensc 86
					return
15215 stevensc 87
				}
15354 stevensc 88
				reset()
15215 stevensc 89
				clearErrors()
90
				dispatch(addNotification({
91
					style: 'success',
92
					msg: 'La publicación ha sido compartida',
93
				}))
7806 stevensc 94
 
15354 stevensc 95
				if (currentPage && timelineUrl) dispatch(fetchFeeds(timelineUrl, currentPage))
7806 stevensc 96
 
15354 stevensc 97
				if (feedSharedId) return dispatch(addFeed(newFeed, feedSharedId))
7806 stevensc 98
 
15215 stevensc 99
				return dispatch(addFeed(newFeed))
11166 stevensc 100
			})
15354 stevensc 101
			.catch((err) => dispatch(addNotification({ style: 'danger', msg: `Error: ${err}` })))
102
			.finally(() => {
103
				setLoading(false)
104
				closeModal()
105
			})
11166 stevensc 106
	}
7386 stevensc 107
 
11166 stevensc 108
	const onUploadedHandler = (files) => {
109
		setValue('file', files)
110
		clearErrors('file')
111
	}
7386 stevensc 112
 
11166 stevensc 113
	return (
114
		<Modal
115
			show={isOpen}
116
			onHide={closeModal}
15215 stevensc 117
			autoFocus={false}>
118
			<form onSubmit={handleSubmit(onSubmit)}>
11166 stevensc 119
				<Modal.Header closeButton>
120
					<Modal.Title>Compartir una publicación</Modal.Title>
121
				</Modal.Header>
122
				<Modal.Body>
123
					{loading
15214 stevensc 124
						? <Spinner />
125
						: <>
14864 stevensc 126
							<CKEditor
127
								onChange={(e) => setValue('description', e.editor.getData())}
128
								config={config}
11166 stevensc 129
							/>
130
							{errors.description && <p>{errors.description.message}</p>}
15353 stevensc 131
							{modalType !== shareModalTypes.POST &&
14864 stevensc 132
								<DropzoneComponent
133
									modalType={modalType}
134
									onUploaded={onUploadedHandler}
135
									settedFile={getValues('file')}
136
									recomendationText={recomendationText[modalType]}
137
								/>
11166 stevensc 138
							}
139
							{errors.file && <p>{errors.file.message}</p>}
140
						</>
141
					}
142
				</Modal.Body>
143
				<Modal.Footer>
15215 stevensc 144
					<button
145
						className='btn btn-sm btn-primary'
146
						disabled={loading}
147
						type='submit'>
14864 stevensc 148
						Enviar
14897 stevensc 149
					</button>
15215 stevensc 150
					<button
151
						className='btn btn-sm btn-tertiary'
152
						disabled={loading}
153
						onClick={closeModal}>
14864 stevensc 154
						Cancelar
14897 stevensc 155
					</button>
11166 stevensc 156
				</Modal.Footer>
157
			</form>
158
		</Modal>
159
	)
160
}
7386 stevensc 161
 
162
export default ShareModal