Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3694 stevensc 1
import React, { useEffect, useState } from 'react';
2
import { Link } from 'react-router-dom';
3
import { useDispatch } from 'react-redux';
4
import { Grid, IconButton, List, ListItem, ListItemButton, ListItemText } from '@mui/material';
5
import Delete from '@mui/icons-material/Delete';
5 stevensc 6
 
3694 stevensc 7
import { axios } from '@utils';
8
import { useFetch } from '@hooks';
9
import { addNotification } from '@store/notification/notification.actions';
1469 stevensc 10
 
3694 stevensc 11
import Widget from '@components/UI/Widget';
12
import Options from '@components/UI/Option';
13
import Spinner from '@components/UI/Spinner';
14
import EmptySection from '@components/UI/EmptySection';
15
import ProfileInfo from '@components/widgets/default/ProfileWidget';
16
import ConfirmModal from '@components/modals/ConfirmModal';
5 stevensc 17
 
18
const NotificationsPage = () => {
3694 stevensc 19
  const { data: user } = useFetch('/helpers/menu');
20
  const { data: fetchedNotifications, isLoading } = useFetch('/notifications', []);
21
  const [notifications, setNotifications] = useState([]);
2995 stevensc 22
  const [deleteModalState, setDeleteModalState] = useState({
23
    show: false,
3432 stevensc 24
    type: 'multiple',
25
    url: null
3694 stevensc 26
  });
27
  const dispatch = useDispatch();
5 stevensc 28
 
2995 stevensc 29
  // useFetch('/notifications/mark-all-read') POST request needed
5 stevensc 30
 
31
  const deleteAllNotifications = () => {
32
    axios
3432 stevensc 33
      .post('/notifications/clear')
2995 stevensc 34
      .then(({ data: { data, success } }) => {
3694 stevensc 35
        if (!success) throw new Error('Error al borrar todas las notificaciones');
36
        setNotifications([]);
37
        dispatch(addNotification({ style: 'success', msg: data }));
5 stevensc 38
      })
39
      .catch((err) => {
3694 stevensc 40
        dispatch(addNotification({ style: 'danger', msg: err.message }));
41
      });
42
  };
5 stevensc 43
 
44
  const deleteNotification = (url) => {
45
    axios
46
      .post(url)
2995 stevensc 47
      .then(({ data: { data, success } }) => {
3694 stevensc 48
        if (!success) throw new Error('Error al borrar la notificacion');
49
        const newNotifications = notifications.filter(({ link_delete }) => link_delete !== url);
50
        setNotifications(newNotifications);
51
        dispatch(addNotification({ style: 'success', msg: data }));
5 stevensc 52
      })
53
      .catch((err) => {
3694 stevensc 54
        dispatch(addNotification({ style: 'danger', msg: err.message }));
55
      });
56
  };
5 stevensc 57
 
2995 stevensc 58
  const handleDelete = (url) => {
59
    setDeleteModalState({
60
      show: true,
3432 stevensc 61
      type: url ? 'single' : 'multiple',
62
      url
3694 stevensc 63
    });
64
  };
5 stevensc 65
 
2995 stevensc 66
  const handleDeleteAccept = () => {
3432 stevensc 67
    if (deleteModalState.type === 'multiple') {
3694 stevensc 68
      deleteAllNotifications();
2995 stevensc 69
    } else {
3694 stevensc 70
      deleteNotification(deleteModalState.url);
2995 stevensc 71
    }
72
    setDeleteModalState({
73
      show: false,
3432 stevensc 74
      type: 'multiple'
3694 stevensc 75
    });
76
  };
2995 stevensc 77
 
78
  const handleDeleteCancel = () => {
79
    setDeleteModalState({
80
      show: false,
3432 stevensc 81
      type: 'multiple'
3694 stevensc 82
    });
83
  };
2995 stevensc 84
 
85
  useEffect(() => {
86
    if (fetchedNotifications) {
3694 stevensc 87
      setNotifications(fetchedNotifications);
2995 stevensc 88
    }
3694 stevensc 89
  }, [fetchedNotifications]);
2995 stevensc 90
 
5 stevensc 91
  return (
92
    <>
3274 stevensc 93
      <Grid container spacing={1}>
2997 stevensc 94
        <Grid item xs md={4}>
2994 stevensc 95
          <ProfileInfo {...user} />
2806 stevensc 96
        </Grid>
2997 stevensc 97
        <Grid item xs md={8}>
2992 stevensc 98
          <Widget>
99
            <Widget.Header
3432 stevensc 100
              title='Notificaciones'
2992 stevensc 101
              renderAction={() => (
102
                <Options>
3694 stevensc 103
                  <Options.Item onClick={handleDelete}>Borrar notificaciones</Options.Item>
2992 stevensc 104
                </Options>
105
              )}
106
            />
107
            <Widget.Body>
3432 stevensc 108
              {isLoading && <Spinner />}
109
              {notifications.length === 0 && !isLoading && (
110
                <EmptySection message='No hay notificaciones' align='center' />
2806 stevensc 111
              )}
2998 stevensc 112
 
3432 stevensc 113
              <List sx={{ maxHeight: '60vh', overflow: 'auto' }}>
3694 stevensc 114
                {notifications.map(({ link_delete, link, message, time_elapsed }) => (
115
                  <ListItem
116
                    key={link}
117
                    secondaryAction={
118
                      <IconButton onClick={() => handleDelete(link_delete)}>
119
                        <Delete />
120
                      </IconButton>
121
                    }
122
                  >
123
                    <ListItemButton LinkComponent={Link} to={link}>
124
                      <ListItemText primary={message} secondary={time_elapsed} />
125
                    </ListItemButton>
126
                  </ListItem>
127
                ))}
2998 stevensc 128
              </List>
2992 stevensc 129
            </Widget.Body>
130
          </Widget>
1469 stevensc 131
        </Grid>
2806 stevensc 132
      </Grid>
5 stevensc 133
      <ConfirmModal
2995 stevensc 134
        show={deleteModalState.show}
135
        onClose={handleDeleteCancel}
136
        onAccept={handleDeleteAccept}
5 stevensc 137
      />
138
    </>
3694 stevensc 139
  );
140
};
5 stevensc 141
 
3694 stevensc 142
export default NotificationsPage;