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:
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)