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 }