diff --git a/suixinkan/UI/Profile/AccountSwitchViewController.swift b/suixinkan/UI/Profile/AccountSwitchViewController.swift index a4adeeb..91dfaa9 100644 --- a/suixinkan/UI/Profile/AccountSwitchViewController.swift +++ b/suixinkan/UI/Profile/AccountSwitchViewController.swift @@ -120,6 +120,16 @@ final class AccountSwitchViewController: BaseViewController, UITableViewDelegate navigationController?.popViewController(animated: true) return } + if account.requiresDeregistrationConfirmation { + present( + makeDeregistrationLoginAlert(account: account) { [weak self] in + guard let self else { return } + Task { await self.switchAccount(account) } + }, + animated: true + ) + return + } Task { await switchAccount(account) } } diff --git a/suixinkanTests/AccountSwitchViewModelTests.swift b/suixinkanTests/AccountSwitchViewModelTests.swift index d4a78b4..95f97bf 100644 --- a/suixinkanTests/AccountSwitchViewModelTests.swift +++ b/suixinkanTests/AccountSwitchViewModelTests.swift @@ -47,6 +47,34 @@ final class AccountSwitchViewModelTests: XCTestCase { XCTAssertEqual(viewModel.selectedAccount?.businessUserId, 9001) } + func testSwitchableAccountsPreserveCoolingOffStoreStatus() async throws { + let json = """ + { + "code": 100000, + "msg": "success", + "data": { + "store_users": [ + { + "account_type": "store_user", + "store_user_id": 2001, + "store_name": "冷静期门店", + "status": 2 + } + ] + } + } + """.data(using: .utf8)! + + let session = MockURLSession(responses: [json]) + let api = ProfileAPI(client: APIClient(environment: .testing, session: session)) + let viewModel = AccountSwitchViewModel() + + try await viewModel.load(api: api, force: true) + + XCTAssertEqual(viewModel.accounts.first?.status, 2) + XCTAssertTrue(viewModel.accounts.first?.requiresDeregistrationConfirmation == true) + } + func testSwitchAccountThrowsWhenBusinessUserIdInvalid() async { let viewModel = AccountSwitchViewModel() let account = AccountSwitchAccount(