You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Apple/Sources/AllInApp/AllIn/ViewModels/CreationBetViewModel.swift

130 lines
5.0 KiB

//
// CreationBetViewModel.swift
// AllIn
//
// Created by Emre on 30/12/2023.
//
import Foundation
import SwiftUI
import DependencyInjection
import Model
class CreationBetViewModel: ObservableObject {
@Inject var manager: Manager
@Published var theme: String = ""
@Published var description: String = ""
@Published var isPrivate = false
@Published var endRegisterDate = Date()
@Published var endBetDate = Date()
@Published var betAdded = false
@Published var selectedOption = 0
@Published var themeFieldError: String?
@Published var descriptionFieldError: String?
@Published var endRegisterDateFieldError: String?
@Published var endBetDateFieldError: String?
@Published var errorMessage: String?
@Published var showErrorMessage = false
func create() {
guard checkAndSetError(forTheme: true, forDescription: true, forEndRegisterDate: true, forEndBetDate: true) else {
return
}
resetAllFieldErrors()
if let user = AppStateContainer.shared.user {
manager.addBet(bet: toBet(theme: theme, description: description, endRegister: endRegisterDate, endBet: endBetDate, isPrivate: isPrivate, status: .inProgress, creator: user.username, type: selectedOption)) { statusCode in
print(statusCode)
switch statusCode {
case 201:
self.betAdded = true
let notificationItem = NotificationItem(title: String(localized: "notification_title_end_bet_date"), content: String(localized: "notification_subtitle_end_bet_date \(self.theme)"), interval: self.endBetDate.timeIntervalSinceNow)
AppStateContainer.shared.notificationState.scheduleNotification(with: notificationItem)
default:
self.setErrorMessage(errorMessage: String(localized: "network_error_text"))
}
}
}
}
func checkAndSetError(forTheme checkTheme: Bool, forDescription checkDescription: Bool, forEndRegisterDate checkEndRegisterDate: Bool, forEndBetDate checkEndBetDate: Bool) -> Bool {
var newThemeFieldError: String?
var newDescriptionFieldError: String?
var newEndRegisterDateFieldError: String?
var newEndBetDateFieldError: String?
var hasError = false
// Theme
if checkTheme, theme.isEmpty {
newThemeFieldError = String(localized: "field_error_mandatory")
hasError = true
}
// Description
if checkDescription, description.isEmpty {
newDescriptionFieldError = String(localized: "field_error_mandatory")
hasError = true
}
// End Register Date
if checkEndRegisterDate, endRegisterDate < Date() {
newEndRegisterDateFieldError = String(localized: "bet_creation_error_past_date")
hasError = true
}
// End Bet Date
if checkEndBetDate, endBetDate < endRegisterDate {
newEndBetDateFieldError = String(localized: "bet_creation_error_date_order")
hasError = true
}
if !hasError {
// No error
return true
}
withAnimation {
themeFieldError = newThemeFieldError
descriptionFieldError = newDescriptionFieldError
endRegisterDateFieldError = newEndRegisterDateFieldError
endBetDateFieldError = newEndBetDateFieldError
}
return false
}
func resetAllFieldErrors() {
withAnimation {
themeFieldError = nil
descriptionFieldError = nil
endRegisterDateFieldError = nil
endBetDateFieldError = nil
}
}
func setErrorMessage(errorMessage: String) {
self.showErrorMessage = true
self.errorMessage = errorMessage
}
func toBet(theme: String, description: String, endRegister: Date, endBet: Date, isPrivate: Bool, status: BetStatus, creator: String, type: Int) -> Bet {
switch type {
case 0:
return BinaryBet(theme: theme, phrase: description, endRegisterDate: endRegister, endBetDate: endBet, isPrivate: isPrivate, status: status, invited: [], author: creator, registered: [])
case 1:
return MatchBet(theme: theme, phrase: description, endRegisterDate: endRegister, endBetDate: endBet, isPrivate: isPrivate, status: status, invited: [], author: creator, registered: [], nameTeam1: "", nameTeam2: "")
case 2:
return CustomBet(theme: theme, phrase: description, endRegisterDate: endRegister, endBetDate: endBet, isPrivate: isPrivate, status: status, invited: [], author: creator, registered: [])
default:
return BinaryBet(theme: theme, phrase: description, endRegisterDate: endRegister, endBetDate: endBet, isPrivate: isPrivate, status: status, invited: [], author: creator, registered: [])
}
}
}