@@ -806,7 +806,7 @@
|
|||||||
"$(PROJECT_DIR)",
|
"$(PROJECT_DIR)",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.1.0;
|
MARKETING_VERSION = 0.1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.jb55.damus;
|
PRODUCT_BUNDLE_IDENTIFIER = com.jb55.damus2;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@@ -841,7 +841,7 @@
|
|||||||
"$(PROJECT_DIR)",
|
"$(PROJECT_DIR)",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 0.1.0;
|
MARKETING_VERSION = 0.1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.jb55.damus;
|
PRODUCT_BUNDLE_IDENTIFIER = com.jb55.damus2;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ func make_post_tags(post_blocks: [PostBlock], tags: [[String]]) -> PostTags {
|
|||||||
blocks.append(block)
|
blocks.append(block)
|
||||||
}
|
}
|
||||||
case .hashtag(let hashtag):
|
case .hashtag(let hashtag):
|
||||||
new_tags.append(["hashtag", hashtag])
|
new_tags.append(["hashtag", hashtag.lowercased()])
|
||||||
blocks.append(.hashtag(hashtag))
|
blocks.append(.hashtag(hashtag))
|
||||||
case .text(let txt):
|
case .text(let txt):
|
||||||
blocks.append(Block.text(txt))
|
blocks.append(Block.text(txt))
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ class ProfileModel: ObservableObject {
|
|||||||
NostrKind.contacts.rawValue,
|
NostrKind.contacts.rawValue,
|
||||||
NostrKind.metadata.rawValue,
|
NostrKind.metadata.rawValue,
|
||||||
NostrKind.boost.rawValue,
|
NostrKind.boost.rawValue,
|
||||||
NostrKind.like.rawValue
|
|
||||||
])
|
])
|
||||||
|
|
||||||
profile_filter.authors = [pubkey]
|
profile_filter.authors = [pubkey]
|
||||||
@@ -72,7 +71,7 @@ class ProfileModel: ObservableObject {
|
|||||||
if seen_event.contains(ev.id) {
|
if seen_event.contains(ev.id) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if ev.known_kind == .text {
|
if ev.known_kind == .text || ev.known_kind == .boost {
|
||||||
let _ = insert_uniq_sorted_event(events: &self.events, new_ev: ev, cmp: { $0.created_at > $1.created_at})
|
let _ = insert_uniq_sorted_event(events: &self.events, new_ev: ev, cmp: { $0.created_at > $1.created_at})
|
||||||
} else if ev.known_kind == .contacts {
|
} else if ev.known_kind == .contacts {
|
||||||
handle_profile_contact_event(ev)
|
handle_profile_contact_event(ev)
|
||||||
@@ -87,7 +86,7 @@ class ProfileModel: ObservableObject {
|
|||||||
case .nostr_event(let resp):
|
case .nostr_event(let resp):
|
||||||
switch resp {
|
switch resp {
|
||||||
case .event(let sid, let ev):
|
case .event(let sid, let ev):
|
||||||
if sid != self.sub_id {
|
if sid != self.sub_id && sid != self.prof_subid {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
add_event(ev)
|
add_event(ev)
|
||||||
|
|||||||
@@ -81,7 +81,8 @@ func parse_nostr_ref_uri(_ p: Parser) -> ReferencedId? {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func decode_nostr_uri(_ s: String) -> NostrLink? {
|
func decode_nostr_uri(_ s: String) -> NostrLink? {
|
||||||
let uri = s.replacingOccurrences(of: "nostr:", with: "")
|
var uri = s.replacingOccurrences(of: "nostr://", with: "")
|
||||||
|
uri = uri.replacingOccurrences(of: "nostr:", with: "")
|
||||||
|
|
||||||
let parts = uri.split(separator: ":")
|
let parts = uri.split(separator: ":")
|
||||||
.reduce(into: Array<String>()) { acc, str in
|
.reduce(into: Array<String>()) { acc, str in
|
||||||
@@ -93,7 +94,7 @@ func decode_nostr_uri(_ s: String) -> NostrLink? {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if parts.count >= 2 && parts[0] == "hashtag" {
|
if parts.count >= 2 && parts[0] == "hashtag" {
|
||||||
return .filter(NostrFilter.filter_hashtag([parts[1]]))
|
return .filter(NostrFilter.filter_hashtag([parts[1].lowercased()]))
|
||||||
}
|
}
|
||||||
|
|
||||||
return tag_to_refid(parts).map { .ref($0) }
|
return tag_to_refid(parts).map { .ref($0) }
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ struct ChatroomView: View {
|
|||||||
next_ev: ind == count-1 ? nil : thread.events[ind+1],
|
next_ev: ind == count-1 ? nil : thread.events[ind+1],
|
||||||
damus: damus
|
damus: damus
|
||||||
)
|
)
|
||||||
|
.event_context_menu(ev)
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
if thread.initial_event.id == ev.id {
|
if thread.initial_event.id == ev.id {
|
||||||
//dismiss()
|
//dismiss()
|
||||||
@@ -56,12 +57,13 @@ struct ChatroomView: View {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
struct ChatroomView_Previews: PreviewProvider {
|
struct ChatroomView_Previews: PreviewProvider {
|
||||||
@State var events = [NostrEvent(content: "hello", pubkey: "pubkey")]
|
@State var events = [NostrEvent(content: "hello", pubkey: "pubkey")]
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
ChatroomView(events: events)
|
let state = test_damus_state()
|
||||||
|
ChatroomView(damus: state)
|
||||||
|
.environmentObject(ThreadModel(evid: "&849ab9bb263ed2819db06e05f1a1a3b72878464e8c7146718a2fc1bf1912f893", pool: state.pool))
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ struct EventActionBar: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.padding(.top, 1)
|
||||||
.onReceive(handle_notify(.liked)) { n in
|
.onReceive(handle_notify(.liked)) { n in
|
||||||
let liked = n.object as! Counted
|
let liked = n.object as! Counted
|
||||||
if liked.id != event.id {
|
if liked.id != event.id {
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ struct EventView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TextEvent(_ event: NostrEvent) -> some View {
|
func TextEvent(_ event: NostrEvent) -> some View {
|
||||||
return HStack {
|
return HStack(alignment: .top) {
|
||||||
let profile = damus.profiles.lookup(id: event.pubkey)
|
let profile = damus.profiles.lookup(id: event.pubkey)
|
||||||
VStack {
|
VStack {
|
||||||
let pmodel = ProfileModel(pubkey: event.pubkey, damus: damus)
|
let pmodel = ProfileModel(pubkey: event.pubkey, damus: damus)
|
||||||
@@ -110,7 +110,13 @@ struct EventView: View {
|
|||||||
.id(event.id)
|
.id(event.id)
|
||||||
.frame(minHeight: PFP_SIZE)
|
.frame(minHeight: PFP_SIZE)
|
||||||
.padding([.bottom], 4)
|
.padding([.bottom], 4)
|
||||||
.contextMenu {
|
.event_context_menu(event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension View {
|
||||||
|
func event_context_menu(_ event: NostrEvent) -> some View {
|
||||||
|
return self.contextMenu {
|
||||||
Button {
|
Button {
|
||||||
UIPasteboard.general.string = event.content
|
UIPasteboard.general.string = event.content
|
||||||
} label: {
|
} label: {
|
||||||
@@ -141,10 +147,10 @@ struct EventView: View {
|
|||||||
Label("Broadcast", systemImage: "globe")
|
Label("Broadcast", systemImage: "globe")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func format_relative_time(_ created_at: Int64) -> String
|
func format_relative_time(_ created_at: Int64) -> String
|
||||||
{
|
{
|
||||||
return time_ago_since(Date(timeIntervalSince1970: Double(created_at)))
|
return time_ago_since(Date(timeIntervalSince1970: Double(created_at)))
|
||||||
|
|||||||
@@ -54,26 +54,8 @@ struct PostView: View {
|
|||||||
}
|
}
|
||||||
.padding([.top, .bottom], 4)
|
.padding([.top, .bottom], 4)
|
||||||
|
|
||||||
HStack(alignment: .top) {
|
TextEditor(text: $post)
|
||||||
ZStack(alignment: .leading) {
|
.focused($focus)
|
||||||
if self.post == "" {
|
|
||||||
VStack {
|
|
||||||
Text("What's happening?")
|
|
||||||
.foregroundColor(.gray)
|
|
||||||
.padding(6)
|
|
||||||
Spacer()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TextEditor(text: $post)
|
|
||||||
.focused($focus)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
}
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
}
|
}
|
||||||
.onAppear() {
|
.onAppear() {
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ func pfp_line_width(_ h: Highlight) -> CGFloat {
|
|||||||
switch h {
|
switch h {
|
||||||
case .reply: return 0
|
case .reply: return 0
|
||||||
case .none: return 0
|
case .none: return 0
|
||||||
case .main: return 2
|
case .main: return 3
|
||||||
case .custom(_, let lw): return CGFloat(lw)
|
case .custom(_, let lw): return CGFloat(lw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -58,6 +58,7 @@ struct ProfilePicView: View {
|
|||||||
return Group {
|
return Group {
|
||||||
if let img = self.img {
|
if let img = self.img {
|
||||||
img
|
img
|
||||||
|
.resizable()
|
||||||
.frame(width: size, height: size)
|
.frame(width: size, height: size)
|
||||||
.clipShape(Circle())
|
.clipShape(Circle())
|
||||||
.overlay(Circle().stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight)))
|
.overlay(Circle().stroke(highlight_color(highlight), lineWidth: pfp_line_width(highlight)))
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ struct ReplyQuoteView: View {
|
|||||||
|
|
||||||
func MainContent(event: NostrEvent) -> some View {
|
func MainContent(event: NostrEvent) -> some View {
|
||||||
HStack(alignment: .top) {
|
HStack(alignment: .top) {
|
||||||
Rectangle().frame(width: 2)
|
Rectangle()
|
||||||
|
.frame(width: 2)
|
||||||
.padding([.leading], 4)
|
.padding([.leading], 4)
|
||||||
.foregroundColor(.accentColor)
|
.foregroundColor(.accentColor)
|
||||||
|
|
||||||
@@ -30,9 +31,9 @@ struct ReplyQuoteView: View {
|
|||||||
.foregroundColor(.gray)
|
.foregroundColor(.gray)
|
||||||
}
|
}
|
||||||
|
|
||||||
Text(event.content)
|
NoteContentView(event: event, profiles: profiles, content: event.content)
|
||||||
//.frame(maxWidth: .infinity, alignment: .leading)
|
.font(.callout)
|
||||||
.textSelection(.enabled)
|
.foregroundColor(.accentColor)
|
||||||
|
|
||||||
//Spacer()
|
//Spacer()
|
||||||
}
|
}
|
||||||
@@ -46,7 +47,7 @@ struct ReplyQuoteView: View {
|
|||||||
if let event = thread.lookup(event_id) {
|
if let event = thread.lookup(event_id) {
|
||||||
MainContent(event: event)
|
MainContent(event: event)
|
||||||
.padding(4)
|
.padding(4)
|
||||||
.frame(maxHeight: 100)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.contentShape(Rectangle())
|
.contentShape(Rectangle())
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
NotificationCenter.default.post(name: .select_quote, object: event)
|
NotificationCenter.default.post(name: .select_quote, object: event)
|
||||||
@@ -59,10 +60,11 @@ struct ReplyQuoteView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
struct ReplyQuoteView_Previews: PreviewProvider {
|
||||||
struct SwiftUIView_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
SwiftUIView()
|
let s = test_damus_state()
|
||||||
|
let quoter = NostrEvent(content: "a\nb\nc", pubkey: "pubkey")
|
||||||
|
ReplyQuoteView(quoter: quoter, event_id: "pubkey2", image_cache: s.image_cache, profiles: s.profiles)
|
||||||
|
.environmentObject(ThreadModel(event: quoter, pool: s.pool))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ struct ReplyView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
Text("Replying to:")
|
Text("Replying to:")
|
||||||
HStack {
|
HStack(alignment: .top) {
|
||||||
let names = all_referenced_pubkeys(replying_to)
|
let names = all_referenced_pubkeys(replying_to)
|
||||||
.map { pubkey in
|
.map { pubkey in
|
||||||
let pk = pubkey.ref_id
|
let pk = pubkey.ref_id
|
||||||
@@ -35,8 +35,6 @@ struct ReplyView: View {
|
|||||||
}
|
}
|
||||||
EventView(event: replying_to, highlight: .none, has_action_bar: false, damus: damus)
|
EventView(event: replying_to, highlight: .none, has_action_bar: false, damus: damus)
|
||||||
PostView(references: gather_reply_ids(our_pubkey: damus.pubkey, from: replying_to))
|
PostView(references: gather_reply_ids(our_pubkey: damus.pubkey, from: replying_to))
|
||||||
|
|
||||||
Spacer()
|
|
||||||
}
|
}
|
||||||
.padding()
|
.padding()
|
||||||
|
|
||||||
@@ -45,10 +43,8 @@ struct ReplyView: View {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
struct ReplyView_Previews: PreviewProvider {
|
struct ReplyView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
ReplyView()
|
ReplyView(replying_to: NostrEvent(content: "hi", pubkey: "pubkey"), damus: test_damus_state())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|||||||
Reference in New Issue
Block a user