From ec019a4dff358db6bce34d5d4ae054dd0304a155 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 7 Aug 2026 23:05:26 +0200 Subject: [PATCH] [Upd] User states --- apps/web/src/components/sidebar.test.tsx | 18 ++ apps/web/src/components/sidebar.tsx | 64 ++++---- .../web/src/components/status-options.test.ts | 15 ++ apps/web/src/components/status-options.ts | 13 ++ mtp-type-maps | 2 +- package.json | 4 + packages/cache/src/sync.test.tsx | 19 +++ packages/cache/src/sync.tsx | 57 ++++++- packages/mtp/src/context.test.tsx | 21 +++ packages/mtp/src/context.tsx | 108 ++++++++++-- packages/shared/package.json | 1 + packages/shared/src/data.test.ts | 65 ++++++++ packages/shared/src/data.ts | 146 +++++++++++++---- packages/shared/src/errors.ts | 25 +++ packages/user/src/context.test.tsx | 45 +++++ packages/user/src/context.tsx | 155 ++++++++++++++++-- 16 files changed, 669 insertions(+), 89 deletions(-) create mode 100644 apps/web/src/components/sidebar.test.tsx create mode 100644 apps/web/src/components/status-options.test.ts create mode 100644 apps/web/src/components/status-options.ts create mode 100644 packages/cache/src/sync.test.tsx create mode 100644 packages/mtp/src/context.test.tsx create mode 100644 packages/shared/src/data.test.ts create mode 100644 packages/shared/src/errors.ts create mode 100644 packages/user/src/context.test.tsx 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} />