diff GeoQuiz/ProfileEditModalView.swift @ 19:f140bb277c96

refactor code
author Dennis C. M. <dennis@denniscm.com>
date Sun, 23 Oct 2022 00:11:38 +0100
parents 1011e56b7832
children b145c408f791
line wrap: on
line diff
--- a/GeoQuiz/ProfileEditModalView.swift	Sat Oct 22 08:56:54 2022 +0100
+++ b/GeoQuiz/ProfileEditModalView.swift	Sun Oct 23 00:11:38 2022 +0100
@@ -9,10 +9,17 @@
 import PhotosUI
 
 struct ProfileEditModalView: View {
-    @ObservedObject var user: User
+    @ObservedObject var userController: UserController
+    
+    @State var newUsername: String
+    @State private var selectedImageItem: PhotosPickerItem? = nil
+    
     @Environment(\.dismiss) var dismiss
     
-    @State private var selectedItem: PhotosPickerItem? = nil
+    init(user: UserController) {
+        self.userController = user
+        self._newUsername = State(initialValue: user.data.username)
+    }
     
     var body: some View {
         NavigationStack {
@@ -20,43 +27,58 @@
                 Section {
                     HStack {
                         Spacer()
-                        ZStack {
-                            UserImage(uiImage: user.data.uiImage)
-                                .onChange(of: selectedItem) { newItem in
-                                    Task {
-                                        if let data = try? await newItem?.loadTransferable(type: Data.self) {
-                                            user.data.imageData = data
-                                        }
+                        PhotosPicker(
+                            selection: $selectedImageItem,
+                            matching: .images,
+                            photoLibrary: .shared()) {
+                                UserImage(userController: userController)
+                                    .frame(height: 150)
+                                    .overlay(
+                                        Image(systemName: "camera.fill")
+                                            .foregroundColor(.white)
+                                            .font(.title)
+                                            .shadow(radius: 5)
+                                    )
+                            }
+                            .onChange(of: selectedImageItem) { newItem in
+                                Task {
+                                    if let data = try? await newItem?.loadTransferable(type: Data.self) {
+                                        userController.data.imageData = data
                                     }
                                 }
-                            
-                            PhotosPicker(
-                                selection: $selectedItem,
-                                matching: .images,
-                                photoLibrary: .shared()) {
-                                    EmptyView()
-                                }
-                        }
+                            }
                         
                         Spacer()
                     }
-                } header: {
-                    Text("Profile image")
+                    .listRowBackground(Color.clear)
                 }
                 
                 Section {
-                    TextField("Enter a username", text: $user.data.username)
+                    TextField("Enter a username", text: $newUsername)
                 } header: {
                     Text("Username")
                 }
+                
             }
             .navigationTitle("Edit profile")
             .navigationBarTitleDisplayMode(.inline)
             .toolbar {
+                ToolbarItem(placement: .cancellationAction) {
+                    Button {
+                        dismiss()
+                    } label: {
+                        Label("Exit", systemImage: "multiply")
+                    }
+                }
+                
                 ToolbarItem(placement: .navigationBarTrailing) {
-                    Button("Done") {
+                    Button {
+                        userController.data.username = newUsername
                         dismiss()
+                    } label: {
+                        Text("Done")
                     }
+                    .disabled(newUsername.isEmpty)
                 }
             }
         }
@@ -65,6 +87,6 @@
 
 struct ProfileEditModalView_Previews: PreviewProvider {
     static var previews: some View {
-        ProfileEditModalView(user: User())
+        ProfileEditModalView(user: UserController())
     }
 }