Proyectos de Subversion LeadersLinked - SPA

Rev

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