ui: add Nostr Wallet Connect views
This commit is contained in:
@@ -137,7 +137,11 @@
|
|||||||
4C75EFB92804A2740006080F /* EventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFB82804A2740006080F /* EventView.swift */; };
|
4C75EFB92804A2740006080F /* EventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFB82804A2740006080F /* EventView.swift */; };
|
||||||
4C75EFBB2804A34C0006080F /* ProofOfWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFBA2804A34C0006080F /* ProofOfWork.swift */; };
|
4C75EFBB2804A34C0006080F /* ProofOfWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFBA2804A34C0006080F /* ProofOfWork.swift */; };
|
||||||
4C7D09592A05BEAD00943473 /* KeyboardVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */; };
|
4C7D09592A05BEAD00943473 /* KeyboardVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */; };
|
||||||
|
4C7D095F2A098C5D00943473 /* ConnectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D095C2A098C5D00943473 /* ConnectWalletView.swift */; };
|
||||||
|
4C7D09602A098C5D00943473 /* WalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D095D2A098C5D00943473 /* WalletView.swift */; };
|
||||||
|
4C7D09622A098D0E00943473 /* WalletConnect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09612A098D0E00943473 /* WalletConnect.swift */; };
|
||||||
4C7D09662A0AE62100943473 /* AlbyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09652A0AE62100943473 /* AlbyButton.swift */; };
|
4C7D09662A0AE62100943473 /* AlbyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09652A0AE62100943473 /* AlbyButton.swift */; };
|
||||||
|
4C7D09682A0AE9B200943473 /* NWCScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09672A0AE9B200943473 /* NWCScannerView.swift */; };
|
||||||
4C7D096D2A0AEA0400943473 /* CodeScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096A2A0AEA0400943473 /* CodeScanner.swift */; };
|
4C7D096D2A0AEA0400943473 /* CodeScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096A2A0AEA0400943473 /* CodeScanner.swift */; };
|
||||||
4C7D096E2A0AEA0400943473 /* ScannerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096B2A0AEA0400943473 /* ScannerCoordinator.swift */; };
|
4C7D096E2A0AEA0400943473 /* ScannerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096B2A0AEA0400943473 /* ScannerCoordinator.swift */; };
|
||||||
4C7D096F2A0AEA0400943473 /* ScannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096C2A0AEA0400943473 /* ScannerViewController.swift */; };
|
4C7D096F2A0AEA0400943473 /* ScannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096C2A0AEA0400943473 /* ScannerViewController.swift */; };
|
||||||
@@ -553,7 +557,11 @@
|
|||||||
4C75EFB82804A2740006080F /* EventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventView.swift; sourceTree = "<group>"; };
|
4C75EFB82804A2740006080F /* EventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventView.swift; sourceTree = "<group>"; };
|
||||||
4C75EFBA2804A34C0006080F /* ProofOfWork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProofOfWork.swift; sourceTree = "<group>"; };
|
4C75EFBA2804A34C0006080F /* ProofOfWork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProofOfWork.swift; sourceTree = "<group>"; };
|
||||||
4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardVisible.swift; sourceTree = "<group>"; };
|
4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardVisible.swift; sourceTree = "<group>"; };
|
||||||
|
4C7D095C2A098C5D00943473 /* ConnectWalletView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectWalletView.swift; sourceTree = "<group>"; };
|
||||||
|
4C7D095D2A098C5D00943473 /* WalletView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletView.swift; sourceTree = "<group>"; };
|
||||||
|
4C7D09612A098D0E00943473 /* WalletConnect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletConnect.swift; sourceTree = "<group>"; };
|
||||||
4C7D09652A0AE62100943473 /* AlbyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbyButton.swift; sourceTree = "<group>"; };
|
4C7D09652A0AE62100943473 /* AlbyButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbyButton.swift; sourceTree = "<group>"; };
|
||||||
|
4C7D09672A0AE9B200943473 /* NWCScannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NWCScannerView.swift; sourceTree = "<group>"; };
|
||||||
4C7D096A2A0AEA0400943473 /* CodeScanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeScanner.swift; sourceTree = "<group>"; };
|
4C7D096A2A0AEA0400943473 /* CodeScanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeScanner.swift; sourceTree = "<group>"; };
|
||||||
4C7D096B2A0AEA0400943473 /* ScannerCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScannerCoordinator.swift; sourceTree = "<group>"; };
|
4C7D096B2A0AEA0400943473 /* ScannerCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScannerCoordinator.swift; sourceTree = "<group>"; };
|
||||||
4C7D096C2A0AEA0400943473 /* ScannerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScannerViewController.swift; sourceTree = "<group>"; };
|
4C7D096C2A0AEA0400943473 /* ScannerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScannerViewController.swift; sourceTree = "<group>"; };
|
||||||
@@ -924,6 +932,7 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
4C7D09692A0AEA0400943473 /* CodeScanner */,
|
4C7D09692A0AEA0400943473 /* CodeScanner */,
|
||||||
|
4C7D095A2A098C5C00943473 /* Wallet */,
|
||||||
4C8D1A6D29F31E4100ACDF75 /* Buttons */,
|
4C8D1A6D29F31E4100ACDF75 /* Buttons */,
|
||||||
4C1A9A1B29DDCF8B00516EAC /* Settings */,
|
4C1A9A1B29DDCF8B00516EAC /* Settings */,
|
||||||
4CFF8F6129CC9A80008DB934 /* Images */,
|
4CFF8F6129CC9A80008DB934 /* Images */,
|
||||||
@@ -1005,6 +1014,16 @@
|
|||||||
path = Nostr;
|
path = Nostr;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
4C7D095A2A098C5C00943473 /* Wallet */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
4C7D095C2A098C5D00943473 /* ConnectWalletView.swift */,
|
||||||
|
4C7D095D2A098C5D00943473 /* WalletView.swift */,
|
||||||
|
4C7D09672A0AE9B200943473 /* NWCScannerView.swift */,
|
||||||
|
);
|
||||||
|
path = Wallet;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
4C7D09692A0AEA0400943473 /* CodeScanner */ = {
|
4C7D09692A0AEA0400943473 /* CodeScanner */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1027,6 +1046,7 @@
|
|||||||
4C7FF7D628233637009601DB /* Util */ = {
|
4C7FF7D628233637009601DB /* Util */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
4C7D09612A098D0E00943473 /* WalletConnect.swift */,
|
||||||
4C198DF329F88D23004C165C /* Images */,
|
4C198DF329F88D23004C165C /* Images */,
|
||||||
4C198DEA29F88C6B004C165C /* BlurHash */,
|
4C198DEA29F88C6B004C165C /* BlurHash */,
|
||||||
4CE4F0F329D779B5005914DB /* PostBox.swift */,
|
4CE4F0F329D779B5005914DB /* PostBox.swift */,
|
||||||
@@ -1622,6 +1642,7 @@
|
|||||||
F7F0BA25297892BD009531F3 /* SwipeToDismiss.swift in Sources */,
|
F7F0BA25297892BD009531F3 /* SwipeToDismiss.swift in Sources */,
|
||||||
4C8D00CA29DF80350036AF10 /* TruncatedText.swift in Sources */,
|
4C8D00CA29DF80350036AF10 /* TruncatedText.swift in Sources */,
|
||||||
4C9BB83429C12D9900FC4E37 /* EventProfileName.swift in Sources */,
|
4C9BB83429C12D9900FC4E37 /* EventProfileName.swift in Sources */,
|
||||||
|
4C7D09602A098C5D00943473 /* WalletView.swift in Sources */,
|
||||||
4CB8838F296F781C00DC99E7 /* ReactionsView.swift in Sources */,
|
4CB8838F296F781C00DC99E7 /* ReactionsView.swift in Sources */,
|
||||||
4C75EFB328049D640006080F /* NostrEvent.swift in Sources */,
|
4C75EFB328049D640006080F /* NostrEvent.swift in Sources */,
|
||||||
4CA2EFA0280E37AC0044ACD8 /* TimelineView.swift in Sources */,
|
4CA2EFA0280E37AC0044ACD8 /* TimelineView.swift in Sources */,
|
||||||
@@ -1664,6 +1685,7 @@
|
|||||||
4C3AC79F2833115300E1F516 /* FollowButtonView.swift in Sources */,
|
4C3AC79F2833115300E1F516 /* FollowButtonView.swift in Sources */,
|
||||||
4CC7AAE7297EFA7B00430951 /* Zap.swift in Sources */,
|
4CC7AAE7297EFA7B00430951 /* Zap.swift in Sources */,
|
||||||
4C3BEFD22819DB9B00B3DE84 /* ProfileModel.swift in Sources */,
|
4C3BEFD22819DB9B00B3DE84 /* ProfileModel.swift in Sources */,
|
||||||
|
4C7D09682A0AE9B200943473 /* NWCScannerView.swift in Sources */,
|
||||||
4C0A3F93280F66F5000448DE /* ReplyMap.swift in Sources */,
|
4C0A3F93280F66F5000448DE /* ReplyMap.swift in Sources */,
|
||||||
7C95CAEE299DCEF1009DCB67 /* KFOptionSetter+.swift in Sources */,
|
7C95CAEE299DCEF1009DCB67 /* KFOptionSetter+.swift in Sources */,
|
||||||
4C7D09722A0AEF5E00943473 /* DamusGradient.swift in Sources */,
|
4C7D09722A0AEF5E00943473 /* DamusGradient.swift in Sources */,
|
||||||
@@ -1695,6 +1717,7 @@
|
|||||||
4CAAD8AD298851D000060CEA /* AccountDeletion.swift in Sources */,
|
4CAAD8AD298851D000060CEA /* AccountDeletion.swift in Sources */,
|
||||||
4CFF8F6329CC9AD7008DB934 /* ImageContextMenuModifier.swift in Sources */,
|
4CFF8F6329CC9AD7008DB934 /* ImageContextMenuModifier.swift in Sources */,
|
||||||
4C54AA0A29A55429003E4487 /* EventGroup.swift in Sources */,
|
4C54AA0A29A55429003E4487 /* EventGroup.swift in Sources */,
|
||||||
|
4C7D09622A098D0E00943473 /* WalletConnect.swift in Sources */,
|
||||||
4C3EA67928FF7ABF00C48A62 /* list.c in Sources */,
|
4C3EA67928FF7ABF00C48A62 /* list.c in Sources */,
|
||||||
4C64987E286D082C00EAE2B3 /* DirectMessagesModel.swift in Sources */,
|
4C64987E286D082C00EAE2B3 /* DirectMessagesModel.swift in Sources */,
|
||||||
9CA876E229A00CEA0003B9A3 /* AttachMediaUtility.swift in Sources */,
|
9CA876E229A00CEA0003B9A3 /* AttachMediaUtility.swift in Sources */,
|
||||||
@@ -1710,6 +1733,7 @@
|
|||||||
4CE1399229F0666100AC6A0B /* ShareActionButton.swift in Sources */,
|
4CE1399229F0666100AC6A0B /* ShareActionButton.swift in Sources */,
|
||||||
4C42812C298C848200DBF26F /* TranslateView.swift in Sources */,
|
4C42812C298C848200DBF26F /* TranslateView.swift in Sources */,
|
||||||
4C363A9C282838B9006E126D /* EventRef.swift in Sources */,
|
4C363A9C282838B9006E126D /* EventRef.swift in Sources */,
|
||||||
|
4C7D095F2A098C5D00943473 /* ConnectWalletView.swift in Sources */,
|
||||||
3AA24802297E3DC20090C62D /* RepostView.swift in Sources */,
|
3AA24802297E3DC20090C62D /* RepostView.swift in Sources */,
|
||||||
4CD7641B28A1641400B6928F /* EndBlock.swift in Sources */,
|
4CD7641B28A1641400B6928F /* EndBlock.swift in Sources */,
|
||||||
4C3EA66528FF5F6800C48A62 /* mem.c in Sources */,
|
4C3EA66528FF5F6800C48A62 /* mem.c in Sources */,
|
||||||
|
|||||||
@@ -66,6 +66,8 @@ struct ContentView: View {
|
|||||||
@State var profile_open: Bool = false
|
@State var profile_open: Bool = false
|
||||||
@State var thread_open: Bool = false
|
@State var thread_open: Bool = false
|
||||||
@State var search_open: Bool = false
|
@State var search_open: Bool = false
|
||||||
|
@State var wallet_open: Bool = false
|
||||||
|
@State var active_nwc: WalletConnectURL? = nil
|
||||||
@State var muting: String? = nil
|
@State var muting: String? = nil
|
||||||
@State var confirm_mute: Bool = false
|
@State var confirm_mute: Bool = false
|
||||||
@State var user_muted_confirm: Bool = false
|
@State var user_muted_confirm: Bool = false
|
||||||
@@ -131,6 +133,7 @@ struct ContentView: View {
|
|||||||
profile_open = false
|
profile_open = false
|
||||||
thread_open = false
|
thread_open = false
|
||||||
search_open = false
|
search_open = false
|
||||||
|
wallet_open = false
|
||||||
isSideBarOpened = false
|
isSideBarOpened = false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,6 +144,9 @@ struct ContentView: View {
|
|||||||
|
|
||||||
func MainContent(damus: DamusState) -> some View {
|
func MainContent(damus: DamusState) -> some View {
|
||||||
VStack {
|
VStack {
|
||||||
|
NavigationLink(destination: WalletView(model: damus_state!.wallet), isActive: $wallet_open) {
|
||||||
|
EmptyView()
|
||||||
|
}
|
||||||
NavigationLink(destination: MaybeProfileView, isActive: $profile_open) {
|
NavigationLink(destination: MaybeProfileView, isActive: $profile_open) {
|
||||||
EmptyView()
|
EmptyView()
|
||||||
}
|
}
|
||||||
@@ -235,6 +241,11 @@ struct ContentView: View {
|
|||||||
self.thread_open = true
|
self.thread_open = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func open_wallet(nwc: WalletConnectURL) {
|
||||||
|
self.damus_state!.wallet.new(nwc)
|
||||||
|
self.wallet_open = true
|
||||||
|
}
|
||||||
|
|
||||||
func open_profile(id: String) {
|
func open_profile(id: String) {
|
||||||
self.active_profile = id
|
self.active_profile = id
|
||||||
self.profile_open = true
|
self.profile_open = true
|
||||||
@@ -320,29 +331,17 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onOpenURL { url in
|
.onOpenURL { url in
|
||||||
guard let link = decode_nostr_uri(url.absoluteString) else {
|
on_open_url(state: damus_state!, url: url) { res in
|
||||||
return
|
guard let res else {
|
||||||
}
|
return
|
||||||
|
|
||||||
switch link {
|
|
||||||
case .ref(let ref):
|
|
||||||
if ref.key == "p" {
|
|
||||||
active_profile = ref.ref_id
|
|
||||||
profile_open = true
|
|
||||||
} else if ref.key == "e" {
|
|
||||||
find_event(state: damus_state!, evid: ref.ref_id, search_type: .event, find_from: nil) { ev in
|
|
||||||
if let ev {
|
|
||||||
open_event(ev: ev)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case .filter(let filt):
|
|
||||||
active_search = filt
|
switch res {
|
||||||
search_open = true
|
case .filter(let filt): self.open_search(filt: filt)
|
||||||
break
|
case .profile(let id): self.open_profile(id: id)
|
||||||
// TODO: handle filter searches?
|
case .event(let ev): self.open_event(ev: ev)
|
||||||
|
case .wallet_connect(let nwc): self.open_wallet(nwc: nwc)}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.onReceive(handle_notify(.compose)) { notif in
|
.onReceive(handle_notify(.compose)) { notif in
|
||||||
let action = notif.object as! PostAction
|
let action = notif.object as! PostAction
|
||||||
@@ -589,7 +588,8 @@ struct ContentView: View {
|
|||||||
postbox: PostBox(pool: pool),
|
postbox: PostBox(pool: pool),
|
||||||
bootstrap_relays: bootstrap_relays,
|
bootstrap_relays: bootstrap_relays,
|
||||||
replies: ReplyCounter(our_pubkey: pubkey),
|
replies: ReplyCounter(our_pubkey: pubkey),
|
||||||
muted_threads: MutedThreadsManager(keypair: keypair)
|
muted_threads: MutedThreadsManager(keypair: keypair),
|
||||||
|
wallet: WalletModel(settings: settings)
|
||||||
)
|
)
|
||||||
home.damus_state = self.damus_state!
|
home.damus_state = self.damus_state!
|
||||||
|
|
||||||
@@ -839,3 +839,40 @@ func handle_post_notification(keypair: FullKeypair, postbox: PostBox, events: Ev
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum OpenResult {
|
||||||
|
case profile(String)
|
||||||
|
case filter(NostrFilter)
|
||||||
|
case event(NostrEvent)
|
||||||
|
case wallet_connect(WalletConnectURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
func on_open_url(state: DamusState, url: URL, result: @escaping (OpenResult?) -> Void) {
|
||||||
|
if let nwc = WalletConnectURL(str: url.absoluteString) {
|
||||||
|
result(.wallet_connect(nwc))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let link = decode_nostr_uri(url.absoluteString) else {
|
||||||
|
result(nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
switch link {
|
||||||
|
case .ref(let ref):
|
||||||
|
if ref.key == "p" {
|
||||||
|
result(.profile(ref.ref_id))
|
||||||
|
} else if ref.key == "e" {
|
||||||
|
find_event(state: state, evid: ref.ref_id, search_type: .event, find_from: nil) { ev in
|
||||||
|
if let ev {
|
||||||
|
result(.event(ev))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case .filter(let filt):
|
||||||
|
result(.filter(filt))
|
||||||
|
break
|
||||||
|
// TODO: handle filter searches?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ struct DamusState {
|
|||||||
let bootstrap_relays: [String]
|
let bootstrap_relays: [String]
|
||||||
let replies: ReplyCounter
|
let replies: ReplyCounter
|
||||||
let muted_threads: MutedThreadsManager
|
let muted_threads: MutedThreadsManager
|
||||||
|
let wallet: WalletModel
|
||||||
|
|
||||||
@discardableResult
|
@discardableResult
|
||||||
func add_zap(zap: Zap) -> Bool {
|
func add_zap(zap: Zap) -> Bool {
|
||||||
@@ -47,5 +48,5 @@ struct DamusState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static var empty: DamusState {
|
static var empty: DamusState {
|
||||||
return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore(), relay_filters: RelayFilters(our_pubkey: ""), relay_metadata: RelayMetadatas(), drafts: Drafts(), events: EventCache(), bookmarks: BookmarksManager(pubkey: ""), postbox: PostBox(pool: RelayPool()), bootstrap_relays: [], replies: ReplyCounter(our_pubkey: ""), muted_threads: MutedThreadsManager(keypair: Keypair(pubkey: "", privkey: nil))) }
|
return DamusState.init(pool: RelayPool(), keypair: Keypair(pubkey: "", privkey: ""), likes: EventCounter(our_pubkey: ""), boosts: EventCounter(our_pubkey: ""), contacts: Contacts(our_pubkey: ""), profiles: Profiles(), dms: DirectMessagesModel(our_pubkey: ""), previews: PreviewCache(), zaps: Zaps(our_pubkey: ""), lnurls: LNUrls(), settings: UserSettingsStore(), relay_filters: RelayFilters(our_pubkey: ""), relay_metadata: RelayMetadatas(), drafts: Drafts(), events: EventCache(), bookmarks: BookmarksManager(pubkey: ""), postbox: PostBox(pool: RelayPool()), bootstrap_relays: [], replies: ReplyCounter(our_pubkey: ""), muted_threads: MutedThreadsManager(keypair: Keypair(pubkey: "", privkey: nil)), wallet: WalletModel()) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,11 +48,17 @@ struct SideMenuView: View {
|
|||||||
navLabel(title: NSLocalizedString("Profile", comment: "Sidebar menu label for Profile view."), systemImage: "person")
|
navLabel(title: NSLocalizedString("Profile", comment: "Sidebar menu label for Profile view."), systemImage: "person")
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
NavigationLink(destination: WalletView(model: damus_state.wallet)) {
|
||||||
NavigationLink(destination: EmptyView()) {
|
HStack {
|
||||||
navLabel(title: NSLocalizedString("Wallet", comment: "Sidebar menu label for Wallet view."), systemImage: "bolt")
|
Image("wallet")
|
||||||
|
.tint(DamusColors.adaptableBlack)
|
||||||
|
|
||||||
|
Text(NSLocalizedString("Wallet", comment: "Sidebar menu label for Wallet view."))
|
||||||
|
.font(.title2)
|
||||||
|
.foregroundColor(textColor())
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
NavigationLink(destination: MutelistView(damus_state: damus_state, users: get_mutelist_users(damus_state.contacts.mutelist) )) {
|
NavigationLink(destination: MutelistView(damus_state: damus_state, users: get_mutelist_users(damus_state.contacts.mutelist) )) {
|
||||||
navLabel(title: NSLocalizedString("Muted", comment: "Sidebar menu label for muted users view."), systemImage: "exclamationmark.octagon")
|
navLabel(title: NSLocalizedString("Muted", comment: "Sidebar menu label for muted users view."), systemImage: "exclamationmark.octagon")
|
||||||
|
|||||||
98
damus/Views/Wallet/ConnectWalletView.swift
Normal file
98
damus/Views/Wallet/ConnectWalletView.swift
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
//
|
||||||
|
// ConnectWalletView.swift
|
||||||
|
// damus
|
||||||
|
//
|
||||||
|
// Created by William Casarin on 2023-05-05.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct ConnectWalletView: View {
|
||||||
|
@Environment(\.openURL) private var openURL
|
||||||
|
@ObservedObject var model: WalletModel
|
||||||
|
|
||||||
|
@State var scanning: Bool = false
|
||||||
|
@State var error: String? = nil
|
||||||
|
@State var wallet_scan_result: WalletScanResult = .scanning
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
MainContent
|
||||||
|
.navigationTitle("Attach a Wallet")
|
||||||
|
.navigationBarTitleDisplayMode(.large)
|
||||||
|
.padding()
|
||||||
|
.onChange(of: wallet_scan_result) { res in
|
||||||
|
scanning = false
|
||||||
|
|
||||||
|
switch res {
|
||||||
|
case .success(let url):
|
||||||
|
error = nil
|
||||||
|
self.model.new(url)
|
||||||
|
|
||||||
|
case .failed:
|
||||||
|
error = "Invalid nostr wallet connection string"
|
||||||
|
|
||||||
|
case .scanning:
|
||||||
|
error = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func AreYouSure(nwc: WalletConnectURL) -> some View {
|
||||||
|
VStack {
|
||||||
|
Text("Are you sure you want to attach this wallet?")
|
||||||
|
.font(.title)
|
||||||
|
|
||||||
|
Text(nwc.relay.id)
|
||||||
|
.font(.body)
|
||||||
|
.foregroundColor(.gray)
|
||||||
|
|
||||||
|
BigButton("Attach") {
|
||||||
|
model.connect(nwc)
|
||||||
|
}
|
||||||
|
|
||||||
|
BigButton("Cancel") {
|
||||||
|
model.cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ConnectWallet: some View {
|
||||||
|
VStack {
|
||||||
|
NavigationLink(destination: WalletScannerView(result: $wallet_scan_result), isActive: $scanning) {
|
||||||
|
EmptyView()
|
||||||
|
}
|
||||||
|
|
||||||
|
AlbyButton() {
|
||||||
|
openURL(URL(string:"https://nwc.getalby.com/apps/new?c=Damus")!)
|
||||||
|
}
|
||||||
|
|
||||||
|
BigButton("Attach Wallet") {
|
||||||
|
scanning = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if let err = self.error {
|
||||||
|
Text(err)
|
||||||
|
.foregroundColor(.red)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var MainContent: some View {
|
||||||
|
Group {
|
||||||
|
switch model.connect_state {
|
||||||
|
case .new(let nwc):
|
||||||
|
AreYouSure(nwc: nwc)
|
||||||
|
case .existing:
|
||||||
|
Text("Shouldn't happen")
|
||||||
|
case .none:
|
||||||
|
ConnectWallet
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ConnectWalletView_Previews: PreviewProvider {
|
||||||
|
static var previews: some View {
|
||||||
|
ConnectWalletView(model: WalletModel())
|
||||||
|
}
|
||||||
|
}
|
||||||
77
damus/Views/Wallet/NWCScannerView.swift
Normal file
77
damus/Views/Wallet/NWCScannerView.swift
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
//
|
||||||
|
// QRScannerView.swift
|
||||||
|
// damus
|
||||||
|
//
|
||||||
|
// Created by William Casarin on 2023-05-09.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
enum WalletScanResult: Equatable {
|
||||||
|
static func == (lhs: WalletScanResult, rhs: WalletScanResult) -> Bool {
|
||||||
|
switch lhs {
|
||||||
|
case .success(let a):
|
||||||
|
switch rhs {
|
||||||
|
case .success(let b):
|
||||||
|
return a == b
|
||||||
|
case .failed:
|
||||||
|
return false
|
||||||
|
case .scanning:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
case .failed:
|
||||||
|
switch rhs {
|
||||||
|
case .success:
|
||||||
|
return false
|
||||||
|
case .failed:
|
||||||
|
return true
|
||||||
|
case .scanning:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
case .scanning:
|
||||||
|
switch rhs {
|
||||||
|
case .success:
|
||||||
|
return false
|
||||||
|
case .failed:
|
||||||
|
return false
|
||||||
|
case .scanning:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case success(WalletConnectURL)
|
||||||
|
case failed
|
||||||
|
case scanning
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WalletScannerView: View {
|
||||||
|
@Binding var result: WalletScanResult
|
||||||
|
|
||||||
|
@Environment(\.dismiss) var dismiss
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
CodeScannerView(codeTypes: [.qr]) { res in
|
||||||
|
switch res {
|
||||||
|
case .success(let success):
|
||||||
|
guard let url = WalletConnectURL(str: success.string) else {
|
||||||
|
result = .failed
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
result = .success(url)
|
||||||
|
case .failure:
|
||||||
|
result = .failed
|
||||||
|
}
|
||||||
|
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct QRScannerView_Previews: PreviewProvider {
|
||||||
|
@State static var result: WalletScanResult = .scanning
|
||||||
|
static var previews: some View {
|
||||||
|
WalletScannerView(result: $result)
|
||||||
|
}
|
||||||
|
}
|
||||||
40
damus/Views/Wallet/WalletView.swift
Normal file
40
damus/Views/Wallet/WalletView.swift
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
//
|
||||||
|
// WalletView.swift
|
||||||
|
// damus
|
||||||
|
//
|
||||||
|
// Created by William Casarin on 2023-05-05.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct WalletView: View {
|
||||||
|
@ObservedObject var model: WalletModel
|
||||||
|
|
||||||
|
func MainWalletView(nwc: WalletConnectURL) -> some View {
|
||||||
|
VStack {
|
||||||
|
Text("\(nwc.relay.id)")
|
||||||
|
|
||||||
|
BigButton("Disconnect Wallet") {
|
||||||
|
self.model.disconnect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
switch model.connect_state {
|
||||||
|
case .new:
|
||||||
|
ConnectWalletView(model: model)
|
||||||
|
case .none:
|
||||||
|
ConnectWalletView(model: model)
|
||||||
|
case .existing(let nwc):
|
||||||
|
MainWalletView(nwc: nwc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WalletView_Previews: PreviewProvider {
|
||||||
|
static var previews: some View {
|
||||||
|
WalletView(model: WalletModel())
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user