Skip to content

Commit

Permalink
feat: add pagination to threads
Browse files Browse the repository at this point in the history
  • Loading branch information
x1unix committed Nov 27, 2024
1 parent 11f3727 commit 918cc79
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 17 deletions.
1 change: 1 addition & 0 deletions examples/gno.land/r/demo/boards2/board.gno
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ func (board *Board) Render(p Pagination) string {
sb.WriteString("\n---\n\n")
sb.WriteString(page.Selector())
}

return sb.String()
}

Expand Down
58 changes: 44 additions & 14 deletions examples/gno.land/r/demo/boards2/post.gno
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import (
"errors"
"std"
"strconv"
"strings"
"time"

"gno.land/p/demo/avl"
"gno.land/p/demo/avl/pager"
"gno.land/p/moul/txlink"
)

Expand Down Expand Up @@ -255,7 +257,7 @@ func (post *Post) RenderSummary() string {
return s
}

func (post *Post) Render(indent string, levels int) string {
func (post *Post) Render(indent string, levels int, pagination *Pagination) string {
if post == nil {
return "nil post"
}
Expand All @@ -278,20 +280,48 @@ func (post *Post) Render(indent string, levels int) string {
s += " \\[" + newLink("repost", post.GetRepostFormURL()) + "]"
}
s += " \\[" + newLink("x", post.GetDeleteFormURL()) + "]\n"
s += post.renderReplies(indent, levels, pagination)

if levels > 0 {
if post.replies.Size() > 0 {
post.replies.Iterate("", "", func(_ string, value interface{}) bool {
s += indent + "\n"
s += value.(*Post).Render(indent+"> ", levels-1)
return false
})
}
} else if post.replies.Size() > 0 {
s += indent + "\n"
return s
}

func (post *Post) renderReplies(indent string, levels int, p *Pagination) string {
if post.replies.Size() == 0 {
return ""
}

if levels == 0 {
postURL := post.GetURL()
s := indent + "\n"
s += indent + "_" + newLink("see all "+strconv.Itoa(post.replies.Size())+" replies", postURL) + "_\n"

return s
}
return s

sb := new(strings.Builder)
callback := func(_ string, value interface{}) bool {
sb.WriteString(indent)
sb.WriteString("\n")
sb.WriteString(value.(*Post).Render(indent+"> ", levels-1, nil))
return false
}

if p == nil {
post.replies.Iterate("", "", callback)
} else {
pg := pager.NewPager(&post.replies, p.PageSize)
page := pg.GetPage(p.PageNumber)
for _, v := range page.Items {
callback(v.Key, v.Value)
}

if page.TotalPages > 1 {
sb.WriteString("\n\n---\n\n")
sb.WriteString(page.Selector())
}
}

return sb.String()
}

func (post *Post) RenderInner() string {
Expand All @@ -313,7 +343,7 @@ func (post *Post) RenderInner() string {
}

s := "_" + newLink("see thread", post.board.GetURLFromThreadID(threadID)) + "_\n\n"
s += parent.Render("", 0) + "\n"
s += post.Render("> ", 5)
s += parent.Render("", 0, nil) + "\n"
s += post.Render("> ", 5, nil)
return s
}
11 changes: 8 additions & 3 deletions examples/gno.land/r/demo/boards2/render.gno
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,10 @@ func renderBoardsList(res *mux.ResponseWriter, r request) {
res.Write(" * " + newLink(url, url) + "\n")
}

res.Write("\n\n---\n\n")
res.Write(page.Selector())
if page.TotalPages > 1 {
res.Write("\n\n---\n\n")
res.Write(page.Selector())
}
}

func renderBoard(res *mux.ResponseWriter, req request) {
Expand All @@ -62,6 +64,7 @@ func renderBoard(res *mux.ResponseWriter, req request) {

func renderThread(res *mux.ResponseWriter, req request) {
name := req.GetVar("board")

v, found := gBoardsByName.Get(name)
if !found {
res.Write("Board does not exist: " + name)
Expand All @@ -81,7 +84,9 @@ func renderThread(res *mux.ResponseWriter, req request) {
res.Write("Thread does not exist with ID: " + req.GetVar("thread"))
return
}
res.Write(thread.Render("", threadRenderDepth))

p := req.pagination(defaultPageSize)
res.Write(thread.Render("", threadRenderDepth, &p))
}

func renderReply(res *mux.ResponseWriter, req request) {
Expand Down

0 comments on commit 918cc79

Please sign in to comment.