Add retweet indicator on tweets
This commit is contained in:
parent
2c8ef0b476
commit
107d21b7e6
@ -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,
|
||||||
}),
|
}),
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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>
|
||||||
|
@ -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}}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user