Proyectos de Subversion LeadersLinked - Backend

Rev

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