Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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