forked from
tangled.org/core
Monorepo for Tangled
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}