FollowingView.swift (6018B)
1 // 2 // FollowingView.swift 3 // damus 4 // 5 // Created by William Casarin on 2022-05-16. 6 // 7 8 import SwiftUI 9 10 struct FollowUserView: View { 11 let target: FollowTarget 12 let damus_state: DamusState 13 14 var body: some View { 15 HStack { 16 UserViewRow(damus_state: damus_state, pubkey: target.pubkey) 17 .onTapGesture { 18 damus_state.nav.push(route: Route.ProfileByKey(pubkey: target.pubkey)) 19 } 20 21 FollowButtonView(target: target, follows_you: false, follow_state: damus_state.contacts.follow_state(target.pubkey)) 22 } 23 Spacer() 24 } 25 } 26 27 struct FollowHashtagView: View { 28 let hashtag: Hashtag 29 let damus_state: DamusState 30 @State var is_following: Bool 31 32 init(hashtag: Hashtag, damus_state: DamusState) { 33 self.hashtag = hashtag 34 self.damus_state = damus_state 35 self.is_following = damus_state.contacts.follows(hashtag: hashtag) 36 } 37 38 var body: some View { 39 HStack { 40 HStack { 41 SingleCharacterAvatar(character: "#") 42 43 Text(verbatim: "#\(hashtag.hashtag)") 44 .bold() 45 } 46 .onTapGesture { 47 let search = SearchModel(state: damus_state, search: NostrFilter.init(hashtag: [hashtag.hashtag])) 48 damus_state.nav.push(route: Route.Search(search: search)) 49 } 50 51 Spacer() 52 if is_following { 53 HashtagUnfollowButton(damus_state: damus_state, hashtag: hashtag.hashtag, is_following: $is_following) 54 } 55 else { 56 HashtagFollowButton(damus_state: damus_state, hashtag: hashtag.hashtag, is_following: $is_following) 57 } 58 } 59 .onReceive(handle_notify(.followed)) { follow in 60 guard case .hashtag(let ht) = follow, ht == hashtag.hashtag else { 61 return 62 } 63 self.is_following = true 64 } 65 .onReceive(handle_notify(.unfollowed)) { follow in 66 guard case .hashtag(let ht) = follow, ht == hashtag.hashtag else { 67 return 68 } 69 self.is_following = false 70 } 71 } 72 } 73 74 struct FollowersYouKnowView: View { 75 let damus_state: DamusState 76 let friended_followers: [Pubkey] 77 @ObservedObject var followers: FollowersModel 78 79 var body: some View { 80 ScrollView { 81 LazyVStack(alignment: .leading) { 82 ForEach(friended_followers, id: \.self) { pk in 83 FollowUserView(target: .pubkey(pk), damus_state: damus_state) 84 } 85 } 86 .padding(.horizontal) 87 } 88 .navigationBarTitle(NSLocalizedString("Followers You Know", comment: "Navigation bar title for view that shows who is following a user.")) 89 } 90 } 91 92 struct FollowersView: View { 93 let damus_state: DamusState 94 @ObservedObject var followers: FollowersModel 95 96 var body: some View { 97 ScrollView { 98 LazyVStack(alignment: .leading) { 99 ForEach(followers.contacts ?? [], id: \.self) { pk in 100 FollowUserView(target: .pubkey(pk), damus_state: damus_state) 101 } 102 } 103 .padding(.horizontal) 104 } 105 .navigationBarTitle(NSLocalizedString("Followers", comment: "Navigation bar title for view that shows who is following a user.")) 106 .onAppear { 107 followers.subscribe() 108 } 109 .onDisappear { 110 followers.unsubscribe() 111 } 112 } 113 } 114 115 enum FollowingViewTabSelection: Int { 116 case people = 0 117 case hashtags = 1 118 } 119 120 struct FollowingView: View { 121 let damus_state: DamusState 122 123 let following: FollowingModel 124 @State var tab_selection: FollowingViewTabSelection = .people 125 @Environment(\.colorScheme) var colorScheme 126 127 128 var body: some View { 129 TabView(selection: $tab_selection) { 130 ScrollView { 131 LazyVStack(alignment: .leading) { 132 ForEach(following.contacts.reversed(), id: \.self) { pk in 133 FollowUserView(target: .pubkey(pk), damus_state: damus_state) 134 } 135 } 136 .padding() 137 } 138 .tag(FollowingViewTabSelection.people) 139 .id(FollowingViewTabSelection.people) 140 141 ScrollView { 142 LazyVStack(alignment: .leading) { 143 ForEach(following.hashtags, id: \.self) { ht in 144 FollowHashtagView(hashtag: ht, damus_state: damus_state) 145 } 146 } 147 .padding() 148 } 149 .tag(FollowingViewTabSelection.hashtags) 150 .id(FollowingViewTabSelection.hashtags) 151 } 152 .tabViewStyle(.page(indexDisplayMode: .never)) 153 .onAppear { 154 guard let txn = NdbTxn(ndb: self.damus_state.ndb) else { return } 155 following.subscribe(txn: txn) 156 } 157 .onDisappear { 158 following.unsubscribe() 159 } 160 .navigationBarTitle(NSLocalizedString("Following", comment: "Navigation bar title for view that shows who a user is following.")) 161 .safeAreaInset(edge: .top, spacing: 0) { 162 VStack(spacing: 0) { 163 CustomPicker(selection: $tab_selection, content: { 164 Text("People", comment: "Label for filter for seeing only people follows.").tag(FollowingViewTabSelection.people) 165 Text("Hashtags", comment: "Label for filter for seeing only hashtag follows.").tag(FollowingViewTabSelection.hashtags) 166 }) 167 Divider() 168 .frame(height: 1) 169 } 170 .background(colorScheme == .dark ? Color.black : Color.white) 171 } 172 } 173 } 174 175 176 struct FollowingView_Previews: PreviewProvider { 177 static var previews: some View { 178 FollowingView(damus_state: test_damus_state, following: test_following_model) 179 } 180 } 181