| @ -1,53 +1,107 @@ | |||
| import { AppDispatch } from "app/store"; | |||
| import { roomMessage, roomGetAll, roomSetAll } from "modules/room/slice"; | |||
| import { | |||
| RoomMembership, | |||
| RoomMessagePayload, | |||
| RoomState, | |||
| roomReceiveMessage, | |||
| roomSendMessage, | |||
| roomGetAll, | |||
| roomSetAll, | |||
| } from "modules/room/slice"; | |||
| import { SocketMessage, SocketMessageMiddleware } from "modules/socket/message"; | |||
| function roomListRequest(): SocketMessage { | |||
| return "RoomListRequest"; | |||
| } | |||
| // TODO: Adapt to new response format. | |||
| function handleRoomListResponse(dispatch: AppDispatch, outerFields: any[]) { | |||
| if (outerFields.length !== 1) { | |||
| console.log("RoomListResponse has wrong number of fields:", outerFields); | |||
| return; | |||
| function roomMessageRequest({ roomName, message }: RoomMessagePayload) { | |||
| return { | |||
| RoomMessageRequest: { | |||
| room_name: roomName, | |||
| message, | |||
| }, | |||
| }; | |||
| } | |||
| function convertMembership(membership: string): RoomMembership { | |||
| switch (membership) { | |||
| case "NonMember": | |||
| return RoomMembership.Left; | |||
| case "Joining": | |||
| return RoomMembership.Joining; | |||
| case "Member": | |||
| return RoomMembership.Joined; | |||
| case "Leaving": | |||
| return RoomMembership.Leaving; | |||
| } | |||
| } | |||
| const { rooms } = outerFields[0]; | |||
| if (rooms === undefined) { | |||
| console.log("RoomListResponse field has wrong shape:", outerFields[0]); | |||
| return; | |||
| function convertMessages(messages: any[]): RoomMessage[] { | |||
| const result = []; | |||
| for (const message of messages) { | |||
| result.push({ | |||
| userName: message.user_name, | |||
| message: message.message, | |||
| }); | |||
| } | |||
| return result; | |||
| } | |||
| dispatch(roomSetAll(rooms)); | |||
| function convertRoomListEntry(name: string, room: any): RoomState { | |||
| return { | |||
| name, | |||
| membership: convertMembership(room.membership), | |||
| visibility: room.visibility, | |||
| operated: room.operated, | |||
| userCount: room.user_count, | |||
| owner: room.owner, | |||
| operators: room.operators, | |||
| members: room.members, | |||
| messages: convertMessages(room.messages), | |||
| tickers: room.tickers, | |||
| }; | |||
| } | |||
| // TODO: Adapt to new response format. | |||
| function handleRoomMessageResponse(dispatch: AppDispatch, outerFields: any[]) { | |||
| if (outerFields.length !== 1) { | |||
| console.log("RoomMessageResponse has wrong number of fields:", outerFields); | |||
| function handleRoomListResponse(dispatch: AppDispatch, response) { | |||
| const { rooms } = response; | |||
| if (rooms === undefined) { | |||
| console.log("RoomListResponse has wrong shape:", response); | |||
| return; | |||
| } | |||
| dispatch(roomMessage(outerFields[0])); | |||
| const map = {}; | |||
| for (const [name, room] of rooms) { | |||
| map[name] = convertRoomListEntry(name, room); | |||
| } | |||
| dispatch(roomSetAll(map)); | |||
| } | |||
| function handleRoomMessageResponse(dispatch: AppDispatch, response) { | |||
| dispatch( | |||
| roomReceiveMessage({ | |||
| roomName: response.room_name, | |||
| userName: response.user_name, | |||
| message: response.message, | |||
| }) | |||
| ); | |||
| } | |||
| export const roomSocketMessageMiddleware: SocketMessageMiddleware = { | |||
| // TODO: Adapt to new response format. | |||
| handleMessage: (dispatch, { variant, fields }) => { | |||
| switch (variant) { | |||
| case "RoomListResponse": | |||
| handleRoomListResponse(dispatch, fields); | |||
| break; | |||
| case "RoomMessageResponse": | |||
| handleRoomMessageResponse(dispatch, fields); | |||
| break; | |||
| handleMessage: (dispatch, message) => { | |||
| if ("RoomListResponse" in message) { | |||
| handleRoomListResponse(dispatch, message["RoomListResponse"]); | |||
| } else if ("RoomMessageResponse" in message) { | |||
| handleRoomMessageResponse(dispatch, message["RoomMessageResponse"]); | |||
| } | |||
| }, | |||
| handleAction: (send, action) => { | |||
| if (roomGetAll.match(action)) { | |||
| send(roomListRequest()); | |||
| } else if (roomSendMessage.match(action)) { | |||
| send(roomMessageRequest(action.payload)); | |||
| } | |||
| }, | |||
| }; | |||