Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2521 | Rev 2807 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1607 stevensc 1
import React, { useEffect, useState } from 'react'
1231 stevensc 2
import { useForm } from 'react-hook-form'
1607 stevensc 3
import { connect, useSelector } from 'react-redux'
1231 stevensc 4
 
2521 stevensc 5
import { axios } from '@app/utils'
1607 stevensc 6
import { addNotification } from '@app/redux/notification/notification.actions'
1231 stevensc 7
import {
8
  closeShareModal,
9
  openShareModal,
10
  setModalType
1607 stevensc 11
} from '@app/redux/share-modal/shareModal.actions'
1650 stevensc 12
import { addFeed } from '@app/redux/feed/feed.actions'
1231 stevensc 13
 
1607 stevensc 14
import { shareModalTypes } from '@app/redux/share-modal/shareModal.types'
15
import { feedTypes } from '@app/redux/feed/feed.types'
1231 stevensc 16
 
1402 stevensc 17
import DropzoneComponent from '../dropzone/DropzoneComponent'
1437 stevensc 18
import FormErrorFeedback from '../UI/form/FormErrorFeedback'
1607 stevensc 19
import Modal from '../UI/modal/Modal'
2521 stevensc 20
import CKEditor from '@app/components/UI/Ckeditor'
1607 stevensc 21
import ConfirmModal from './ConfirmModal'
1231 stevensc 22
 
23
const ShareModal = ({
24
  postUrl,
25
  isOpen,
26
  modalType,
27
  lastModalType,
28
  setModalType,
29
  feedType,
30
  feedSharedId,
31
  closeShareModal, // Redux action
32
  addNotification, // Redux action
33
  addFeed, // Redux action
34
  openShareModal // Redux action
35
}) => {
36
  const [showConfirmModal, setShowConfirmModal] = useState(false)
37
  const labels = useSelector(({ intl }) => intl.labels)
38
 
39
  const {
40
    register,
41
    unregister,
42
    handleSubmit,
43
    setValue,
44
    getValues,
45
    clearErrors,
46
    setError,
2802 stevensc 47
    watch,
48
    formState: { errors }
1231 stevensc 49
  } = useForm({
50
    defaultValues: {
51
      description: '',
52
      share_width: 'p'
53
    }
54
  })
2521 stevensc 55
  const watchedDescription = watch('description')
1231 stevensc 56
 
57
  const recomendationText = () => {
58
    switch (modalType) {
59
      case shareModalTypes.IMAGE:
60
        return 'Tamaño recomendado: 720x720'
61
      case shareModalTypes.FILE:
62
        return 'solo documentos PDF'
63
      case shareModalTypes.VIDEO:
64
        return 'Video de extensión mp4, mpeg, webm, mov'
65
      default:
66
        return ''
67
    }
68
  }
69
 
1608 stevensc 70
  const toggleConfirmModal = () => setShowConfirmModal(!showConfirmModal)
1231 stevensc 71
 
72
  const handleModalAccept = () => {
73
    setShowConfirmModal(false)
74
    setValue('description', '')
75
    setValue('file', '')
76
    openShareModal(postUrl, modalType, feedType)
77
    clearErrors()
78
  }
79
 
80
  const handleModalCancel = () => {
81
    setShowConfirmModal(false)
82
    closeShareModal()
83
    setModalType(lastModalType)
84
    openShareModal(postUrl, lastModalType, feedType)
85
  }
86
 
1609 stevensc 87
  const onSubmit = handleSubmit((data) => {
1979 stevensc 88
    const currentFormData = new FormData()
89
 
90
    Object.entries(data).forEach(([key, value]) =>
91
      currentFormData.append(key, value)
92
    )
93
 
1231 stevensc 94
    axios
1979 stevensc 95
      .post(postUrl, currentFormData)
1231 stevensc 96
      .then((response) => {
97
        const { data, success } = response.data
98
 
1765 stevensc 99
        if (!success && typeof data !== 'string') {
100
          Object.entries(data).map(([key, value]) =>
101
            setError(key, { type: 'required', message: value[0] })
102
          )
1231 stevensc 103
          return
104
        }
105
 
1765 stevensc 106
        if (!success && typeof data === 'string') {
107
          throw new Error(data)
108
        }
109
 
1231 stevensc 110
        const newFeed = data
111
 
112
        addNotification({
113
          style: 'success',
114
          msg: 'La publicación ha sido compartida'
115
        })
2250 stevensc 116
 
1611 stevensc 117
        onClose()
1231 stevensc 118
 
119
        if (feedSharedId) {
120
          addFeed(newFeed, feedSharedId)
121
        } else {
122
          addFeed(newFeed)
123
        }
2250 stevensc 124
 
125
        setValue('description', '')
126
        setValue('file', '')
1231 stevensc 127
      })
1765 stevensc 128
      .catch((error) => {
129
        console.log(error)
130
        addNotification({
131
          style: 'danger',
132
          msg: 'Ha ocurrido un error al publicar, intente más tarde.'
133
        })
134
      })
1609 stevensc 135
  })
1231 stevensc 136
 
137
  const onUploadedHandler = (files) => {
138
    setValue('file', files)
139
    clearErrors('file')
140
  }
141
 
1609 stevensc 142
  const onClose = () => {
143
    clearErrors()
144
    closeShareModal()
145
  }
146
 
147
  useEffect(() => {
148
    const postedOrShared = modalType === shareModalTypes.SHARE ? 's' : 'p'
149
 
150
    register('posted_or_shared')
151
    setValue('posted_or_shared', postedOrShared)
152
 
1231 stevensc 153
    if (
154
      modalType !== shareModalTypes.POST &&
155
      modalType !== shareModalTypes.SHARE
156
    ) {
1609 stevensc 157
      register('file', {
158
        required: { value: 'true', message: 'El campo es requerido' }
159
      })
160
    } else {
161
      if (!getValues('file')) unregister('file')
1231 stevensc 162
    }
163
 
1609 stevensc 164
    if (getValues('file') || getValues('description')) {
165
      if (modalType !== lastModalType) {
166
        onClose()
167
        toggleConfirmModal()
168
      }
1231 stevensc 169
    }
1609 stevensc 170
  }, [modalType])
1231 stevensc 171
 
1609 stevensc 172
  useEffect(() => {
1611 stevensc 173
    if (isOpen) {
174
      register('description', { required: 'El campo es requerido' })
175
    }
176
  }, [isOpen])
1609 stevensc 177
 
1231 stevensc 178
  return (
179
    <>
180
      <Modal
1402 stevensc 181
        show={isOpen}
1231 stevensc 182
        title={labels.share_a_post}
183
        labelAccept={labels.send}
184
        labelReject={labels.cancel}
1609 stevensc 185
        onClose={onClose}
186
        onAccept={onSubmit}
1231 stevensc 187
      >
1609 stevensc 188
        {feedType === feedTypes.DASHBOARD ? (
1610 stevensc 189
          <select
190
            name='shared_with'
191
            className='form-control'
192
            defaultValue='p'
193
            ref={register}
194
          >
1609 stevensc 195
            <option value='p'>{labels.public}</option>
196
            <option value='c'>{labels.connections}</option>
197
          </select>
198
        ) : null}
1231 stevensc 199
 
200
        <CKEditor
2521 stevensc 201
          defaultValue={watchedDescription}
202
          onChange={(value) => setValue('description', value)}
1231 stevensc 203
        />
204
 
205
        {errors.description && (
206
          <FormErrorFeedback>{errors.description.message}</FormErrorFeedback>
207
        )}
208
 
1609 stevensc 209
        {![shareModalTypes.POST, shareModalTypes.SHARE].includes(modalType) ? (
210
          <DropzoneComponent
211
            modalType={modalType}
212
            onUploaded={onUploadedHandler}
1931 stevensc 213
            settedFile={watch('file')}
1609 stevensc 214
            recomendationText={recomendationText()}
215
          />
216
        ) : null}
1231 stevensc 217
 
218
        {errors.file && (
219
          <FormErrorFeedback>{errors.file.message}</FormErrorFeedback>
220
        )}
221
      </Modal>
222
      <ConfirmModal
223
        show={showConfirmModal}
224
        onClose={handleModalCancel}
225
        onAccept={handleModalAccept}
226
        message='¿No se ha compartido tu publicación , desea descartarlo?'
227
      />
228
    </>
229
  )
230
}
231
 
232
const mapStateToProps = (state) => ({
233
  isOpen: state.shareModal.isOpen,
234
  postUrl: state.shareModal.postUrl,
235
  modalType: state.shareModal.modalType,
236
  lastModalType: state.shareModal.lastModalType,
237
  feedType: state.shareModal.feedType,
238
  feedSharedId: state.shareModal.feedSharedId
239
})
240
 
241
const mapDispatchToProps = {
242
  addNotification: (notification) => addNotification(notification),
243
  closeShareModal: () => closeShareModal(),
244
  openShareModal: (postUrl, modalType, feedType) =>
245
    openShareModal(postUrl, modalType, feedType),
246
  setModalType: (modalType) => setModalType(modalType),
1650 stevensc 247
  addFeed: (feed, feedSharedId) => addFeed(feed, feedSharedId)
1231 stevensc 248
}
249
 
250
export default connect(mapStateToProps, mapDispatchToProps)(ShareModal)