From eb22e3d2d2d473818f98893e2b9e7671e0f73dc1 Mon Sep 17 00:00:00 2001 From: Shiljababu Date: Tue, 5 May 2026 16:54:31 +0530 Subject: [PATCH 1/3] refactor(notification):fix errors --- apps/web/app/influencer-dashboard/layout.tsx | 15 ++++++++++++++- apps/web/components/NotificationBell.tsx | 14 ++++++++++---- apps/web/store/notification.store.ts | 5 +++-- data.ms/auth/lock.mdb | Bin 8192 -> 8192 bytes .../data.mdb | Bin 139264 -> 139264 bytes .../lock.mdb | Bin 65664 -> 65664 bytes .../data.mdb | Bin 94208 -> 143360 bytes .../lock.mdb | Bin 65664 -> 65664 bytes .../data.mdb | Bin 45056 -> 45056 bytes .../lock.mdb | Bin 65664 -> 65664 bytes data.ms/tasks/data.mdb | Bin 1826816 -> 1884160 bytes data.ms/tasks/lock.mdb | Bin 8192 -> 8192 bytes 12 files changed, 27 insertions(+), 7 deletions(-) diff --git a/apps/web/app/influencer-dashboard/layout.tsx b/apps/web/app/influencer-dashboard/layout.tsx index e98d917..8031c1c 100644 --- a/apps/web/app/influencer-dashboard/layout.tsx +++ b/apps/web/app/influencer-dashboard/layout.tsx @@ -19,6 +19,7 @@ import { import { useAuthStore } from "@/store/auth.store"; import RoleGuard from "@/components/rbac/RoleGuard"; import api from "@/lib/axios.client"; +import NotificationBell from "@/components/NotificationBell"; export default function InfluencerDashboardLayout({ @@ -155,7 +156,18 @@ export default function InfluencerDashboardLayout({ -
+
+ {/* Explore Gigs Button */} + + Explore gigs + + + + +
)}
+
{/* Content */} diff --git a/apps/web/components/NotificationBell.tsx b/apps/web/components/NotificationBell.tsx index 726d9fc..dde54cb 100644 --- a/apps/web/components/NotificationBell.tsx +++ b/apps/web/components/NotificationBell.tsx @@ -14,12 +14,18 @@ export default function NotificationBell() { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + }, []); + // Fetch notifications on mount if user is logged in useEffect(() => { - if (accessToken) { + if (mounted && accessToken) { fetchNotifications(); } - }, [accessToken, fetchNotifications]); + }, [mounted, accessToken, fetchNotifications]); // Handle clicking outside to close dropdown useEffect(() => { @@ -38,8 +44,8 @@ export default function NotificationBell() { }; }, [isOpen]); - // Don't render the bell if the user is not authenticated - if (!accessToken) return null; + // Don't render the bell if the user is not authenticated or component is not mounted + if (!mounted || !accessToken) return null; const handleNotificationClick = (notification: Notification) => { console.log("🔥 CLICKED NOTIFICATION FULL:", JSON.stringify(notification, null, 2)); diff --git a/apps/web/store/notification.store.ts b/apps/web/store/notification.store.ts index c2d1455..2b859b8 100644 --- a/apps/web/store/notification.store.ts +++ b/apps/web/store/notification.store.ts @@ -12,6 +12,7 @@ export interface Notification { gigRequestId?: string; conversationId?: string; }; + isRead?: boolean; createdAt: string; } @@ -35,7 +36,7 @@ export const useNotificationStore = create((set, get) => ({ // ✅ Normalize incoming data (VERY IMPORTANT) const normalized: Notification = { ...notification, - read: notification.read ?? false, + read: notification.isRead ?? notification.read ?? false, metadata: notification.metadata || {}, }; @@ -70,7 +71,7 @@ if (Array.isArray(raw)) { // const unreadCount = notifications.filter((n) => !n.read).length; const normalized = notifications.map((n) => ({ ...n, - read: n.read ?? false, + read: n.isRead ?? n.read ?? false, metadata: n.metadata || {}, })); diff --git a/data.ms/auth/lock.mdb b/data.ms/auth/lock.mdb index fbc180965387b1f9fbad775ae7cb39f153f6cd8e..e575fdda37265b41038bf603e9f7442063f50914 100644 GIT binary patch delta 18 ZcmZp0XmFS?iKV-{rFP@Oc=?G5+yF`O2Z{gy delta 18 ZcmZp0XmFS?iKU1=xOn5jc=?G5+yFtX2C@JE diff --git a/data.ms/indexes/1d141789-4d51-4a8c-b800-fead2df19ab9/data.mdb b/data.ms/indexes/1d141789-4d51-4a8c-b800-fead2df19ab9/data.mdb index 62e4359ad1a3ea63f6ad14a4caff59947fd5247c..48572adf35c859bac10e8547a7d0508c93ad0d0a 100644 GIT binary patch delta 1188 zcmbu8%Wl&^6ozxsv^XS9903Xui`XNf7RgG+9*@T!iOV+XrYJ19Nc0hS0~8iWY>=R{ z$d)aaKoT#E1QLA&w!8yU)NW8$5c`Z3rwhczo1^iu{&T*6evgif(UI|DAL=h}_gm*n z_}IG66WfAE%|mk^nrVOgOh49r%Zjb(*9N>%$B%d5gBtX^D(suB_xk${U0do&zpc!L zF}~b|XRr~&bkV53)!nkPzqG4Xb}~v+)k#$j%suttxYgTRZJ2aAB zBq{5076pO_g54+A$Fl)ki%$m6q309H9Kwk79Kwn89TE`99TE~L91;;3Iz$i|IK(BA z#*@8a1-5YacdOkOtKDa+bI?^r--N%W*oAYMGQ1ui-+-OpTljH4ns+pykj!5K`XLp9 z1uMXB3U<@A9pVw`=9q|FgiQgHNezaT!&mjVPQN#+H4RrQ7|E!lZqM}s&vjW8<#Upg zdvInD`i3LWNpv+GolG7q2SGgsYZ-t^ZsOSPLc3#SN24^?uk-Y5t>xn%JcexyNJ9%Z zid;;3yhkZ>sUI?)b74TxIb0uufMG!_^b$QzanVI+W^hsd50v%Lmae9*R#uHttj{@Z zUD=EO_F@^P)1Mb;cAao3IlT#=I~Rp?nWSEidqF7N$n)1>5eJd+4vV)}#7~ivt9$UY poOlmm^hqa?OCBu61!I0h#kx2OuDo&xjzd3DeC2jBxl$fhegUa|@&o_? delta 1426 zcmc(fJ#Q015QaVHgPenNwgJhqDDJ#X0-Vl!AM3kY2_+OrAR0%eARtBjgS1p6B@{@& z78VT!pOL^tI3>n{!u$cCMAY=iG$>U#dv;|z6i7%BZbqved**$gcfB<*wg$$77MKrL z8gWzOc7gyG3|iI7u1zsq6a*3z#1Tv$&_>;sivDlP91t42b(g3U-EDrBW03GTgTQ;cp~Ak02kLr8_+6T9)+Ml6f(-QvS+LVYhuZ1voqIe?Tt?#{i&qd$TE^k^FV=xr diff --git a/data.ms/indexes/44b06117-319a-482a-ac6a-bb3a24ded65c/data.mdb b/data.ms/indexes/44b06117-319a-482a-ac6a-bb3a24ded65c/data.mdb index d6f5d2007655c51f35447ff6bf23770087830e49..fd82358d91ce0daf454fe4d260f5f38745937191 100644 GIT binary patch delta 1609 zcma)6UuauZ82?VXwsB2zk~Y$`>$3E^5^L7xCe43iR~SXu+^E_qIE&uqPm>vQN174p zzZHBDgstlt6o!L6jYWoAd(n=fI7-B7g9aTY8*?itdyp}od=MYzx#!%P)J^bvINv$n zcfQ~E_ng^{=GhJX+#Fg`dXLF?-aLkc)6cst+klgxafPXu93{KeKQ4wNLqid-Z!qi+ zc*LM598_wbX<-rGGC%Hu8jPKiWmIt`}6PoqXdORX1Hq z=bll7c9MyKeG3~HwKM_jAjSHjNBLvmZHClBX55j@JKf}Schup~f@{_|fDWuMjz7cW zSQRNY@sjD0@sir`JJMlh#xg|!-9jLo3{OhIxK9iw!tqcn7KjHY{gPJz)FBk)LV7AE z7ZT~IL?IoYN(rDd2>C=Tm6bE{)QkX4X5o#asbnTCO{bDar;{mxe0t)5tz}DaSMe=; z70;U{v0`(a$Gdr*ZSY^dsWBqAPVHVgc5yFSBE`#Yw5Z&;>^P_V8C^$OZem3A42q$k z-xu};{mZpOXvCt}&d*`AxKNal8(kqq*=g(C5=jZ)#U=bv>)lqR_u3_Va68kQ)f!Tt z^~CBso{53qfLtOkr89iBH6XXceSBZBT>BaK>6w_~sgOWx3|&m3E^4PL_%~cpELXn3 z&+--;Re9YZQcbw#F;&BzsY2*h7e+d;!3BH|-=x`GpkSvk8xofV9%>o0-|763L36krh_G%0*4@Z)7|iFYrSD7Y-+jA^4EdZ{$Hs!1 zI5o3{zVd*h0YZe^Z6Dy9Ca>Xko87o(_}Dm!<yy7fohb!(Z{MhNMaHh@Z5fXGl}D z-{svS{I8PX0^B(Uu0DXCkXx|yN bX`J^OfWALQe3SrM`H_4nchPU@hV1+sZnAMf delta 223 zcmZp8z|ru4b;1P3HJc|2WXmFShqQSt_%E&;^$imFr$iU1Tq(Os` zk!>>L0`bif1rzugS53c}&!|5Af<6-mJU#6Ycy4T5m?Bt~K8Zm=knwKf Kqx}Dg3ETj5P#CEI diff --git a/data.ms/indexes/a7b76728-97b9-4942-bdaf-9967d45f811a/data.mdb b/data.ms/indexes/a7b76728-97b9-4942-bdaf-9967d45f811a/data.mdb index 1409f303d38af3b4c22b707c1d6d408705c31e3a..a100da5236565df6e8136dcad7fca5799ff1b955 100644 GIT binary patch delta 162 zcmZp8z|`=7X~G1?4Vx7c^7$tTOkmsyW^GdNk`p!!F|f2Uva~WV)-$!VG&C_cG2R?& zcTs-wf_%2gCU#L-xS(t5(>+=$1+&FpVe0`weoAd1<`qocgxn7@f9Z*;u0FNRz AGXMYp delta 178 zcmZp8z|`=7X~G1?RhuUYno2Lq7^G{wNAj_%100JBgt0u3^*JoV0 z`DT8hoCsK>5zt^WJwpo%b2AHbW0TEseO`i$t0%9Vug|z@^3D17m}ab;ymGxh;|ib> FbpQ<>Hevt( diff --git a/data.ms/indexes/a7b76728-97b9-4942-bdaf-9967d45f811a/lock.mdb b/data.ms/indexes/a7b76728-97b9-4942-bdaf-9967d45f811a/lock.mdb index 8422fdd7b5f3d900129ff2ff4f689fe0d7106179..2d7e430fbd63e7889cd7269be0ca18bded61dd36 100644 GIT binary patch delta 44 wcmZo@WNBz*;ki_@% diff --git a/data.ms/tasks/data.mdb b/data.ms/tasks/data.mdb index e4eceaa92a6c1464df2327f2bb891f3efae8c46f..dec76bd47aab01127a636cf3dac00fb893ab5a73 100644 GIT binary patch delta 36242 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 delta 6351 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 AKL7v# delta 55 zcmZp0XmH@Xci{a#rUZQ*tBIT)tjF%N1s6{Y)SB2J$XYg=70#X}4qX3 A`~Uy| From 6e2d47855673d6a1fb61d25fb414b8c1f7f6c86f Mon Sep 17 00:00:00 2001 From: Shiljababu Date: Tue, 5 May 2026 18:16:04 +0530 Subject: [PATCH 2/3] refactor(notification):fix errors --- apps/web/app/influencer-dashboard/layout.tsx | 4 ++-- apps/web/components/NotificationBell.tsx | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/web/app/influencer-dashboard/layout.tsx b/apps/web/app/influencer-dashboard/layout.tsx index 3cb4454..19a57ee 100644 --- a/apps/web/app/influencer-dashboard/layout.tsx +++ b/apps/web/app/influencer-dashboard/layout.tsx @@ -120,7 +120,7 @@ export default function InfluencerDashboardLayout({

- + diff --git a/apps/web/components/NotificationBell.tsx b/apps/web/components/NotificationBell.tsx index dde54cb..c0b7585 100644 --- a/apps/web/components/NotificationBell.tsx +++ b/apps/web/components/NotificationBell.tsx @@ -14,18 +14,18 @@ export default function NotificationBell() { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); - const [mounted, setMounted] = useState(false); + const mountedRef = useRef(false); - useEffect(() => { - setMounted(true); - }, []); +useEffect(() => { + mountedRef.current = true; +}, []); // Fetch notifications on mount if user is logged in useEffect(() => { - if (mounted && accessToken) { + if (mountedRef && accessToken) { fetchNotifications(); } - }, [mounted, accessToken, fetchNotifications]); + }, [mountedRef, accessToken, fetchNotifications]); // Handle clicking outside to close dropdown useEffect(() => { @@ -45,7 +45,7 @@ export default function NotificationBell() { }, [isOpen]); // Don't render the bell if the user is not authenticated or component is not mounted - if (!mounted || !accessToken) return null; + if (!mountedRef || !accessToken) return null; const handleNotificationClick = (notification: Notification) => { console.log("🔥 CLICKED NOTIFICATION FULL:", JSON.stringify(notification, null, 2)); From a506563ec6e0f2b0ed5301c1b2141f7abd9255dc Mon Sep 17 00:00:00 2001 From: Shiljababu Date: Tue, 5 May 2026 18:36:32 +0530 Subject: [PATCH 3/3] refactor(notification):fix errors --- apps/web/app/influencer-dashboard/layout.tsx | 123 ++++++++++++++++--- 1 file changed, 103 insertions(+), 20 deletions(-) diff --git a/apps/web/app/influencer-dashboard/layout.tsx b/apps/web/app/influencer-dashboard/layout.tsx index 19a57ee..df18fcb 100644 --- a/apps/web/app/influencer-dashboard/layout.tsx +++ b/apps/web/app/influencer-dashboard/layout.tsx @@ -1,9 +1,9 @@ "use client"; -import React, { useState } from "react"; +import React, { useState, useEffect, useRef } from "react"; import Link from "next/link"; import Image from "next/image"; -import { usePathname } from "next/navigation"; +import { useRouter, usePathname } from "next/navigation"; import { LayoutDashboard, Users, @@ -11,23 +11,70 @@ import { MessageSquare, Calendar, DollarSign, + LogOut, + Menu, X } from "lucide-react"; +import { useAuthStore } from "@/store/auth.store"; import RoleGuard from "@/components/rbac/RoleGuard"; import api from "@/lib/axios.client"; import NotificationBell from "@/components/NotificationBell"; -import DashboardHeader from "@/components/DashboardHeader"; -import NotificationBell from "@/components/NotificationBell"; export default function InfluencerDashboardLayout({ children, }: { children: React.ReactNode; }) { + const router = useRouter(); const pathname = usePathname(); + const { user, clearAuth } = useAuthStore(); + const [showLogoutModal, setShowLogoutModal] = useState(false); const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const [profile, setProfile] = useState<{ fullName?: string; profileImageUrl?: string; companyName?: string } | null>(null); + const [isLoadingProfile, setIsLoadingProfile] = useState(true); + + // Fetch real profile data for name & photo + useEffect(() => { + setIsLoadingProfile(true); + api.get("/profile/get_profile") + .then((res) => setProfile(res.data.data)) + .catch(() => { }) // silently fail — fallback to auth store values + .finally(() => setIsLoadingProfile(false)); + }, []); + + const rawDisplayName = profile?.fullName || user?.fullName || user?.email?.split("@")[0] || "User"; + const displayName = rawDisplayName.trim() || "User"; + const profileImage = (profile?.profileImageUrl || user?.profileImageUrl || user?.profileImage || "").trim() || null; + + const dropdownRef = useRef(null); + + // Close dropdown on outside click + useEffect(() => { + function handleClickOutside(event: MouseEvent) { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setShowLogoutModal(false); + } + } + if (showLogoutModal) { + document.addEventListener("mousedown", handleClickOutside); + } + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [showLogoutModal]); + + const handleLogout = async () => { + try { + await api.post("/auth/logout"); + } catch (e) { + console.error("Logout error", e); + } finally { + clearAuth(); + router.push("/login"); + } + }; const navItems = [ { name: "Overview", href: "/influencer-dashboard", icon: LayoutDashboard }, @@ -39,8 +86,8 @@ export default function InfluencerDashboardLayout({ ]; return ( - -
+ +
{/* Mobile Sidebar Overlay */} {isSidebarOpen && ( @@ -64,6 +111,7 @@ export default function InfluencerDashboardLayout({
+
- {/* Content */}