This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / appview / state / timeline.go
3.4 kB 122 lines
1package state 2 3import ( 4 "fmt" 5 "net/http" 6 7 "github.com/bluesky-social/indigo/atproto/syntax" 8 "tangled.org/core/appview/db" 9 "tangled.org/core/appview/models" 10 "tangled.org/core/appview/oauth" 11 "tangled.org/core/appview/pages" 12 "tangled.org/core/orm" 13) 14 15func (s *State) Home(w http.ResponseWriter, r *http.Request) { 16 // TODO: set this flag based on the UI 17 filtered := false 18 19 user := s.oauth.GetMultiAccountUser(r) 20 21 timeline, err := db.MakeTimeline(s.db, 50, "", filtered) 22 if err != nil { 23 s.logger.Error("failed to make timeline", "err", err) 24 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") 25 return 26 } 27 28 blueskyPosts, err := db.GetBlueskyPosts(s.db, 8) 29 if err != nil { 30 s.logger.Error("failed to get bluesky posts", "err", err) 31 } 32 33 fmt.Println(s.pages.Home(w, pages.TimelineParams{ 34 LoggedInUser: user, 35 Timeline: timeline, 36 BlueskyPosts: blueskyPosts, 37 ShowNewsletter: s.showNewsletter(user), 38 })) 39} 40func (s *State) HomeOrTimeline(w http.ResponseWriter, r *http.Request) { 41 if s.oauth.GetMultiAccountUser(r) != nil { 42 s.Timeline(w, r) 43 return 44 } 45 s.Home(w, r) 46} 47 48func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { 49 user := s.oauth.GetMultiAccountUser(r) 50 51 // TODO: set this flag based on the UI 52 filtered := false 53 54 var userDid string 55 if user != nil { 56 userDid = user.Did 57 } 58 timeline, err := db.MakeTimeline(s.db, 50, userDid, filtered) 59 if err != nil { 60 s.logger.Error("failed to make timeline", "err", err) 61 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") 62 } 63 64 repos, err := db.GetTopStarredReposLastWeek(s.db) 65 if err != nil { 66 s.logger.Error("failed to get top starred repos", "err", err) 67 s.pages.Notice(w, "topstarredrepos", "Unable to load.") 68 return 69 } 70 71 gfiLabel, err := db.GetLabelDefinition(s.db, orm.FilterEq("at_uri", s.config.Label.GoodFirstIssue)) 72 if err != nil { 73 // non-fatal 74 } 75 76 var vouchSuggestions []models.VouchSuggestion 77 if user != nil { 78 vouchSuggestions, err = db.GetVouchSuggestions(s.db, user.Did, 3) 79 if err != nil { 80 s.logger.Error("failed to get vouch suggestions", "err", err) 81 } 82 if len(vouchSuggestions) > 0 { 83 suggestionDids := make([]syntax.DID, len(vouchSuggestions)) 84 for i, sv := range vouchSuggestions { 85 suggestionDids[i] = syntax.DID(sv.Did) 86 } 87 relationships, err := db.GetVouchRelationshipsBatch(s.db, syntax.DID(user.Did), suggestionDids) 88 if err != nil { 89 s.logger.Error("failed to get vouch relationships for suggestions", "err", err) 90 } else { 91 for i := range vouchSuggestions { 92 vouchSuggestions[i].VouchRelationship = relationships[vouchSuggestions[i].Did] 93 } 94 } 95 } 96 } 97 98 s.pages.Timeline(w, pages.TimelineParams{ 99 LoggedInUser: user, 100 Timeline: timeline, 101 Repos: repos, 102 GfiLabel: gfiLabel, 103 VouchSuggestions: vouchSuggestions, 104 ShowNewsletter: s.showNewsletter(user), 105 }) 106} 107 108// showNewsletter decides whether the newsletter widget/CTA should render. 109// Anonymous visitors always see it (they can dismiss via localStorage); 110// logged-in users whose newsletter_preferences row exists (either 111// subscribed or dismissed) do not. 112func (s *State) showNewsletter(user *oauth.MultiAccountUser) bool { 113 if user == nil { 114 return true 115 } 116 pref, err := db.GetNewsletterPref(s.db, user.Did) 117 if err != nil { 118 s.logger.Error("failed to read newsletter preference", "did", user.Did, "err", err) 119 return true 120 } 121 return pref == nil 122}