Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
691 stevensc 1
import React, { useEffect, useState } from 'react'
2
import { axios } from '../../../utils'
3
import { useDispatch } from 'react-redux'
4
import { addNotification } from '../../../redux/notification/notification.actions'
5
import { styled } from 'styled-components'
6
import WidgetLayout from '../WidgetLayout'
7
import Spinner from '../../UI/Spinner'
8
import LoaderContainer from '../../UI/LoaderContainer'
5 stevensc 9
 
40 stevensc 10
const StyledDailyPulseContainer = styled(WidgetLayout)`
11
  padding: 1rem;
12
  h3 {
41 stevensc 13
    color: var(--title-color);
40 stevensc 14
    font-weight: 700;
15
    font-size: 1.1rem;
16
  }
17
  span {
41 stevensc 18
    color: var(--subtitle-color);
40 stevensc 19
    font-weight: 600;
20
  }
41 stevensc 21
  h4 {
22
    font-weight: 600;
23
    color: var(--title-color);
24
    text-align: center;
25
    margin-bottom: 0.5rem;
26
  }
691 stevensc 27
`
5 stevensc 28
 
41 stevensc 29
const StyledPulseList = styled.ul`
30
  display: flex;
31
  gap: 0.5rem;
42 stevensc 32
  justify-content: center;
41 stevensc 33
  button {
34
    width: 32px;
35
    height: 32px;
36
    border-radius: 50%;
37
    transition: all 300ms;
38
    & > img {
39
      width: 100%;
40
      height: 100%;
41
      object-fit: cover;
42
    }
43
    &:hover {
44
      transform: translateY(-10px);
45
    }
46
  }
691 stevensc 47
`
41 stevensc 48
 
691 stevensc 49
const StyledLoaderContainer = styled(LoaderContainer)`
50
  position: absolute;
51
  top: 50%;
52
  left: 50%;
53
  transform: translate(-50%, -50%);
54
`
5 stevensc 55
 
691 stevensc 56
const DailyPulse = ({ dailyPulseUrl = '' }) => {
57
  const [emojisHowAreYouFeel, setEmojisHowAreYouFeel] = useState([])
58
  const [emojisClimateOrganization, setEmojisClimateOrganization] = useState([])
59
  const dispatch = useDispatch()
60
 
61
  const getData = (url = '') => {
5 stevensc 62
    axios
63
      .get(url)
691 stevensc 64
      .then(({ data: responseData }) => {
65
        const { success, data } = responseData
5 stevensc 66
 
67
        if (success) {
691 stevensc 68
          setEmojisHowAreYouFeel(data.emojis_how_are_you_feel)
69
          setEmojisClimateOrganization(data.emojis_climate_on_your_organization)
5 stevensc 70
        }
71
      })
72
      .catch((error) => {
691 stevensc 73
        dispatch(addNotification({ style: 'danger', msg: error.message }))
74
      })
75
  }
5 stevensc 76
 
77
  useEffect(() => {
691 stevensc 78
    getData(dailyPulseUrl)
79
  }, [dailyPulseUrl])
5 stevensc 80
 
81
  return (
40 stevensc 82
    <StyledDailyPulseContainer>
5 stevensc 83
      <h3>Pulso Diario</h3>
84
      <DailyPulse.List
85
        options={emojisHowAreYouFeel}
691 stevensc 86
        title='¿Como te sientes hoy?'
334 stevensc 87
        onComplete={() => getData(dailyPulseUrl)}
5 stevensc 88
      />
89
      <DailyPulse.List
691 stevensc 90
        options={emojisClimateOrganization}
91
        title='¿Como esta el clima en la organización?'
334 stevensc 92
        onComplete={() => getData(dailyPulseUrl)}
5 stevensc 93
      />
40 stevensc 94
    </StyledDailyPulseContainer>
691 stevensc 95
  )
96
}
5 stevensc 97
 
691 stevensc 98
const PulseList = ({ options = [], title = '', onComplete = () => null }) => {
99
  const [isLoading, setIsLoading] = useState(false)
100
  const dispatch = useDispatch()
5 stevensc 101
 
102
  const handleEmojiSave = (url) => {
691 stevensc 103
    if (!url) return
104
    setIsLoading(true)
5 stevensc 105
 
691 stevensc 106
    axios
107
      .post(url)
108
      .then(({ data: responseData }) => {
109
        const { data, success } = responseData
5 stevensc 110
 
691 stevensc 111
        if (!success) {
112
          const errorMessage =
113
            typeof data === 'string' ? data : 'Ha ocurrido un error'
114
          throw new Error(errorMessage)
115
        }
5 stevensc 116
 
691 stevensc 117
        onComplete()
118
      })
119
      .catch((error) => {
120
        dispatch(addNotification({ style: 'danger', msg: error.message }))
121
      })
122
      .finally(() => setIsLoading(false))
123
  }
124
 
5 stevensc 125
  return (
41 stevensc 126
    <>
5 stevensc 127
      <h4>{title}</h4>
41 stevensc 128
      <StyledPulseList>
5 stevensc 129
        {options.map(({ link_save, id, image }, index) => (
130
          <li key={id}>
41 stevensc 131
            <button onClick={() => handleEmojiSave(link_save)}>
5 stevensc 132
              <img
691 stevensc 133
                className='fadedown'
5 stevensc 134
                src={image}
135
                style={{ animationDelay: `${index + 10}00ms` }}
136
              />
41 stevensc 137
            </button>
5 stevensc 138
          </li>
139
        ))}
41 stevensc 140
      </StyledPulseList>
691 stevensc 141
      {isLoading && (
142
        <StyledLoaderContainer>
143
          <Spinner />
144
        </StyledLoaderContainer>
145
      )}
41 stevensc 146
    </>
691 stevensc 147
  )
148
}
5 stevensc 149
 
691 stevensc 150
DailyPulse.List = PulseList
5 stevensc 151
 
691 stevensc 152
export default DailyPulse