Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3585 stevensc 1
import React 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';
5 stevensc 6
 
3585 stevensc 7
import { useFetch } from '@hooks';
2776 stevensc 8
 
3585 stevensc 9
import WidgetLayout from '../widgets/WidgetLayout';
10
import EmptySection from '../UI/EmptySection';
5 stevensc 11
 
12
const StyledContainer = styled(WidgetLayout)`
13
  padding: 1rem;
14
  ul {
15
    display: flex;
16
    flex-direction: column;
17
    gap: 0.5rem;
709 stevensc 18
    margin-top: 0.5rem;
5 stevensc 19
  }
3432 stevensc 20
`;
5 stevensc 21
 
709 stevensc 22
const StyledEventContainer = styled.div`
23
  display: flex;
24
  flex-direction: column;
25
  cursor: pointer;
26
  padding: 0.5rem;
27
  border-radius: ${(props) => props.theme.border.radius};
3585 stevensc 28
  background-color: ${(props) => props.background || 'transparent'};
711 stevensc 29
  h4 {
712 stevensc 30
    color: ${(props) => props.theme.font.color.title};
711 stevensc 31
  }
710 stevensc 32
  b {
33
    color: ${(props) => props.theme.font.color.title};
712 stevensc 34
    font-weight: 600;
710 stevensc 35
  }
36
  span {
37
    color: ${(props) => props.color || props.theme.font.color.primary};
711 stevensc 38
    font-weight: 400;
710 stevensc 39
  }
3432 stevensc 40
`;
709 stevensc 41
 
5 stevensc 42
const EventsList = () => {
3585 stevensc 43
  const { data: eventsAndTasks } = useFetch('/helpers/next-events', []);
3432 stevensc 44
  const dispatch = useDispatch();
5 stevensc 45
 
709 stevensc 46
  const getAdminAuth = (url) => {
5 stevensc 47
    axios
48
      .get(url)
3432 stevensc 49
      .then((response) => {
50
        const { data, success } = response.data;
5 stevensc 51
 
52
        if (!success) {
3585 stevensc 53
          throw new Error('Error interno. Por favor, intente más tarde.');
5 stevensc 54
        }
55
 
3585 stevensc 56
        window.open(data, '_blank');
5 stevensc 57
      })
655 stevensc 58
      .catch((err) => {
3585 stevensc 59
        dispatch(addNotification({ style: 'danger', msg: err.message }));
3432 stevensc 60
      });
61
  };
5 stevensc 62
 
893 stevensc 63
  const formatDate = (date, allDay) => {
3432 stevensc 64
    const dateObj = new Date(date);
736 stevensc 65
 
66
    if (isNaN(dateObj)) {
3432 stevensc 67
      return date;
736 stevensc 68
    }
69
 
3585 stevensc 70
    return new Intl.DateTimeFormat('es', {
71
      dateStyle: 'medium',
72
      timeStyle: allDay ? undefined : 'short',
73
      timeZone: 'UTC',
74
      hour12: allDay ? undefined : true
3432 stevensc 75
    }).format(dateObj);
76
  };
735 stevensc 77
 
5 stevensc 78
  return (
79
    <StyledContainer>
80
      <h2>Eventos y Tareas</h2>
81
 
82
      <ul>
83
        {eventsAndTasks.length ? (
707 stevensc 84
          eventsAndTasks.map(
3585 stevensc 85
            ({ id, allDay, url, title, backgroundColor, start, end, textColor, source }) => {
707 stevensc 86
              return (
87
                <li key={id}>
709 stevensc 88
                  <StyledEventContainer
89
                    color={textColor}
90
                    background={backgroundColor}
710 stevensc 91
                    onClick={() =>
3585 stevensc 92
                      source === 'external' ? window.open(url, '_blank') : getAdminAuth(url)
710 stevensc 93
                    }
5 stevensc 94
                  >
95
                    <h4>
707 stevensc 96
                      <b>Evento: </b>
97
                      {title}
5 stevensc 98
                    </h4>
99
                    <span>
100
                      <b>Inicio: </b>
893 stevensc 101
                      {formatDate(start, allDay)}
5 stevensc 102
                    </span>
707 stevensc 103
                    {end && (
5 stevensc 104
                      <span>
105
                        <b>Fin: </b>
893 stevensc 106
                        {formatDate(end, allDay)}
5 stevensc 107
                      </span>
108
                    )}
709 stevensc 109
                  </StyledEventContainer>
707 stevensc 110
                </li>
3432 stevensc 111
              );
707 stevensc 112
            }
113
          )
5 stevensc 114
        ) : (
3585 stevensc 115
          <EmptySection message='No hay eventos disponibles' />
5 stevensc 116
        )}
117
      </ul>
118
    </StyledContainer>
3432 stevensc 119
  );
120
};
5 stevensc 121
 
3432 stevensc 122
export default EventsList;