diff --git a/apps/client/src/network/handlers/LobbyHandler.ts b/apps/client/src/network/handlers/LobbyHandler.ts index b315f6c..0a7cad1 100644 --- a/apps/client/src/network/handlers/LobbyHandler.ts +++ b/apps/client/src/network/handlers/LobbyHandler.ts @@ -1,23 +1,50 @@ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; -import type { roomTypes } from "@repo/shared"; +import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; + +type SocketEventName = Exclude; type LobbyHandler = { - onRoomUpdate: (callback: (room: roomTypes.Room) => void) => void; - offRoomUpdate: (callback: (room: roomTypes.Room) => void) => void; + onRoomUpdate: (callback: (room: PayloadOf) => void) => void; + offRoomUpdate: (callback: (room: PayloadOf) => void) => void; startGame: () => void; }; export const createLobbyHandler = (socket: Socket): LobbyHandler => { + const onEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).on(event, callback); + }; + + const offEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).off(event, callback); + }; + + function emitEvent(event: TEvent): void; + function emitEvent(event: TEvent, payload: PayloadOf): void; + function emitEvent(event: TEvent, payload?: PayloadOf): void { + if (payload === undefined) { + (socket as any).emit(event); + return; + } + + (socket as any).emit(event, payload); + } + return { - onRoomUpdate: (callback: (room: roomTypes.Room) => void) => { - socket.on(protocol.SocketEvents.ROOM_UPDATE, callback); + onRoomUpdate: (callback) => { + onEvent(protocol.SocketEvents.ROOM_UPDATE, callback); }, - offRoomUpdate: (callback: (room: roomTypes.Room) => void) => { - socket.off(protocol.SocketEvents.ROOM_UPDATE, callback); + offRoomUpdate: (callback) => { + offEvent(protocol.SocketEvents.ROOM_UPDATE, callback); }, startGame: () => { - socket.emit(protocol.SocketEvents.START_GAME); + emitEvent(protocol.SocketEvents.START_GAME); } }; }; diff --git a/apps/client/src/network/handlers/TitleHandler.ts b/apps/client/src/network/handlers/TitleHandler.ts index 3246817..d91da27 100644 --- a/apps/client/src/network/handlers/TitleHandler.ts +++ b/apps/client/src/network/handlers/TitleHandler.ts @@ -1,23 +1,50 @@ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; -import type { roomTypes } from "@repo/shared"; +import type { PayloadOf, SocketPayloadMap } from "@repo/shared"; + +type SocketEventName = Exclude; type TitleHandler = { - joinRoom: (payload: roomTypes.JoinRoomPayload) => void; - onJoinRejected: (callback: (payload: roomTypes.JoinRoomRejectedPayload) => void) => void; - offJoinRejected: (callback: (payload: roomTypes.JoinRoomRejectedPayload) => void) => void; + joinRoom: (payload: PayloadOf) => void; + onJoinRejected: (callback: (payload: PayloadOf) => void) => void; + offJoinRejected: (callback: (payload: PayloadOf) => void) => void; }; export const createTitleHandler = (socket: Socket): TitleHandler => { + const onEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).on(event, callback); + }; + + const offEvent = ( + event: TEvent, + callback: (payload: PayloadOf) => void + ) => { + (socket as any).off(event, callback); + }; + + function emitEvent(event: TEvent): void; + function emitEvent(event: TEvent, payload: PayloadOf): void; + function emitEvent(event: TEvent, payload?: PayloadOf): void { + if (payload === undefined) { + (socket as any).emit(event); + return; + } + + (socket as any).emit(event, payload); + } + return { - joinRoom: (payload: roomTypes.JoinRoomPayload) => { - socket.emit(protocol.SocketEvents.JOIN_ROOM, payload); + joinRoom: (payload) => { + emitEvent(protocol.SocketEvents.JOIN_ROOM, payload); }, - onJoinRejected: (callback: (payload: roomTypes.JoinRoomRejectedPayload) => void) => { - socket.on(protocol.SocketEvents.ROOM_JOIN_REJECTED, callback); + onJoinRejected: (callback) => { + onEvent(protocol.SocketEvents.ROOM_JOIN_REJECTED, callback); }, - offJoinRejected: (callback: (payload: roomTypes.JoinRoomRejectedPayload) => void) => { - socket.off(protocol.SocketEvents.ROOM_JOIN_REJECTED, callback); + offJoinRejected: (callback) => { + offEvent(protocol.SocketEvents.ROOM_JOIN_REJECTED, callback); } }; };