Rev 3015 | Rev 3017 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useEffect, useMemo, useRef, useState } from 'react'import { useForm } from 'react-hook-form'import { styled } from '@mui/material'import { Public, LockClock } from '@mui/icons-material'import { axios } from '@utils'import { updateFeed } from '@store/feed/feed.actions'import { addNotification } from '@store/notification/notification.actions'import styles from './survey.module.scss'const RadioButton = styled('div')`display: flex;align-items: center;gap: 0.5rem;padding: 0.5rem 1rem;border: 2px solid var(--border-primary);border-radius: 50px;cursor: pointer;transition: all 200ms ease;position: relative;overflow: hidden;margin-bottom: 0.5rem;input {margin: 0 !important;}label {color: var(--font-color);font-weight: 500;}&::before {content: '';position: absolute;left: 0;top: 0;height: 100%;width: ${(props) => (props.porcentage ? `${props.porcentage}%` : '0%')};background-color: #0002;z-index: 4;}&:hover {border-color: var(--font-color);text-shadow: 0 0 1px var(--font-color);}`const VoteTag = styled('span')`position: absolute;bottom: 1rem;right: 1rem;color: var(--font-color) !important;font-weight: 600;`const SurveyForm = (props) => {const {active = 0,question = '¿Cómo consideras el ambiente laboral?',answers = ['Excelente', 'Regular', null, null, null],votes = [null, null, null, null, null],time = 0,voteUrl = '/feed/vote/d454717c-ba6f-485c-b94c-4fbb5f5bed94',resultType = 'pu',voted = 0} = propsconst [remainingTime, setRemainingTime] = useState('00:00:00')const [isActive, setIsActive] = useState(true)const timeRef = useRef(time)const { register, handleSubmit } = useForm()console.log(props)const totalVotes = useMemo(() =>votes.reduce((curr, next) => {if (!next) return currreturn curr + next}, 0),[votes])const sendVote = handleSubmit(({ vote }) => {setIsActive(false)const formData = new FormData()formData.append('vote', vote)axios.post(voteUrl, formData).then(({ data: response }) => {const { success, data } = responseif (!success) {const errorMessage =typeof data === 'string'? data: 'Error interno, por favor intente mas tarde.'throw new Error(errorMessage)}updateFeed({ feed: data, uuid: data.feed_uuid })addNotification({ style: 'success', msg: 'Voto emitido con exito' })}).catch((err) => {setIsActive(true)addNotification({ style: 'danger', msg: err.message })})})function getTimeDiff(segundos) {const currentDate = new Date()const futureDate = new Date(currentDate.getTime() + segundos * 1000)const diff = futureDate - currentDateconst days = Math.floor(diff / (1000 * 60 * 60 * 24))const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60))return `${addZero(days)}d ${addZero(hours)}h ${addZero(minutes)}m`}function addZero(unit) {return String(unit).padStart(2, '0')}function getPorcentage(n, total) {return (n / total) * 100}useEffect(() => {setIsActive(!!active)}, [active])return (<form onChange={sendVote} className={styles.survey_form}><h3>{question}</h3>{resultType === 'pu' && (<spanclassName='mb-2'title='El número de votos es visible para todos los usuarios'><Public /> Público</span>)}{resultType === 'pr' && (<spanclassName='mb-2'title='Los resultados de la votación son privados'><LockClock /> Privado</span>)}{answers.map((answer, index) => {if (answer === null) return nullreturn (<RadioButton key={answer}><inputtype='radio'name='vote'ref={register({ required: true })}value={index + 1}/><label htmlFor={`vote-${index + 1}`}>{answer}</label>{/* {!!totalVotes && (<span className='mb-0'>{getPorcentage(votes[index], totalVotes)}%</span>)} */}</RadioButton>)})}<span>Tiempo restante: </span>{!isActive && <VoteTag>Tu voto ya fue emitido</VoteTag>}</form>)}export default SurveyForm