Proyectos de Subversion LeadersLinked - SPA

Rev

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

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