Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3432 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,
3432 stevensc 10
  ListItemText
11
} from '@mui/material'
12
import { Delete } from '@mui/icons-material'
5 stevensc 13
 
3432 stevensc 14
import { axios } from '@utils'
15
import { useFetch } from '@hooks'
16
import { addNotification } from '@store/notification/notification.actions'
1469 stevensc 17
 
3432 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 = () => {
3432 stevensc 26
  const { data: user } = useFetch('/helpers/menu')
27
  const { data: fetchedNotifications, isLoading } = useFetch(
28
    '/notifications',
2998 stevensc 29
    []
3432 stevensc 30
  )
31
  const [notifications, setNotifications] = useState([])
2995 stevensc 32
  const [deleteModalState, setDeleteModalState] = useState({
33
    show: false,
3432 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
3432 stevensc 43
      .post('/notifications/clear')
2995 stevensc 44
      .then(({ data: { data, success } }) => {
45
        if (!success)
3432 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) => {
3432 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 } }) => {
3432 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
3432 stevensc 62
        )
63
        setNotifications(newNotifications)
64
        dispatch(addNotification({ style: 'success', msg: data }))
5 stevensc 65
      })
66
      .catch((err) => {
3432 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,
3432 stevensc 74
      type: url ? 'single' : 'multiple',
75
      url
76
    })
77
  }
5 stevensc 78
 
2995 stevensc 79
  const handleDeleteAccept = () => {
3432 stevensc 80
    if (deleteModalState.type === 'multiple') {
81
      deleteAllNotifications()
2995 stevensc 82
    } else {
3432 stevensc 83
      deleteNotification(deleteModalState.url)
2995 stevensc 84
    }
85
    setDeleteModalState({
86
      show: false,
3432 stevensc 87
      type: 'multiple'
88
    })
89
  }
2995 stevensc 90
 
91
  const handleDeleteCancel = () => {
92
    setDeleteModalState({
93
      show: false,
3432 stevensc 94
      type: 'multiple'
95
    })
96
  }
2995 stevensc 97
 
98
  useEffect(() => {
99
    if (fetchedNotifications) {
3432 stevensc 100
      setNotifications(fetchedNotifications)
2995 stevensc 101
    }
3432 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
3432 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>
3432 stevensc 123
              {isLoading && <Spinner />}
124
              {notifications.length === 0 && !isLoading && (
125
                <EmptySection message='No hay notificaciones' align='center' />
2806 stevensc 126
              )}
2998 stevensc 127
 
3432 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
    </>
3432 stevensc 159
  )
160
}
5 stevensc 161
 
3432 stevensc 162
export default NotificationsPage