룰렛 변경
- 확률 수동 설정 - 여러개의 룰렛이 켜져있을 때 선택하여 돌리기 - 후원 히스토리에 룰렛 히스토리
This commit is contained in:
@@ -151,7 +151,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
@Published var isShowRouletteSettings = false
|
||||
|
||||
@Published var isShowRoulettePreview = false
|
||||
@Published var roulettePreview: RoulettePreview? = nil
|
||||
@Published var roulettePreviewList = [RoulettePreview]()
|
||||
|
||||
@Published var isShowRoulette = false
|
||||
@Published var rouletteItems = [String]()
|
||||
@@ -1456,6 +1456,7 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
|
||||
func showRoulette() {
|
||||
if let liveRoomInfo = liveRoomInfo, !isLoading {
|
||||
self.roulettePreviewList.removeAll()
|
||||
isLoading = true
|
||||
|
||||
rouletteRepository.getRoulette(creatorId: liveRoomInfo.creatorId)
|
||||
@@ -1472,10 +1473,14 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
|
||||
do {
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let decoded = try jsonDecoder.decode(ApiResponse<GetRouletteResponse>.self, from: responseData)
|
||||
let decoded = try jsonDecoder.decode(ApiResponse<[GetRouletteResponse]>.self, from: responseData)
|
||||
|
||||
if let data = decoded.data, decoded.success, !data.items.isEmpty {
|
||||
self.roulettePreview = RoulettePreview(can: data.can, items: calculatePercentages(options: data.items))
|
||||
if let data = decoded.data, decoded.success, !data.isEmpty {
|
||||
let roulettePreviewList = data
|
||||
.filter { $0.isActive }
|
||||
.filter { !$0.items.isEmpty}
|
||||
.map { RoulettePreview(id: $0.id, can: $0.can, items: calculatePercentages(options: $0.items)) }
|
||||
self.roulettePreviewList.append(contentsOf: roulettePreviewList)
|
||||
self.isShowRoulettePreview = true
|
||||
} else {
|
||||
if let message = decoded.message {
|
||||
@@ -1494,10 +1499,10 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
func spinRoulette() {
|
||||
func spinRoulette(rouletteId: Int) {
|
||||
if !isLoading {
|
||||
isLoading = true
|
||||
rouletteRepository.spinRoulette(request: SpinRouletteRequest(roomId: AppState.shared.roomId))
|
||||
rouletteRepository.spinRoulette(request: SpinRouletteRequest(roomId: AppState.shared.roomId, rouletteId: rouletteId))
|
||||
.sink { result in
|
||||
switch result {
|
||||
case .finished:
|
||||
@@ -1511,11 +1516,15 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
|
||||
do {
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let decoded = try jsonDecoder.decode(ApiResponse<GetRouletteResponse>.self, from: responseData)
|
||||
let decoded = try jsonDecoder.decode(ApiResponse<SpinRouletteResponse>.self, from: responseData)
|
||||
|
||||
if let data = decoded.data, decoded.success, !data.items.isEmpty {
|
||||
UserDefaults.set(UserDefaults.int(forKey: .can) - data.can, forKey: .can)
|
||||
randomSelectRouletteItem(can: data.can, items: data.items)
|
||||
self.rouletteItems.removeAll()
|
||||
self.rouletteItems.append(contentsOf: data.items.map { $0.title })
|
||||
self.rouletteSelectedItem = data.result
|
||||
self.rouletteCan = data.can
|
||||
self.isShowRoulette = true
|
||||
} else {
|
||||
if let message = decoded.message {
|
||||
self.errorMessage = message
|
||||
@@ -1574,35 +1583,13 @@ final class LiveRoomViewModel: NSObject, ObservableObject {
|
||||
}
|
||||
|
||||
private func calculatePercentages(options: [RouletteItem]) -> [RoulettePreviewItem] {
|
||||
let totalWeight = options.reduce(0) { $0 + $1.weight }
|
||||
let updatedOptions = options.map { option in
|
||||
let percent = floor(Double(option.weight) / Double(totalWeight) * 10000) / 100
|
||||
return RoulettePreviewItem(title: option.title, percent: "\(String(format: "%.2f", percent))%")
|
||||
return RoulettePreviewItem(title: option.title, percent: "\(String(format: "%.2f", option.percentage))%")
|
||||
}
|
||||
|
||||
return updatedOptions
|
||||
}
|
||||
|
||||
private func randomSelectRouletteItem(can: Int, items: [RouletteItem]) {
|
||||
isLoading = true
|
||||
|
||||
var rouletteItems = [String]()
|
||||
items.forEach {
|
||||
var i = 1
|
||||
while (i < $0.weight * 10) {
|
||||
rouletteItems.append($0.title)
|
||||
i += 1
|
||||
}
|
||||
}
|
||||
|
||||
isLoading = false
|
||||
self.rouletteItems.removeAll()
|
||||
self.rouletteItems.append(contentsOf: items.map { $0.title })
|
||||
self.rouletteSelectedItem = rouletteItems.randomElement()!
|
||||
self.rouletteCan = can
|
||||
self.isShowRoulette = true
|
||||
}
|
||||
|
||||
private func refundRouletteDonation() {
|
||||
isLoading = true
|
||||
|
||||
|
Reference in New Issue
Block a user