Proyectos de Subversion LeadersLinked - SPA

Rev

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