Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 1609 | Rev 1611 | 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
import { CKEditor } from 'ckeditor4-react'
5
 
1607 stevensc 6
import { axios, CKEDITOR_OPTIONS } from '@app/utils'
7
import { addNotification } from '@app/redux/notification/notification.actions'
1231 stevensc 8
import {
9
  closeShareModal,
10
  openShareModal,
11
  setModalType
1607 stevensc 12
} from '@app/redux/share-modal/shareModal.actions'
13
import { addFeed, fetchFeeds } from '@app/redux/feed/feed.actions'
1231 stevensc 14
 
1607 stevensc 15
import { shareModalTypes } from '@app/redux/share-modal/shareModal.types'
16
import { feedTypes } from '@app/redux/feed/feed.types'
1231 stevensc 17
 
1402 stevensc 18
import DropzoneComponent from '../dropzone/DropzoneComponent'
1437 stevensc 19
import FormErrorFeedback from '../UI/form/FormErrorFeedback'
1607 stevensc 20
import Modal from '../UI/modal/Modal'
1402 stevensc 21
import Spinner from '../UI/Spinner'
1607 stevensc 22
import ConfirmModal from './ConfirmModal'
1231 stevensc 23
 
24
const ShareModal = ({
25
  postUrl,
26
  isOpen,
27
  modalType,
28
  lastModalType,
29
  setModalType,
30
  feedType,
31
  fetchFeeds,
32
  currentPage,
33
  timelineUrl,
34
  feedSharedId,
35
  closeShareModal, // Redux action
36
  addNotification, // Redux action
37
  addFeed, // Redux action
38
  openShareModal // Redux action
39
}) => {
40
  const [loading, setLoading] = useState(false)
41
  const [isCKEditorLoading, setIsCKEditorLoading] = useState(true)
42
  const [showConfirmModal, setShowConfirmModal] = useState(false)
43
  const labels = useSelector(({ intl }) => intl.labels)
44
 
45
  const {
46
    register,
47
    unregister,
48
    errors,
49
    handleSubmit,
50
    setValue,
51
    getValues,
52
    clearErrors,
53
    setError,
54
    reset
55
  } = useForm({
56
    defaultValues: {
57
      description: '',
58
      share_width: 'p'
59
    }
60
  })
61
 
62
  const recomendationText = () => {
63
    switch (modalType) {
64
      case shareModalTypes.IMAGE:
65
        return 'Tamaño recomendado: 720x720'
66
      case shareModalTypes.FILE:
67
        return 'solo documentos PDF'
68
      case shareModalTypes.VIDEO:
69
        return 'Video de extensión mp4, mpeg, webm, mov'
70
      default:
71
        return ''
72
    }
73
  }
74
 
1608 stevensc 75
  const toggleConfirmModal = () => setShowConfirmModal(!showConfirmModal)
1231 stevensc 76
 
77
  const handleModalAccept = () => {
78
    setShowConfirmModal(false)
79
    setValue('description', '')
80
    setValue('file', '')
81
    openShareModal(postUrl, modalType, feedType)
82
    clearErrors()
83
  }
84
 
85
  const handleModalCancel = () => {
86
    setShowConfirmModal(false)
87
    closeShareModal()
88
    setModalType(lastModalType)
89
    openShareModal(postUrl, lastModalType, feedType)
90
  }
91
 
1609 stevensc 92
  const onSubmit = handleSubmit((data) => {
1231 stevensc 93
    setLoading(true)
94
    const currentFormData = new FormData()
95
 
96
    Object.entries(data).forEach(([key, value]) =>
97
      currentFormData.append(key, value)
98
    )
99
 
100
    axios
101
      .post(postUrl, currentFormData)
102
      .then((response) => {
103
        const { data, success } = response.data
104
 
105
        if (!success) {
1610 stevensc 106
          typeof data === 'string'
107
            ? addNotification({ style: 'danger', msg: data })
108
            : Object.entries(data).map(([key, value]) =>
109
                setError(key, { type: 'required', message: value[0] })
110
              )
1231 stevensc 111
          return
112
        }
113
 
114
        const newFeed = data
115
 
116
        addNotification({
117
          style: 'success',
118
          msg: 'La publicación ha sido compartida'
119
        })
120
        reset()
121
        clearErrors()
122
        closeShareModal()
123
 
124
        if (feedSharedId) {
125
          addFeed(newFeed, feedSharedId)
126
        } else {
127
          addFeed(newFeed)
128
        }
129
 
130
        if (currentPage && timelineUrl) {
131
          fetchFeeds(timelineUrl, currentPage)
132
        }
133
      })
134
      .finally(() => setLoading(false))
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(() => {
173
    register('description', {
174
      required: { value: 'true', message: 'El campo es requerido' }
175
    })
176
  }, [])
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
1608 stevensc 201
          data={getValues('description')}
1231 stevensc 202
          config={CKEDITOR_OPTIONS}
1608 stevensc 203
          onChange={({ editor }) => setValue('description', editor.getData())}
1231 stevensc 204
          onDialogShow={() => {
205
            const modal = document.querySelector('.fade.modal.show')
206
            modal.removeAttribute('tabindex')
207
          }}
1608 stevensc 208
          onBeforeLoad={() => setIsCKEditorLoading(false)}
1231 stevensc 209
        />
210
 
211
        {isCKEditorLoading && <Spinner />}
212
 
213
        {errors.description && (
214
          <FormErrorFeedback>{errors.description.message}</FormErrorFeedback>
215
        )}
216
 
1609 stevensc 217
        {![shareModalTypes.POST, shareModalTypes.SHARE].includes(modalType) ? (
218
          <DropzoneComponent
219
            modalType={modalType}
220
            onUploaded={onUploadedHandler}
221
            settedFile={getValues('file')}
222
            recomendationText={recomendationText()}
223
          />
224
        ) : null}
1231 stevensc 225
 
226
        {errors.file && (
227
          <FormErrorFeedback>{errors.file.message}</FormErrorFeedback>
228
        )}
229
 
230
        {loading && <Spinner />}
231
      </Modal>
232
      <ConfirmModal
233
        show={showConfirmModal}
234
        onClose={handleModalCancel}
235
        onAccept={handleModalAccept}
236
        message='¿No se ha compartido tu publicación , desea descartarlo?'
237
      />
238
    </>
239
  )
240
}
241
 
242
const mapStateToProps = (state) => ({
243
  isOpen: state.shareModal.isOpen,
244
  postUrl: state.shareModal.postUrl,
245
  modalType: state.shareModal.modalType,
246
  lastModalType: state.shareModal.lastModalType,
247
  feedType: state.shareModal.feedType,
248
  feedSharedId: state.shareModal.feedSharedId
249
})
250
 
251
const mapDispatchToProps = {
252
  addNotification: (notification) => addNotification(notification),
253
  closeShareModal: () => closeShareModal(),
254
  openShareModal: (postUrl, modalType, feedType) =>
255
    openShareModal(postUrl, modalType, feedType),
256
  setModalType: (modalType) => setModalType(modalType),
257
  addFeed: (feed, feedSharedId) => addFeed(feed, feedSharedId),
258
  fetchFeeds: (url, page) => fetchFeeds(url, page)
259
}
260
 
261
export default connect(mapStateToProps, mapDispatchToProps)(ShareModal)