Skip to content

Commit cd1943a

Browse files
authored
Merge pull request #15 from Prajualit/main
ui revamp and websocket errors fixed
2 parents c550205 + b62f808 commit cd1943a

22 files changed

Lines changed: 1252 additions & 534 deletions

backend/package-lock.json

Lines changed: 0 additions & 80 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/server.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,28 @@ const startServer = async () => {
165165
socket.on("new message", (newMessageRecieved) => {
166166
try {
167167
var chat = newMessageRecieved.chat;
168+
console.log('📨 New message received on backend:', {
169+
messageId: newMessageRecieved._id,
170+
chatId: chat._id,
171+
sender: newMessageRecieved.sender._id,
172+
usersCount: chat.users?.length
173+
});
174+
168175
if (!chat.users) {
169176
console.log("❌ chat.users not defined");
170177
return;
171178
}
172179

180+
console.log('📤 Broadcasting message to users in chat...');
173181
chat.users.forEach((user) => {
174-
if (user._id == newMessageRecieved.sender._id) return;
182+
if (user._id == newMessageRecieved.sender._id) {
183+
console.log(`⏭️ Skipping sender: ${user._id}`);
184+
return;
185+
}
186+
console.log(`📨 Emitting to user room: ${user._id}`);
175187
socket.in(user._id).emit("message recieved", newMessageRecieved);
176188
});
189+
console.log('✅ Message broadcast complete');
177190
} catch (error) {
178191
console.error('❌ New message error:', error);
179192
}

frontend/src/App.js

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Homepage from "./Pages/Homepage";
44
import Chatpage from "./Pages/Chatpage";
55
import { ChakraProvider } from "@chakra-ui/react";
66
import ChatProvider from "./Context/ChatProvider";
7+
import { SocketProvider } from "./Context/SocketContext";
78
import WorkspaceSelection from "./components/workspace/WorkspaceSelection";
89
import WorkspaceProvider from "./Context/WorkspaceProvider";
910
import TaskAllocatorPage from "./components/task_allocator/TaskAllocatorPage";
@@ -32,20 +33,22 @@ const App = () => {
3233
<Router>
3334
<ChakraProvider theme={theme}>
3435
<ChatProvider>
35-
<WorkspaceProvider>
36-
<div className="container">
37-
<Routes>
38-
<Route path="/" element={<Homepage />} />
39-
<Route path="/signup" element={<Signup />} />
40-
<Route path="/geo-location" element={<Geo />} />
41-
<Route path="/tasks/:workspaceId" element={<TaskAllocatorPage />} /> {/* Updated route */}
42-
<Route path="/my-tasks" element={<MyTasks />} />
43-
<Route path="/chats" element={<Chatpage />} />
44-
<Route path="/workspace" element={<WorkspaceSelection />} />
45-
<Route path="/workspace/:workspaceId/chats" element={<Chatpage />} />
46-
</Routes>
47-
</div>
48-
</WorkspaceProvider>
36+
<SocketProvider>
37+
<WorkspaceProvider>
38+
<div className="container">
39+
<Routes>
40+
<Route path="/" element={<Homepage />} />
41+
<Route path="/signup" element={<Signup />} />
42+
<Route path="/geo-location" element={<Geo />} />
43+
<Route path="/tasks/:workspaceId" element={<TaskAllocatorPage />} /> {/* Updated route */}
44+
<Route path="/my-tasks" element={<MyTasks />} />
45+
<Route path="/chats" element={<Chatpage />} />
46+
<Route path="/workspace" element={<WorkspaceSelection />} />
47+
<Route path="/workspace/:workspaceId/chats" element={<Chatpage />} />
48+
</Routes>
49+
</div>
50+
</WorkspaceProvider>
51+
</SocketProvider>
4952
</ChatProvider>
5053
</ChakraProvider>
5154
</Router>
Lines changed: 103 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,117 @@
1+
import { createContext, useContext, useEffect } from 'react';
2+
import io from 'socket.io-client';
13
import { API_URL } from "../config/api.config";
24

3-
const SOCKET_URL = API_URL.replace('/api', '');
5+
// Determine Socket URL based on environment
6+
// In development with proxy, use relative path
7+
// In production, use full backend URL
8+
const getSocketURL = () => {
9+
if (process.env.NODE_ENV === 'development' && !process.env.REACT_APP_USE_PROD_API) {
10+
// In development, connect directly to backend
11+
return 'http://localhost:5000';
12+
} else {
13+
// Use full backend URL
14+
return API_URL.replace('/api', '');
15+
}
16+
};
17+
18+
const SOCKET_URL = getSocketURL();
19+
20+
console.log('Socket Configuration:', {
21+
NODE_ENV: process.env.NODE_ENV,
22+
USE_PROD_API: process.env.REACT_APP_USE_PROD_API,
23+
SOCKET_URL: SOCKET_URL,
24+
API_URL: API_URL
25+
});
426

527
const socket = io(SOCKET_URL, {
6-
transports: ['websocket', 'polling'],
28+
path: '/socket.io',
29+
transports: ['polling', 'websocket'], // Try polling first, then upgrade to websocket
730
withCredentials: true,
831
reconnection: true,
9-
reconnectionAttempts: Infinity,
32+
reconnectionAttempts: 5,
1033
reconnectionDelay: 1000,
1134
reconnectionDelayMax: 5000,
12-
timeout: 20000,
13-
autoConnect: false
35+
timeout: 10000, // Reduced timeout
36+
autoConnect: false,
37+
forceNew: false
1438
});
1539

16-
// Handle offline/online events
17-
window.addEventListener('online', () => {
18-
socket.connect();
40+
// Add socket event listeners for debugging
41+
socket.on('connect', () => {
42+
console.log('✅ Socket.IO connected:', socket.id);
1943
});
2044

21-
window.addEventListener('offline', () => {
22-
socket.disconnect();
45+
socket.on('disconnect', (reason) => {
46+
console.log('❌ Socket.IO disconnected:', reason);
2347
});
2448

25-
// Reconnect logic for mobile background state
26-
document.addEventListener('visibilitychange', () => {
27-
if (document.visibilityState === 'visible') {
28-
socket.connect();
29-
}
30-
});
49+
socket.on('connect_error', (error) => {
50+
console.error('❌ Socket.IO connection error:', error.message);
51+
});
52+
53+
socket.on('reconnect', (attemptNumber) => {
54+
console.log('🔄 Socket.IO reconnected after', attemptNumber, 'attempts');
55+
});
56+
57+
socket.on('reconnect_attempt', (attemptNumber) => {
58+
console.log('🔄 Socket.IO reconnection attempt:', attemptNumber);
59+
});
60+
61+
socket.on('reconnect_error', (error) => {
62+
console.error('❌ Socket.IO reconnection error:', error.message);
63+
});
64+
65+
socket.on('reconnect_failed', () => {
66+
console.error('❌ Socket.IO reconnection failed - max attempts reached');
67+
});
68+
69+
// Create context
70+
const SocketContext = createContext(socket);
71+
72+
// Hook to use socket
73+
export const useSocket = () => {
74+
return useContext(SocketContext);
75+
};
76+
77+
// Provider component
78+
export const SocketProvider = ({ children }) => {
79+
useEffect(() => {
80+
// Handle offline/online events
81+
const handleOnline = () => {
82+
console.log('Network online - connecting socket');
83+
socket.connect();
84+
};
85+
86+
const handleOffline = () => {
87+
console.log('Network offline - disconnecting socket');
88+
socket.disconnect();
89+
};
90+
91+
// Reconnect logic for mobile background state
92+
const handleVisibilityChange = () => {
93+
if (document.visibilityState === 'visible') {
94+
console.log('App visible - connecting socket');
95+
socket.connect();
96+
}
97+
};
98+
99+
window.addEventListener('online', handleOnline);
100+
window.addEventListener('offline', handleOffline);
101+
document.addEventListener('visibilitychange', handleVisibilityChange);
102+
103+
return () => {
104+
window.removeEventListener('online', handleOnline);
105+
window.removeEventListener('offline', handleOffline);
106+
document.removeEventListener('visibilitychange', handleVisibilityChange);
107+
};
108+
}, []);
109+
110+
return (
111+
<SocketContext.Provider value={socket}>
112+
{children}
113+
</SocketContext.Provider>
114+
);
115+
};
116+
117+
export default socket;

frontend/src/Pages/Chatpage.js

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import SplitPane from "react-split-pane";
2-
import { Box, useBreakpointValue, Drawer, DrawerOverlay, DrawerContent, DrawerBody, IconButton } from "@chakra-ui/react";
2+
import {
3+
Box,
4+
useBreakpointValue,
5+
Drawer,
6+
DrawerOverlay,
7+
DrawerContent,
8+
DrawerBody,
9+
IconButton,
10+
} from "@chakra-ui/react";
311
import { useState } from "react";
412
import { FiMenu } from "react-icons/fi";
513
import Chatbox from "../components/Chatbox";
@@ -37,31 +45,45 @@ const Chatpage = () => {
3745
onClick={() => setDrawerOpen(true)}
3846
colorScheme="blue"
3947
/>
40-
<Drawer isOpen={isDrawerOpen} placement="left" onClose={() => setDrawerOpen(false)}>
48+
<Drawer
49+
isOpen={isDrawerOpen}
50+
placement="left"
51+
onClose={() => setDrawerOpen(false)}
52+
>
4153
<DrawerOverlay />
42-
<DrawerContent bg="#0f1924" maxWidth={"60vw"} width="60vw" >
54+
<DrawerContent bg="#0f1924" maxWidth={"60vw"} width="60vw">
4355
<DrawerBody>
4456
{user && <MyChats fetchAgain={fetchAgain} />}
4557
</DrawerBody>
4658
</DrawerContent>
4759
</Drawer>
4860
<Box className="chatting" w="100%" h="100vh">
49-
{user && <Chatbox fetchAgain={fetchAgain} setFetchAgain={setFetchAgain} />}
61+
{user && (
62+
<Chatbox fetchAgain={fetchAgain} setFetchAgain={setFetchAgain} />
63+
)}
5064
</Box>
5165
</>
5266
)}
5367

5468
{mode === "large" && (
5569
<SplitPane
5670
split="vertical"
57-
minSize={200}
58-
defaultSize={550}
71+
minSize={300}
72+
maxSize={1200}
73+
defaultSize={500}
5974
style={{ height: "100vh" }}
6075
>
61-
<div className="sidebar" style={{ background: "#0f1924", height: "100%", overflowX: "hidden" }}>
76+
<div
77+
className="sidebar"
78+
style={{
79+
background: "#0f1924",
80+
height: "100%",
81+
overflowX: "hidden",
82+
}}
83+
>
6284
{user && <MyChats fetchAgain={fetchAgain} />}
6385
</div>
64-
<div className="chatting">
86+
<div>
6587
{user && (
6688
<Chatbox fetchAgain={fetchAgain} setFetchAgain={setFetchAgain} />
6789
)}

frontend/src/Pages/chat.css

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
flex-direction: column;
2424
justify-content: space-between;
2525
background-color: white !important;
26-
padding: 10px;
2726
transition: width 0.3s ease;
2827
}
2928

@@ -140,7 +139,6 @@
140139
justify-content: space-between;
141140
background-color: #0f1924 !important;
142141

143-
padding: 10px;
144142
transition: width 0.3s ease;
145143
}
146144

@@ -175,7 +173,7 @@
175173

176174
/* Add to chat.css */
177175
.SplitPane .Resizer {
178-
background: #05549e;
176+
background: #21364A;
179177
opacity: 0.5;
180178
z-index: 1;
181179
box-sizing: border-box;

frontend/src/components/Authentication/Login.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const Login = () => {
2323
setShow(!show);
2424
};
2525
const navigate = useNavigate();
26-
const handelSignup = (e) => {
26+
const handleSignup = (e) => {
2727
e.preventDefault();
2828
navigate("/signup");
2929
};

0 commit comments

Comments
 (0)