taler-ios

iOS apps for GNU Taler (wallet)
Log | Files | Refs | README | LICENSE

CopyShare.swift (3886B)


      1 /*
      2  * This file is part of GNU Taler, ©2022-25 Taler Systems S.A.
      3  * See LICENSE.md
      4  */
      5 /**
      6  * @author Marc Stibane
      7  */
      8 import UniformTypeIdentifiers
      9 import SwiftUI
     10 import SymLog
     11 
     12 struct CopyButton: View {
     13     private let symLog = SymLogV(0)
     14     let textToCopy: String
     15     let image: UIImage?
     16     let vertical: Bool
     17     let title: String?
     18 
     19     @Environment(\.isEnabled) private var isEnabled: Bool
     20     @EnvironmentObject private var controller: Controller
     21 
     22     init(textToCopy: String, vertical: Bool, image: UIImage? = nil) {
     23         self.textToCopy = textToCopy
     24         self.image = image
     25         self.vertical = vertical
     26         self.title = nil
     27     }
     28 
     29     init(textToCopy: String, title: String, image: UIImage? = nil) {
     30         self.textToCopy = textToCopy
     31         self.image = image
     32         self.vertical = false
     33         self.title = title
     34     }
     35 
     36     func copyAction() -> Void {
     37         symLog.log(textToCopy)
     38         controller.hapticFeedback(.medium)
     39         let strings = [UTType.plainText.identifier : textToCopy]
     40         var items: [[String : Any]] = [strings]
     41         if let image {
     42             let images = [UTType.image.identifier : image]
     43             items.append(images)
     44         }
     45         UIPasteboard.general.setItems(items)
     46     }
     47 
     48     var body: some View {
     49         Button(action: copyAction) {
     50             if vertical {
     51                 VStack {
     52                     let shortCopy = String(localized: "Copy.short", defaultValue: "Copy", comment: "5 letters max, else abbreviate")
     53                     Image(systemName: "doc.on.doc")
     54                         .accessibility(hidden: true)
     55                     Text(shortCopy)
     56                 }
     57             } else {
     58                 let longCopy = String(localized: "Copy.long", defaultValue: "Copy", comment: "may be a bit longer")
     59                 HStack {
     60                     Image(systemName: "doc.on.doc")
     61                         .accessibility(hidden: true)
     62                     Text(title ?? longCopy)
     63                 }
     64             }
     65         }
     66         .tint(.accentColor)
     67         .talerFont(.body)
     68         .disabled(!isEnabled)
     69     }
     70 }
     71 // MARK: -
     72 @MainActor
     73 struct ShareButton: View {
     74     private let symLog = SymLogV(0)
     75     let textToShare: String
     76     let image: UIImage?
     77     let title: String
     78 
     79     init(textToShare: String, image: UIImage? = nil) {
     80         self.textToShare = textToShare
     81         self.image = image
     82         self.title = String(localized: "Share")
     83     }
     84     init(textToShare: String, title: String, image: UIImage? = nil) {
     85         self.textToShare = textToShare
     86         self.image = image
     87         self.title = title
     88     }
     89 
     90     @Environment(\.isEnabled) private var isEnabled: Bool
     91     @EnvironmentObject private var controller: Controller
     92 
     93     func shareAction() -> Void {
     94         symLog.log(textToShare)
     95         controller.hapticFeedback(.soft)
     96         ShareSheet.shareSheet(textToShare: textToShare, image: image)
     97     }
     98 
     99     var body: some View {
    100         Button(action: shareAction) {
    101             HStack {
    102                 Image(systemName: "square.and.arrow.up")
    103                     .accessibility(hidden: true)
    104                 Text(title)
    105             }
    106         }
    107         .tint(.accentColor)
    108         .talerFont(.body)
    109         .disabled(!isEnabled)
    110     }
    111 }
    112 // MARK: -
    113 struct CopyShare: View {
    114     @Environment(\.isEnabled) private var isEnabled: Bool
    115 
    116     let textToCopy: String
    117     let image: UIImage?
    118 
    119     var body: some View {
    120         HStack {
    121             CopyButton(textToCopy: textToCopy, vertical: false, image: image)
    122                 .buttonStyle(TalerButtonStyle(type: .bordered))
    123             ShareButton(textToShare: textToCopy, image: image)
    124                 .buttonStyle(TalerButtonStyle(type: .bordered))
    125         } // two buttons
    126     }
    127 }
    128 // MARK: -
    129 struct CopyShare_Previews: PreviewProvider {
    130     static var previews: some View {
    131         CopyShare(textToCopy: "Hallö", image: nil)
    132     }
    133 }