Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16694 | Rev 16697 | 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'
16685 stevensc 3
import { config } from './helpers/ckeditor_config'
4
import { useForm } from 'react-hook-form'
16686 stevensc 5
import { connect } from 'react-redux'
16682 stevensc 6
import { Button, Modal } from 'react-bootstrap'
16685 stevensc 7
import { CKEditor } from 'ckeditor4-react'
16696 stevensc 8
import Datetime from 'react-datetime'
16685 stevensc 9
 
16671 stevensc 10
import {
11
  closeShareModal,
12
  setModalType
13
} from '../redux/share-modal/shareModal.actions'
11166 stevensc 14
import { addFeed, fetchFeeds } from '../redux/feed/feed.actions'
15
import { addNotification } from '../redux/notification/notification.actions'
16685 stevensc 16
 
17
import { shareModalTypes } from '../redux/share-modal/shareModal.types'
18
 
11166 stevensc 19
import Spinner from './Spinner'
16685 stevensc 20
import DropzoneComponent from './Dropzone/DropzoneComponent'
7386 stevensc 21
 
16685 stevensc 22
const ShareModal = (props) => {
23
  const { addNotification, closeShareModal, setModalType, addFeed } = props // Redux actions
24
  const { postUrl, isOpen, modalType, currentPage, timelineUrl, feedSharedId } =
25
    props // Redux states
26
  const [loading, setLoading] = useState(false)
27
 
16671 stevensc 28
  const {
29
    register,
30
    errors,
31
    handleSubmit,
32
    setValue,
33
    getValues,
34
    clearErrors,
35
    reset
16681 stevensc 36
  } = useForm()
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 = () => {
16685 stevensc 45
    closeShareModal()
16681 stevensc 46
  }
7386 stevensc 47
 
16681 stevensc 48
  const onUploadedHandler = (files) => {
49
    setValue('file', files)
50
    clearErrors('file')
51
  }
7386 stevensc 52
 
16683 stevensc 53
  const onSubmit = handleSubmit((data) => {
16671 stevensc 54
    setLoading(true)
16683 stevensc 55
    const formData = new FormData()
7390 stevensc 56
 
16683 stevensc 57
    Object.entries(data).map(([entry, value]) => formData.append(entry, value))
16696 stevensc 58
    console.log(data)
7386 stevensc 59
 
16696 stevensc 60
    /* axios
16685 stevensc 61
      .post(postUrl, formData)
62
      .then(({ data: response }) => {
63
        const { success, data } = response
64
        if (!success) {
65
          typeof data !== 'string'
66
            ? Object.entries(data).map(([key, value]) =>
67
                addNotification({ style: 'danger', msg: `${key}: ${value[0]}` })
16671 stevensc 68
              )
16685 stevensc 69
            : addNotification({ style: 'danger', msg: data })
16671 stevensc 70
          return
71
        }
7386 stevensc 72
 
16685 stevensc 73
        if (currentPage && timelineUrl) {
74
          fetchFeeds(timelineUrl, currentPage)
75
        }
15215 stevensc 76
 
16685 stevensc 77
        if (feedSharedId) {
78
          addFeed(data, feedSharedId)
79
          return
80
        }
7806 stevensc 81
 
16685 stevensc 82
        addFeed(data)
83
        addNotification({
84
          style: 'success',
85
          msg: 'La publicación ha sido compartida'
86
        })
87
        reset()
88
        clearErrors()
16671 stevensc 89
        closeModal()
90
      })
16685 stevensc 91
      .catch((err) => {
92
        addNotification({ style: 'danger', msg: `Error: ${err}` })
93
        throw new Error(err)
94
      })
16696 stevensc 95
      .finally(() => setLoading(false)) */
16683 stevensc 96
  })
7806 stevensc 97
 
16681 stevensc 98
  useEffect(() => {
99
    clearErrors()
100
  }, [isOpen])
7806 stevensc 101
 
16681 stevensc 102
  useEffect(() => {
103
    register('posted_or_shared')
104
    setValue('posted_or_shared', shareModalTypes.POST)
105
 
106
    if (
107
      [
108
        shareModalTypes.IMAGE,
109
        shareModalTypes.VIDEO,
110
        shareModalTypes.FILE,
111
        shareModalTypes.SHARE,
112
        shareModalTypes.CHAT
16684 stevensc 113
      ].includes(modalType)
16681 stevensc 114
    ) {
115
      register('file', { required: 'El campo es requerido' })
116
    }
117
 
118
    if (modalType === shareModalTypes.POST) {
119
      register('description', { required: 'El campo es requerido' })
120
    }
16696 stevensc 121
 
122
    if (modalType === shareModalTypes.SURVEY) {
123
      register('date', { required: 'El campo es requerido' })
124
    }
16681 stevensc 125
  }, [modalType])
126
 
16671 stevensc 127
  return (
16681 stevensc 128
    <Modal show={isOpen} onHide={closeModal}>
16687 stevensc 129
      <form onSubmit={onSubmit} method="post">
130
        <Modal.Header closeButton>
131
          <Modal.Title>Compartir una publicación</Modal.Title>
132
        </Modal.Header>
133
        <Modal.Body>
16675 stevensc 134
          {!loading ? (
16671 stevensc 135
            <>
16676 stevensc 136
              {modalType === shareModalTypes.SURVEY && (
16696 stevensc 137
                <SurveyForm register={register} setValue={setValue} />
16676 stevensc 138
              )}
16675 stevensc 139
              {modalType !== shareModalTypes.SURVEY && (
140
                <>
141
                  <CKEditor
142
                    onChange={(e) =>
143
                      setValue('description', e.editor.getData())
144
                    }
145
                    config={config}
146
                  />
147
                  {errors.description && <p>{errors.description.message}</p>}
148
                </>
149
              )}
16671 stevensc 150
              {![shareModalTypes.POST, shareModalTypes.SURVEY].includes(
151
                modalType
152
              ) && (
16677 stevensc 153
                <>
154
                  <DropzoneComponent
155
                    modalType={modalType}
156
                    onUploaded={onUploadedHandler}
157
                    settedFile={getValues('file')}
158
                    recomendationText={recomendationText[modalType]}
159
                  />
160
                  {errors.file && <p>{errors.file.message}</p>}
161
                </>
16671 stevensc 162
              )}
163
            </>
16675 stevensc 164
          ) : (
165
            <Spinner />
16671 stevensc 166
          )}
16687 stevensc 167
        </Modal.Body>
168
        <Modal.Footer>
169
          <Button size="sm" type="submit" disabled={loading}>
170
            Enviar
171
          </Button>
172
          <Button
16690 stevensc 173
            variant="light"
16687 stevensc 174
            size="sm"
175
            disabled={loading}
176
            onClick={closeShareModal}
177
          >
178
            Cancelar
179
          </Button>
180
          <Button
16690 stevensc 181
            variant="outline-info"
16687 stevensc 182
            size="sm"
183
            disabled={loading}
184
            onClick={() => setModalType(shareModalTypes.SURVEY)}
185
          >
186
            Añadir encuesta
187
          </Button>
188
        </Modal.Footer>
189
      </form>
16671 stevensc 190
    </Modal>
191
  )
192
}
7386 stevensc 193
 
16696 stevensc 194
const SurveyForm = ({ register, setValue }) => {
16671 stevensc 195
  const [optionsNumber, setOptionsNumber] = useState(2)
7386 stevensc 196
 
16671 stevensc 197
  const options = [
198
    { placeholder: 'Por ejemplo: transporte público' },
199
    { placeholder: 'Por ejemplo: coche propio' },
200
    { placeholder: 'Por ejemplo: coche compartido' },
201
    { placeholder: 'Por ejemplo: bicicleta' },
202
    { placeholder: 'Por ejemplo: otro' }
203
  ]
204
 
205
  const addOption = () => {
16674 stevensc 206
    setOptionsNumber(optionsNumber + 1)
16671 stevensc 207
  }
208
 
209
  const removeOption = () => {
16674 stevensc 210
    setOptionsNumber(optionsNumber - 1)
16671 stevensc 211
  }
212
 
213
  return (
214
    <>
215
      <div className="form-group">
16694 stevensc 216
        <label htmlFor="privacy">Privacidad</label>
217
        <select
218
          className="form-control"
219
          name="privacy"
220
          id="privacy"
221
          ref={register}
222
        >
16696 stevensc 223
          <option value="c">Compañía</option>
224
          <option value="p">Público</option>
16694 stevensc 225
        </select>
226
      </div>
227
      <div className="form-group">
16696 stevensc 228
        <label htmlFor="result">Resultado</label>
229
        <select
230
          className="form-control"
231
          name="result"
232
          id="result"
233
          ref={register}
234
        >
235
          <option value="pr">Privado</option>
236
          <option value="pu">Público</option>
237
        </select>
238
      </div>
239
      <div className="form-group">
16671 stevensc 240
        <label htmlFor="question">Tu pregunta*</label>
241
        <input
242
          type="text"
243
          className="form-control"
244
          placeholder="Por ejemplo: ¿cómo te desplazas al trabajo?"
245
          maxLength={140}
246
          id="question"
247
          name="question"
248
          ref={register({ required: true })}
249
        />
250
      </div>
251
      {options.slice(0, optionsNumber).map((option, index) => (
252
        <div className="form-group" key={index}>
253
          <label htmlFor={`option-${index + 1}`}>Opción {index + 1}*</label>
254
          {index > 1 && (
255
            <button className="btn" onClick={removeOption}>
256
              Eliminar
257
            </button>
258
          )}
259
          <input
260
            type="text"
261
            className="form-control"
262
            placeholder={option.placeholder}
263
            maxLength={30}
264
            id={`option-${index + 1}`}
265
            name={`option-${index + 1}`}
266
            ref={register({ required: true })}
267
          />
268
        </div>
269
      ))}
16675 stevensc 270
      {optionsNumber < options.length && (
271
        <button className="btn btn-outline-primary rounded" onClick={addOption}>
272
          Añadir opción
273
        </button>
274
      )}
16696 stevensc 275
      <Datetime
276
        onChange={(e) => {
277
          const date = e.toDate()
278
          setValue('date', date)
279
        }}
280
      />
16671 stevensc 281
    </>
282
  )
11166 stevensc 283
}
7386 stevensc 284
 
16685 stevensc 285
const mapStateToProps = (state) => ({
286
  isOpen: state.shareModal.isOpen,
287
  postUrl: state.shareModal.postUrl,
288
  modalType: state.shareModal.modalType,
289
  feedSharedId: state.shareModal.feedSharedId,
290
  currentPage: state.feed.currentPage,
291
  timelineUrl: state.feed.timelineUrl
292
})
293
 
294
const mapDispatchToProps = {
295
  addNotification: (notification) => addNotification(notification),
296
  closeShareModal: () => closeShareModal(),
297
  setModalType: (modalType) => setModalType(modalType),
298
  addFeed: (feed, feedSharedId) => addFeed(feed, feedSharedId)
299
}
300
 
301
export default connect(mapStateToProps, mapDispatchToProps)(ShareModal)