// // BackgroundSettings.swift // Monal // // Created by Thilo Molitor on 14.11.22. // Copyright © 2022 monal-im.org. All rights reserved. // //swiftui is somehow needed to let the PhotosUI import succeed, even if it's already imported by SwiftuiHelpers.swift using @_exported import SwiftUI import PhotosUI @ViewBuilder func title(contact: ObservableKVOWrapper?) -> some View { if let contact = contact { Text("Select a background to display behind conversations with \(contact.contactDisplayName as String)") } else { Text("Select a default background to display behind conversations.") } } struct BackgroundSettings: View { @State private var selectedItem: PhotosPickerItem? = nil @State private var showingImagePicker = false @State private var inputImage: UIImage? let contact: ObservableKVOWrapper? init(contact: ObservableKVOWrapper?) { self.contact = contact _inputImage = State(initialValue:MLImageManager.sharedInstance().getBackgroundFor(self.contact?.obj)) } var body: some View { VStack { Form { Section(header:title(contact:contact)) { VStack(spacing: 20) { Spacer().frame(height: 0) PhotosPicker(selection:$selectedItem, matching:.images, photoLibrary:.shared()) { if let inputImage = inputImage { HStack(alignment: .center) { Image(uiImage:inputImage) .resizable() .aspectRatio(contentMode: .fit) .frame(maxWidth: .infinity, alignment: .center) } .addTopRight { Button(action: { self.inputImage = nil }, label: { Image(systemName: "xmark.circle.fill") .resizable() .frame(width: 32.0, height: 32.0) .accessibilityLabel(Text("Remove Background Image")) .symbolRenderingMode(.palette) .foregroundStyle(.white, .red) }) .buttonStyle(.borderless) .offset(x: 12, y: -12) } } else { Text("Select background image") .frame(maxWidth: .infinity, alignment: .center) } } .accessibilityLabel(Text("Change Background Image")) .onChange(of:selectedItem) { newItem in // Retrive selected asset in the form of Data newItem?.loadTransferable(type:Data.self) { result in guard let data = try? result.get() else { self.inputImage = nil return } guard let loadedImage = UIImage(data: data) else { self.inputImage = nil return } self.inputImage = loadedImage } } Spacer().frame(height: 0) } } } } .navigationBarTitle(contact != nil ? Text("Chat Background") : Text("Default Background")) .onChange(of:inputImage) { _ in MLImageManager.sharedInstance().saveBackgroundImageData(inputImage?.pngData(), for:self.contact?.obj) } } } struct BackgroundSettings_Previews: PreviewProvider { static var previews: some View { BackgroundSettings(contact:nil) } }