Proyectos de Subversion LeadersLinked - SPA

Rev

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

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