// // HeaderStatsView.swift // Feels // // Created by Trey Tartt on 1/8/22. // import SwiftUI import Charts struct HeaderStatsView : UIViewRepresentable { //Bar chart accepts data as array of BarChartDataEntry objects var entries : [BarChartDataEntry] init(fakeData: Bool, backDays: Int) { entries = [BarChartDataEntry]() var moodEntries: [MoodEntry]? if fakeData { moodEntries = PersistenceController.shared.randomEntries(count: 10) } else { var daysAgo = Calendar.current.date(byAdding: .day, value: -backDays, to: Date())! daysAgo = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: daysAgo)! moodEntries = PersistenceController.shared.getData(startDate: daysAgo, endDate: Date(), includedDays: [1,2,3,4,5,6,7]) } if let moodEntries = moodEntries { for (index, mood) in Mood.allValues.enumerated() { entries.append(BarChartDataEntry(x: Double(index + 1), y: Double(moodEntries.filter({ Int($0.moodValue) == mood.rawValue }).count))) } } } // this func is required to conform to UIViewRepresentable protocol func makeUIView(context: Context) -> BarChartView { //crate new chart let chart = BarChartView() chart.drawGridBackgroundEnabled = false chart.drawValueAboveBarEnabled = false chart.xAxis.drawAxisLineEnabled = false chart.xAxis.labelTextColor = .clear chart.rightAxis.drawAxisLineEnabled = false chart.rightAxis.labelTextColor = .clear chart.leftAxis.drawAxisLineEnabled = false chart.leftAxis.labelTextColor = .clear chart.xAxis.drawGridLinesEnabled = false chart.leftAxis.drawGridLinesEnabled = false chart.leftAxis.axisLineColor = .clear chart.rightAxis.axisLineColor = .clear chart.legend.textColor = .clear chart.legend.enabled = false chart.drawBordersEnabled = false chart.drawMarkers = false // chart.yAxis.drawGridLinesEnabled = false chart.rightAxis.drawGridLinesEnabled = false chart.borderColor = .clear //it is convenient to form chart data in a separate func chart.data = addData() return chart } // this func is required to conform to UIViewRepresentable protocol func updateUIView(_ uiView: BarChartView, context: Context) { //when data changes chartd.data update is required uiView.data = addData() } func addData() -> BarChartData{ let data = BarChartData() //BarChartDataSet is an object that contains information about your data, styling and more let dataSet = BarChartDataSet(entries: entries) // change bars color to green dataSet.colors = Mood.allValues.map({ NSUIColor( $0.color ) }) //change data label data.append(dataSet) return data } typealias UIViewType = BarChartView } struct HeaderStatsView_Previews: PreviewProvider { static var previews: some View { HeaderStatsView(fakeData: true, backDays: 30).frame(minHeight: 85, maxHeight: 90) } }