| @ -1,53 +1,107 @@ | |||||
| import { AppDispatch } from "app/store"; | 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"; | import { SocketMessage, SocketMessageMiddleware } from "modules/socket/message"; | ||||
| function roomListRequest(): SocketMessage { | function roomListRequest(): SocketMessage { | ||||
| return "RoomListRequest"; | 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; | 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 = { | export const roomSocketMessageMiddleware: SocketMessageMiddleware = { | ||||
| // TODO: Adapt to new response format. | // 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) => { | handleAction: (send, action) => { | ||||
| if (roomGetAll.match(action)) { | if (roomGetAll.match(action)) { | ||||
| send(roomListRequest()); | send(roomListRequest()); | ||||
| } else if (roomSendMessage.match(action)) { | |||||
| send(roomMessageRequest(action.payload)); | |||||
| } | } | ||||
| }, | }, | ||||
| }; | }; | ||||