Proyectos de Subversion LeadersLinked - SPA

Rev

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