Compare commits
5 Commits
master
...
absolute_f
Author | SHA1 | Date | |
---|---|---|---|
|
ecb19c8746 | ||
|
4ab53547a8 | ||
|
9f34b60749 | ||
|
c3f39210d8 | ||
|
3a3a8672ba |
@ -69,6 +69,11 @@ type ThreadData struct {
|
||||
ReplyMap map[string][]mastodon.ReplyInfo
|
||||
}
|
||||
|
||||
type StatusData struct {
|
||||
*CommonData
|
||||
Status *mastodon.Status
|
||||
}
|
||||
|
||||
type NotificationData struct {
|
||||
*CommonData
|
||||
Notifications []*mastodon.Notification
|
||||
|
@ -20,6 +20,7 @@ const (
|
||||
RootPage = "root.tmpl"
|
||||
TimelinePage = "timeline.tmpl"
|
||||
ThreadPage = "thread.tmpl"
|
||||
StatusPopup = "status.tmpl"
|
||||
NotificationPage = "notification.tmpl"
|
||||
UserPage = "user.tmpl"
|
||||
UserSearchPage = "usersearch.tmpl"
|
||||
|
@ -321,6 +321,14 @@ func (s *service) ThreadPage(c *client, id string, reply bool) (err error) {
|
||||
return s.renderer.Render(c.rctx, c.w, renderer.ThreadPage, data)
|
||||
}
|
||||
|
||||
func (svc *service) StatusPopup(c *client, id string) (err error) {
|
||||
status, err := c.GetStatus(c.ctx, id)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
return svc.renderer.Render(c.rctx, c.w, renderer.StatusPopup, status)
|
||||
}
|
||||
|
||||
func (s *service) LikedByPage(c *client, id string) (err error) {
|
||||
likers, err := c.GetFavouritedBy(c.ctx, id, nil)
|
||||
if err != nil {
|
||||
|
@ -54,6 +54,15 @@ func writeJson(c *client, data interface{}) error {
|
||||
})
|
||||
}
|
||||
|
||||
func serveJsonError(w http.ResponseWriter, err error) {
|
||||
var d = make(map[string]interface{})
|
||||
d["error"] = err.Error()
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
json.NewEncoder(w).Encode(d)
|
||||
return
|
||||
}
|
||||
|
||||
func redirect(c *client, url string) {
|
||||
c.w.Header().Add("Location", url)
|
||||
c.w.WriteHeader(http.StatusFound)
|
||||
@ -620,6 +629,11 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
||||
return writeJson(c, count)
|
||||
}, CSRF, JSON)
|
||||
|
||||
fStatus := handle(func(c *client) error {
|
||||
id, _ := mux.Vars(c.r)["id"]
|
||||
return s.StatusPopup(c, id)
|
||||
}, SESSION, JSON)
|
||||
|
||||
r.HandleFunc("/", rootPage).Methods(http.MethodGet)
|
||||
r.HandleFunc("/nav", navPage).Methods(http.MethodGet)
|
||||
r.HandleFunc("/signin", signinPage).Methods(http.MethodGet)
|
||||
@ -669,6 +683,7 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
||||
r.HandleFunc("/fluoride/unlike/{id}", fUnlike).Methods(http.MethodPost)
|
||||
r.HandleFunc("/fluoride/retweet/{id}", fRetweet).Methods(http.MethodPost)
|
||||
r.HandleFunc("/fluoride/unretweet/{id}", fUnretweet).Methods(http.MethodPost)
|
||||
r.HandleFunc("/fluoride/status/{id}", fStatus).Methods(http.MethodGet)
|
||||
r.PathPrefix("/static").Handler(http.StripPrefix("/static",
|
||||
http.FileServer(http.Dir(staticDir))))
|
||||
|
||||
|
@ -7,6 +7,8 @@ var reverseActions = {
|
||||
"unretweet": "retweet"
|
||||
};
|
||||
|
||||
var statusCache = {};
|
||||
|
||||
var csrfToken = "";
|
||||
var antiDopamineMode = false;
|
||||
|
||||
@ -33,10 +35,11 @@ function http(method, url, body, type, success, error) {
|
||||
};
|
||||
req.onerror = function() {
|
||||
if (typeof error === "function") {
|
||||
error(this.responseText);
|
||||
error(this);
|
||||
}
|
||||
};
|
||||
req.open(method, url);
|
||||
if (type)
|
||||
req.setRequestHeader("Content-Type", type);
|
||||
req.send(body);
|
||||
}
|
||||
@ -132,7 +135,7 @@ function isInView(el) {
|
||||
return false;
|
||||
}
|
||||
|
||||
function handleReplyToLink(a) {
|
||||
function replyToLinkLocal(a) {
|
||||
if (!a)
|
||||
return;
|
||||
var id = a.getAttribute("href");
|
||||
@ -168,6 +171,68 @@ function handleReplyToLink(a) {
|
||||
}
|
||||
}
|
||||
|
||||
var inMouseEnter = false;
|
||||
function replyToLinkRemote(a) {
|
||||
a.onmouseenter = function(event) {
|
||||
inMouseEnter = true;
|
||||
var id = event.target.getAttribute("href");
|
||||
var arr = id.replace("/thread", "").split("#");
|
||||
if (arr.length < 2)
|
||||
return
|
||||
id = arr[1].replace("status-", "");
|
||||
if (statusCache[id]) {
|
||||
var copy = document.createElement("div");
|
||||
copy.innerHTML = statusCache[id];
|
||||
copy = copy.firstElementChild;
|
||||
copy.id = "reply-to-popup";
|
||||
var ract = event.target.getBoundingClientRect();
|
||||
if (ract.top > window.innerHeight / 2) {
|
||||
copy.style.bottom = (window.innerHeight -
|
||||
window.scrollY - ract.top) + "px";
|
||||
}
|
||||
event.target.parentElement.appendChild(copy);
|
||||
} else {
|
||||
http("GET", "/fluoride/status/"+id, null, null, function(res, type) {
|
||||
statusCache[id] = res;
|
||||
if (!inMouseEnter)
|
||||
return;
|
||||
var copy = document.createElement("div");
|
||||
copy.innerHTML = res;
|
||||
copy = copy.firstElementChild;
|
||||
copy.id = "reply-to-popup";
|
||||
var ract = event.target.getBoundingClientRect();
|
||||
if (ract.top > window.innerHeight / 2) {
|
||||
copy.style.bottom = (window.innerHeight -
|
||||
window.scrollY - ract.top) + "px";
|
||||
}
|
||||
event.target.parentElement.appendChild(copy);
|
||||
}, function(err) {
|
||||
console.log("error:", err);
|
||||
})
|
||||
}
|
||||
}
|
||||
a.onmouseleave = function(event) {
|
||||
inMouseEnter = false;
|
||||
var popup = document.getElementById("reply-to-popup");
|
||||
if (popup) {
|
||||
popup.parentElement.removeChild(popup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function handleReplyToLink(a) {
|
||||
if (!a)
|
||||
return;
|
||||
var id = a.getAttribute("href");
|
||||
if (!id)
|
||||
return;
|
||||
if (id[0] === "#") {
|
||||
replyToLinkLocal(a);
|
||||
} else if (id.indexOf("/thread/") === 0) {
|
||||
replyToLinkRemote(a);
|
||||
}
|
||||
}
|
||||
|
||||
function handleReplyLink(a) {
|
||||
a.onmouseenter = function(event) {
|
||||
var id = event.target.getAttribute("href");
|
||||
|
15
templates/statuspopup.tmpl
Normal file
15
templates/statuspopup.tmpl
Normal file
@ -0,0 +1,15 @@
|
||||
{{with $s := .Data}}
|
||||
{{template "header.tmpl" (WithContext .CommonData $.Ctx)}}
|
||||
<div class="page-title"> Thread </div>
|
||||
|
||||
{{range .Statuses}}
|
||||
|
||||
{{template "status.tmpl" (WithContext . $.Ctx)}}
|
||||
{{if $s.PostContext.ReplyContext}}{{if eq .ID $s.PostContext.ReplyContext.InReplyToID}}
|
||||
{{template "postform.tmpl" (WithContext $s.PostContext $.Ctx)}}
|
||||
{{end}}{{end}}
|
||||
|
||||
{{end}}
|
||||
|
||||
{{template "footer.tmpl"}}
|
||||
{{end}}
|
Loading…
Reference in New Issue
Block a user