Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16678 | Rev 16680 | 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'
16671 stevensc 6
import {
7
  closeShareModal,
8
  setModalType
9
} from '../redux/share-modal/shareModal.actions'
11166 stevensc 10
import { useDispatch, useSelector } from 'react-redux'
11
import DropzoneComponent from './Dropzone/DropzoneComponent'
12
import { addFeed, fetchFeeds } from '../redux/feed/feed.actions'
13
import { addNotification } from '../redux/notification/notification.actions'
14
import Spinner from './Spinner'
14864 stevensc 15
import { CKEditor } from 'ckeditor4-react'
16
import { config } from './helpers/ckeditor_config'
7386 stevensc 17
 
7387 stevensc 18
const ShareModal = () => {
16671 stevensc 19
  const [loading, setLoading] = useState(false)
20
  const { postUrl, isOpen, modalType } = useSelector(
21
    ({ shareModal }) => shareModal
22
  )
23
  const { currentPage, timelineUrl, feedSharedId } = useSelector(
24
    ({ feed }) => feed
25
  )
26
  const dispatch = useDispatch()
7386 stevensc 27
 
16671 stevensc 28
  const {
29
    register,
30
    unregister,
31
    errors,
32
    handleSubmit,
33
    setValue,
34
    getValues,
35
    clearErrors,
36
    reset
37
  } = useForm({
38
    defaultValues: {
39
      description: '',
40
      share_width: ''
41
    }
42
  })
7388 stevensc 43
 
16671 stevensc 44
  useEffect(() => {
45
    register('posted_or_shared')
46
    setValue('posted_or_shared', shareModalTypes.POST)
7386 stevensc 47
 
16677 stevensc 48
    if (
49
      [
50
        shareModalTypes.IMAGE,
51
        shareModalTypes.VIDEO,
52
        shareModalTypes.FILE,
53
        shareModalTypes.SHARE,
54
        shareModalTypes.CHAT
55
      ]
56
    ) {
16671 stevensc 57
      register('file', { required: 'El campo es requerido' })
58
    }
7386 stevensc 59
 
16671 stevensc 60
    if (modalType === shareModalTypes.POST) {
16677 stevensc 61
      register('description', { required: 'El campo es requerido' })
16671 stevensc 62
    }
63
  }, [modalType])
15353 stevensc 64
 
16671 stevensc 65
  const recomendationText = {
66
    IMAGE: 'Tamaño recomendado: 720x720',
67
    FILE: 'solo documentos PDF',
68
    VIDEO: 'Video de extensión mp4, mpeg, webm'
69
  }
15353 stevensc 70
 
16671 stevensc 71
  const closeModal = () => dispatch(closeShareModal())
7386 stevensc 72
 
16671 stevensc 73
  useEffect(() => clearErrors(), [isOpen])
7386 stevensc 74
 
16671 stevensc 75
  const onSubmit = (data) => {
76
    setLoading(true)
77
    const currentFormData = new FormData()
7390 stevensc 78
 
16671 stevensc 79
    Object.entries(data).map(([entry, value]) =>
80
      currentFormData.append(entry, value)
81
    )
7386 stevensc 82
 
16671 stevensc 83
    axios
84
      .post(postUrl, currentFormData)
85
      .then(({ data }) => {
86
        const newFeed = data.data
87
        if (!data.success) {
88
          typeof data.data === 'string'
89
            ? dispatch(
90
                addNotification({
91
                  style: 'danger',
92
                  msg: data.data
93
                })
94
              )
95
            : Object.entries(data.data).map(([key, value]) =>
96
                value.map((err) =>
97
                  dispatch(
98
                    addNotification({
99
                      style: 'danger',
100
                      msg: `${key}: ${err}`
101
                    })
102
                  )
103
                )
104
              )
105
          return
106
        }
107
        reset()
108
        clearErrors()
109
        dispatch(
110
          addNotification({
111
            style: 'success',
112
            msg: 'La publicación ha sido compartida'
113
          })
114
        )
7386 stevensc 115
 
16671 stevensc 116
        if (currentPage && timelineUrl)
117
          dispatch(fetchFeeds(timelineUrl, currentPage))
15215 stevensc 118
 
16671 stevensc 119
        if (feedSharedId) return dispatch(addFeed(newFeed, feedSharedId))
7806 stevensc 120
 
16671 stevensc 121
        return dispatch(addFeed(newFeed))
122
      })
123
      .catch((err) =>
124
        dispatch(addNotification({ style: 'danger', msg: `Error: ${err}` }))
125
      )
126
      .finally(() => {
127
        setLoading(false)
128
        closeModal()
129
      })
130
  }
7806 stevensc 131
 
16671 stevensc 132
  const onUploadedHandler = (files) => {
133
    setValue('file', files)
134
    clearErrors('file')
135
  }
7806 stevensc 136
 
16671 stevensc 137
  return (
138
    <Modal show={isOpen} onHide={closeModal} autoFocus={false}>
16679 stevensc 139
      <Modal.Header closeButton>
140
        <Modal.Title>Compartir una publicación</Modal.Title>
141
      </Modal.Header>
142
      <Modal.Body>
143
        <form onSubmit={handleSubmit(onSubmit)}>
16675 stevensc 144
          {!loading ? (
16671 stevensc 145
            <>
16676 stevensc 146
              {modalType === shareModalTypes.SURVEY && (
147
                <SurveyForm register={register} />
148
              )}
16675 stevensc 149
              {modalType !== shareModalTypes.SURVEY && (
150
                <>
151
                  <CKEditor
152
                    onChange={(e) =>
153
                      setValue('description', e.editor.getData())
154
                    }
155
                    config={config}
156
                  />
157
                  {errors.description && <p>{errors.description.message}</p>}
158
                </>
159
              )}
16671 stevensc 160
              {![shareModalTypes.POST, shareModalTypes.SURVEY].includes(
161
                modalType
162
              ) && (
16677 stevensc 163
                <>
164
                  <DropzoneComponent
165
                    modalType={modalType}
166
                    onUploaded={onUploadedHandler}
167
                    settedFile={getValues('file')}
168
                    recomendationText={recomendationText[modalType]}
169
                  />
170
                  {errors.file && <p>{errors.file.message}</p>}
171
                </>
16671 stevensc 172
              )}
173
            </>
16675 stevensc 174
          ) : (
175
            <Spinner />
16671 stevensc 176
          )}
16679 stevensc 177
 
16671 stevensc 178
          <button
179
            className="btn btn-sm btn-primary"
180
            disabled={loading}
181
            type="submit"
182
          >
183
            Enviar
184
          </button>
185
          <button
16678 stevensc 186
            type="button"
16671 stevensc 187
            className="btn btn-sm btn-tertiary"
188
            disabled={loading}
189
            onClick={closeModal}
190
          >
191
            Cancelar
192
          </button>
193
          <button
16678 stevensc 194
            type="button"
16675 stevensc 195
            className="btn btn-sm"
16671 stevensc 196
            disabled={loading}
197
            onClick={() => dispatch(setModalType(shareModalTypes.SURVEY))}
198
          >
199
            Añadir encuesta
200
          </button>
16679 stevensc 201
        </form>
202
      </Modal.Body>
16671 stevensc 203
    </Modal>
204
  )
205
}
7386 stevensc 206
 
16675 stevensc 207
const SurveyForm = ({ register }) => {
16671 stevensc 208
  const [optionsNumber, setOptionsNumber] = useState(2)
7386 stevensc 209
 
16671 stevensc 210
  const options = [
211
    { placeholder: 'Por ejemplo: transporte público' },
212
    { placeholder: 'Por ejemplo: coche propio' },
213
    { placeholder: 'Por ejemplo: coche compartido' },
214
    { placeholder: 'Por ejemplo: bicicleta' },
215
    { placeholder: 'Por ejemplo: otro' }
216
  ]
217
 
218
  const addOption = () => {
16674 stevensc 219
    setOptionsNumber(optionsNumber + 1)
16671 stevensc 220
  }
221
 
222
  const removeOption = () => {
16674 stevensc 223
    setOptionsNumber(optionsNumber - 1)
16671 stevensc 224
  }
225
 
226
  return (
227
    <>
228
      <div className="form-group">
229
        <label htmlFor="question">Tu pregunta*</label>
230
        <input
231
          type="text"
232
          className="form-control"
233
          placeholder="Por ejemplo: ¿cómo te desplazas al trabajo?"
234
          maxLength={140}
235
          id="question"
236
          name="question"
237
          ref={register({ required: true })}
238
        />
239
      </div>
240
      {options.slice(0, optionsNumber).map((option, index) => (
241
        <div className="form-group" key={index}>
242
          <label htmlFor={`option-${index + 1}`}>Opción {index + 1}*</label>
243
          {index > 1 && (
244
            <button className="btn" onClick={removeOption}>
245
              Eliminar
246
            </button>
247
          )}
248
          <input
249
            type="text"
250
            className="form-control"
251
            placeholder={option.placeholder}
252
            maxLength={30}
253
            id={`option-${index + 1}`}
254
            name={`option-${index + 1}`}
255
            ref={register({ required: true })}
256
          />
257
        </div>
258
      ))}
16675 stevensc 259
      {optionsNumber < options.length && (
260
        <button className="btn btn-outline-primary rounded" onClick={addOption}>
261
          Añadir opción
262
        </button>
263
      )}
16671 stevensc 264
    </>
265
  )
11166 stevensc 266
}
7386 stevensc 267
 
16671 stevensc 268
export default ShareModal