Mercurial > public > geoquiz
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 } |