Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3183 stevensc 1
import React, { useState } from 'react'
3181 stevensc 2
import { Controller, useForm } from 'react-hook-form'
2807 stevensc 3
import { useDispatch, useSelector } from 'react-redux'
1231 stevensc 4
 
3174 stevensc 5
import { axios } from '@utils'
3181 stevensc 6
import { useShareModal } from '@hooks'
3174 stevensc 7
import { addFeed } from '@store/feed/feed.actions'
8
import { feedTypes } from '@store/feed/feed.types'
9
import { addNotification } from '@store/notification/notification.actions'
10
import { shareModalTypes } from '@store/share-modal/shareModal.types'
1231 stevensc 11
 
3174 stevensc 12
import Modal from '@components/UI/modal/Modal'
13
import Select from '@components/UI/inputs/Select'
3269 stevensc 14
import Ckeditor from '@components/common/ckeditor/Ckeditor'
3174 stevensc 15
import DropzoneComponent from '@components/dropzone/DropzoneComponent'
2807 stevensc 16
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback'
1607 stevensc 17
import ConfirmModal from './ConfirmModal'
1231 stevensc 18
 
2807 stevensc 19
const recomendationText = {
20
  [shareModalTypes.IMAGE]: 'Tamaño recomendado: 720x720',
21
  [shareModalTypes.FILE]: 'solo documentos PDF',
22
  [shareModalTypes.VIDEO]: 'Video de extensión mp4, mpeg, webm, mov'
23
}
24
 
3181 stevensc 25
const ShareModal = () => {
3183 stevensc 26
  const [showConfirm, setShowConfirm] = useState(false)
1231 stevensc 27
  const labels = useSelector(({ intl }) => intl.labels)
3174 stevensc 28
  const dispatch = useDispatch()
29
 
3184 stevensc 30
  const {
31
    show,
32
    modalType,
33
    feedType,
34
    feedSharedId,
35
    postUrl,
36
    closeModal,
37
    openModal
38
  } = useShareModal()
1231 stevensc 39
 
40
  const {
2807 stevensc 41
    control,
3173 stevensc 42
    formState: { errors, isSubmitting },
1231 stevensc 43
    handleSubmit,
3183 stevensc 44
    reset,
45
    watch
1231 stevensc 46
  } = useForm({
3181 stevensc 47
    defaultValues: {
48
      posted_or_shared: modalType === shareModalTypes.SHARE ? 's' : 'p',
49
      share_width: 'p',
50
      description: ''
51
    }
1231 stevensc 52
  })
3183 stevensc 53
  const description = watch('description')
54
  const file = watch('file')
1231 stevensc 55
 
3183 stevensc 56
  const toggleConfirm = () => setShowConfirm(!showConfirm)
57
 
3181 stevensc 58
  const onSubmit = handleSubmit(async (feed) => {
3176 stevensc 59
    try {
60
      const form = new FormData()
61
      Object.entries(feed).forEach(([key, value]) => form.append(key, value))
1979 stevensc 62
 
3176 stevensc 63
      const response = await axios.post(postUrl, form)
64
      const { data, success } = response.data
1231 stevensc 65
 
3176 stevensc 66
      if (!success) {
67
        const errorMessage =
68
          typeof data === 'string'
69
            ? data
70
            : 'Ha ocurrido un error al publicar, inténtalo de nuevo más tarde.'
71
        throw new Error(errorMessage)
72
      }
1231 stevensc 73
 
3176 stevensc 74
      const newFeed = data
1231 stevensc 75
 
3176 stevensc 76
      dispatch(
77
        addNotification({
78
          style: 'success',
79
          msg: 'La publicación ha sido compartida'
80
        })
81
      )
3181 stevensc 82
      dispatch(addFeed(newFeed, feedSharedId))
83
      reset()
3183 stevensc 84
      closeModal()
3176 stevensc 85
    } catch (error) {
86
      console.error(error)
87
      dispatch(addNotification({ style: 'danger', msg: error.message }))
88
    }
3181 stevensc 89
  })
1231 stevensc 90
 
3183 stevensc 91
  const handleClose = () => {
3184 stevensc 92
    if (description || file) toggleConfirm()
3183 stevensc 93
    closeModal()
94
  }
95
 
96
  const handleConfirm = () => {
97
    reset()
3184 stevensc 98
    toggleConfirm()
3183 stevensc 99
    closeModal()
100
  }
101
 
3184 stevensc 102
  const handleCancel = () => {
103
    toggleConfirm()
104
    openModal({ url: postUrl, modalType, feedType })
105
  }
106
 
1231 stevensc 107
  return (
108
    <>
109
      <Modal
3181 stevensc 110
        show={show}
1231 stevensc 111
        title={labels.share_a_post}
112
        labelAccept={labels.send}
113
        labelReject={labels.cancel}
3175 stevensc 114
        loading={isSubmitting}
3181 stevensc 115
        onAccept={onSubmit}
3183 stevensc 116
        onClose={handleClose}
1231 stevensc 117
      >
3178 stevensc 118
        {feedType === feedTypes.DASHBOARD && (
119
          <Select
120
            name='shared_with'
121
            defaultValue='p'
3173 stevensc 122
            control={control}
3178 stevensc 123
            options={[
124
              { name: labels.public, value: 'p' },
125
              { name: labels.connections, value: 'c' }
126
            ]}
2807 stevensc 127
          />
3178 stevensc 128
        )}
1231 stevensc 129
 
3178 stevensc 130
        <Ckeditor
131
          name='description'
132
          control={control}
133
          rules={{ required: 'La descripción es requerida' }}
134
          error={errors.description?.message}
135
        />
1231 stevensc 136
 
3178 stevensc 137
        {![shareModalTypes.POST, shareModalTypes.SHARE].includes(modalType) && (
3181 stevensc 138
          <Controller
139
            name='file'
140
            control={control}
141
            rules={{ required: 'El archivo es requerido' }}
142
            render={({ field: { value, onChange } }) => (
143
              <DropzoneComponent
3278 stevensc 144
                type={modalType}
3181 stevensc 145
                onUploaded={(file) => onChange(file)}
146
                settedFile={value}
147
                recomendationText={recomendationText[modalType] ?? ''}
148
              />
149
            )}
3178 stevensc 150
          />
151
        )}
152
 
153
        {errors.file && (
154
          <FormErrorFeedback>{errors.file.message}</FormErrorFeedback>
155
        )}
1231 stevensc 156
      </Modal>
157
      <ConfirmModal
3181 stevensc 158
        show={showConfirm}
3183 stevensc 159
        onAccept={handleConfirm}
3184 stevensc 160
        onClose={handleCancel}
3183 stevensc 161
        message='¿Estás seguro de que quieres salir sin publicar tu post?'
1231 stevensc 162
      />
163
    </>
164
  )
165
}
166
 
2807 stevensc 167
export default ShareModal