diff --git a/apps/web/src/components/sidebar.test.tsx b/apps/web/src/components/sidebar.test.tsx new file mode 100644 index 0000000..7527664 --- /dev/null +++ b/apps/web/src/components/sidebar.test.tsx @@ -0,0 +1,18 @@ +import { describe, expect, it } from "vitest"; + +import { mtp } from "@tensamin/shared/data"; +import { onlineStatusOptions } from "./status-options"; + +describe("sidebar status requests", () => { + it.each(onlineStatusOptions)("sends $label as $value", ({ value }) => { + expect(mtp.SetUserState.request.parse({ UserState: value })).toEqual({ + UserState: value, + }); + }); + + it("keeps status text on the profile operation", () => { + expect(mtp.ChangeUserData.request.parse({ Status: "At lunch" })).toEqual({ + Status: "At lunch", + }); + }); +}); diff --git a/apps/web/src/components/sidebar.tsx b/apps/web/src/components/sidebar.tsx index 10baf34..7a7c58b 100644 --- a/apps/web/src/components/sidebar.tsx +++ b/apps/web/src/components/sidebar.tsx @@ -36,23 +36,19 @@ import { useShowMobileNavbar } from "@/routes/app/useShowMobileNavbar"; import { Ellipsis, Check } from "lucide-react"; import { useState } from "react"; import type { User } from "@tensamin/user/context"; -import type z from "zod"; -import { mtp } from "@tensamin/shared/data"; +import { mtp, userPresencePreferenceSchema } from "@tensamin/shared/data"; import { useMTP } from "@tensamin/mtp"; +import { + onlineStatusLabels, + onlineStatusOptions, + type OnlineStatus, +} from "./status-options"; -type OnlineStatus = z.infer; - -const onlineStatusLabels: Record = { - user_online: "Online", - user_offline: "Offline", - user_dnd: "Do not disturb", - user_idle: "Idle", - user_wc: "Away", - user_borked: "Borked", - iota_offline: "Iota offline", - iota_online: "Iota online", - iota_borked: "Iota borked", -}; +function accountPreference(status: User["OnlineStatus"]): OnlineStatus { + return userPresencePreferenceSchema.safeParse(status).success + ? (status as OnlineStatus) + : "user_online"; +} function StatusDialog({ user, @@ -87,7 +83,7 @@ function StatusDialog({ onOpenChange={(nextOpen) => { if (!nextOpen) { setDraftStatus(user.Status ?? ""); - setDraftOnlineStatus(user.OnlineStatus); + setDraftOnlineStatus(accountPreference(user.OnlineStatus)); setErrorMessage(""); setSaveSucceeded(false); } @@ -126,10 +122,11 @@ function StatusDialog({ - Online - Offline - Idle - Do not disturb + {onlineStatusOptions.map((option) => ( + + {option.label} + + ))} @@ -140,12 +137,9 @@ function StatusDialog({ Cancel} />