From 532a771e8db03a97d1a9ec106f8f2f028cb67f2a Mon Sep 17 00:00:00 2001 From: Titouan Rigoudy Date: Sun, 14 Nov 2021 18:11:52 +0100 Subject: [PATCH] Handle user list response. --- src/modules/user/message.ts | 57 +++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/src/modules/user/message.ts b/src/modules/user/message.ts index 1eb4c40..3a54876 100644 --- a/src/modules/user/message.ts +++ b/src/modules/user/message.ts @@ -1,34 +1,61 @@ import { AppDispatch } from "app/store"; -import { userGetAll, userSetAll } from "modules/user/slice"; +import { + UserState, + UserStatus, + userGetAll, + userSetAll, +} from "modules/user/slice"; import { SocketMessage, SocketMessageMiddleware } from "modules/socket/message"; function userListRequest(): SocketMessage { return "UserListRequest"; } -// TODO: Adapt to new response format. -function handleUserListResponse(dispatch: AppDispatch, outerFields: any[]) { - if (outerFields.length !== 1) { - console.log("UserListResponse has wrong number of fields:", outerFields); - return; +function convertUserStatus(s: string): UserStatus { + switch (s) { + case "Offline": + return UserStatus.Offline; + case "Away": + return UserStatus.Away; + case "Online": + return UserStatus.Online; + default: + throw new TypeError(`invalid user status ${s}`); } +} + +function convertUserListEntry(entry: any): UserState { + return { + name: entry.user_name, + status: convertUserStatus(entry.status), + averageSpeed: entry.average_speed, + numDownloads: entry.num_downloads, + numFiles: entry.num_files, + numFolders: entry.num_folders, + numFreeSlots: entry.num_free_slots, + country: entry.country, + }; +} - const { users } = outerFields[0]; +function handleUserListResponse(dispatch: AppDispatch, response: any): void { + const { users } = response; if (users === undefined) { - console.log("UserListResponse field has wrong shape:", outerFields[0]); + console.log("UserListResponse has wrong shape:", response); return; } - dispatch(userSetAll(users)); + const payload = []; + for (const [name, user] of users) { + payload.push(convertUserListEntry(user)); + } + + dispatch(userSetAll(payload)); } export const userSocketMessageMiddleware: SocketMessageMiddleware = { - // TODO: Adapt to new response format. - handleMessage: (dispatch, { variant, fields }) => { - switch (variant) { - case "UserListResponse": - handleUserListResponse(dispatch, fields); - break; + handleMessage: (dispatch, message) => { + if ("UserListResponse" in message) { + handleUserListResponse(dispatch, message["UserListResponse"]); } },