status.nim 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # SPDX-License-Identifier: AGPL-3.0-only
  2. import karax/[karaxdsl, vdom]
  3. import ".."/[types, formatters]
  4. import tweet, timeline
  5. proc renderEarlier(thread: Chain): VNode =
  6. buildHtml(tdiv(class="timeline-item more-replies earlier-replies")):
  7. a(class="more-replies-text", href=getLink(thread.content[0])):
  8. text "earlier replies"
  9. proc renderMoreReplies(thread: Chain): VNode =
  10. let link = getLink(thread.content[^1])
  11. buildHtml(tdiv(class="timeline-item more-replies")):
  12. if thread.content[^1].available:
  13. a(class="more-replies-text", href=link):
  14. text "more replies"
  15. else:
  16. a(class="more-replies-text"):
  17. text "more replies"
  18. proc renderReplyThread(thread: Chain; prefs: Prefs; path: string): VNode =
  19. buildHtml(tdiv(class="reply thread thread-line")):
  20. for i, tweet in thread.content:
  21. let last = (i == thread.content.high and not thread.hasMore)
  22. renderTweet(tweet, prefs, path, index=i, last=last)
  23. if thread.hasMore:
  24. renderMoreReplies(thread)
  25. proc renderReplies*(replies: Result[Chain]; prefs: Prefs; path: string): VNode =
  26. buildHtml(tdiv(class="replies", id="r")):
  27. for thread in replies.content:
  28. if thread.content.len == 0: continue
  29. renderReplyThread(thread, prefs, path)
  30. if replies.bottom.len > 0:
  31. renderMore(Query(), replies.bottom, focus="#r")
  32. proc renderConversation*(conv: Conversation; prefs: Prefs; path: string): VNode =
  33. let hasAfter = conv.after.content.len > 0
  34. let threadId = conv.tweet.threadId
  35. buildHtml(tdiv(class="conversation")):
  36. tdiv(class="main-thread"):
  37. if conv.before.content.len > 0:
  38. tdiv(class="before-tweet thread-line"):
  39. let first = conv.before.content[0]
  40. if threadId != first.id and (first.replyId > 0 or not first.available):
  41. renderEarlier(conv.before)
  42. for i, tweet in conv.before.content:
  43. renderTweet(tweet, prefs, path, index=i)
  44. tdiv(class="main-tweet", id="m"):
  45. let afterClass = if hasAfter: "thread thread-line" else: ""
  46. renderTweet(conv.tweet, prefs, path, class=afterClass, mainTweet=true)
  47. if hasAfter:
  48. tdiv(class="after-tweet thread-line"):
  49. let
  50. total = conv.after.content.high
  51. hasMore = conv.after.hasMore
  52. for i, tweet in conv.after.content:
  53. renderTweet(tweet, prefs, path, index=i,
  54. last=(i == total and not hasMore), afterTweet=true)
  55. if hasMore:
  56. renderMoreReplies(conv.after)
  57. if not prefs.hideReplies:
  58. if not conv.replies.beginning:
  59. renderNewer(Query(), getLink(conv.tweet), focus="#r")
  60. if conv.replies.content.len > 0 or conv.replies.bottom.len > 0:
  61. renderReplies(conv.replies, prefs, path)
  62. renderToTop(focus="#m")