From ac1a5d237e88b749a4dca7adcf3617fd75c8d918 Mon Sep 17 00:00:00 2001 From: Joel Klabo Date: Tue, 31 Jan 2023 18:32:11 -0800 Subject: [PATCH] Add Copy Invoice Button Changelog-Added: Copy invoice button Closes: #469 --- damus/Components/InvoiceView.swift | 135 +++++++++++++++++------------ 1 file changed, 79 insertions(+), 56 deletions(-) diff --git a/damus/Components/InvoiceView.swift b/damus/Components/InvoiceView.swift index adae01a1..027dfe75 100644 --- a/damus/Components/InvoiceView.swift +++ b/damus/Components/InvoiceView.swift @@ -7,6 +7,84 @@ import SwiftUI +struct InvoiceView: View { + @Environment(\.colorScheme) var colorScheme + @Environment(\.openURL) private var openURL + let our_pubkey: String + let invoice: Invoice + @State var showing_select_wallet: Bool = false + @State var copied = false + + var CopyButton: some View { + Button { + copied = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + copied = false + } + UIImpactFeedbackGenerator(style: .medium).impactOccurred() + UIPasteboard.general.string = invoice.string + } label: { + if !copied { + Image(systemName: "doc.on.clipboard") + .foregroundColor(.gray) + } else { + Image(systemName: "checkmark.circle") + .foregroundColor(Color("DamusGreen")) + } + } + } + + var PayButton: some View { + Button { + if should_show_wallet_selector(our_pubkey) { + showing_select_wallet = true + } else { + open_with_wallet(wallet: get_default_wallet(our_pubkey).model, invoice: invoice.string) + } + } label: { + RoundedRectangle(cornerRadius: 20, style: .circular) + .foregroundColor(colorScheme == .light ? .black : .white) + .overlay { + Text("Pay", comment: "Button to pay a Lightning invoice.") + .fontWeight(.medium) + .foregroundColor(colorScheme == .light ? .white : .black) + } + } + .onTapGesture { + // Temporary solution so that the "pay" button can be clicked (Yes we need an empty tap gesture) + print("pay button tap") + } + } + + var body: some View { + ZStack { + RoundedRectangle(cornerRadius: 10) + .foregroundColor(.secondary.opacity(0.1)) + + VStack(alignment: .leading, spacing: 12) { + HStack { + Label("", systemImage: "bolt.fill") + .foregroundColor(.orange) + Text("Lightning Invoice", comment: "Indicates that the view is for paying a Lightning invoice.") + Spacer() + CopyButton + } + Divider() + Text(invoice.description_string) + Text(invoice.amount.amount_sats_str()) + .font(.title) + PayButton + .frame(height: 50) + .zIndex(10.0) + } + .padding(30) + } + .sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) { + SelectWalletView(showingSelectWallet: $showing_select_wallet, our_pubkey: our_pubkey, invoice: invoice.string) + } + } +} + func open_with_wallet(wallet: Wallet.Model, invoice: String) { if let url = URL(string: "\(wallet.link)\(invoice)"), UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url) @@ -28,67 +106,12 @@ func open_with_wallet(wallet: Wallet.Model, invoice: String) { } } -struct InvoiceView: View { - @Environment(\.colorScheme) var colorScheme - @Environment(\.openURL) private var openURL - let our_pubkey: String - let invoice: Invoice - @State var showing_select_wallet: Bool = false - - var PayButton: some View { - Button { - if should_show_wallet_selector(our_pubkey) { - showing_select_wallet = true - } else { - open_with_wallet(wallet: get_default_wallet(our_pubkey).model, invoice: invoice.string) - } - } label: { - RoundedRectangle(cornerRadius: 20) - .foregroundColor(colorScheme == .light ? .black : .white) - .overlay { - Text("Pay", comment: "Button to pay a Lightning invoice.") - .fontWeight(.medium) - .foregroundColor(colorScheme == .light ? .white : .black) - } - } - //.buttonStyle(.bordered) - .onTapGesture { - // Temporary solution so that the "pay" button can be clicked (Yes we need an empty tap gesture) - } - } - - var body: some View { - ZStack { - RoundedRectangle(cornerRadius: 10) - .foregroundColor(.secondary.opacity(0.1)) - - VStack(alignment: .leading, spacing: 12) { - HStack { - Label("", systemImage: "bolt.fill") - .foregroundColor(.orange) - Text("Lightning Invoice", comment: "Indicates that the view is for paying a Lightning invoice.") - } - Divider() - Text(invoice.description_string) - Text(invoice.amount.amount_sats_str()) - .font(.title) - PayButton - .frame(height: 50) - .zIndex(10.0) - } - .padding(30) - } - .sheet(isPresented: $showing_select_wallet, onDismiss: {showing_select_wallet = false}) { - SelectWalletView(showingSelectWallet: $showing_select_wallet, our_pubkey: our_pubkey, invoice: invoice.string) - } - } -} let test_invoice = Invoice(description: .description("this is a description"), amount: .specific(10000), string: "lnbc100n1p357sl0sp5t9n56wdztun39lgdqlr30xqwksg3k69q4q2rkr52aplujw0esn0qpp5mrqgljk62z20q4nvgr6lzcyn6fhylzccwdvu4k77apg3zmrkujjqdpzw35xjueqd9ejqcfqv3jhxcmjd9c8g6t0dcxqyjw5qcqpjrzjqt56h4gvp5yx36u2uzqa6qwcsk3e2duunfxppzj9vhypc3wfe2wswz607uqq3xqqqsqqqqqqqqqqqlqqyg9qyysgqagx5h20aeulj3gdwx3kxs8u9f4mcakdkwuakasamm9562ffyr9en8yg20lg0ygnr9zpwp68524kmda0t5xp2wytex35pu8hapyjajxqpsql29r", expiry: 604800, payment_hash: Data(), created_at: 1666139119) struct InvoiceView_Previews: PreviewProvider { static var previews: some View { InvoiceView(our_pubkey: "", invoice: test_invoice) - .frame(width: 200, height: 200) + .frame(width: 300, height: 200) } }