intuit/CardParts

reload specific card inside CardPartsViewController by calling loadSpecificCards

zhenyiy opened this issue · 0 comments

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()
                  }
        }
        
    }
}