Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
6436 stevensc 1
import React, { useEffect, useRef, useState } from 'react'
6393 stevensc 2
import { axios } from '../../../utils'
6392 stevensc 3
import { useForm } from 'react-hook-form'
6393 stevensc 4
import { connect } from 'react-redux'
5
 
6410 stevensc 6
import { updateFeed } from '../../../redux/feed/feed.actions'
6392 stevensc 7
import { addNotification } from '../../../redux/notification/notification.actions'
6390 stevensc 8
 
6410 stevensc 9
import LockClockIcon from '@mui/icons-material/LockClock'
10
import PublicIcon from '@mui/icons-material/Public'
11
 
6393 stevensc 12
import styles from './survey.module.scss'
13
 
14
const SurveyForm = ({
15
  question,
16
  answers = [],
17
  active,
18
  time,
6401 stevensc 19
  resultType,
6393 stevensc 20
  voteUrl,
6401 stevensc 21
  addNotification, // Redux action
22
  updateFeed, // Redux action
6393 stevensc 23
}) => {
6438 stevensc 24
  const [remainingTime, setRemainingTime] = useState('00:00:00')
6395 stevensc 25
  const [isActive, setIsActive] = useState(Boolean(active))
6436 stevensc 26
  const timeRef = useRef(time)
6393 stevensc 27
  const { register, handleSubmit } = useForm()
6390 stevensc 28
 
6395 stevensc 29
  const sendVote = handleSubmit(({ vote }) => {
30
    setIsActive(false)
6392 stevensc 31
    const formData = new FormData()
32
 
6395 stevensc 33
    formData.append('vote', vote)
34
 
6392 stevensc 35
    axios
36
      .post(voteUrl, formData)
37
      .then(({ data: response }) => {
38
        const { success, data } = response
39
        if (!success) {
40
          addNotification({ style: 'danger', msg: `Error: ${data}` })
6395 stevensc 41
          setIsActive(true)
6392 stevensc 42
        }
43
 
6407 stevensc 44
        updateFeed({ feed: data, uuid: data.feed_uuid })
6392 stevensc 45
      })
46
      .catch((err) => {
47
        addNotification({ style: 'danger', msg: `Error: ${err}` })
6395 stevensc 48
        setIsActive(true)
6392 stevensc 49
        throw new Error(err)
50
      })
6393 stevensc 51
  })
6392 stevensc 52
 
6415 stevensc 53
  function getTimeDiff(segundos) {
54
    // Obtener la fecha y hora actual
55
    const currentDate = new Date()
56
 
57
    // Calcular la fecha y hora futura sumando los segundos proporcionados
6416 stevensc 58
    const futureDate = new Date(currentDate.getTime() + segundos * 1000)
6415 stevensc 59
 
60
    // Calcular la diferencia entre la fecha futura y la fecha actual
61
    const diff = futureDate - currentDate
62
 
63
    // Calcular los componentes de la diferencia de tiempo
6419 stevensc 64
    const days = Math.floor(diff / (1000 * 60 * 60 * 24))
65
    const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
66
    const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))
6415 stevensc 67
 
68
    // Devolver el resultado
6438 stevensc 69
    return `${addZero(days)}:${addZero(hours)}:${addZero(minutes)}`
6415 stevensc 70
  }
71
 
6438 stevensc 72
  function addZero(unit) {
73
    return String(unit).padStart(2, '0')
74
  }
75
 
6415 stevensc 76
  useEffect(() => {
6421 stevensc 77
    setRemainingTime(getTimeDiff(time))
78
 
6433 stevensc 79
    const interval = setInterval(() => {
6436 stevensc 80
      timeRef.current = timeRef.current - 60
81
      setRemainingTime(() => getTimeDiff(timeRef.current))
6437 stevensc 82
    }, 60000)
6417 stevensc 83
 
6433 stevensc 84
    return () => {
85
      clearInterval(interval)
86
    }
87
  }, [])
88
 
6390 stevensc 89
  return (
6392 stevensc 90
    <form onChange={sendVote} className={styles.survey_form}>
6390 stevensc 91
      <h3>{question}</h3>
6410 stevensc 92
      {resultType === 'pu' && (
93
        <span>
94
          <PublicIcon /> El autor puede ver tu voto
95
        </span>
96
      )}
97
      {resultType === 'pr' && (
98
        <span>
99
          <LockClockIcon /> Tu voto es privado
100
        </span>
101
      )}
6390 stevensc 102
      {answers.map(
103
        (option, index) =>
104
          option && (
6401 stevensc 105
            <div
6402 stevensc 106
              className={
107
                isActive
108
                  ? styles.survey_input
6404 stevensc 109
                  : styles.survey_input + ' ' + styles.disabled
6402 stevensc 110
              }
6401 stevensc 111
              key={index}
112
            >
6390 stevensc 113
              <input
114
                type="radio"
6392 stevensc 115
                name="vote"
116
                id={`vote-${index + 1}`}
6390 stevensc 117
                disabled={!isActive}
6392 stevensc 118
                ref={register({ required: true })}
119
                value={index + 1}
6390 stevensc 120
              />
6392 stevensc 121
              <label htmlFor={`vote-${index + 1}`}>{option}</label>
6390 stevensc 122
            </div>
123
          )
124
      )}
6438 stevensc 125
      <span>Tiempo restante: {remainingTime}</span>
6390 stevensc 126
    </form>
127
  )
128
}
129
 
6393 stevensc 130
const mapDispatchToProps = {
131
  addNotification: (notification) => addNotification(notification),
6401 stevensc 132
  updateFeed: (payload) => updateFeed(payload),
6393 stevensc 133
}
134
 
135
export default connect(null, mapDispatchToProps)(SurveyForm)