Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3181 stevensc 1
import React from 'react'
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'
2807 stevensc 14
import Ckeditor from '@components/UI/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 = () => {
1231 stevensc 26
  const labels = useSelector(({ intl }) => intl.labels)
3174 stevensc 27
  const dispatch = useDispatch()
28
 
3181 stevensc 29
  const {
30
    show,
31
    showConfirm,
32
    postUrl,
33
    modalType,
34
    feedType,
35
    feedSharedId,
36
    onConfirm,
37
    onReject,
38
    close
39
  } = useShareModal()
1231 stevensc 40
 
41
  const {
2807 stevensc 42
    control,
3173 stevensc 43
    formState: { errors, isSubmitting },
1231 stevensc 44
    handleSubmit,
3181 stevensc 45
    reset
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
  })
53
 
3181 stevensc 54
  const onSubmit = handleSubmit(async (feed) => {
3176 stevensc 55
    try {
56
      const form = new FormData()
57
      Object.entries(feed).forEach(([key, value]) => form.append(key, value))
1979 stevensc 58
 
3176 stevensc 59
      const response = await axios.post(postUrl, form)
60
      const { data, success } = response.data
1231 stevensc 61
 
3176 stevensc 62
      if (!success) {
63
        const errorMessage =
64
          typeof data === 'string'
65
            ? data
66
            : 'Ha ocurrido un error al publicar, inténtalo de nuevo más tarde.'
67
        throw new Error(errorMessage)
68
      }
1231 stevensc 69
 
3176 stevensc 70
      const newFeed = data
1231 stevensc 71
 
3176 stevensc 72
      dispatch(
73
        addNotification({
74
          style: 'success',
75
          msg: 'La publicación ha sido compartida'
76
        })
77
      )
3181 stevensc 78
      dispatch(addFeed(newFeed, feedSharedId))
79
      reset()
80
      close()
3176 stevensc 81
    } catch (error) {
82
      console.error(error)
83
      dispatch(addNotification({ style: 'danger', msg: error.message }))
84
    }
3181 stevensc 85
  })
1231 stevensc 86
 
87
  return (
88
    <>
89
      <Modal
3181 stevensc 90
        show={show}
1231 stevensc 91
        title={labels.share_a_post}
92
        labelAccept={labels.send}
93
        labelReject={labels.cancel}
3175 stevensc 94
        loading={isSubmitting}
3181 stevensc 95
        onAccept={onSubmit}
96
        onClose={close}
1231 stevensc 97
      >
3178 stevensc 98
        {feedType === feedTypes.DASHBOARD && (
99
          <Select
100
            name='shared_with'
101
            defaultValue='p'
3173 stevensc 102
            control={control}
3178 stevensc 103
            options={[
104
              { name: labels.public, value: 'p' },
105
              { name: labels.connections, value: 'c' }
106
            ]}
2807 stevensc 107
          />
3178 stevensc 108
        )}
1231 stevensc 109
 
3178 stevensc 110
        <Ckeditor
111
          name='description'
112
          control={control}
113
          rules={{ required: 'La descripción es requerida' }}
114
          error={errors.description?.message}
115
        />
1231 stevensc 116
 
3178 stevensc 117
        {![shareModalTypes.POST, shareModalTypes.SHARE].includes(modalType) && (
3181 stevensc 118
          <Controller
119
            name='file'
120
            control={control}
121
            rules={{ required: 'El archivo es requerido' }}
122
            render={({ field: { value, onChange } }) => (
123
              <DropzoneComponent
124
                modalType={modalType}
125
                onUploaded={(file) => onChange(file)}
126
                settedFile={value}
127
                recomendationText={recomendationText[modalType] ?? ''}
128
              />
129
            )}
3178 stevensc 130
          />
131
        )}
132
 
133
        {errors.file && (
134
          <FormErrorFeedback>{errors.file.message}</FormErrorFeedback>
135
        )}
1231 stevensc 136
      </Modal>
137
      <ConfirmModal
3181 stevensc 138
        show={showConfirm}
139
        onClose={onReject}
140
        onAccept={onConfirm}
1231 stevensc 141
        message='¿No se ha compartido tu publicación , desea descartarlo?'
142
      />
143
    </>
144
  )
145
}
146
 
2807 stevensc 147
export default ShareModal