Proyectos de Subversion LeadersLinked - Backend

Rev

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