damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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