Add retweet indicator on tweets

This commit is contained in:
Alessio 2023-08-13 15:57:58 -03:00
parent 2c8ef0b476
commit 107d21b7e6
6 changed files with 42 additions and 7 deletions

View File

@ -56,6 +56,7 @@ func (app *Application) buffered_render(w http.ResponseWriter, tpl *template.Tem
type TweetCollection interface { type TweetCollection interface {
Tweet(id scraper.TweetID) scraper.Tweet Tweet(id scraper.TweetID) scraper.Tweet
User(id scraper.UserID) scraper.User User(id scraper.UserID) scraper.User
Retweet(id scraper.TweetID) scraper.Retweet
FocusedTweetID() scraper.TweetID FocusedTweetID() scraper.TweetID
} }
@ -72,6 +73,7 @@ func (app *Application) buffered_render_tweet_page(w http.ResponseWriter, tpl_fi
func_map(template.FuncMap{ func_map(template.FuncMap{
"tweet": data.Tweet, "tweet": data.Tweet,
"user": data.User, "user": data.User,
"retweet": data.Retweet,
"active_user": app.get_active_user, "active_user": app.get_active_user,
"focused_tweet_id": data.FocusedTweetID, "focused_tweet_id": data.FocusedTweetID,
}), }),

View File

@ -138,6 +138,9 @@ func (t TweetDetailData) Tweet(id scraper.TweetID) scraper.Tweet {
func (t TweetDetailData) User(id scraper.UserID) scraper.User { func (t TweetDetailData) User(id scraper.UserID) scraper.User {
return t.Users[id] return t.Users[id]
} }
func (t TweetDetailData) Retweet(id scraper.TweetID) scraper.Retweet {
return t.Retweets[id]
}
func (t TweetDetailData) FocusedTweetID() scraper.TweetID { func (t TweetDetailData) FocusedTweetID() scraper.TweetID {
return t.MainTweetID return t.MainTweetID
} }
@ -217,6 +220,10 @@ func (t UserProfileData) Tweet(id scraper.TweetID) scraper.Tweet {
func (t UserProfileData) User(id scraper.UserID) scraper.User { func (t UserProfileData) User(id scraper.UserID) scraper.User {
return t.Users[id] return t.Users[id]
} }
func (t UserProfileData) Retweet(id scraper.TweetID) scraper.Retweet {
return t.Retweets[id]
}
func (t UserProfileData) FocusedTweetID() scraper.TweetID { func (t UserProfileData) FocusedTweetID() scraper.TweetID {
return scraper.TweetID(0) return scraper.TweetID(0)
} }

View File

@ -385,3 +385,17 @@ input[type="submit"] {
.quick-link .author-info { .quick-link .author-info {
pointer-events: none; pointer-events: none;
} }
.retweet-info-container {
margin-left: 3.5em;
display: flex;
align-items: center;
opacity: 0.8;
}
.retweet-info-container .svg-icon {
width: 1.2em; /* override default from .svg-icon of 1.5em */
opacity: 0.6;
margin-right: 0.3em;
}
.retweeted-by-label {
margin: 0 0.2em;
}

View File

@ -4,18 +4,18 @@
{{define "main"}} {{define "main"}}
{{range .ParentIDs}} {{range .ParentIDs}}
<div class="thread-parent-tweet"> <div class="thread-parent-tweet">
{{template "tweet" .}} {{template "tweet" (dict "TweetID" . "RetweetID" 0)}}
</div> </div>
{{end}} {{end}}
<div class="focused-tweet"> <div class="focused-tweet">
{{template "tweet" .MainTweetID}} {{template "tweet" (dict "TweetID" .MainTweetID "RetweetID" 0)}}
</div> </div>
{{range .ReplyChains}} {{range .ReplyChains}}
<div class="reply-chain"> <div class="reply-chain">
{{range .}} {{range .}}
<div class="reply-tweet"> <div class="reply-tweet">
{{template "tweet" .}} {{template "tweet" (dict "TweetID" . "RetweetID" 0)}}
</div> </div>
{{end}} {{end}}
</div> </div>

View File

@ -1,5 +1,5 @@
{{define "tweet"}} {{define "tweet"}}
{{$main_tweet := (tweet .)}} {{$main_tweet := (tweet .TweetID)}}
{{$author := (user $main_tweet.UserID)}} {{$author := (user $main_tweet.UserID)}}
<div class="tweet" <div class="tweet"
{{if (not (eq $main_tweet.ID (focused_tweet_id)))}} {{if (not (eq $main_tweet.ID (focused_tweet_id)))}}
@ -10,6 +10,17 @@
hx-push-url="true" hx-push-url="true"
{{end}} {{end}}
> >
{{if (not (eq .RetweetID 0))}}
{{$retweet := (retweet .RetweetID)}}
{{$retweet_user := (user $retweet.RetweetedByID)}}
<div class="retweet-info-container">
<img class="svg-icon" src="/static/icons/retweet.svg" />
<span class="retweeted-by-label">Retweeted by</span>
<a class="retweeted-by-user" hx-get="/{{$retweet_user.Handle}}" hx-target="body" hx-swap="outerHTML" hx-push-url="true">
{{$retweet_user.DisplayName}}
</a>
</div>
{{end}}
<div class="tweet-header-container"> <div class="tweet-header-container">
<div class="author-info-container" hx-trigger="click consume"> <div class="author-info-container" hx-trigger="click consume">
{{template "author-info" $author}} {{template "author-info" $author}}

View File

@ -36,9 +36,7 @@ func (l CommaSeparatedList) Value() (driver.Value, error) {
} }
type Tweet struct { type Tweet struct {
ID TweetID `db:"id"` ID TweetID `db:"id"`
UserID UserID `db:"user_id"`
User *User
Text string `db:"text"` Text string `db:"text"`
IsExpandable bool `db:"is_expandable"` IsExpandable bool `db:"is_expandable"`
PostedAt Timestamp `db:"posted_at"` PostedAt Timestamp `db:"posted_at"`
@ -49,6 +47,9 @@ type Tweet struct {
InReplyToID TweetID `db:"in_reply_to_id"` InReplyToID TweetID `db:"in_reply_to_id"`
QuotedTweetID TweetID `db:"quoted_tweet_id"` QuotedTweetID TweetID `db:"quoted_tweet_id"`
UserID UserID `db:"user_id"`
User *User `db:"user"`
// For processing tombstones // For processing tombstones
UserHandle UserHandle UserHandle UserHandle
in_reply_to_user_handle UserHandle in_reply_to_user_handle UserHandle