Proyectos de Subversion LeadersLinked - Backend

Rev

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