intuit / CardParts

A reactive, card-based UI framework built on UIKit for iOS developers.
Other
2.52k stars 224 forks source link

reload specific card inside CardPartsViewController by calling loadSpecificCards #280

Open zhenyiy opened 2 years ago

zhenyiy commented 2 years ago

I'd like to reload one specific card after I get the data update from an async restful process. However, loadSpecificCards function is not available under the CardPartsViewController. I am wondering what's the correct method to achieve that. Also, I am wondering what the "indexPath" in the function is. Is it possible for someone to give an example? Thank you very much!

import Foundation
import CardParts
import RxSwift

class CardRecommendationController: CardPartsViewController {

    private var diseaseClient: DiseaseClient?
    private var progressManager: ProgressManager?
    private var currentPage = 0
    private var timer: Timer?

    let cardPartTextView = CardPartTextView(type: .normal)
    var recommendations = BehaviorSubject(value: ["1", "2"])
    var recommendationImages: [UIImage?] = [UIImage(systemName: "heart"), UIImage(systemName: "lungs")]
    let imageRecommendation = CardPartImageView()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.progressManager = ProgressManager()
        self.diseaseClient = DiseaseClient()

        cardPartTextView.text = "Top Health Threats in the Country"
        cardPartTextView.font = UIFont.systemFont(ofSize: 18)
        cardPartTextView.textColor = .darkGray

        self.diseaseClient?.getDiseaseData(country: "US"){[unowned self] (diseaseData, error) in
                  if error != nil {
                    self.progressManager?.stopLoading()
                    return
                  }
                  if let diseaseData = diseaseData {
                    let viewModel3 = DiseaseViewModel(model: diseaseData)
                      viewModel3.cause.asObservable().bind(to: recommendations).disposed(by: bag)
                      var stackViews: [CardPartStackView] = []
                      do {
                          for (index, recommedationString) in try recommendations.value().enumerated() {

                              let sv = CardPartStackView()
                              sv.axis = .vertical
                              sv.spacing = 8
                              stackViews.append(sv)

                              let strs = recommedationString.components(separatedBy: "|")

                              let image = CardPartImageView()
                              image.image = recommendationImages[index]
                              image.contentMode = .scaleAspectFit
                              image.tintColor = .lightGray
                              sv.addArrangedSubview(image)

                              let recom1 = CardPartTextView(type: .normal)
                              recom1.text = String(index * 5 + 1) + ". " + strs[0]
                              recom1.textAlignment = .center
                              sv.addArrangedSubview(recom1)

                              let recom2 = CardPartTextView(type: .normal)
                              recom2.text = String(index * 5 + 2) + ". " + strs[1]
                              recom2.textAlignment = .center
                              sv.addArrangedSubview(recom2)

                              let recom3 = CardPartTextView(type: .normal)
                              recom3.text = String(index * 5 + 3) + ". " + strs[2]
                              recom3.textAlignment = .center
                              sv.addArrangedSubview(recom3)

                              let recom4 = CardPartTextView(type: .normal)
                              recom4.text = String(index * 5 + 4) + ". " + strs[3]
                              recom4.textAlignment = .center
                              sv.addArrangedSubview(recom4)

                              let recom5 = CardPartTextView(type: .normal)
                              recom5.text = String(index * 5 + 5) + ". " + strs[4]
                              recom5.textAlignment = .center
                              sv.addArrangedSubview(recom5)
                          }
                      } catch {

                      }

                      let cardPartPagedView = CardPartPagedView(withPages: stackViews, andHeight: 200)

                      // To animate through the pages
                      timer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true, block: {[weak self] (_) in

                          guard let this = self else { return }
                          do {
                              let recomSize = try this.recommendations.value().count
                              this.currentPage = this.currentPage == recomSize - 1 ? 0 : this.currentPage + 1
                          } catch{

                          }
                          cardPartPagedView.moveToPage(this.currentPage)
                      })

                      setupCardParts([cardPartTextView, cardPartPagedView])

                     // I want to call loadSpecificCards(cards: <#T##[CardController]#>, indexPaths: <#T##[IndexPath]#>) method here 
                    //  but it is not available for CardPartsViewController. What should be the best practice?

                      self.progressManager?.stopLoading()
                  }
        }

    }
}