Proyectos de Subversion LeadersLinked - SPA

Rev

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