damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit e4beb872a50a89b581b60d4f2d8bdb40df5dd0fe
parent 552bd9cae5a04c1a876d6ea54384491c65c03287
Author: ericholguin <eric.holguinsanchez@gmail.com>
Date:   Fri, 27 Jan 2023 23:30:57 -0700

Add QRCode view

Changelog-Added: Add QRCode view for sharing your pubkey
Closes: #418

Diffstat:
Mdamus.xcodeproj/project.pbxproj | 4++++
Adamus/Views/QRCodeView.swift | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdamus/Views/SideMenuView.swift | 39++++++++++++++++++++++++++++-----------
3 files changed, 122 insertions(+), 11 deletions(-)

diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -172,6 +172,7 @@ 4CF0ABEE29844B5500D66079 /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABED29844B5500D66079 /* AnyEncodable.swift */; }; 4CF0ABF029857E9200D66079 /* Bech32Object.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABEF29857E9200D66079 /* Bech32Object.swift */; }; 4FE60CDD295E1C5E00105A1F /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE60CDC295E1C5E00105A1F /* Wallet.swift */; }; + 5C513FCC2984ACA60072348F /* QRCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FCB2984ACA60072348F /* QRCodeView.swift */; }; 6439E014296790CF0020672B /* ProfileZoomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6439E013296790CF0020672B /* ProfileZoomView.swift */; }; 647D9A8D2968520300A295DE /* SideMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647D9A8C2968520300A295DE /* SideMenuView.swift */; }; 64FBD06F296255C400D9D3B2 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64FBD06E296255C400D9D3B2 /* Theme.swift */; }; @@ -427,6 +428,7 @@ 4CF0ABED29844B5500D66079 /* AnyEncodable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyEncodable.swift; sourceTree = "<group>"; }; 4CF0ABEF29857E9200D66079 /* Bech32Object.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bech32Object.swift; sourceTree = "<group>"; }; 4FE60CDC295E1C5E00105A1F /* Wallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = "<group>"; }; + 5C513FCB2984ACA60072348F /* QRCodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeView.swift; sourceTree = "<group>"; }; 6439E013296790CF0020672B /* ProfileZoomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileZoomView.swift; sourceTree = "<group>"; }; 647D9A8C2968520300A295DE /* SideMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideMenuView.swift; sourceTree = "<group>"; }; 64FBD06E296255C400D9D3B2 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; }; @@ -642,6 +644,7 @@ 4CF0ABD529817F5B00D66079 /* ReportView.swift */, 4CF0ABE42981EE0C00D66079 /* EULAView.swift */, 3AA247FE297E3D900090C62D /* RepostsView.swift */, + 5C513FCB2984ACA60072348F /* QRCodeView.swift */, ); path = Views; sourceTree = "<group>"; @@ -1111,6 +1114,7 @@ 4CF0ABE52981EE0C00D66079 /* EULAView.swift in Sources */, 4CBCA930297DB57F00EC6B2F /* WebsiteLink.swift in Sources */, 4C3EA64128FF553900C48A62 /* hash_u5.c in Sources */, + 5C513FCC2984ACA60072348F /* QRCodeView.swift in Sources */, 4C3EA64F28FF59F200C48A62 /* tal.c in Sources */, 4CB88393296F798300DC99E7 /* ReactionsModel.swift in Sources */, 4CB88396296F7F8B00DC99E7 /* ReactionView.swift in Sources */, diff --git a/damus/Views/QRCodeView.swift b/damus/Views/QRCodeView.swift @@ -0,0 +1,90 @@ +// +// QRCodeView.swift +// damus +// +// Created by eric on 1/27/23. +// + +import SwiftUI +import CoreImage.CIFilterBuiltins + +struct QRCodeView: View { + let damus_state: DamusState + + @Environment(\.dismiss) var dismiss + @Environment(\.presentationMode) var presentationMode + + var maybe_key: String? { + guard let key = bech32_pubkey(damus_state.pubkey) else { + return nil + } + + return key + } + + var body: some View { + ZStack(alignment: .topLeading) { + DamusGradient() + Button { + presentationMode.wrappedValue.dismiss() + } label: { + Image(systemName: "xmark") + .foregroundColor(.white) + .font(.subheadline) + .padding(.leading, 20) + } + .zIndex(1) + + VStack(alignment: .center) { + + Spacer() + + if let key = maybe_key { + Image(uiImage: generateQRCode(pubkey: "nostr:" + key)) + .interpolation(.none) + .resizable() + .scaledToFit() + .frame(width: 200, height: 200) + .padding() + + Text(key) + .font(.headline) + .foregroundColor(Color(.white)) + .padding() + } + + Spacer() + + } + + } + .modifier(SwipeToDismissModifier(minDistance: nil, onDismiss: { + presentationMode.wrappedValue.dismiss() + })) + } + + func generateQRCode(pubkey: String) -> UIImage { + let data = pubkey.data(using: String.Encoding.ascii) + let qrFilter = CIFilter(name: "CIQRCodeGenerator") + qrFilter?.setValue(data, forKey: "inputMessage") + let qrImage = qrFilter?.outputImage + + let colorInvertFilter = CIFilter(name: "CIColorInvert") + colorInvertFilter?.setValue(qrImage, forKey: "inputImage") + let outputInvertedImage = colorInvertFilter?.outputImage + + let maskToAlphaFilter = CIFilter(name: "CIMaskToAlpha") + maskToAlphaFilter?.setValue(outputInvertedImage, forKey: "inputImage") + let outputCIImage = maskToAlphaFilter?.outputImage + + let context = CIContext() + let cgImage = context.createCGImage(outputCIImage!, from: outputCIImage!.extent)! + return UIImage(cgImage: cgImage) + } +} + +struct QRCodeView_Previews: PreviewProvider { + static var previews: some View { + QRCodeView(damus_state: test_damus_state()) + } +} diff --git a/damus/Views/SideMenuView.swift b/damus/Views/SideMenuView.swift @@ -14,6 +14,8 @@ struct SideMenuView: View { @State var confirm_logout: Bool = false @StateObject var user_settings = UserSettingsStore() + @State private var showQRCode = false + @Environment(\.colorScheme) var colorScheme var sideBarWidth = min(UIScreen.main.bounds.size.width * 0.65, 400.0) @@ -124,18 +126,33 @@ struct SideMenuView: View { Spacer() - Button(action: { - //ConfigView(state: damus_state) - if damus_state.keypair.privkey == nil { - notify(.logout, ()) - } else { - confirm_logout = true + HStack(alignment: .center) { + Button(action: { + //ConfigView(state: damus_state) + if damus_state.keypair.privkey == nil { + notify(.logout, ()) + } else { + confirm_logout = true + } + }, label: { + Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), systemImage: "pip.exit") + .font(.title3) + .foregroundColor(textColor()) + }) + + Spacer() + + Button(action: { + showQRCode.toggle() + }, label: { + Label(NSLocalizedString("", comment: "Sidebar menu label for accessing QRCode view"), systemImage: "qrcode") + .font(.title) + .foregroundColor(textColor()) + .padding(.trailing, 20) + }).fullScreenCover(isPresented: $showQRCode) { + QRCodeView(damus_state: damus_state) } - }, label: { - Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), systemImage: "pip.exit") - .font(.title3) - .foregroundColor(textColor()) - }) + } } .padding(.top, 60) .padding(.bottom, 40)