From fba29d44549ccceb4f7e8afc172b1585c0f37bb6 Mon Sep 17 00:00:00 2001 From: Ben Weeks Date: Fri, 6 Jan 2023 22:41:48 +0000 Subject: [PATCH] Worked on amending the colors. --- damus/ContentView.swift | 349 +++++++++++++++++---------------- damus/Views/ProfileName.swift | 2 +- damus/Views/SideMenuView.swift | 59 ++++-- damus/damusApp.swift | 3 - 4 files changed, 219 insertions(+), 194 deletions(-) diff --git a/damus/ContentView.swift b/damus/ContentView.swift index fe75c0ad..5217c3f6 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -211,197 +211,207 @@ struct ContentView: View { } var body: some View { - //ZStack { + ZStack { + if let damus = self.damus_state { + VStack(alignment: .leading, spacing: 0) { - if let damus = self.damus_state { NavigationView { - SideMenuView(damus_state: damus_state!, isSidebarVisible: $isSideBarOpened) - MainContent(damus: damus) - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - let profile_model = ProfileModel(pubkey: damus_state!.pubkey, damus: damus_state!) - let followers_model = FollowersModel(damus_state: damus_state!, target: damus_state!.pubkey) - let prof_dest = ProfileView(damus_state: damus_state!, profile: profile_model, followers: followers_model) - - Button { - isSideBarOpened.toggle() - } label: { + + SideMenuView(damus_state: damus, isSidebarVisible: $isSideBarOpened).zIndex(1) + + VStack(alignment: .leading, spacing: 0) { + + MainContent(damus: damus) + .toolbar { + ToolbarItem(placement: .navigationBarLeading) { let profile_model = ProfileModel(pubkey: damus_state!.pubkey, damus: damus_state!) let followers_model = FollowersModel(damus_state: damus_state!, target: damus_state!.pubkey) let prof_dest = ProfileView(damus_state: damus_state!, profile: profile_model, followers: followers_model) - if let picture = damus_state?.profiles.lookup(id: pubkey)?.picture { - ProfilePicView(pubkey: damus_state!.pubkey, size: 32, highlight: .none, profiles: damus_state!.profiles, picture: picture) - } else { - Image(systemName: "person.fill") - } - } - - NavigationLink(destination: prof_dest) { - /// Verify that the user has a profile picture, if not display a generic SF Symbol - /// (Resolves an in-app error where ``Robohash`` pictures are not generated so the button dissapears - if let picture = damus_state?.profiles.lookup(id: pubkey)?.picture { - ProfilePicView(pubkey: damus_state!.pubkey, size: 32, highlight: .none, profiles: damus_state!.profiles, picture: picture) - } else { - Image(systemName: "person.fill") - } - } - .buttonStyle(PlainButtonStyle()) - - } - - ToolbarItem(placement: .navigationBarTrailing) { - HStack(alignment: .center) { - if home.signal.signal != home.signal.max_signal { - Text("\(home.signal.signal)/\(home.signal.max_signal)") - .font(.callout) - .foregroundColor(.gray) + Button { + isSideBarOpened.toggle() + } label: { + let profile_model = ProfileModel(pubkey: damus_state!.pubkey, damus: damus_state!) + let followers_model = FollowersModel(damus_state: damus_state!, target: damus_state!.pubkey) + let prof_dest = ProfileView(damus_state: damus_state!, profile: profile_model, followers: followers_model) + + if let picture = damus_state?.profiles.lookup(id: pubkey)?.picture { + ProfilePicView(pubkey: damus_state!.pubkey, size: 32, highlight: .none, profiles: damus_state!.profiles, picture: picture) + } else { + Image(systemName: "person.fill") + } } - NavigationLink(destination: ConfigView(state: damus_state!).environmentObject(user_settings)) { - Label("", systemImage: "gear") + NavigationLink(destination: prof_dest) { + /// Verify that the user has a profile picture, if not display a generic SF Symbol + /// (Resolves an in-app error where ``Robohash`` pictures are not generated so the button dissapears + if let picture = damus_state?.profiles.lookup(id: pubkey)?.picture { + ProfilePicView(pubkey: damus_state!.pubkey, size: 32, highlight: .none, profiles: damus_state!.profiles, picture: picture) + } else { + Image(systemName: "person.fill") + } } .buttonStyle(PlainButtonStyle()) + + } + + ToolbarItem(placement: .navigationBarTrailing) { + HStack(alignment: .center) { + if home.signal.signal != home.signal.max_signal { + Text("\(home.signal.signal)/\(home.signal.max_signal)") + .font(.callout) + .foregroundColor(.gray) + } + + /* + NavigationLink(destination: ConfigView(state: damus_state!).environmentObject(user_settings)) { + Label("", systemImage: "gear") + } + .buttonStyle(PlainButtonStyle()) + */ + } } } - } - } - .navigationViewStyle(.stack) - } - - TabBar(new_events: $home.new_events, selected: $selected_timeline, action: switch_timeline) - .padding([.bottom], 8) - } - .onAppear() { - self.connect() - //KingfisherManager.shared.cache.clearDiskCache() - setup_notifications() - } - .sheet(item: $active_sheet) { item in - switch item { - case .post: - PostView(replying_to: nil, references: []) - case .reply(let event): - ReplyView(replying_to: event, damus: damus_state!) - } - } - .onOpenURL { url in - guard let link = decode_nostr_uri(url.absoluteString) 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" { - active_event_id = ref.ref_id - thread_open = true - } - case .filter(let filt): - active_search = filt - search_open = true - break - // TODO: handle filter searches? - } - - } - .onReceive(handle_notify(.boost)) { notif in - guard let privkey = self.privkey else { - return - } - - let ev = notif.object as! NostrEvent - let boost = make_boost_event(pubkey: pubkey, privkey: privkey, boosted: ev) - self.damus_state?.pool.send(.event(boost)) - } - .onReceive(handle_notify(.open_thread)) { obj in - //let ev = obj.object as! NostrEvent - //thread.set_active_event(ev) - //is_thread_open = true - } - .onReceive(handle_notify(.reply)) { notif in - let ev = notif.object as! NostrEvent - self.active_sheet = .reply(ev) - } - .onReceive(handle_notify(.like)) { like in - } - .onReceive(handle_notify(.broadcast_event)) { obj in - let ev = obj.object as! NostrEvent - self.damus_state?.pool.send(.event(ev)) - } - .onReceive(handle_notify(.unfollow)) { notif in - guard let privkey = self.privkey else { - return - } - - guard let damus = self.damus_state else { - return - } - - let target = notif.object as! FollowTarget - let pk = target.pubkey - - if let ev = unfollow_user(pool: damus.pool, - our_contacts: damus.contacts.event, - pubkey: damus.pubkey, - privkey: privkey, - unfollow: pk) { - notify(.unfollowed, pk) + } + }.navigationViewStyle(.stack) - damus.contacts.event = ev - damus.contacts.remove_friend(pk) - //friend_events = friend_events.filter { $0.pubkey != pk } + TabBar(new_events: $home.new_events, selected: $selected_timeline, action: switch_timeline) + .padding([.bottom], 8) } } - .onReceive(handle_notify(.follow)) { notif in - guard let privkey = self.privkey else { - return + } + .onAppear() { + self.connect() + //KingfisherManager.shared.cache.clearDiskCache() + setup_notifications() + } + .sheet(item: $active_sheet) { item in + switch item { + case .post: + PostView(replying_to: nil, references: []) + case .reply(let event): + ReplyView(replying_to: event, damus: damus_state!) + } + } + .onOpenURL { url in + guard let link = decode_nostr_uri(url.absoluteString) 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" { + active_event_id = ref.ref_id + thread_open = true } + case .filter(let filt): + active_search = filt + search_open = true + break + // TODO: handle filter searches? + } + + } + .onReceive(handle_notify(.boost)) { notif in + guard let privkey = self.privkey else { + return + } + + let ev = notif.object as! NostrEvent + let boost = make_boost_event(pubkey: pubkey, privkey: privkey, boosted: ev) + self.damus_state?.pool.send(.event(boost)) + } + .onReceive(handle_notify(.open_thread)) { obj in + //let ev = obj.object as! NostrEvent + //thread.set_active_event(ev) + //is_thread_open = true + } + .onReceive(handle_notify(.reply)) { notif in + let ev = notif.object as! NostrEvent + self.active_sheet = .reply(ev) + } + .onReceive(handle_notify(.like)) { like in + } + .onReceive(handle_notify(.broadcast_event)) { obj in + let ev = obj.object as! NostrEvent + self.damus_state?.pool.send(.event(ev)) + } + .onReceive(handle_notify(.unfollow)) { notif in + guard let privkey = self.privkey else { + return + } + + guard let damus = self.damus_state else { + return + } + + let target = notif.object as! FollowTarget + let pk = target.pubkey + + if let ev = unfollow_user(pool: damus.pool, + our_contacts: damus.contacts.event, + pubkey: damus.pubkey, + privkey: privkey, + unfollow: pk) { + notify(.unfollowed, pk) - let fnotify = notif.object as! FollowTarget - guard let damus = self.damus_state else { - return - } + damus.contacts.event = ev + damus.contacts.remove_friend(pk) + //friend_events = friend_events.filter { $0.pubkey != pk } + } + } + .onReceive(handle_notify(.follow)) { notif in + guard let privkey = self.privkey else { + return + } + + let fnotify = notif.object as! FollowTarget + guard let damus = self.damus_state else { + return + } + + if let ev = follow_user(pool: damus.pool, + our_contacts: damus.contacts.event, + pubkey: damus.pubkey, + privkey: privkey, + follow: ReferencedId(ref_id: fnotify.pubkey, relay_id: nil, key: "p")) { + notify(.followed, fnotify.pubkey) - if let ev = follow_user(pool: damus.pool, - our_contacts: damus.contacts.event, - pubkey: damus.pubkey, - privkey: privkey, - follow: ReferencedId(ref_id: fnotify.pubkey, relay_id: nil, key: "p")) { - notify(.followed, fnotify.pubkey) - - damus_state?.contacts.event = ev - - switch fnotify { - case .pubkey(let pk): - damus.contacts.add_friend_pubkey(pk) - case .contact(let ev): - damus.contacts.add_friend_contact(ev) - } - } - } - .onReceive(handle_notify(.post)) { obj in - guard let privkey = self.privkey else { - return - } + damus_state?.contacts.event = ev - let post_res = obj.object as! NostrPostResult - switch post_res { - case .post(let post): - print("post \(post.content)") - let new_ev = post_to_event(post: post, privkey: privkey, pubkey: pubkey) - self.damus_state?.pool.send(.event(new_ev)) - case .cancel: - active_sheet = nil - print("post cancelled") + switch fnotify { + case .pubkey(let pk): + damus.contacts.add_friend_pubkey(pk) + case .contact(let ev): + damus.contacts.add_friend_contact(ev) } } - .onReceive(timer) { n in - self.damus_state?.pool.connect_to_disconnected() + } + .onReceive(handle_notify(.post)) { obj in + guard let privkey = self.privkey else { + return } - //} + + let post_res = obj.object as! NostrPostResult + switch post_res { + case .post(let post): + print("post \(post.content)") + let new_ev = post_to_event(post: post, privkey: privkey, pubkey: pubkey) + self.damus_state?.pool.send(.event(new_ev)) + case .cancel: + active_sheet = nil + print("post cancelled") + } + } + .onReceive(timer) { n in + self.damus_state?.pool.connect_to_disconnected() + } + + + } func switch_timeline(_ timeline: Timeline) { @@ -460,7 +470,6 @@ struct ContentView_Previews: PreviewProvider { } } - func get_since_time(last_event: NostrEvent?) -> Int64? { if let last_event = last_event { return last_event.created_at - 60 * 10 diff --git a/damus/Views/ProfileName.swift b/damus/Views/ProfileName.swift index b7bba8f0..b48b3a38 100644 --- a/damus/Views/ProfileName.swift +++ b/damus/Views/ProfileName.swift @@ -137,7 +137,7 @@ struct EventProfileName: View { .padding([.trailing], 2) Text("@" + String(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey))) - .foregroundColor(.gray) + .foregroundColor(Color("DamusMediumGrey")) .font(eventviewsize_to_font(size)) } else { Text(String(display_name ?? Profile.displayName(profile: profile, pubkey: pubkey))) diff --git a/damus/Views/SideMenuView.swift b/damus/Views/SideMenuView.swift index 51623889..1f044adf 100644 --- a/damus/Views/SideMenuView.swift +++ b/damus/Views/SideMenuView.swift @@ -11,13 +11,20 @@ struct SideMenuView: View { let damus_state: DamusState @Binding var isSidebarVisible: Bool + @State var confirm_logout: Bool = false + @StateObject var user_settings = UserSettingsStore() + + @Environment(\.colorScheme) var colorScheme + var sideBarWidth = UIScreen.main.bounds.size.width * 0.7 - var bgColor: Color = - Color(.init( - red: 52 / 255, - green: 70 / 255, - blue: 182 / 255, - alpha: 1)) + + func fillColor() -> Color { + colorScheme == .light ? Color("DamusWhite") : Color("DamusBlack") + } + + func textColor() -> Color { + colorScheme == .light ? Color("DamusBlack") : Color("DamusWhite") + } var body: some View { if isSidebarVisible { @@ -25,7 +32,7 @@ struct SideMenuView: View { GeometryReader { _ in EmptyView() } - .background(.black.opacity(0.6)) + .background(.gray.opacity(0.6)) .opacity(isSidebarVisible ? 1 : 0) .animation(.easeInOut.delay(0.2), value: isSidebarVisible) .onTapGesture { @@ -40,7 +47,7 @@ struct SideMenuView: View { var content: some View { HStack(alignment: .top) { ZStack(alignment: .top) { - Color("DamusBlack") + fillColor() VStack(alignment: .leading, spacing: 20) { let profile = damus_state.profiles.lookup(id: damus_state.pubkey) @@ -50,14 +57,16 @@ struct SideMenuView: View { } else { Image(systemName: "person.fill") } - if let display_name = profile?.display_name { - VStack(alignment: .leading) { + VStack(alignment: .leading) { + if let display_name = profile?.display_name { Text(display_name) - .foregroundColor(Color("DamusWhite")) - .font(.headline) - ProfileName(pubkey: damus_state.pubkey, profile: profile, prefix: "@", damus: damus_state, show_friend_confirmed: false) - .font(.callout) - .foregroundColor(.gray) + .foregroundColor(textColor()) + .font(.title) + } + if let name = profile?.name { + Text("@" + name) + .foregroundColor(Color("DamusMediumGrey")) + .font(.body) } } @@ -80,7 +89,7 @@ struct SideMenuView: View { .foregroundColor(.accentColor) } - NavigationLink(destination: ConfigView(state: damus_state)) { + NavigationLink(destination: ConfigView(state: damus_state).environmentObject(user_settings)) { Label("App Settings", systemImage: "xserve") .font(.title2) .foregroundColor(.accentColor) @@ -90,20 +99,30 @@ struct SideMenuView: View { Button(action: { //ConfigView(state: damus_state) - notify(.logout, ()) + confirm_logout = true }, label: { - Label("Sign out", systemImage: "exit") + Label("Sign out", systemImage: "pip.exit") .font(.title3) - .foregroundColor(Color("DamusWhite")) + .foregroundColor(textColor()) }) } .padding(.top, 50) .padding(.bottom, 50) - .padding(.horizontal, 20) + .padding(.leading, 40) } .frame(width: sideBarWidth) .offset(x: isSidebarVisible ? 0 : -sideBarWidth) .animation(.default, value: isSidebarVisible) + .alert("Logout", isPresented: $confirm_logout) { + Button("Cancel") { + confirm_logout = false + } + Button("Logout") { + notify(.logout, ()) + } + } message: { + Text("Make sure your nsec account key is saved before you logout or you will lose access to this account") + } Spacer() } diff --git a/damus/damusApp.swift b/damus/damusApp.swift index 72215085..be7056b1 100644 --- a/damus/damusApp.swift +++ b/damus/damusApp.swift @@ -14,10 +14,7 @@ struct damusApp: App { WindowGroup { MainView() } - } - - } struct MainView: View {