修复账号切换后「我的」页当前账号展示错误,并统一举报摄影师首页 URI。

切换账号时以用户选中账号为准写入展示标题与业务作用域,避免沿用旧门店名称;同时将首页举报摄影师入口 URI 对齐为 report_photographer。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-01 17:21:04 +08:00
parent fcb86d43f5
commit 5ab9b1b324
23 changed files with 419 additions and 92 deletions

View File

@ -76,6 +76,14 @@ struct AccountSwitchAccount: Identifiable, Hashable {
}
return SetUserRequest(ssUserId: businessUserId)
}
/// ID
var preferredScopeSelection: (scenicId: Int?, storeId: Int?) {
if isStoreUser {
return (scenicId, storeId)
}
return (scenicId, nil)
}
}
/// token
@ -100,9 +108,9 @@ struct V9AuthResponse: Decodable, Equatable {
scenicUsers.map { $0.toAccountSwitchAccount() } + storeUsers.map { $0.toAccountSwitchAccount() }
}
///
/// 使 isCurrent
var primaryProfile: AccountProfile? {
if let storeUser = storeUsers.first(where: \.isCurrent) ?? storeUsers.first {
if let storeUser = resolvedCurrentStoreUser {
return AccountProfile(
userId: String(storeUser.userId),
displayName: storeUser.displayName,
@ -111,7 +119,7 @@ struct V9AuthResponse: Decodable, Equatable {
)
}
if let scenicUser = scenicUsers.first(where: \.isCurrent) ?? scenicUsers.first {
if let scenicUser = resolvedCurrentScenicUser {
return AccountProfile(
userId: String(scenicUser.userId),
displayName: scenicUser.displayName,
@ -123,6 +131,60 @@ struct V9AuthResponse: Decodable, Equatable {
return nil
}
/// ID/
var currentAccountIdentity: (accountType: String, businessUserId: Int)? {
if let storeUser = resolvedCurrentStoreUser {
return (storeUser.accountType, storeUser.businessUserId)
}
if let scenicUser = resolvedCurrentScenicUser {
return (scenicUser.accountType, scenicUser.businessUserId)
}
return nil
}
/// ID/
var preferredScopeSelection: (scenicId: Int?, storeId: Int?) {
if let storeUser = resolvedCurrentStoreUser {
return (
storeUser.scenicId > 0 ? storeUser.scenicId : nil,
storeUser.storeId > 0 ? storeUser.storeId : nil
)
}
if let scenicUser = resolvedCurrentScenicUser {
return (scenicUser.scenicId > 0 ? scenicUser.scenicId : nil, nil)
}
return (nil, nil)
}
///
var currentAccountDisplayTitle: String? {
if let storeUser = resolvedCurrentStoreUser {
return storeUser.displayName.nonEmpty
}
if let scenicUser = resolvedCurrentScenicUser {
return scenicUser.displayName.nonEmpty
}
return nil
}
/// isCurrent isCurrent 退
private var resolvedCurrentStoreUser: V9StoreUser? {
if let current = storeUsers.first(where: \.isCurrent) {
return current
}
guard !scenicUsers.contains(where: \.isCurrent) else { return nil }
return storeUsers.first
}
/// isCurrent isCurrent 退
private var resolvedCurrentScenicUser: V9ScenicUser? {
if let current = scenicUsers.first(where: \.isCurrent) {
return current
}
guard !storeUsers.contains(where: \.isCurrent) else { return nil }
return scenicUsers.first
}
///
var scenicScopes: [BusinessScope] {
var seen = Set<Int>()
@ -159,10 +221,10 @@ struct V9AuthResponse: Decodable, Equatable {
/// app_role_code
var currentAccountRoleCode: String? {
if let storeUser = storeUsers.first(where: \.isCurrent) ?? storeUsers.first {
if let storeUser = resolvedCurrentStoreUser {
return nonEmpty(storeUser.resolvedAppRoleCode)
}
if let scenicUser = scenicUsers.first(where: \.isCurrent) ?? scenicUsers.first {
if let scenicUser = resolvedCurrentScenicUser {
return nonEmpty(scenicUser.resolvedAppRoleCode)
}
return nil

View File

@ -179,7 +179,7 @@ struct LoginView: View {
do {
try await globalLoading.withLoading(message: "账号切换中...") {
let response = try await viewModel.selectAccount(account, authAPI: authAPI)
await completeLogin(with: response)
await completeLogin(with: response, selectedAccount: account)
}
} catch is CancellationError {
// Keep cancellation silent; the current task was abandoned by SwiftUI.
@ -190,7 +190,7 @@ struct LoginView: View {
}
///
private func completeLogin(with response: V9AuthResponse) async {
private func completeLogin(with response: V9AuthResponse, selectedAccount: AccountSwitchAccount? = nil) async {
do {
try await authSessionCoordinator.completeLogin(
with: response,
@ -200,7 +200,8 @@ struct LoginView: View {
accountContext: accountContext,
permissionContext: permissionContext,
profileAPI: profileAPI,
accountContextAPI: accountContextAPI
accountContextAPI: accountContextAPI,
selectedAccount: selectedAccount
)
} catch {
toastCenter.show(error.localizedDescription)