import Foundation
import DynamicSDKSwift
import Combine
@MainActor
class SessionManager: ObservableObject {
@Published var user: UserProfile?
@Published var token: String?
@Published var wallets: [BaseWallet] = []
@Published var isAuthenticated = false
@Published var isCreatingWallets = false
private let sdk = DynamicSDK.instance()
private var cancellables = Set<AnyCancellable>()
func startListening() {
// Initialize with current state
user = sdk.auth.authenticatedUser
token = sdk.auth.token
wallets = sdk.wallets.userWallets
isAuthenticated = user != nil
// Check if wallets are being created
if user != nil && wallets.isEmpty {
isCreatingWallets = true
}
// Listen for user changes
sdk.auth.authenticatedUserChanges
.receive(on: DispatchQueue.main)
.sink { [weak self] newUser in
guard let self else { return }
self.user = newUser
self.isAuthenticated = newUser != nil
if newUser == nil {
// User logged out
self.wallets = []
self.isCreatingWallets = false
} else if self.wallets.isEmpty {
// User just authenticated, wallets being created
self.isCreatingWallets = true
}
}
.store(in: &cancellables)
// Listen for token changes
sdk.auth.tokenChanges
.receive(on: DispatchQueue.main)
.sink { [weak self] newToken in
self?.token = newToken
}
.store(in: &cancellables)
// Listen for wallet changes
sdk.wallets.userWalletsChanges
.receive(on: DispatchQueue.main)
.sink { [weak self] newWallets in
guard let self else { return }
self.wallets = newWallets
// Wallets appeared, stop showing loading
if !newWallets.isEmpty {
self.isCreatingWallets = false
}
}
.store(in: &cancellables)
}
func logout() async {
do {
try await sdk.auth.logout()
// State updates handled by authenticatedUserChanges
} catch {
print("Logout failed: \(error)")
}
}
func showUserProfile() {
sdk.ui.showUserProfile()
}
}