commit d2b0eb6e94cbda4a0cc5766c4409735dc5533e6d
parent 8a7e253126aa473b0c63bbd3b16a61832be1e546
Author: David Eisinger <[email protected]>
Date: Thu, 9 Oct 2025 13:50:57 -0400
Remove initial API call on logged-out view
Diffstat:
2 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/internal/api.go b/internal/api.go
@@ -387,7 +387,7 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) {
}
if u, err := db.GetUserByUsername(r.Context(), uname); err == nil && u != nil {
if html, err := RenderPage("user.html", cfg); err == nil {
- // If owner viewing own page, embed initial bookmarks to avoid client fetch
+ // Embed initial bookmarks to avoid client fetch
if isOwnerAuthorized(r, u, db) {
items, err := db.ListBookmarks(r.Context(), u.ID, 50, 0)
if err == nil {
@@ -407,6 +407,25 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) {
}
}
}
+ } else {
+ items, err := db.ListPublicBookmarks(r.Context(), u.ID, 50, 0)
+ if err == nil {
+ resp := make([]bookmarkResponse, 0, len(items))
+ for i := range items {
+ resp = append(resp, toRespWithArchive(r.Context(), db, &items[i]))
+ }
+ if b, err := json.Marshal(resp); err == nil {
+ inject := []byte("<script>window.MARKY_INITIAL={view:'public',user:" + strconv.Quote(u.Username) + ",results:" + string(b) + "}</script>\n")
+ marker := []byte("<script src=\"/app.js\"></script>")
+ if i := bytes.Index(html, marker); i >= 0 {
+ out := make([]byte, 0, len(html)+len(inject))
+ out = append(out, html[:i]...)
+ out = append(out, inject...)
+ out = append(out, html[i:]...)
+ html = out
+ }
+ }
+ }
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
_, _ = w.Write(html)
@@ -461,7 +480,7 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) {
if !strings.Contains(p, "/") && !strings.Contains(p, ".") {
if u, err := db.GetUserByUsername(r.Context(), p); err == nil && u != nil {
if html, err := RenderPage("user.html", cfg); err == nil {
- // Owner initial embed for legacy route
+ // Initial embed for legacy route
if isOwnerAuthorized(r, u, db) {
items, err := db.ListBookmarks(r.Context(), u.ID, 50, 0)
if err == nil {
@@ -481,6 +500,25 @@ func NewHandlerWithConfig(db *DB, cfg HandlerConfig) (http.Handler, error) {
}
}
}
+ } else {
+ items, err := db.ListPublicBookmarks(r.Context(), u.ID, 50, 0)
+ if err == nil {
+ resp := make([]bookmarkResponse, 0, len(items))
+ for i := range items {
+ resp = append(resp, toRespWithArchive(r.Context(), db, &items[i]))
+ }
+ if b, err := json.Marshal(resp); err == nil {
+ inject := []byte("<script>window.MARKY_INITIAL={view:'public',user:" + strconv.Quote(u.Username) + ",results:" + string(b) + "}</script>\n")
+ marker := []byte("<script src=\"/app.js\"></script>")
+ if i := bytes.Index(html, marker); i >= 0 {
+ out := make([]byte, 0, len(html)+len(inject))
+ out = append(out, html[:i]...)
+ out = append(out, inject...)
+ out = append(out, html[i:]...)
+ html = out
+ }
+ }
+ }
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
_, _ = w.Write(html)
diff --git a/internal/web/app.js b/internal/web/app.js
@@ -68,7 +68,15 @@ createApp({
// Do not auto-fetch all bookmarks on initial load
} else {
this.view = 'public';
- this.loadPublic();
+ // Initialize from server-embedded data when available; otherwise fetch
+ let hydrated = false;
+ try {
+ if (window.MARKY_INITIAL && window.MARKY_INITIAL.view === 'public' && window.MARKY_INITIAL.user === this.viewUser) {
+ this.results = Array.isArray(window.MARKY_INITIAL.results) ? window.MARKY_INITIAL.results : [];
+ hydrated = true;
+ }
+ } catch {}
+ if (!hydrated) this.loadPublic();
}
this.updateTitle();
},