This repository has no description
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}