Fix duplicate status ids
authorr <r@freesoftwareextremist.com>
Sun, 5 Jan 2020 18:55:37 +0000 (18:55 +0000)
committerr <r@freesoftwareextremist.com>
Sun, 5 Jan 2020 18:55:37 +0000 (18:55 +0000)
Use retweeted_by_id to focus target tweet

mastodon/status.go
service/service.go
service/transport.go
templates/status.tmpl

index 6646c601f6a528793e83ffb6708b237941bcc4d7..06fdd20ce46aa43b3a6e740f7c5a23e8bebd6e8f 100644 (file)
@@ -56,6 +56,7 @@ type Status struct {
        ReplyNumber     int                    `json:"reply_number"`
        ThreadInNewTab  bool                   `json:"thread_in_new_tab"`
        MaskNSFW        bool                   `json:"mask_nsfw"`
+       RetweetedByID   string                 `json:"retweeted_by_id"`
 }
 
 // Context hold information for mastodon context.
index f8a4aed0fa974fdd3e6dcb407812c5da5e77a9d1..47e3de99bf601b87aab085b590c8065702ad023b 100644 (file)
@@ -282,6 +282,7 @@ func (svc *service) ServeTimelinePage(ctx context.Context, client io.Writer,
                statuses[i].ThreadInNewTab = c.Session.Settings.ThreadInNewTab
                statuses[i].MaskNSFW = c.Session.Settings.MaskNSFW
                if statuses[i].Reblog != nil {
+                       statuses[i].Reblog.RetweetedByID = statuses[i].ID
                        statuses[i].Reblog.ThreadInNewTab = c.Session.Settings.ThreadInNewTab
                        statuses[i].Reblog.MaskNSFW = c.Session.Settings.MaskNSFW
                }
index d481b21e91107d8759fbb49b326a3d7cec919404..041330d4824df1c9606932c4b2f3da74ab3e1dfb 100644 (file)
@@ -159,52 +159,76 @@ func NewHandler(s Service, staticDir string) http.Handler {
        r.HandleFunc("/like/{id}", func(w http.ResponseWriter, req *http.Request) {
                ctx := getContextWithSession(context.Background(), req)
                id, _ := mux.Vars(req)["id"]
-               err := s.Like(ctx, w, nil, id)
+               retweetedByID := req.FormValue("retweeted_by_id")
+
+               _, err := s.Like(ctx, w, nil, id)
                if err != nil {
                        s.ServeErrorPage(ctx, w, err)
                        return
                }
 
-               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+id)
+               rID := id
+               if len(retweetedByID) > 0 {
+                       rID = retweetedByID
+               }
+               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+rID)
                w.WriteHeader(http.StatusFound)
        }).Methods(http.MethodPost)
 
        r.HandleFunc("/unlike/{id}", func(w http.ResponseWriter, req *http.Request) {
                ctx := getContextWithSession(context.Background(), req)
                id, _ := mux.Vars(req)["id"]
-               err := s.UnLike(ctx, w, nil, id)
+               retweetedByID := req.FormValue("retweeted_by_id")
+
+               _, err := s.UnLike(ctx, w, nil, id)
                if err != nil {
                        s.ServeErrorPage(ctx, w, err)
                        return
                }
 
-               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+id)
+               rID := id
+               if len(retweetedByID) > 0 {
+                       rID = retweetedByID
+               }
+               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+rID)
                w.WriteHeader(http.StatusFound)
        }).Methods(http.MethodPost)
 
        r.HandleFunc("/retweet/{id}", func(w http.ResponseWriter, req *http.Request) {
                ctx := getContextWithSession(context.Background(), req)
                id, _ := mux.Vars(req)["id"]
-               err := s.Retweet(ctx, w, nil, id)
+               retweetedByID := req.FormValue("retweeted_by_id")
+
+               _, err := s.Retweet(ctx, w, nil, id)
                if err != nil {
                        s.ServeErrorPage(ctx, w, err)
                        return
                }
 
-               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+id)
+               rID := id
+               if len(retweetedByID) > 0 {
+                       rID = retweetedByID
+               }
+               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+rID)
                w.WriteHeader(http.StatusFound)
        }).Methods(http.MethodPost)
 
        r.HandleFunc("/unretweet/{id}", func(w http.ResponseWriter, req *http.Request) {
                ctx := getContextWithSession(context.Background(), req)
                id, _ := mux.Vars(req)["id"]
-               err := s.UnRetweet(ctx, w, nil, id)
+               retweetedByID := req.FormValue("retweeted_by_id")
+
+               _, err := s.UnRetweet(ctx, w, nil, id)
                if err != nil {
                        s.ServeErrorPage(ctx, w, err)
                        return
                }
 
-               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+id)
+               rID := id
+               if len(retweetedByID) > 0 {
+                       rID = retweetedByID
+               }
+               w.Header().Add("Location", req.Header.Get("Referer")+"#status-"+rID)
                w.WriteHeader(http.StatusFound)
        }).Methods(http.MethodPost)
 
index 1661f5871647770f698585c205bab679f99a738e..10b7d40bfaa36bff0b7b109772be0359f65231e7 100644 (file)
@@ -1,4 +1,4 @@
-<div id="status-{{if .Reblog}}{{.Reblog.ID}}{{else}}{{.ID}}{{end}}" class="status-container-container">
+<div id="status-{{.ID}}" class="status-container-container">
        {{if .Reblog}}
        <div class="retweet-info">
                <a class="img-link" href="/user/{{.Account.ID}}">
                                        {{else}}
                                        {{if .Reblogged}}
                                        <form class="status-retweet" action="/unretweet/{{.ID}}" method="post">
-                                           <input type="image" src="/static/icons/retweeted.png" alt="undo retweet" class="icon" title="undo retweet">
+                                               <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}" />
+                                               <input type="image" src="/static/icons/retweeted.png" alt="undo retweet" class="icon" title="undo retweet">
                                        </form>
                                        {{else}}
                                        <form class="status-retweet" action="/retweet/{{.ID}}" method="post">
-                                           <input type="image" src="/static/icons/retweet.png" alt="retweet" class="icon" title="retweet">
+                                               <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}" />
+                                               <input type="image" src="/static/icons/retweet.png" alt="retweet" class="icon" title="retweet">
                                        </form>
                                        {{end}}
                                        {{end}}
                                <div class="status-action">
                                        {{if .Favourited}}
                                        <form class="status-like" action="/unlike/{{.ID}}" method="post">
-                                           <input type="image" src="/static/icons/liked.png" alt="unlike" class="icon" title="unlike">
+                                               <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}" />
+                                               <input type="image" src="/static/icons/liked.png" alt="unlike" class="icon" title="unlike">
                                        </form>
                                        {{else}}
                                        <form class="status-like" action="/like/{{.ID}}" method="post">
-                                           <input type="image" src="/static/icons/star-o.png" alt="like" class="icon" title="like">
+                                               <input type="hidden" name="retweeted_by_id" value="{{.RetweetedByID}}" />
+                                               <input type="image" src="/static/icons/star-o.png" alt="like" class="icon" title="like">
                                        </form>
                                        {{end}}
                                        <a class="status-action-count" href="/likedby/{{.ID}}" title="click to see the the list">