Add quick reply

This commit is contained in:
r 2021-09-05 17:17:59 +00:00
parent 6340b60d8c
commit 816281c225
8 changed files with 96 additions and 2 deletions

View file

@ -15,6 +15,7 @@ type PostContext struct {
type ReplyContext struct { type ReplyContext struct {
InReplyToID string InReplyToID string
InReplyToName string InReplyToName string
QuickReply bool
ReplyContent string ReplyContent string
ForceVisibility bool ForceVisibility bool
} }

View file

@ -69,6 +69,13 @@ type ThreadData struct {
ReplyMap map[string][]mastodon.ReplyInfo ReplyMap map[string][]mastodon.ReplyInfo
} }
type QuickReplyData struct {
*CommonData
Ancestor *mastodon.Status
Status *mastodon.Status
PostContext model.PostContext
}
type NotificationData struct { type NotificationData struct {
*CommonData *CommonData
Notifications []*mastodon.Notification Notifications []*mastodon.Notification

View file

@ -20,6 +20,7 @@ const (
RootPage = "root.tmpl" RootPage = "root.tmpl"
TimelinePage = "timeline.tmpl" TimelinePage = "timeline.tmpl"
ThreadPage = "thread.tmpl" ThreadPage = "thread.tmpl"
QuickReplyPage = "quickreply.tmpl"
NotificationPage = "notification.tmpl" NotificationPage = "notification.tmpl"
UserPage = "user.tmpl" UserPage = "user.tmpl"
UserSearchPage = "usersearch.tmpl" UserSearchPage = "usersearch.tmpl"

View file

@ -321,6 +321,62 @@ func (s *service) ThreadPage(c *client, id string, reply bool) (err error) {
return s.renderer.Render(c.rctx, c.w, renderer.ThreadPage, data) return s.renderer.Render(c.rctx, c.w, renderer.ThreadPage, data)
} }
func (s *service) QuickReplyPage(c *client, id string) (err error) {
status, err := c.GetStatus(c.ctx, id)
if err != nil {
return
}
var ancestor *mastodon.Status
if status.InReplyToID != nil {
ancestor, err = c.GetStatus(c.ctx, status.InReplyToID.(string))
if err != nil {
return
}
}
var content string
if c.s.UserID != status.Account.ID {
content += "@" + status.Account.Acct + " "
}
for i := range status.Mentions {
if status.Mentions[i].ID != c.s.UserID &&
status.Mentions[i].ID != status.Account.ID {
content += "@" + status.Mentions[i].Acct + " "
}
}
var visibility string
isDirect := status.Visibility == "direct"
if isDirect || c.s.Settings.CopyScope {
visibility = status.Visibility
} else {
visibility = c.s.Settings.DefaultVisibility
}
pctx := model.PostContext{
DefaultVisibility: visibility,
DefaultFormat: c.s.Settings.DefaultFormat,
Formats: s.postFormats,
ReplyContext: &model.ReplyContext{
InReplyToID: id,
InReplyToName: status.Account.Acct,
QuickReply: true,
ReplyContent: content,
ForceVisibility: isDirect,
},
}
cdata := s.cdata(c, "post by "+status.Account.DisplayName, 0, 0, "")
data := &renderer.QuickReplyData{
Ancestor: ancestor,
Status: status,
PostContext: pctx,
CommonData: cdata,
}
return s.renderer.Render(c.rctx, c.w, renderer.QuickReplyPage, data)
}
func (s *service) LikedByPage(c *client, id string) (err error) { func (s *service) LikedByPage(c *client, id string) (err error) {
likers, err := c.GetFavouritedBy(c.ctx, id, nil) likers, err := c.GetFavouritedBy(c.ctx, id, nil)
if err != nil { if err != nil {

View file

@ -177,6 +177,11 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
return s.ThreadPage(c, id, len(reply) > 1) return s.ThreadPage(c, id, len(reply) > 1)
}, SESSION, HTML) }, SESSION, HTML)
quickReplyPage := handle(func(c *client) error {
id, _ := mux.Vars(c.r)["id"]
return s.QuickReplyPage(c, id)
}, SESSION, HTML)
likedByPage := handle(func(c *client) error { likedByPage := handle(func(c *client) error {
id, _ := mux.Vars(c.r)["id"] id, _ := mux.Vars(c.r)["id"]
return s.LikedByPage(c, id) return s.LikedByPage(c, id)
@ -263,6 +268,7 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
format := c.r.FormValue("format") format := c.r.FormValue("format")
visibility := c.r.FormValue("visibility") visibility := c.r.FormValue("visibility")
isNSFW := c.r.FormValue("is_nsfw") == "true" isNSFW := c.r.FormValue("is_nsfw") == "true"
quickReply := c.r.FormValue("quickreply") == "true"
files := c.r.MultipartForm.File["attachments"] files := c.r.MultipartForm.File["attachments"]
id, err := s.Post(c, content, replyToID, format, visibility, isNSFW, files) id, err := s.Post(c, content, replyToID, format, visibility, isNSFW, files)
@ -270,10 +276,16 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
return err return err
} }
location := c.r.FormValue("referrer") var location string
if len(replyToID) > 0 { if len(replyToID) > 0 {
if quickReply {
location = "/quickreply/" + id + "#status-" + id
} else {
location = "/thread/" + replyToID + "#status-" + id location = "/thread/" + replyToID + "#status-" + id
} }
} else {
location = c.r.FormValue("referrer")
}
redirect(c, location) redirect(c, location)
return nil return nil
}, CSRF, HTML) }, CSRF, HTML)
@ -626,6 +638,7 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
r.HandleFunc("/timeline/{type}", timelinePage).Methods(http.MethodGet) r.HandleFunc("/timeline/{type}", timelinePage).Methods(http.MethodGet)
r.HandleFunc("/timeline", defaultTimelinePage).Methods(http.MethodGet) r.HandleFunc("/timeline", defaultTimelinePage).Methods(http.MethodGet)
r.HandleFunc("/thread/{id}", threadPage).Methods(http.MethodGet) r.HandleFunc("/thread/{id}", threadPage).Methods(http.MethodGet)
r.HandleFunc("/quickreply/{id}", quickReplyPage).Methods(http.MethodGet)
r.HandleFunc("/likedby/{id}", likedByPage).Methods(http.MethodGet) r.HandleFunc("/likedby/{id}", likedByPage).Methods(http.MethodGet)
r.HandleFunc("/retweetedby/{id}", retweetedByPage).Methods(http.MethodGet) r.HandleFunc("/retweetedby/{id}", retweetedByPage).Methods(http.MethodGet)
r.HandleFunc("/notifications", notificationsPage).Methods(http.MethodGet) r.HandleFunc("/notifications", notificationsPage).Methods(http.MethodGet)

View file

@ -4,6 +4,7 @@
<input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}"> <input type="hidden" name="referrer" value="{{$.Ctx.Referrer}}">
{{if .ReplyContext}} {{if .ReplyContext}}
<input type="hidden" name="reply_to_id" value="{{.ReplyContext.InReplyToID}}" /> <input type="hidden" name="reply_to_id" value="{{.ReplyContext.InReplyToID}}" />
<input type="hidden" name="quickreply" value="{{.ReplyContext.QuickReply}}" />
<label for="post-content" class="post-form-title"> Reply to {{.ReplyContext.InReplyToName}} </label> <label for="post-content" class="post-form-title"> Reply to {{.ReplyContext.InReplyToName}} </label>
{{else}} {{else}}
<label for="post-content" class="post-form-title"> New post </label> <label for="post-content" class="post-form-title"> New post </label>

12
templates/quickreply.tmpl Normal file
View file

@ -0,0 +1,12 @@
{{with $s := .Data}}
{{template "header.tmpl" (WithContext .CommonData $.Ctx)}}
<div class="page-title"> Quick Reply </div>
{{if .Ancestor}}
{{template "status.tmpl" (WithContext .Ancestor $.Ctx)}}
{{end}}
{{template "status.tmpl" (WithContext .Status $.Ctx)}}
{{template "postform.tmpl" (WithContext $s.PostContext $.Ctx)}}
{{template "footer.tmpl"}}
{{end}}

View file

@ -35,6 +35,9 @@
<a class="more-link" href="{{.URL}}" target="_blank"> <a class="more-link" href="{{.URL}}" target="_blank">
source source
</a> </a>
<a class="more-link" href="/quickreply/{{.ID}}#status-{{.ID}}">
quickreply
</a>
{{if .Muted}} {{if .Muted}}
<form action="/unmuteconv/{{.ID}}" method="post" target="_self"> <form action="/unmuteconv/{{.ID}}" method="post" target="_self">
<input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}"> <input type="hidden" name="csrf_token" value="{{$.Ctx.CSRFToken}}">