Add quick reply
This commit is contained in:
parent
6340b60d8c
commit
816281c225
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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,9 +276,15 @@ 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 {
|
||||||
location = "/thread/" + replyToID + "#status-" + id
|
if quickReply {
|
||||||
|
location = "/quickreply/" + id + "#status-" + id
|
||||||
|
} else {
|
||||||
|
location = "/thread/" + replyToID + "#status-" + id
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
location = c.r.FormValue("referrer")
|
||||||
}
|
}
|
||||||
redirect(c, location)
|
redirect(c, location)
|
||||||
return nil
|
return nil
|
||||||
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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}}
|
|
@ -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}}">
|
||||||
|
|
Loading…
Reference in New Issue