comparison 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
comparison
equal deleted inserted replaced
18:d20cf93c9812 19:f140bb277c96
7 7
8 import SwiftUI 8 import SwiftUI
9 import PhotosUI 9 import PhotosUI
10 10
11 struct ProfileEditModalView: View { 11 struct ProfileEditModalView: View {
12 @ObservedObject var user: User 12 @ObservedObject var userController: UserController
13
14 @State var newUsername: String
15 @State private var selectedImageItem: PhotosPickerItem? = nil
16
13 @Environment(\.dismiss) var dismiss 17 @Environment(\.dismiss) var dismiss
14 18
15 @State private var selectedItem: PhotosPickerItem? = nil 19 init(user: UserController) {
20 self.userController = user
21 self._newUsername = State(initialValue: user.data.username)
22 }
16 23
17 var body: some View { 24 var body: some View {
18 NavigationStack { 25 NavigationStack {
19 Form { 26 Form {
20 Section { 27 Section {
21 HStack { 28 HStack {
22 Spacer() 29 Spacer()
23 ZStack { 30 PhotosPicker(
24 UserImage(uiImage: user.data.uiImage) 31 selection: $selectedImageItem,
25 .onChange(of: selectedItem) { newItem in 32 matching: .images,
26 Task { 33 photoLibrary: .shared()) {
27 if let data = try? await newItem?.loadTransferable(type: Data.self) { 34 UserImage(userController: userController)
28 user.data.imageData = data 35 .frame(height: 150)
29 } 36 .overlay(
37 Image(systemName: "camera.fill")
38 .foregroundColor(.white)
39 .font(.title)
40 .shadow(radius: 5)
41 )
42 }
43 .onChange(of: selectedImageItem) { newItem in
44 Task {
45 if let data = try? await newItem?.loadTransferable(type: Data.self) {
46 userController.data.imageData = data
30 } 47 }
31 } 48 }
32 49 }
33 PhotosPicker(
34 selection: $selectedItem,
35 matching: .images,
36 photoLibrary: .shared()) {
37 EmptyView()
38 }
39 }
40 50
41 Spacer() 51 Spacer()
42 } 52 }
43 } header: { 53 .listRowBackground(Color.clear)
44 Text("Profile image")
45 } 54 }
46 55
47 Section { 56 Section {
48 TextField("Enter a username", text: $user.data.username) 57 TextField("Enter a username", text: $newUsername)
49 } header: { 58 } header: {
50 Text("Username") 59 Text("Username")
51 } 60 }
61
52 } 62 }
53 .navigationTitle("Edit profile") 63 .navigationTitle("Edit profile")
54 .navigationBarTitleDisplayMode(.inline) 64 .navigationBarTitleDisplayMode(.inline)
55 .toolbar { 65 .toolbar {
66 ToolbarItem(placement: .cancellationAction) {
67 Button {
68 dismiss()
69 } label: {
70 Label("Exit", systemImage: "multiply")
71 }
72 }
73
56 ToolbarItem(placement: .navigationBarTrailing) { 74 ToolbarItem(placement: .navigationBarTrailing) {
57 Button("Done") { 75 Button {
76 userController.data.username = newUsername
58 dismiss() 77 dismiss()
78 } label: {
79 Text("Done")
59 } 80 }
81 .disabled(newUsername.isEmpty)
60 } 82 }
61 } 83 }
62 } 84 }
63 } 85 }
64 } 86 }
65 87
66 struct ProfileEditModalView_Previews: PreviewProvider { 88 struct ProfileEditModalView_Previews: PreviewProvider {
67 static var previews: some View { 89 static var previews: some View {
68 ProfileEditModalView(user: User()) 90 ProfileEditModalView(user: UserController())
69 } 91 }
70 } 92 }