fix(auth): preserve backend roles on login

This commit is contained in:
zetaloop
2026-04-24 09:06:44 +08:00
parent ffb420f7e7
commit d59f7c6dc8
4 changed files with 22 additions and 18 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ export default function LoginPage() {
const onSubmit = async (data: z.infer<typeof loginSchema>) => { const onSubmit = async (data: z.infer<typeof loginSchema>) => {
try { try {
const user = await loginApi({ username: data.username, password: data.password }) const user = await loginApi({ username: data.username, password: data.password })
storeLogin(user, ["consumer", "player", "owner"]) storeLogin(user, user.verifiedRoles)
router.push("/") router.push("/")
} catch (err) { } catch (err) {
notifyInfo(toApiError(err).msg) notifyInfo(toApiError(err).msg)
+1 -1
View File
@@ -84,7 +84,7 @@ export default function RegisterPage() {
vcode: data.vcode, vcode: data.vcode,
requestId, requestId,
}) })
storeLogin(user, ["consumer"]) storeLogin(user, user.verifiedRoles ?? ["consumer"])
router.push("/") router.push("/")
} catch (err) { } catch (err) {
notifyInfo(toApiError(err).msg) notifyInfo(toApiError(err).msg)
+1 -1
View File
@@ -45,7 +45,7 @@ export function LoginDialog({ open, onOpenChange }: LoginDialogProps) {
const onSubmit = async (data: z.infer<typeof loginSchema>) => { const onSubmit = async (data: z.infer<typeof loginSchema>) => {
try { try {
const user = await loginApi({ username: data.username, password: data.password }) const user = await loginApi({ username: data.username, password: data.password })
storeLogin(user, ["consumer", "player", "owner"]) storeLogin(user, user.verifiedRoles)
consumePendingAction() consumePendingAction()
onOpenChange(false) onOpenChange(false)
} catch (err) { } catch (err) {
+15 -11
View File
@@ -125,23 +125,27 @@ export const useAuthStore = create<AuthState>((set, get) => ({
}, },
} }
}), }),
login: (user, verifiedRoles = ["consumer"], themePreference) => login: (user, verifiedRoles, themePreference) =>
set((state) => ({ set((state) => {
const nextVerifiedRoles = verifiedRoles ?? user.verifiedRoles ?? [user.role]
const nextVerificationStatus =
user.verificationStatus ??
nextVerifiedRoles.reduce<Partial<Record<UserRole, VerificationStatus>>>((acc, role) => {
acc[role] = "approved"
return acc
}, {})
return {
isAuthenticated: true, isAuthenticated: true,
user, user,
currentRole: user.role, currentRole: user.role,
verifiedRoles, verifiedRoles: nextVerifiedRoles,
verificationStatus: verifiedRoles.reduce<Partial<Record<UserRole, VerificationStatus>>>( verificationStatus: nextVerificationStatus,
(acc, role) => {
acc[role] = "approved"
return acc
},
{},
),
verificationReasons: {}, verificationReasons: {},
notificationPrefs: state.notificationPrefs, notificationPrefs: state.notificationPrefs,
themePreference: themePreference ?? state.themePreference, themePreference: themePreference ?? state.themePreference,
})), }
}),
logout: () => logout: () =>
set({ set({
isAuthenticated: false, isAuthenticated: false,