From 5fb97ccd908202b4635a27f0295ea6a158403476 Mon Sep 17 00:00:00 2001 From: Giovanni-Josserand Date: Fri, 9 Jan 2026 14:39:19 +0100 Subject: [PATCH] split notification listeners into separate files --- src/components/Header/Header.jsx | 54 ++++++++++--------- .../echo/listeners/userCreatedListener.js | 17 ++++++ 2 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 src/utils/echo/listeners/userCreatedListener.js diff --git a/src/components/Header/Header.jsx b/src/components/Header/Header.jsx index 98f502e..e2f813c 100644 --- a/src/components/Header/Header.jsx +++ b/src/components/Header/Header.jsx @@ -6,6 +6,8 @@ import deleteNotificationUser from "../../utils/notifications/deleteNotification import initEcho from "../../utils/echo/initEcho.js" import readNotifications from "../../utils/notifications/readNotifications.js"; import {AuthContext} from "../../contexts/auth/AuthContext.js"; +import getUser from "../../utils/getUser.js"; +import { userCreatedListener } from "../../utils/echo/listeners/userCreatedListener"; function Header() { @@ -16,38 +18,36 @@ function Header() { const [notifications, setNotifications] = useState([]); const notificationRef = useRef(null); - useEffect(() => { - const echo = initEcho(); + let echoInstance = null; + let channelsToLeave = []; - echo.private("admins-private") - .listen(".user.created", (event) => { - const newNotification = { - id: Date.now(), - content: `Nouvel demande d'inscription : ${event.user.name} ${event.user.lastname}`, - is_new: true - }; - setNotifications(prevNotifications => [newNotification, ...prevNotifications]); - setunreadNotification(true); - }); + async function initializeHeader() { + try { + const [userData, notifData] = await Promise.all([ + getUser(), + getUserNotifications() + ]); - return () => { - echo.leave("admins-private"); - }; - }, []); + const data = notifData || []; + setNotifications(data); + const hasUnread = data.some(n => n.pivot && n.pivot.unread === 1); + setunreadNotification(hasUnread); - useEffect(() => { + const echo = initEcho(); + echoInstance = echo; - async function loadNotifications() { - const notifData = await getUserNotifications(); - const data = notifData || []; - setNotifications(notifData || []); - const hasUnread = data.some(n => n.pivot && n.pivot.unread === 1); + const activeChannels = [ + userCreatedListener(echo, userData, setNotifications, setunreadNotification), + ]; + channelsToLeave = activeChannels.filter(name => name !== null); - setunreadNotification(hasUnread); + } catch (err) { + console.error("Erreur initialisation Header:", err); + } } - loadNotifications(); + initializeHeader(); const handleClickOutside = (event) => { if ( @@ -60,15 +60,17 @@ function Header() { }; document.addEventListener("mousedown", handleClickOutside); + return () => { document.removeEventListener("mousedown", handleClickOutside); + if (echoInstance) { + channelsToLeave.forEach(chan => echoInstance.leave(chan)); + } }; }, []); - - const toggleNotificationMenu = async () => { try { setnotificationMenu(!notificationMenu); diff --git a/src/utils/echo/listeners/userCreatedListener.js b/src/utils/echo/listeners/userCreatedListener.js new file mode 100644 index 0000000..3cd8e04 --- /dev/null +++ b/src/utils/echo/listeners/userCreatedListener.js @@ -0,0 +1,17 @@ +export const userCreatedListener = (echo, userData, setNotifications, setunreadNotification) => { + if (userData.isAdmin || userData.role === "Gérant") { + const channelName = "users.registration"; + echo.private(channelName) + .listen(".users.registration", (event) => { + const newNotification = { + id: Date.now(), + content: `Nouvelle demande d'inscription : ${event.user.name} ${event.user.lastname}`, + pivot: { unread: 1 } + }; + setNotifications(prev => [newNotification, ...prev]); + setunreadNotification(true); + }); + return channelName; + } + return null; +}; \ No newline at end of file