Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 694 | Rev 2268 | 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'
694 stevensc 5
import styled from 'styled-components'
691 stevensc 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)`
692 stevensc 50
  position: absolute !important;
691 stevensc 51
  top: 50%;
52
  left: 50%;
692 stevensc 53
  margin: 0;
691 stevensc 54
  transform: translate(-50%, -50%);
55
`
5 stevensc 56
 
691 stevensc 57
const DailyPulse = ({ dailyPulseUrl = '' }) => {
58
  const [emojisHowAreYouFeel, setEmojisHowAreYouFeel] = useState([])
59
  const [emojisClimateOrganization, setEmojisClimateOrganization] = useState([])
60
  const dispatch = useDispatch()
61
 
62
  const getData = (url = '') => {
5 stevensc 63
    axios
64
      .get(url)
691 stevensc 65
      .then(({ data: responseData }) => {
66
        const { success, data } = responseData
5 stevensc 67
 
68
        if (success) {
691 stevensc 69
          setEmojisHowAreYouFeel(data.emojis_how_are_you_feel)
70
          setEmojisClimateOrganization(data.emojis_climate_on_your_organization)
5 stevensc 71
        }
72
      })
73
      .catch((error) => {
691 stevensc 74
        dispatch(addNotification({ style: 'danger', msg: error.message }))
75
      })
76
  }
5 stevensc 77
 
78
  useEffect(() => {
691 stevensc 79
    getData(dailyPulseUrl)
80
  }, [dailyPulseUrl])
5 stevensc 81
 
82
  return (
40 stevensc 83
    <StyledDailyPulseContainer>
5 stevensc 84
      <h3>Pulso Diario</h3>
85
      <DailyPulse.List
86
        options={emojisHowAreYouFeel}
691 stevensc 87
        title='¿Como te sientes hoy?'
334 stevensc 88
        onComplete={() => getData(dailyPulseUrl)}
5 stevensc 89
      />
90
      <DailyPulse.List
691 stevensc 91
        options={emojisClimateOrganization}
92
        title='¿Como esta el clima en la organización?'
334 stevensc 93
        onComplete={() => getData(dailyPulseUrl)}
5 stevensc 94
      />
40 stevensc 95
    </StyledDailyPulseContainer>
691 stevensc 96
  )
97
}
5 stevensc 98
 
691 stevensc 99
const PulseList = ({ options = [], title = '', onComplete = () => null }) => {
695 stevensc 100
  const [isLoading, setIsLoading] = useState(false)
691 stevensc 101
  const dispatch = useDispatch()
5 stevensc 102
 
103
  const handleEmojiSave = (url) => {
691 stevensc 104
    if (!url) return
105
    setIsLoading(true)
5 stevensc 106
 
691 stevensc 107
    axios
108
      .post(url)
109
      .then(({ data: responseData }) => {
110
        const { data, success } = responseData
5 stevensc 111
 
691 stevensc 112
        if (!success) {
113
          const errorMessage =
114
            typeof data === 'string' ? data : 'Ha ocurrido un error'
115
          throw new Error(errorMessage)
116
        }
5 stevensc 117
 
691 stevensc 118
        onComplete()
119
      })
120
      .catch((error) => {
121
        dispatch(addNotification({ style: 'danger', msg: error.message }))
122
      })
123
      .finally(() => setIsLoading(false))
124
  }
125
 
5 stevensc 126
  return (
41 stevensc 127
    <>
5 stevensc 128
      <h4>{title}</h4>
41 stevensc 129
      <StyledPulseList>
5 stevensc 130
        {options.map(({ link_save, id, image }, index) => (
131
          <li key={id}>
41 stevensc 132
            <button onClick={() => handleEmojiSave(link_save)}>
5 stevensc 133
              <img
691 stevensc 134
                className='fadedown'
5 stevensc 135
                src={image}
136
                style={{ animationDelay: `${index + 10}00ms` }}
137
              />
41 stevensc 138
            </button>
5 stevensc 139
          </li>
140
        ))}
41 stevensc 141
      </StyledPulseList>
691 stevensc 142
      {isLoading && (
143
        <StyledLoaderContainer>
144
          <Spinner />
145
        </StyledLoaderContainer>
146
      )}
41 stevensc 147
    </>
691 stevensc 148
  )
149
}
5 stevensc 150
 
691 stevensc 151
DailyPulse.List = PulseList
5 stevensc 152
 
691 stevensc 153
export default DailyPulse