TSGenmojiGennerateViewModel.swift 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //
  2. // Untitled.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/1/17.
  6. //
  7. import Combine
  8. import Alamofire
  9. enum TSProgressState {
  10. case none
  11. case start
  12. case pending
  13. case progress(CGFloat)
  14. case progressString(String)
  15. case success(Any?)
  16. case failed(String)
  17. static func fromKeyValue(key string: String,value:String) -> TSProgressState {
  18. if string == "none" {
  19. return .none
  20. } else if string == "start" {
  21. return .start
  22. } else if string == "pending" {
  23. return .pending
  24. }else if string == "progress" {
  25. var progress = 0.0
  26. if let doubleValue = Float(value) {
  27. progress = CGFloat(doubleValue)
  28. }
  29. return .progress(progress)
  30. }else if string == "progressString" {
  31. return .progressString(value)
  32. }else if string == "success" {
  33. return .success(value)
  34. }else if string == "failed" {
  35. return .failed(value)
  36. }else{
  37. return .none
  38. }
  39. }
  40. var keyValue:(String,String){
  41. switch self {
  42. case .none:
  43. return ("none","")
  44. case .start:
  45. return ("start","")
  46. case .pending:
  47. return ("pending","")
  48. case .progress(let float):
  49. return ("progress",String(Float(float)))
  50. case .progressString(let string):
  51. return ("progressString",string)
  52. case .success(let string):
  53. if let string = string as? String{
  54. return ("success",string)
  55. }
  56. return ("success","")
  57. case .failed(let string):
  58. return ("failed",string)
  59. }
  60. }
  61. var isResult:Bool{
  62. switch self {
  63. case .none:
  64. return false
  65. case .start:
  66. return false
  67. case .pending:
  68. return false
  69. case .progress(_):
  70. return false
  71. case .progressString(_):
  72. return false
  73. case .success(_):
  74. return true
  75. case .failed(_):
  76. return true
  77. }
  78. }
  79. var reslutSuccess:Bool{
  80. switch self {
  81. case .success(_):
  82. return true
  83. case .failed(_):
  84. return false
  85. default:
  86. return false
  87. }
  88. }
  89. var reloadNewData:Bool{
  90. switch self {
  91. case .pending,.success(_),.failed(_):
  92. return true
  93. default:
  94. return false
  95. }
  96. }
  97. }
  98. class TSGenmojiGennerateViewModel {
  99. var creatRequest:Request?
  100. var queryRequest:Request?
  101. var stopNetwork = false
  102. @Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil)
  103. var aiText:String = ""
  104. var generatingProgress = 0
  105. func creatImageEmoji(text:String) {
  106. stopNetwork = false
  107. aiText = text
  108. generatingProgress = 0
  109. stateDatauPblished = (.start,nil)
  110. stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
  111. creatRequest = TSNetworkShared.post(urlType: .imageEmoji,parameters: ["prompt":text,"device":getUserInfoJsonString()]) { [weak self] data,error in
  112. guard let self = self else { return }
  113. if let dataDict = kNetWorkCodeSuccess(data: data),
  114. let actionId = dataDict["actionId"] as? Int{
  115. if stopNetwork == false {
  116. self.getActionInfo(action_id:actionId)
  117. }
  118. }else{
  119. self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
  120. }
  121. }
  122. }
  123. func getActionInfo(action_id:Int){
  124. queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
  125. guard let self = self else { return }
  126. if let result = kNetWorkResultSuccess(data: data) {
  127. if let genmojiModel = TSActionInfoModel(JSON: result) {
  128. switch genmojiModel.actionStatus {
  129. case .success:
  130. TSToastShared.hideLoading()
  131. self.stateDatauPblished = (.success(nil),genmojiModel)
  132. generatingProgress = 0
  133. case .failed:
  134. self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
  135. generatingProgress = 0
  136. default:
  137. stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
  138. if stopNetwork == false {
  139. kDelayOnMainThread(1.0) {
  140. self.getActionInfo(action_id: action_id)
  141. }
  142. }
  143. }
  144. }
  145. }else{
  146. self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
  147. }
  148. }
  149. }
  150. func cancelAllRequest(){
  151. creatRequest?.cancel()
  152. queryRequest?.cancel()
  153. stopNetwork = true
  154. }
  155. func generating(progress:Float) -> String {
  156. //Generating 0%-100%
  157. var progressInt = Int(progress*100)
  158. if progressInt > 99 {
  159. progressInt = 99
  160. }
  161. generatingProgress = progressInt
  162. return "Generating".localized + " \(progressInt)%"
  163. }
  164. }