Proyectos de Subversion LeadersLinked - Backend

Rev

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