status.nim 2.9 KB

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