Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3017 stevensc 1
import React from 'react'
813 stevensc 2
import { useForm } from 'react-hook-form'
3017 stevensc 3
import { styled, Typography } from '@mui/material'
2970 stevensc 4
import { Public, LockClock } from '@mui/icons-material'
5 stevensc 5
 
2969 stevensc 6
import { axios } from '@utils'
2970 stevensc 7
import { updateFeed } from '@store/feed/feed.actions'
2969 stevensc 8
import { addNotification } from '@store/notification/notification.actions'
5 stevensc 9
 
2970 stevensc 10
import styles from './survey.module.scss'
3017 stevensc 11
import Widget from '@components/UI/Widget'
2970 stevensc 12
 
2969 stevensc 13
const RadioButton = styled('div')`
5 stevensc 14
  display: flex;
15
  align-items: center;
16
  gap: 0.5rem;
17
  padding: 0.5rem 1rem;
18
  border: 2px solid var(--border-primary);
19
  border-radius: 50px;
20
  cursor: pointer;
21
  transition: all 200ms ease;
22
  position: relative;
23
  overflow: hidden;
24
  margin-bottom: 0.5rem;
25
  input {
26
    margin: 0 !important;
27
  }
28
  label {
29
    color: var(--font-color);
30
    font-weight: 500;
31
  }
32
  &::before {
813 stevensc 33
    content: '';
5 stevensc 34
    position: absolute;
35
    left: 0;
36
    top: 0;
37
    height: 100%;
813 stevensc 38
    width: ${(props) => (props.porcentage ? `${props.porcentage}%` : '0%')};
5 stevensc 39
    background-color: #0002;
40
    z-index: 4;
41
  }
42
  &:hover {
43
    border-color: var(--font-color);
44
    text-shadow: 0 0 1px var(--font-color);
45
  }
813 stevensc 46
`
5 stevensc 47
 
2969 stevensc 48
const VoteTag = styled('span')`
5 stevensc 49
  position: absolute;
50
  bottom: 1rem;
51
  right: 1rem;
52
  color: var(--font-color) !important;
53
  font-weight: 600;
813 stevensc 54
`
5 stevensc 55
 
3017 stevensc 56
const SurveyForm = ({
57
  active = false,
58
  question = '¿Cómo consideras el ambiente laboral?',
59
  answers = [],
60
  votes = [],
61
  time = 0,
62
  voteUrl = '/feed/vote/d454717c-ba6f-485c-b94c-4fbb5f5bed94',
63
  resultType = 'pu'
64
}) => {
813 stevensc 65
  const { register, handleSubmit } = useForm()
5 stevensc 66
 
3014 stevensc 67
  const sendVote = handleSubmit(({ vote }) => {
68
    const formData = new FormData()
69
    formData.append('vote', vote)
70
 
71
    axios
72
      .post(voteUrl, formData)
73
      .then(({ data: response }) => {
74
        const { success, data } = response
75
 
76
        if (!success) {
77
          const errorMessage =
78
            typeof data === 'string'
79
              ? data
80
              : 'Error interno, por favor intente mas tarde.'
81
          throw new Error(errorMessage)
82
        }
83
 
84
        updateFeed({ feed: data, uuid: data.feed_uuid })
85
        addNotification({ style: 'success', msg: 'Voto emitido con exito' })
86
      })
87
      .catch((err) => {
88
        addNotification({ style: 'danger', msg: err.message })
89
      })
90
  })
91
 
3017 stevensc 92
  console.log({
93
    active,
94
    question,
95
    answers,
96
    votes,
97
    time,
98
    voteUrl,
99
    resultType
100
  })
3014 stevensc 101
 
3017 stevensc 102
  return (
103
    <Widget>
104
      <Widget.Body>
105
        <Typography variant='h3'>{question}</Typography>
3014 stevensc 106
 
3017 stevensc 107
        {resultType === 'pu' ? (
108
          <Typography
109
            variant='overline'
110
            title='El número de votos es visible para todos los usuarios'
111
          >
112
            <Public /> Público
113
          </Typography>
114
        ) : (
115
          <Typography
116
            variant='overline'
117
            title='Los resultados de la votación son privados'
118
          >
119
            <LockClock /> Privado
120
          </Typography>
121
        )}
3014 stevensc 122
 
3017 stevensc 123
        <form onChange={sendVote} className={styles.survey_form}>
124
          {answers.map((answer, index) => {
125
            if (answer === null) return null
3014 stevensc 126
 
3017 stevensc 127
            return (
128
              <RadioButton key={answer}>
129
                <input
130
                  type='radio'
131
                  name='vote'
132
                  ref={register({ required: true })}
133
                  value={index + 1}
134
                />
135
                <label htmlFor={`vote-${index + 1}`}>{answer}</label>
136
                {/*  {!!totalVotes && (
3015 stevensc 137
              <span className='mb-0'>
138
                {getPorcentage(votes[index], totalVotes)}%
139
              </span>
140
            )} */}
3017 stevensc 141
              </RadioButton>
142
            )
143
          })}
144
          <span>Tiempo restante: </span>
145
          {!active && <VoteTag>El formulario ya ha finalizado</VoteTag>}
146
        </form>
147
      </Widget.Body>
148
    </Widget>
813 stevensc 149
  )
150
}
5 stevensc 151
 
2969 stevensc 152
export default SurveyForm