From d59f7c6dc8638db27980e715c674bdc9a79887d5 Mon Sep 17 00:00:00 2001 From: zetaloop Date: Fri, 24 Apr 2026 09:06:44 +0800 Subject: [PATCH] fix(auth): preserve backend roles on login --- app/(auth)/login/page.tsx | 2 +- app/(auth)/register/page.tsx | 2 +- components/login-dialog.tsx | 2 +- store/auth.ts | 34 +++++++++++++++++++--------------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/app/(auth)/login/page.tsx b/app/(auth)/login/page.tsx index a9518f1..57dcba0 100644 --- a/app/(auth)/login/page.tsx +++ b/app/(auth)/login/page.tsx @@ -36,7 +36,7 @@ export default function LoginPage() { const onSubmit = async (data: z.infer) => { try { const user = await loginApi({ username: data.username, password: data.password }) - storeLogin(user, ["consumer", "player", "owner"]) + storeLogin(user, user.verifiedRoles) router.push("/") } catch (err) { notifyInfo(toApiError(err).msg) diff --git a/app/(auth)/register/page.tsx b/app/(auth)/register/page.tsx index fda158b..27d8cc3 100644 --- a/app/(auth)/register/page.tsx +++ b/app/(auth)/register/page.tsx @@ -84,7 +84,7 @@ export default function RegisterPage() { vcode: data.vcode, requestId, }) - storeLogin(user, ["consumer"]) + storeLogin(user, user.verifiedRoles ?? ["consumer"]) router.push("/") } catch (err) { notifyInfo(toApiError(err).msg) diff --git a/components/login-dialog.tsx b/components/login-dialog.tsx index e02cd70..758a7d6 100644 --- a/components/login-dialog.tsx +++ b/components/login-dialog.tsx @@ -45,7 +45,7 @@ export function LoginDialog({ open, onOpenChange }: LoginDialogProps) { const onSubmit = async (data: z.infer) => { try { const user = await loginApi({ username: data.username, password: data.password }) - storeLogin(user, ["consumer", "player", "owner"]) + storeLogin(user, user.verifiedRoles) consumePendingAction() onOpenChange(false) } catch (err) { diff --git a/store/auth.ts b/store/auth.ts index d1dd5b9..beba521 100644 --- a/store/auth.ts +++ b/store/auth.ts @@ -125,23 +125,27 @@ export const useAuthStore = create((set, get) => ({ }, } }), - login: (user, verifiedRoles = ["consumer"], themePreference) => - set((state) => ({ - isAuthenticated: true, - user, - currentRole: user.role, - verifiedRoles, - verificationStatus: verifiedRoles.reduce>>( - (acc, role) => { + login: (user, verifiedRoles, themePreference) => + set((state) => { + const nextVerifiedRoles = verifiedRoles ?? user.verifiedRoles ?? [user.role] + const nextVerificationStatus = + user.verificationStatus ?? + nextVerifiedRoles.reduce>>((acc, role) => { acc[role] = "approved" return acc - }, - {}, - ), - verificationReasons: {}, - notificationPrefs: state.notificationPrefs, - themePreference: themePreference ?? state.themePreference, - })), + }, {}) + + return { + isAuthenticated: true, + user, + currentRole: user.role, + verifiedRoles: nextVerifiedRoles, + verificationStatus: nextVerificationStatus, + verificationReasons: {}, + notificationPrefs: state.notificationPrefs, + themePreference: themePreference ?? state.themePreference, + } + }), logout: () => set({ isAuthenticated: false,