Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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