Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3178 | Rev 3180 | 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'
2807 stevensc 3
import { useDispatch, useSelector } from 'react-redux'
1231 stevensc 4
 
3174 stevensc 5
import { axios } from '@utils'
6
import { addFeed } from '@store/feed/feed.actions'
7
import { feedTypes } from '@store/feed/feed.types'
8
import { addNotification } from '@store/notification/notification.actions'
9
import { shareModalTypes } from '@store/share-modal/shareModal.types'
1231 stevensc 10
import {
11
  closeShareModal,
2807 stevensc 12
  openShareModal
3174 stevensc 13
} from '@store/share-modal/shareModal.actions'
1231 stevensc 14
 
3174 stevensc 15
import Modal from '@components/UI/modal/Modal'
16
import Select from '@components/UI/inputs/Select'
2807 stevensc 17
import Ckeditor from '@components/UI/Ckeditor'
3174 stevensc 18
import DropzoneComponent from '@components/dropzone/DropzoneComponent'
2807 stevensc 19
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback'
1607 stevensc 20
import ConfirmModal from './ConfirmModal'
1231 stevensc 21
 
2807 stevensc 22
const recomendationText = {
23
  [shareModalTypes.IMAGE]: 'Tamaño recomendado: 720x720',
24
  [shareModalTypes.FILE]: 'solo documentos PDF',
25
  [shareModalTypes.VIDEO]: 'Video de extensión mp4, mpeg, webm, mov'
26
}
27
 
28
const ShareModal = ({ setModalType }) => {
1231 stevensc 29
  const [showConfirmModal, setShowConfirmModal] = useState(false)
30
  const labels = useSelector(({ intl }) => intl.labels)
3174 stevensc 31
  const dispatch = useDispatch()
32
 
2807 stevensc 33
  const { isOpen, postUrl, modalType, lastModalType, feedType, feedSharedId } =
34
    useSelector((state) => state.shareModal)
1231 stevensc 35
 
36
  const {
2807 stevensc 37
    control,
3173 stevensc 38
    formState: { errors, isSubmitting },
1231 stevensc 39
    register,
40
    unregister,
41
    handleSubmit,
42
    setValue,
3178 stevensc 43
    reset,
2807 stevensc 44
    watch
1231 stevensc 45
  } = useForm({
3176 stevensc 46
    defaultValues:
47
      modalType !== shareModalTypes.POST && modalType !== shareModalTypes.SHARE
48
        ? {
49
            posted_or_shared: modalType === shareModalTypes.SHARE ? 's' : 'p',
50
            share_width: 'p',
51
            description: '',
52
            file: ''
53
          }
54
        : {
55
            posted_or_shared: modalType === shareModalTypes.SHARE ? 's' : 'p',
56
            share_width: 'p',
57
            description: ''
58
          }
1231 stevensc 59
  })
3176 stevensc 60
  const watchedDescription = watch('description')
61
  const watchedFile = watch('file')
1231 stevensc 62
 
1608 stevensc 63
  const toggleConfirmModal = () => setShowConfirmModal(!showConfirmModal)
1231 stevensc 64
 
65
  const handleModalAccept = () => {
66
    setShowConfirmModal(false)
3178 stevensc 67
    reset()
2807 stevensc 68
    dispatch(openShareModal(postUrl, modalType, feedType))
1231 stevensc 69
  }
70
 
71
  const handleModalCancel = () => {
72
    setShowConfirmModal(false)
73
    setModalType(lastModalType)
2807 stevensc 74
    dispatch(closeShareModal())
75
    dispatch(openShareModal(postUrl, lastModalType, feedType))
1231 stevensc 76
  }
77
 
3175 stevensc 78
  const onUploadedHandler = (files) => {
79
    setValue('file', files)
80
  }
81
 
82
  const onClose = () => {
83
    dispatch(closeShareModal())
84
  }
85
 
3176 stevensc 86
  const onSubmit = async (feed) => {
87
    try {
88
      const form = new FormData()
89
      Object.entries(feed).forEach(([key, value]) => form.append(key, value))
1979 stevensc 90
 
3176 stevensc 91
      const response = await axios.post(postUrl, form)
92
      const { data, success } = response.data
1231 stevensc 93
 
3176 stevensc 94
      if (!success) {
95
        const errorMessage =
96
          typeof data === 'string'
97
            ? data
98
            : 'Ha ocurrido un error al publicar, inténtalo de nuevo más tarde.'
99
        throw new Error(errorMessage)
100
      }
1231 stevensc 101
 
3176 stevensc 102
      const newFeed = data
1231 stevensc 103
 
3176 stevensc 104
      dispatch(
105
        addNotification({
106
          style: 'success',
107
          msg: 'La publicación ha sido compartida'
108
        })
109
      )
2250 stevensc 110
 
3176 stevensc 111
      onClose()
1231 stevensc 112
 
3176 stevensc 113
      if (feedSharedId) {
114
        dispatch(addFeed(newFeed, feedSharedId))
115
      } else {
116
        dispatch(addFeed(newFeed))
117
      }
2250 stevensc 118
 
3176 stevensc 119
      setValue('description', '')
120
      setValue('file', '')
121
    } catch (error) {
122
      console.error(error)
123
      dispatch(addNotification({ style: 'danger', msg: error.message }))
124
    }
1231 stevensc 125
  }
126
 
1609 stevensc 127
  useEffect(() => {
3179 stevensc 128
    console.log(watchedFile)
129
 
3178 stevensc 130
    if ((watchedFile || watchedDescription) && modalType !== lastModalType) {
131
      onClose()
132
      toggleConfirmModal()
133
    }
134
 
3176 stevensc 135
    if (watchedFile !== undefined) {
3177 stevensc 136
      register('file', { required: 'El archivo es requerido' })
1609 stevensc 137
    } else {
3176 stevensc 138
      unregister('file')
1231 stevensc 139
    }
1609 stevensc 140
  }, [modalType])
1231 stevensc 141
 
142
  return (
143
    <>
144
      <Modal
1402 stevensc 145
        show={isOpen}
1231 stevensc 146
        title={labels.share_a_post}
147
        labelAccept={labels.send}
148
        labelReject={labels.cancel}
3175 stevensc 149
        loading={isSubmitting}
3178 stevensc 150
        onAccept={handleSubmit(onSubmit)}
1609 stevensc 151
        onClose={onClose}
1231 stevensc 152
      >
3178 stevensc 153
        {feedType === feedTypes.DASHBOARD && (
154
          <Select
155
            name='shared_with'
156
            defaultValue='p'
3173 stevensc 157
            control={control}
3178 stevensc 158
            options={[
159
              { name: labels.public, value: 'p' },
160
              { name: labels.connections, value: 'c' }
161
            ]}
2807 stevensc 162
          />
3178 stevensc 163
        )}
1231 stevensc 164
 
3178 stevensc 165
        <Ckeditor
166
          name='description'
167
          control={control}
168
          rules={{ required: 'La descripción es requerida' }}
169
          error={errors.description?.message}
170
        />
1231 stevensc 171
 
3178 stevensc 172
        {![shareModalTypes.POST, shareModalTypes.SHARE].includes(modalType) && (
173
          <DropzoneComponent
174
            modalType={modalType}
175
            onUploaded={onUploadedHandler}
176
            settedFile={watch('file')}
177
            recomendationText={recomendationText[modalType] ?? ''}
178
          />
179
        )}
180
 
181
        {errors.file && (
182
          <FormErrorFeedback>{errors.file.message}</FormErrorFeedback>
183
        )}
1231 stevensc 184
      </Modal>
185
      <ConfirmModal
186
        show={showConfirmModal}
187
        onClose={handleModalCancel}
188
        onAccept={handleModalAccept}
189
        message='¿No se ha compartido tu publicación , desea descartarlo?'
190
      />
191
    </>
192
  )
193
}
194
 
2807 stevensc 195
export default ShareModal