Monorepo for Tangled
0
fork

Configure Feed

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

at fix/knot-version-string 96 lines 2.5 kB view raw
1package state 2 3import ( 4 "net/http" 5 6 "tangled.org/core/appview/db" 7 "tangled.org/core/appview/oauth" 8 "tangled.org/core/appview/pages" 9 "tangled.org/core/orm" 10) 11 12func (s *State) Home(w http.ResponseWriter, r *http.Request) { 13 // TODO: set this flag based on the UI 14 filtered := false 15 16 user := s.oauth.GetMultiAccountUser(r) 17 18 timeline, err := db.MakeTimeline(s.db, 50, "", filtered) 19 if err != nil { 20 s.logger.Error("failed to make timeline", "err", err) 21 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") 22 return 23 } 24 25 blueskyPosts, err := db.GetBlueskyPosts(s.db, 8) 26 if err != nil { 27 s.logger.Error("failed to get bluesky posts", "err", err) 28 } 29 30 s.pages.Home(w, pages.TimelineParams{ 31 LoggedInUser: user, 32 Timeline: timeline, 33 BlueskyPosts: blueskyPosts, 34 ShowNewsletter: s.showNewsletter(user), 35 }) 36} 37func (s *State) HomeOrTimeline(w http.ResponseWriter, r *http.Request) { 38 if s.oauth.GetMultiAccountUser(r) != nil { 39 s.Timeline(w, r) 40 return 41 } 42 s.Home(w, r) 43} 44 45func (s *State) Timeline(w http.ResponseWriter, r *http.Request) { 46 user := s.oauth.GetMultiAccountUser(r) 47 48 // TODO: set this flag based on the UI 49 filtered := false 50 51 var userDid string 52 if user != nil { 53 userDid = user.Did 54 } 55 timeline, err := db.MakeTimeline(s.db, 50, userDid, filtered) 56 if err != nil { 57 s.logger.Error("failed to make timeline", "err", err) 58 s.pages.Notice(w, "timeline", "Uh oh! Failed to load timeline.") 59 } 60 61 repos, err := db.GetTopStarredReposLastWeek(s.db) 62 if err != nil { 63 s.logger.Error("failed to get top starred repos", "err", err) 64 s.pages.Notice(w, "topstarredrepos", "Unable to load.") 65 return 66 } 67 68 gfiLabel, err := db.GetLabelDefinition(s.db, orm.FilterEq("at_uri", s.config.Label.GoodFirstIssue)) 69 if err != nil { 70 // non-fatal 71 } 72 73 s.pages.Timeline(w, pages.TimelineParams{ 74 LoggedInUser: user, 75 Timeline: timeline, 76 Repos: repos, 77 GfiLabel: gfiLabel, 78 ShowNewsletter: s.showNewsletter(user), 79 }) 80} 81 82// showNewsletter decides whether the newsletter widget/CTA should render. 83// Anonymous visitors always see it (they can dismiss via localStorage); 84// logged-in users whose newsletter_preferences row exists (either 85// subscribed or dismissed) do not. 86func (s *State) showNewsletter(user *oauth.MultiAccountUser) bool { 87 if user == nil { 88 return true 89 } 90 pref, err := db.GetNewsletterPref(s.db, user.Did) 91 if err != nil { 92 s.logger.Error("failed to read newsletter preference", "did", user.Did, "err", err) 93 return true 94 } 95 return pref == nil 96}