73 lines
2.3 KiB
Swift
73 lines
2.3 KiB
Swift
import Foundation
|
|
import Combine
|
|
import SwiftUI
|
|
|
|
class CardManager: ObservableObject {
|
|
@Published var userCards: [Card] = []
|
|
@Published var isLoading = false
|
|
@Published var errorMessage: String?
|
|
@Published var currentDraw: CardDrawResult?
|
|
@Published var isDrawing = false
|
|
|
|
private var cancellables = Set<AnyCancellable>()
|
|
private let apiClient = APIClient.shared
|
|
|
|
func loadUserCards(userDid: String) {
|
|
isLoading = true
|
|
|
|
apiClient.getUserCards(userDid: userDid)
|
|
.receive(on: DispatchQueue.main)
|
|
.sink(
|
|
receiveCompletion: { [weak self] completion in
|
|
self?.isLoading = false
|
|
if case .failure(let error) = completion {
|
|
self?.errorMessage = self?.getErrorMessage(from: error)
|
|
}
|
|
},
|
|
receiveValue: { [weak self] cards in
|
|
self?.userCards = cards
|
|
}
|
|
)
|
|
.store(in: &cancellables)
|
|
}
|
|
|
|
func drawCard(userDid: String, isPaid: Bool = false) {
|
|
isDrawing = true
|
|
errorMessage = nil
|
|
|
|
apiClient.drawCard(userDid: userDid, isPaid: isPaid)
|
|
.receive(on: DispatchQueue.main)
|
|
.sink(
|
|
receiveCompletion: { [weak self] completion in
|
|
if case .failure(let error) = completion {
|
|
self?.isDrawing = false
|
|
self?.errorMessage = self?.getErrorMessage(from: error)
|
|
}
|
|
},
|
|
receiveValue: { [weak self] result in
|
|
self?.currentDraw = result
|
|
// アニメーション終了後にカードを追加
|
|
}
|
|
)
|
|
.store(in: &cancellables)
|
|
}
|
|
|
|
func completeCardDraw() {
|
|
if let newCard = currentDraw?.card {
|
|
userCards.append(newCard)
|
|
}
|
|
currentDraw = nil
|
|
isDrawing = false
|
|
}
|
|
|
|
private func getErrorMessage(from error: APIError) -> String {
|
|
switch error {
|
|
case .unauthorized:
|
|
return "認証が必要です"
|
|
case .networkError:
|
|
return "ネットワークエラーが発生しました"
|
|
default:
|
|
return "エラーが発生しました"
|
|
}
|
|
}
|
|
} |