Universal Links: share notes!
Changelog-Added: Added universal link sharing of notes
This commit is contained in:
@@ -80,7 +80,32 @@ func parse_nostr_ref_uri(_ p: Parser) -> ReferencedId? {
|
|||||||
return ReferencedId(ref_id: pk, relay_id: nil, key: typ)
|
return ReferencedId(ref_id: pk, relay_id: nil, key: typ)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func decode_universal_link(_ s: String) -> NostrLink? {
|
||||||
|
var uri = s.replacingOccurrences(of: "https://damus.io/r/", with: "")
|
||||||
|
uri = uri.replacingOccurrences(of: "https://damus.io/", with: "")
|
||||||
|
uri = uri.replacingOccurrences(of: "/", with: "")
|
||||||
|
|
||||||
|
guard let decoded = try? bech32_decode(uri) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
let h = hex_encode(decoded.data)
|
||||||
|
|
||||||
|
if decoded.hrp == "note" {
|
||||||
|
return .ref(ReferencedId(ref_id: h, relay_id: nil, key: "e"))
|
||||||
|
} else if decoded.hrp == "npub" {
|
||||||
|
return .ref(ReferencedId(ref_id: h, relay_id: nil, key: "p"))
|
||||||
|
}
|
||||||
|
// TODO: handle nprofile, etc
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func decode_nostr_uri(_ s: String) -> NostrLink? {
|
func decode_nostr_uri(_ s: String) -> NostrLink? {
|
||||||
|
if s.starts(with: "https://damus.io/") {
|
||||||
|
return decode_universal_link(s)
|
||||||
|
}
|
||||||
|
|
||||||
var uri = s.replacingOccurrences(of: "nostr://", with: "")
|
var uri = s.replacingOccurrences(of: "nostr://", with: "")
|
||||||
uri = uri.replacingOccurrences(of: "nostr:", with: "")
|
uri = uri.replacingOccurrences(of: "nostr:", with: "")
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ struct EventActionBar: View {
|
|||||||
let generator = UIImpactFeedbackGenerator(style: .medium)
|
let generator = UIImpactFeedbackGenerator(style: .medium)
|
||||||
@State var sheet: ActionBarSheet? = nil
|
@State var sheet: ActionBarSheet? = nil
|
||||||
@State var confirm_boost: Bool = false
|
@State var confirm_boost: Bool = false
|
||||||
|
@State var show_share_sheet: Bool = false
|
||||||
@StateObject var bar: ActionBarModel
|
@StateObject var bar: ActionBarModel
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -40,6 +41,7 @@ struct EventActionBar: View {
|
|||||||
EventActionButton(img: "bubble.left", col: nil) {
|
EventActionButton(img: "bubble.left", col: nil) {
|
||||||
notify(.reply, event)
|
notify(.reply, event)
|
||||||
}
|
}
|
||||||
|
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
|
||||||
}
|
}
|
||||||
|
|
||||||
HStack(alignment: .bottom) {
|
HStack(alignment: .bottom) {
|
||||||
@@ -55,6 +57,7 @@ struct EventActionBar: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
|
||||||
|
|
||||||
HStack(alignment: .bottom) {
|
HStack(alignment: .bottom) {
|
||||||
Text("\(bar.likes > 0 ? "\(bar.likes)" : "")")
|
Text("\(bar.likes > 0 ? "\(bar.likes)" : "")")
|
||||||
@@ -69,6 +72,12 @@ struct EventActionBar: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
|
||||||
|
|
||||||
|
EventActionButton(img: "square.and.arrow.up", col: Color.gray) {
|
||||||
|
show_share_sheet = true
|
||||||
|
}
|
||||||
|
.frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
HStack(alignment: .bottom) {
|
HStack(alignment: .bottom) {
|
||||||
@@ -86,6 +95,13 @@ struct EventActionBar: View {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
.sheet(isPresented: $show_share_sheet) {
|
||||||
|
if let note_id = bech32_note_id(event.id) {
|
||||||
|
if let url = URL(string: "https://damus.io/" + note_id) {
|
||||||
|
ShareSheet(activityItems: [url])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.alert("Boost", isPresented: $confirm_boost) {
|
.alert("Boost", isPresented: $confirm_boost) {
|
||||||
Button("Cancel") {
|
Button("Cancel") {
|
||||||
confirm_boost = false
|
confirm_boost = false
|
||||||
@@ -142,7 +158,6 @@ func EventActionButton(img: String, col: Color?, action: @escaping () -> ()) ->
|
|||||||
.font(.footnote.weight(.medium))
|
.font(.footnote.weight(.medium))
|
||||||
.foregroundColor(col == nil ? Color.gray : col!)
|
.foregroundColor(col == nil ? Color.gray : col!)
|
||||||
}
|
}
|
||||||
.padding(.trailing, 40)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LikeButton: View {
|
struct LikeButton: View {
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>aps-environment</key>
|
<key>aps-environment</key>
|
||||||
<string>development</string>
|
<string>development</string>
|
||||||
|
<key>com.apple.developer.associated-domains</key>
|
||||||
|
<array>
|
||||||
|
<string>applinks:damus.io</string>
|
||||||
|
</array>
|
||||||
<key>keychain-access-groups</key>
|
<key>keychain-access-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>$(AppIdentifierPrefix)com.jb55.damus2</string>
|
<string>$(AppIdentifierPrefix)com.jb55.damus2</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user