Proyectos de Subversion LeadersLinked - Backend

Rev

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