package boards2 import ( "strconv" "strings" "gno.land/p/gnoland/boards" "gno.land/p/jeronimoalbi/mdform" "gno.land/p/leon/svgbtn" "gno.land/p/moul/md" "gno.land/p/nt/mux/v0" "gno.land/p/nt/ufmt/v0" ) func renderThread(res *mux.ResponseWriter, req *mux.Request) { name := req.GetVar("board") board, found := gBoards.GetByName(name) if !found { res.Write("Board not found") return } rawID := req.GetVar("thread") threadID, err := strconv.Atoi(rawID) if err != nil { res.Write("Invalid thread ID: " + rawID) return } thread, found := getThread(board, boards.ID(threadID)) if !found { res.Write("Thread not found") return } if thread.Hidden { link := md.Link("inappropriate", makeFlaggingReasonsURI(thread)) res.Write("⚠ Thread has been flagged as " + link) return } res.Write(md.H1(md.Link("Boards", gRealmPath) + " › " + md.Link(board.Name, makeBoardURI(board)))) res.Write(renderPost(thread, req.RawPath, "", 5)) } func renderThreadSummary(thread *boards.Post) string { var ( b strings.Builder postURI = makeThreadURI(thread) summary = summaryOf(thread.Title, 80) creatorLink = userLink(thread.Creator) roleBadge = getRoleBadge(thread) date = thread.CreatedAt.Format(dateFormat) ) if boards.IsRepost(thread) { summary += ` ⟳` postURI += ` "This is a thread repost"` } b.WriteString(md.H6(md.Link(summary, postURI))) b.WriteString("Created by " + creatorLink + roleBadge + " on " + date + " \n") status := []string{ strconv.Itoa(thread.Replies.Size()) + " replies", strconv.Itoa(thread.Reposts.Size()) + " reposts", } b.WriteString(md.Bold(strings.Join(status, " • ")) + "\n") return b.String() } func renderCreateThread(res *mux.ResponseWriter, req *mux.Request) { name := req.GetVar("board") board, found := gBoards.GetByName(name) if !found { res.Write("Board not found") return } form := mdform.New("exec", "CreateThread") form.Input( "boardID", "placeholder", "Board ID", "value", board.ID.String(), "readonly", "true", ) form.Input( "title", "placeholder", "Title", "required", "true", ) form.Textarea( "body", "placeholder", "Content", "rows", "10", "required", "true", ) res.Write(md.H1(board.Name + ": Create Thread")) res.Write(md.Link("← Back to board", makeBoardURI(board)) + "\n\n") res.Write( md.Paragraph( ufmt.Sprintf("Thread will be created in the board: %s", md.Link(board.Name, makeBoardURI(board))), ), ) res.Write(form.String()) res.Write("\n\n**Done?** " + svgbtn.ButtonWithRadius(136, 32, 4, "#E2E2E2", "#54595D", "Return to board", makeBoardURI(board)) + "\n") } func renderEditThread(res *mux.ResponseWriter, req *mux.Request) { name := req.GetVar("board") board, found := gBoards.GetByName(name) if !found { res.Write("Board not found") return } rawID := req.GetVar("thread") threadID, err := strconv.Atoi(rawID) if err != nil { res.Write("Invalid thread ID: " + rawID) return } thread, found := getThread(board, boards.ID(threadID)) if !found { res.Write("Thread not found") return } form := mdform.New("exec", "EditThread") form.Input( "boardID", "placeholder", "Board ID", "value", board.ID.String(), "readonly", "true", ) form.Input( "threadID", "placeholder", "Thread ID", "value", thread.ID.String(), "readonly", "true", ) form.Input( "title", "placeholder", "Title", "value", thread.Title, "required", "true", ) form.Textarea( "body", "placeholder", "Content", "rows", "10", "value", thread.Body, "required", "true", ) res.Write(md.H1(board.Name + ": Edit Thread")) res.Write(md.Link("← Back to thread", makeThreadURI(thread)) + "\n\n") res.Write( md.Paragraph("Editing " + md.Link(thread.Title, makeThreadURI(thread))), ) res.Write(form.String()) res.Write("\n\n**Done?** " + svgbtn.ButtonWithRadius(136, 32, 4, "#E2E2E2", "#54595D", "Return to thread", makeThreadURI(thread)) + "\n") } func renderRepostThread(res *mux.ResponseWriter, req *mux.Request) { name := req.GetVar("board") board, found := gBoards.GetByName(name) if !found { res.Write("Board not found") return } rawID := req.GetVar("thread") threadID, err := strconv.Atoi(rawID) if err != nil { res.Write("Invalid thread ID: " + rawID) return } thread, found := getThread(board, boards.ID(threadID)) if !found { res.Write("Thread not found") return } form := mdform.New("exec", "CreateRepost") form.Input( "boardID", "placeholder", "Board ID", "value", board.ID.String(), "readonly", "true", ) form.Input( "threadID", "placeholder", "Thread ID", "value", thread.ID.String(), "readonly", "true", ) form.Input( "destinationBoardID", "type", mdform.InputTypeNumber, "placeholder", "Board ID where to repost", "required", "true", ) form.Input( "title", "value", thread.Title, "placeholder", "Title", "required", "true", ) form.Textarea( "body", "placeholder", "Content", "rows", "10", ) res.Write(md.H1(board.Name + ": Repost Thread")) res.Write(md.Link("← Back to thread", makeThreadURI(thread)) + "\n\n") res.Write( md.Paragraph( "Threads can be reposted to other open boards or boards where you are a member " + "and are allowed to create new threads.", ), ) res.Write( md.Paragraph( ufmt.Sprintf("Reposting the thread: %s.", md.Link(thread.Title, makeThreadURI(thread))), ), ) res.Write(form.String()) res.Write("\n\n**Done?** " + svgbtn.ButtonWithRadius(136, 32, 4, "#E2E2E2", "#54595D", "Return to thread", makeThreadURI(thread)) + "\n") }