룰렛 변경

- 확률 수동 설정
- 여러개의 룰렛이 켜져있을 때 선택하여 돌리기
- 후원 히스토리에 룰렛 히스토리
This commit is contained in:
Yu Sung
2024-05-11 02:56:52 +09:00
parent 57abeea432
commit cab719c774
21 changed files with 339 additions and 265 deletions

View File

@@ -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