From 64ee9b842e6aa13f7ec6df555dae0df8930d9afc Mon Sep 17 00:00:00 2001 From: NotII <46204250+NotII@users.noreply.github.com> Date: Sun, 23 Mar 2025 23:08:09 +0000 Subject: [PATCH] hmm --- components/dashboard/ChatNotifications.tsx | 42 +++++++------------ components/dashboard/ChatTable.tsx | 28 ++++--------- .../notifications/OrderNotifications.tsx | 5 ++- .../notifications/UnifiedNotifications.tsx | 42 ++++++++----------- 4 files changed, 46 insertions(+), 71 deletions(-) diff --git a/components/dashboard/ChatNotifications.tsx b/components/dashboard/ChatNotifications.tsx index a2d3ca7..f4763a9 100644 --- a/components/dashboard/ChatNotifications.tsx +++ b/components/dashboard/ChatNotifications.tsx @@ -11,8 +11,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import axios from "axios"; -import { getCookie } from "@/lib/client-utils"; +import { clientFetch } from "@/lib/client-utils"; interface UnreadCounts { totalUnread: number; @@ -81,54 +80,45 @@ export default function ChatNotifications() { useEffect(() => { const fetchUnreadCounts = async () => { try { - const authToken = getCookie("Authorization"); + // Use clientFetch instead of direct API calls to leverage the Next.js API rewrite rules - if (!authToken) return; - - const authAxios = axios.create({ - baseURL: process.env.NEXT_PUBLIC_API_URL, - headers: { - Authorization: `Bearer ${authToken}` - } - }); - - // Get vendor info from profile endpoint - removing /api prefix - const vendorResponse = await authAxios.get('/auth/me'); + // Get vendor info from profile endpoint + const vendorData = await clientFetch('/auth/me'); // Access correct property - the vendor ID is in vendor._id - const vendorId = vendorResponse.data.vendor?._id; + const vendorId = vendorData.vendor?._id; if (!vendorId) { - console.error("Vendor ID not found in profile response:", vendorResponse.data); + console.error("Vendor ID not found in profile response:", vendorData); return; } - const response = await authAxios.get(`/chats/vendor/${vendorId}/unread`); + const response = await clientFetch(`/chats/vendor/${vendorId}/unread`); // Check if there are new notifications and play sound if needed - if (!loading && response.data.totalUnread > previousUnreadTotal) { + if (!loading && response.totalUnread > previousUnreadTotal) { playNotificationSound(); } - // Update state - setUnreadCounts(response.data); - setPreviousUnreadTotal(response.data.totalUnread); + // Update state - clientFetch already parses the JSON + setUnreadCounts(response); + setPreviousUnreadTotal(response.totalUnread); - if (response.data.totalUnread > 0) { - const chatIds = Object.keys(response.data.chatCounts); + if (response.totalUnread > 0) { + const chatIds = Object.keys(response.chatCounts); if (chatIds.length > 0) { // Create a simplified metadata object with just needed info const metadata: Record = {}; - // Fetch each chat to get buyer IDs - removing /api prefix + // Fetch each chat to get buyer IDs await Promise.all( chatIds.map(async (chatId) => { try { // Use markAsRead=false to ensure we don't mark messages as read - const chatResponse = await authAxios.get(`/chats/${chatId}?markAsRead=false`); + const chatResponse = await clientFetch(`/chats/${chatId}?markAsRead=false`); metadata[chatId] = { - buyerId: chatResponse.data.buyerId, + buyerId: chatResponse.buyerId, }; } catch (error) { console.error(`Error fetching chat ${chatId}:`, error); diff --git a/components/dashboard/ChatTable.tsx b/components/dashboard/ChatTable.tsx index 5f0dcf9..dcb0efe 100644 --- a/components/dashboard/ChatTable.tsx +++ b/components/dashboard/ChatTable.tsx @@ -22,7 +22,7 @@ import { Eye, User } from "lucide-react"; -import axios from "axios"; +import { clientFetch } from "@/lib/client-utils"; import { toast } from "sonner"; import { getCookie } from "@/lib/client-utils"; @@ -106,17 +106,12 @@ export default function ChatTable() { const fetchUnreadCounts = async () => { try { // Get the vendor ID from the auth token - const { vendorId, authToken } = getVendorIdFromToken(); + const { vendorId } = getVendorIdFromToken(); - // Fetch unread counts for this vendor - const response = await axios.get(`${process.env.NEXT_PUBLIC_API_URL}/chats/vendor/${vendorId}/unread`, { - headers: { - Authorization: `Bearer ${authToken}`, - "Content-Type": "application/json", - }, - }); + // Fetch unread counts for this vendor using clientFetch + const response = await clientFetch(`/chats/vendor/${vendorId}/unread`); - const newUnreadCounts = response.data; + const newUnreadCounts = response; // Play sound if there are new messages if (newUnreadCounts.totalUnread > unreadCounts.totalUnread) { @@ -135,17 +130,12 @@ export default function ChatTable() { try { // Get the vendor ID from the auth token - const { vendorId, authToken } = getVendorIdFromToken(); + const { vendorId } = getVendorIdFromToken(); - // Now fetch chats for this vendor - const response = await axios.get(`${process.env.NEXT_PUBLIC_API_URL}/chats/vendor/${vendorId}`, { - headers: { - Authorization: `Bearer ${authToken}`, - "Content-Type": "application/json", - }, - }); + // Now fetch chats for this vendor using clientFetch + const response = await clientFetch(`/chats/vendor/${vendorId}`); - setChats(Array.isArray(response.data) ? response.data : []); + setChats(Array.isArray(response) ? response : []); await fetchUnreadCounts(); } catch (error) { console.error("Failed to fetch chats:", error); diff --git a/components/notifications/OrderNotifications.tsx b/components/notifications/OrderNotifications.tsx index c4a1830..fc533c3 100644 --- a/components/notifications/OrderNotifications.tsx +++ b/components/notifications/OrderNotifications.tsx @@ -80,8 +80,9 @@ export default function OrderNotifications() { yesterday.setDate(yesterday.getDate() - 1); const timestamp = yesterday.toISOString(); - // Include timestamp filter to reduce load - const orderData = await clientFetch(`/orders?status=paid&limit=10&after=${timestamp}`); + // Use orderDate parameter instead of 'after' to avoid backend casting errors + // The error logs show that the 'after' parameter is being interpreted as 'orderId' incorrectly + const orderData = await clientFetch(`/orders?status=paid&limit=10&orderDate[gte]=${timestamp}`); const orders: Order[] = orderData.orders || []; // If this is the first fetch, just store the orders without notifications diff --git a/components/notifications/UnifiedNotifications.tsx b/components/notifications/UnifiedNotifications.tsx index 45d4dd6..c1d0eca 100644 --- a/components/notifications/UnifiedNotifications.tsx +++ b/components/notifications/UnifiedNotifications.tsx @@ -107,8 +107,9 @@ export default function UnifiedNotifications() { yesterday.setDate(yesterday.getDate() - 1); const timestamp = yesterday.toISOString(); - // Include timestamp filter to reduce load - const orderData = await clientFetch(`/orders?status=paid&limit=10&after=${timestamp}`); + // Use orderDate parameter instead of 'after' to avoid backend casting errors + // The error logs show that the 'after' parameter is being interpreted as 'orderId' incorrectly + const orderData = await clientFetch(`/orders?status=paid&limit=10&orderDate[gte]=${timestamp}`); const orders: Order[] = orderData.orders || []; // If this is the first fetch, just store the orders without notifications @@ -174,41 +175,34 @@ export default function UnifiedNotifications() { const fetchUnreadCounts = async () => { try { - const authToken = getCookie("Authorization"); - - if (!authToken) return; - - const authAxios = axios.create({ - baseURL: process.env.NEXT_PUBLIC_API_URL, - headers: { - Authorization: `Bearer ${authToken}` - } - }); + // Use clientFetch instead of direct API calls to leverage the API rewrite rules + // This will route through Next.js rewrites instead of calling the API directly // Get vendor info from profile endpoint - const vendorResponse = await authAxios.get('/auth/me'); + const vendorData = await clientFetch('/auth/me'); // Access correct property - the vendor ID is in vendor._id - const vendorId = vendorResponse.data.vendor?._id; + const vendorId = vendorData.vendor?._id; if (!vendorId) { - console.error("Vendor ID not found in profile response:", vendorResponse.data); + console.error("Vendor ID not found in profile response:", vendorData); return; } - const response = await authAxios.get(`/chats/vendor/${vendorId}/unread`); + // Use clientFetch which will properly route through Next.js API rewrites + const response = await clientFetch(`/chats/vendor/${vendorId}/unread`); // Check if there are new notifications and play sound if needed - if (!loading && response.data.totalUnread > previousUnreadTotal) { + if (!loading && response.totalUnread > previousUnreadTotal) { playNotificationSound(); } - // Update chat state - setUnreadCounts(response.data); - setPreviousUnreadTotal(response.data.totalUnread); + // Update chat state - note that clientFetch already parses the JSON response + setUnreadCounts(response); + setPreviousUnreadTotal(response.totalUnread); - if (response.data.totalUnread > 0) { - const chatIds = Object.keys(response.data.chatCounts); + if (response.totalUnread > 0) { + const chatIds = Object.keys(response.chatCounts); if (chatIds.length > 0) { // Create a simplified metadata object with just needed info @@ -219,9 +213,9 @@ export default function UnifiedNotifications() { chatIds.map(async (chatId) => { try { // Use markAsRead=false to ensure we don't mark messages as read - const chatResponse = await authAxios.get(`/chats/${chatId}?markAsRead=false`); + const chatResponse = await clientFetch(`/chats/${chatId}?markAsRead=false`); metadata[chatId] = { - buyerId: chatResponse.data.buyerId, + buyerId: chatResponse.buyerId, }; } catch (error) { console.error(`Error fetching chat ${chatId}:`, error);