Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
3192 stevensc 1
/* eslint-disable react/prop-types */
5106 stevensc 2
import React, { useState, useEffect } from 'react'
3
import { connect } from 'react-redux'
4
import Modal from 'react-bootstrap/Modal'
5
import Button from 'react-bootstrap/Button'
6
import { useForm } from 'react-hook-form'
7
import styled from 'styled-components'
8
import FormErrorFeedback from '../../../shared/form-error-feedback/FormErrorFeedback'
9
import Spinner from '../../../shared/loading-spinner/Spinner'
10
import { addNotification } from '../../../redux/notification/notification.actions'
11
import { closeShareModal, openShareModal, setModalType } from '../../../redux/share-modal/shareModal.actions'
12
import { addFeed, fetchFeeds } from '../../../redux/feed/feed.actions'
13
import DropzoneComponent from '../../../shared/dropzone/DropzoneComponent'
14
import { shareModalTypes } from '../../../redux/share-modal/shareModal.types'
15
import { feedTypes } from '../../../redux/feed/feed.types'
16
import { CKEditor } from 'ckeditor4-react'
17
import { axios, CKEDITOR_OPTIONS } from '../../../utils'
18
import ConfirmModal from '../../../shared/confirm-modal/ConfirmModal'
1 www 19
 
5106 stevensc 20
const ShareModal = ({
21
  postUrl,
22
  isOpen,
23
  modalType,
24
  lastModalType,
25
  setModalType,
26
  feedType,
27
  fetchFeeds,
28
  currentPage,
29
  timelineUrl,
30
  feedSharedId,
31
  closeShareModal, // Redux action
32
  addNotification, // Redux action
33
  addFeed, // Redux action
34
  openShareModal // Redux action
35
}) => {
4987 stevensc 36
  const [loading, setLoading] = useState(false)
37
  const [isCKEditorLoading, setIsCKEditorLoading] = useState(true)
38
  const [showConfirmModal, setShowConfirmModal] = useState(false)
1 www 39
 
40
  const {
41
    register,
42
    unregister,
43
    errors,
44
    handleSubmit,
45
    setValue,
46
    watch,
47
    getValues,
48
    clearErrors,
5106 stevensc 49
    setError
1 www 50
  } = useForm({
51
    defaultValues: {
5106 stevensc 52
      description: '',
53
      share_width: ''
54
    }
4987 stevensc 55
  })
1 www 56
 
57
  useEffect(() => {
5106 stevensc 58
    register('description', {
59
      required: { value: 'true', message: 'El campo es requerido' }
4987 stevensc 60
    })
5106 stevensc 61
    register('posted_or_shared')
1 www 62
    if (
63
      modalType !== shareModalTypes.POST &&
64
      modalType !== shareModalTypes.SHARE
65
    ) {
5106 stevensc 66
      register('file', {
67
        required: { value: 'true', message: 'El campo es requerido' }
4987 stevensc 68
      })
1 www 69
    } else {
5106 stevensc 70
      if (!getValues('file')) unregister('file')
1 www 71
    }
4987 stevensc 72
  }, [modalType])
1 www 73
 
74
  const recomendationText = () => {
75
    switch (modalType) {
76
      case shareModalTypes.IMAGE:
5106 stevensc 77
        return 'Tamaño recomendado: 720x720'
1 www 78
      case shareModalTypes.FILE:
5106 stevensc 79
        return 'solo documentos PDF'
1 www 80
      case shareModalTypes.VIDEO:
5106 stevensc 81
        return 'Video de extensión mp4, mpeg, webm'
1 www 82
      default:
5106 stevensc 83
        return ''
1 www 84
    }
4987 stevensc 85
  }
1 www 86
  useEffect(() => {
5106 stevensc 87
    const postedOrShared = modalType === shareModalTypes.SHARE ? 's' : 'p'
88
    setValue('posted_or_shared', postedOrShared)
89
    if (getValues('file') || getValues('description')) {
1 www 90
      if (modalType !== lastModalType) {
4987 stevensc 91
        closeShareModal()
92
        handleShowConfirmModal()
1 www 93
      }
94
    }
4987 stevensc 95
  }, [modalType])
1260 steven 96
 
868 steven 97
  const hideDuplicatedModal = () => {
98
    setTimeout(() => {
4987 stevensc 99
      const modals = document.getElementsByClassName('modal')
1261 steven 100
      if (modals.length > 1 && modals[0].style.display !== 'none') {
4987 stevensc 101
        const currentModal = modals[0]
102
        currentModal.style.display = 'none'
946 steven 103
        for (let index = 0; index < modals.length; index++) {
4987 stevensc 104
          const element = modals[index]
5106 stevensc 105
          element.removeAttribute('tabindex')
946 steven 106
        }
870 steven 107
      }
4987 stevensc 108
    }, 3000)
868 steven 109
  }
984 steven 110
 
1 www 111
  useEffect(() => {
4987 stevensc 112
    clearErrors()
113
    hideDuplicatedModal()
114
  }, [isOpen])
1 www 115
 
116
  const handleShowConfirmModal = () => {
4987 stevensc 117
    setShowConfirmModal(!showConfirmModal)
118
  }
1 www 119
 
120
  const handleModalAccept = () => {
4987 stevensc 121
    setShowConfirmModal(false)
5106 stevensc 122
    setValue('description', '')
123
    setValue('file', '')
4987 stevensc 124
    openShareModal(postUrl, modalType, feedType)
125
    clearErrors()
126
  }
1 www 127
 
128
  const handleModalCancel = () => {
4987 stevensc 129
    setShowConfirmModal(false)
130
    closeShareModal()
131
    setModalType(lastModalType)
132
    openShareModal(postUrl, lastModalType, feedType)
133
  }
1 www 134
 
135
  const onSubmit = async (data, e) => {
4987 stevensc 136
    setLoading(true)
137
    const currentFormData = new FormData()
5106 stevensc 138
    for (const input in data) {
4987 stevensc 139
      currentFormData.append(input, data[input])
1 www 140
    }
141
    await axios.post(postUrl, currentFormData).then((response) => {
4987 stevensc 142
      const data = response.data
143
      const newFeed = data.data
1 www 144
      if (data.success) {
4987 stevensc 145
        closeShareModal()
1 www 146
        // reset data
4987 stevensc 147
        e.target.reset()
5106 stevensc 148
        setValue('description', '')
149
        setValue('file', '')
4987 stevensc 150
        clearErrors()
1 www 151
        addNotification({
5106 stevensc 152
          style: 'success',
153
          msg: 'La publicación ha sido compartida'
4987 stevensc 154
        })
1018 stevensc 155
        if (feedSharedId) {
4987 stevensc 156
          addFeed(newFeed, feedSharedId)
1018 stevensc 157
        } else {
4987 stevensc 158
          addFeed(newFeed)
1018 stevensc 159
        }
160
        if (currentPage && timelineUrl) {
1009 steven 161
          fetchFeeds(timelineUrl, currentPage)
162
        }
1 www 163
      } else {
164
        if (data.data.description || data.data.file || data.data.share_width) {
5106 stevensc 165
          Object.entries(data.data)
166
            .map(([key, value]) => setError(key, { type: 'required', message: value })
167
            )
1 www 168
        } else {
169
          addNotification({
5106 stevensc 170
            style: 'danger',
171
            msg: data.data
4987 stevensc 172
          })
1 www 173
        }
174
      }
4987 stevensc 175
    })
1 www 176
 
4987 stevensc 177
    setLoading(false)
178
  }
1 www 179
 
180
  const onUploadedHandler = (files) => {
5106 stevensc 181
    setValue('file', files)
182
    clearErrors('file')
4987 stevensc 183
  }
1 www 184
 
185
  const dropZoneRender = () => {
186
    if (
187
      modalType !== shareModalTypes.POST &&
188
      modalType !== shareModalTypes.SHARE
189
    ) {
190
      return (
191
        <DropzoneComponent
192
          modalType={modalType}
193
          onUploaded={onUploadedHandler}
5106 stevensc 194
          settedFile={getValues('file')}
1 www 195
          recomendationText={recomendationText()}
196
        />
4987 stevensc 197
      )
1 www 198
    }
4987 stevensc 199
  }
1 www 200
 
201
  const SharedWithSelectRender = () => {
202
    if (feedType === feedTypes.DASHBOARD) {
203
      return (
4987 stevensc 204
        <>
1 www 205
          <select
206
            name="shared_with"
207
            id="shared_with"
208
            className="form-control"
5106 stevensc 209
            ref={register({ required: 'El campo es requerido' })}
1 www 210
            defaultValue="p"
211
          >
5106 stevensc 212
            <option disabled="disabled" value="" style={{ display: 'none' }}>
213
              {LABELS.SHARE_WITH}
1 www 214
            </option>
5106 stevensc 215
            <option value="p">{LABELS.PUBLIC}</option>
216
            <option value="c">{LABELS.CONNECTIONS}</option>
1 www 217
          </select>
4987 stevensc 218
          {errors.shared_with && <FormErrorFeedback>{errors.shared_with.message}</FormErrorFeedback>}
219
        </>
220
      )
1 www 221
    }
4987 stevensc 222
  }
1 www 223
 
224
  return (
5106 stevensc 225
    <>
1 www 226
      <Modal
227
        show={isOpen}
228
        onHide={closeShareModal}
943 steven 229
        autoFocus={false}
1 www 230
      >
231
        <Modal.Header closeButton>
5106 stevensc 232
          <Modal.Title>{LABELS.SHARE_A_POST}</Modal.Title>
1 www 233
        </Modal.Header>
234
        <form encType="multipart/form-data" onSubmit={handleSubmit(onSubmit)}>
235
          <Modal.Body>
236
            {SharedWithSelectRender()}
237
            <CKEditor
5106 stevensc 238
              data={watch('description')}
1 www 239
              onChange={(e) => {
4987 stevensc 240
                const text = e.editor.getData()
5106 stevensc 241
                setValue('description', text)
242
                if (errors.description && getValues('description')) clearErrors('description')
1 www 243
              }}
2043 steven 244
              config={CKEDITOR_OPTIONS}
1 www 245
              name="description"
4997 stevensc 246
              onDialogShow={() => {
247
                const modal = document.querySelector('.fade.modal.show')
248
                modal.removeAttribute('tabindex')
249
              }}
4998 stevensc 250
              onBeforeLoad={() => {
4987 stevensc 251
                setIsCKEditorLoading(false)
1 www 252
              }}
253
            />
5106 stevensc 254
            {isCKEditorLoading && <Spinner />}
4987 stevensc 255
            {errors.description && <FormErrorFeedback>{errors.description.message}</FormErrorFeedback>}
1 www 256
 
257
            {dropZoneRender()}
4987 stevensc 258
            {errors.file && <FormErrorFeedback>{errors.file.message}</FormErrorFeedback>}
1 www 259
          </Modal.Body>
260
          <Modal.Footer>
5106 stevensc 261
            <Button size="sm" type="submit">{LABELS.SEND}r</Button>
1 www 262
            <Button color="danger" size="sm" variant="danger" onClick={closeShareModal}>
5106 stevensc 263
              {LABELS.CANCEL}
1 www 264
            </Button>
265
          </Modal.Footer>
266
        </form>
5106 stevensc 267
        {loading && <Spinner />}
1 www 268
      </Modal>
269
      <ConfirmModal
270
        show={showConfirmModal}
271
        onClose={handleModalCancel}
272
        onAccept={handleModalAccept}
5106 stevensc 273
        acceptLabel={LABELS.ACCEPT}
3723 stevensc 274
        message="¿No se ha compartido tu publicación , desea descartarlo?"
1 www 275
      />
5106 stevensc 276
    </>
4987 stevensc 277
  )
278
}
1 www 279
 
280
const mapStateToProps = (state) => ({
281
  isOpen: state.shareModal.isOpen,
282
  postUrl: state.shareModal.postUrl,
283
  modalType: state.shareModal.modalType,
284
  lastModalType: state.shareModal.lastModalType,
285
  feedType: state.shareModal.feedType,
5106 stevensc 286
  feedSharedId: state.shareModal.feedSharedId
4987 stevensc 287
})
1 www 288
 
289
const mapDispatchToProps = {
290
  addNotification: (notification) => addNotification(notification),
291
  closeShareModal: () => closeShareModal(),
1021 stevensc 292
  openShareModal: (postUrl, modalType, feedType) => openShareModal(postUrl, modalType, feedType),
1 www 293
  setModalType: (modalType) => setModalType(modalType),
1022 stevensc 294
  addFeed: (feed, feedSharedId) => addFeed(feed, feedSharedId),
5106 stevensc 295
  fetchFeeds: (url, page) => fetchFeeds(url, page)
4987 stevensc 296
}
1 www 297
 
4987 stevensc 298
export default connect(mapStateToProps, mapDispatchToProps)(ShareModal)