Skip to content

Commit 1f09599

Browse files
committed
feat: enhance ConnectionDialog with toggle connection functionality and update CollaborationClient to support withCredentials
1 parent 0517e04 commit 1f09599

File tree

3 files changed

+29
-17
lines changed

3 files changed

+29
-17
lines changed

excalidraw-app/src/components/ConnectionDialog.tsx

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,26 @@ export function ConnectionDialog({
131131
return lastFetchedUrl || storedUrl || effectiveServerUrl;
132132
}, [lastFetchedUrl, storedUrl, effectiveServerUrl]);
133133

134+
const isConnectedToRoom = Boolean(serverConfig.enabled && currentRoomId);
135+
136+
const toggleButtonLabel = isConnectedToRoom
137+
? 'Disconnect'
138+
: isFetchingRooms
139+
? 'Connecting…'
140+
: 'Connect';
141+
142+
const toggleButtonDisabled = isConnectedToRoom
143+
? false
144+
: !hasEffectiveServerUrl || isFetchingRooms;
145+
146+
const handleToggleClick = () => {
147+
if (isConnectedToRoom) {
148+
handleDisconnectClick();
149+
} else {
150+
void handleConnectClick();
151+
}
152+
};
153+
134154
const handleRoomSelection = (roomId: string) => {
135155
if (!resolvedServerUrl) {
136156
setRoomsError('Connect to a server before selecting a room.');
@@ -148,8 +168,6 @@ export function ConnectionDialog({
148168
onSelectRoom(newRoomId, resolvedServerUrl);
149169
};
150170

151-
const isConnectedToRoom = Boolean(serverConfig.enabled && currentRoomId);
152-
153171
return (
154172
<div className="connection-dialog-overlay" onClick={onClose}>
155173
<div className="connection-dialog" onClick={(e) => e.stopPropagation()}>
@@ -195,18 +213,11 @@ export function ConnectionDialog({
195213

196214
<div className="button-group">
197215
<button
198-
onClick={handleConnectClick}
199-
disabled={isFetchingRooms || !hasEffectiveServerUrl}
200-
className="btn-primary"
201-
>
202-
{isFetchingRooms ? 'Connecting…' : 'Connect'}
203-
</button>
204-
<button
205-
onClick={handleDisconnectClick}
206-
disabled={!isConnectedToRoom && !storedUrl}
207-
className="btn-secondary"
216+
onClick={handleToggleClick}
217+
disabled={toggleButtonDisabled}
218+
className={isConnectedToRoom ? 'btn-secondary' : 'btn-primary'}
208219
>
209-
Disconnect
220+
{toggleButtonLabel}
210221
</button>
211222
<button onClick={onClose} className="btn-secondary">
212223
Close

excalidraw-app/src/lib/__tests__/websocket.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,24 @@ describe('CollaborationClient', () => {
7474

7575
describe('joinRoom', () => {
7676
it('should throw error when not connected', () => {
77-
return expect(client.joinRoom('room-123')).rejects.toThrow('Not connected to server');
77+
expect(() => client.joinRoom('room-123')).toThrow('Not connected to server');
7878
});
7979

8080
it('should handle empty room ID when trying to join', () => {
81-
return expect(client.joinRoom('')).rejects.toThrow('Not connected to server');
81+
expect(() => client.joinRoom('')).toThrow('Not connected to server');
8282
});
8383
});
8484

8585
describe('broadcast', () => {
8686
it('should not broadcast when not connected', () => {
8787
mockSocket.connected = false;
88-
return expect(client.broadcast({ data: 'test' })).resolves.toBeUndefined();
88+
expect(() => client.broadcast({ data: 'test' })).not.toThrow();
8989
expect(mockSocket.emit).not.toHaveBeenCalled();
9090
});
9191

9292
it('should handle null data', () => {
9393
mockSocket.connected = false;
94-
return expect(client.broadcast(null)).resolves.toBeUndefined();
94+
expect(() => client.broadcast(null as unknown as Record<string, unknown>)).not.toThrow();
9595
expect(mockSocket.emit).not.toHaveBeenCalled();
9696
});
9797
});

excalidraw-app/src/lib/websocket.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export class CollaborationClient {
2727

2828
this.socket = io(this.serverUrl, {
2929
transports: ['websocket', 'polling'],
30+
withCredentials: true,
3031
});
3132

3233
this.socket.on('connect', () => {

0 commit comments

Comments
 (0)