diff GeoQuiz/Components/UserProgressComponent.swift @ 16:1011e56b7832

implement user profile
author Dennis C. M. <dennis@denniscm.com>
date Thu, 20 Oct 2022 13:49:42 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GeoQuiz/Components/UserProgressComponent.swift	Thu Oct 20 13:49:42 2022 +0200
@@ -0,0 +1,82 @@
+//
+//  GameProgressHelper.swift
+//  GeoQuiz
+//
+//  Created by Dennis Concepción Martín on 20/10/22.
+//
+
+import SwiftUI
+
+struct UserProgress: View {
+    private let games: [(key: String, value: GameProgress)]
+    
+    var body: some View {
+        VStack(alignment: .leading) {
+            VStack(spacing: 10) {
+                ForEach(games, id: \.key) { game in
+                    HStack {
+                        Text(game.key)
+                            .font(.headline)
+                        
+                        Spacer()
+                        
+                        Text("\(game.value.highestScore) of \(game.value.numberOfQuestions)")
+                            .font(.caption)
+                            .foregroundColor(.secondary)
+                    }
+                    
+                    ProgressBar(pctScore: game.value.pctScore, gradient: game.value.gradient)
+                    
+                    if game.key != games.last!.key {
+                        Divider()
+                    }
+                }
+            }
+        }
+        .padding()
+        .background(
+            RoundedRectangle(cornerRadius: 20)
+                .foregroundColor(.white)
+        )
+    }
+    
+    init(playedGames: FetchedResults<PlayedGame>) {
+        let flagGames = playedGames.filter { $0.type == .guessTheFlag }
+        let capitalGames = playedGames.filter { $0.type == .guessTheCapital }
+        let countryGames = playedGames.filter { $0.type == .guessTheCountry }
+        let populationGames = playedGames.filter { $0.type == .guessThePopulation }
+        
+        self.games = [
+            GuessTheFlagInfo.name: GameProgress(
+                numberOfQuestions: GuessTheFlagInfo.numberOfQuestions,
+                highestScore: Int(flagGames.max { $0.score < $1.score }?.score ?? 0),
+                gradient: GuessTheFlagInfo.gradient
+            ),
+            GuessTheCapitalInfo.name: GameProgress(
+                numberOfQuestions: GuessTheCapitalInfo.numberOfQuestions,
+                highestScore: Int(capitalGames.max { $0.score < $1.score }?.score ?? 0),
+                gradient: GuessTheCapitalInfo.gradient
+            ),
+            GuessTheCountryInfo.name: GameProgress(
+                numberOfQuestions: GuessTheCountryInfo.numberOfQuestions,
+                highestScore: Int(countryGames.max { $0.score < $1.score }?.score ?? 0),
+                gradient: GuessTheCountryInfo.gradient
+            ),
+            GuessThePopulationInfo.name: GameProgress(
+                numberOfQuestions: GuessThePopulationInfo.numberOfQuestions,
+                highestScore: Int(populationGames.max { $0.score < $1.score }?.score ?? 0),
+                gradient: GuessThePopulationInfo.gradient
+            )
+        ].sorted { $0.value.pctScore > $1.value.pctScore }
+    }
+    
+    private struct GameProgress {
+        let numberOfQuestions: Int
+        let highestScore: Int
+        var pctScore: Double {
+            Double(highestScore) / Double(numberOfQuestions)
+        }
+        
+        let gradient: Gradient
+    }
+}