Message.coffee 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. class Message
  2. constructor: (@message_list, @row) ->
  3. @active = false
  4. @selected = false
  5. @deleted = false
  6. @key = @row.key
  7. if @row.folder == "sent" or Page.local_storage.read[@row.date_added]
  8. @read = true
  9. else
  10. @read = false
  11. @
  12. getBodyPreview: ->
  13. return @row.body[0..80]
  14. markRead: (read = true) ->
  15. if not @read
  16. Page.local_storage.read[@row.date_added] = true
  17. Page.saveLocalStorage()
  18. @read = read
  19. # Handle
  20. handleListClick: (e) =>
  21. @markRead()
  22. if e and e.ctrlKey # Single select
  23. @selected = not @selected
  24. # Convert currently active message as selected
  25. if @message_list.message_lists.message_active
  26. @message_list.message_lists.message_active.active = false
  27. @message_list.message_lists.message_active.selected = true
  28. @message_list.message_lists.message_active = null
  29. Page.message_show.message = null
  30. # Update selected list
  31. @message_list.updateSelected()
  32. else if e and e.shiftKey # Range select
  33. # Convert currently active message as selected
  34. if @message_list.message_lists.message_active
  35. active_index = @message_list.messages.indexOf(@message_list.message_lists.message_active)
  36. my_index = @message_list.messages.indexOf(@)
  37. for message in @message_list.messages[Math.min(active_index, my_index)..Math.max(active_index, my_index)]
  38. message.selected = true
  39. @message_list.updateSelected()
  40. else # View message
  41. @message_list.setActiveMessage(@)
  42. Page.message_show.setMessage(@)
  43. return false
  44. handleDeleteClick: =>
  45. @message_list.deleteMessage(@)
  46. @message_list.save()
  47. return false
  48. handleReplyClick: =>
  49. Page.message_create.setReplyDetails()
  50. Page.message_create.show()
  51. return false
  52. # Render
  53. renderBody: (node) =>
  54. node.innerHTML = Text.renderMarked(@row.body, {"sanitize": true})
  55. renderBodyPreview: (node) =>
  56. node.textContent = @getBodyPreview()
  57. handleContactClick: (e) =>
  58. Page.message_create.show(e.currentTarget.querySelector(".name").textContent)
  59. return false
  60. renderUsernameLink: (username, address) =>
  61. color = Text.toColor(address)
  62. username ?= "n/a"
  63. username ?= "address"
  64. h("a.username", {href: Page.createUrl("to", username.replace("@zeroid.bit", "")), onclick: @handleContactClick},
  65. @renderUsername(username, address)
  66. )
  67. renderUsername: (username, address) =>
  68. color = Text.toColor(address)
  69. [
  70. h("span.name", {"title": address, "style": "color: #{color}"}, [username.replace("@zeroid.bit", "")])
  71. ]
  72. renderList: ->
  73. h("a.Message", {
  74. "key": @key, "href": "#MessageShow:#{@row.key}",
  75. "onclick": @handleListClick, "disableAnimation": @row.disable_animation,
  76. "enterAnimation": Animation.slideDown, "exitAnimation": Animation.slideUp,
  77. classes: { "active": @active, "selected": @selected, "unread": !@read }
  78. }, [
  79. h("div.sent", [Time.since(@row.date_added)]),
  80. h("div.subject", [@row.subject]),
  81. if @row.folder == "sent"
  82. h("div.to.username", ["To: ", @renderUsername(@row.to, @row.to_address)])
  83. else
  84. h("div.from.username", ["From: ", @renderUsername(@row.from, @row.from_address)])
  85. ,
  86. h("div.preview", {"afterCreate": @renderBodyPreview, "updateAnimation": @renderBodyPreview}, [@row.body])
  87. ]
  88. )
  89. renderShow: =>
  90. h("div.Message", {"key": @key, "enterAnimation": Animation.show, "classes": {"deleted": @deleted}}, [
  91. h("div.tools", [
  92. h("a.icon.icon-reply", {href: "#Reply", "title": "Reply message", onclick: @handleReplyClick}),
  93. h("a.icon.icon-trash", {href: "#Delete", "title": "Delete message", onclick: @handleDeleteClick})
  94. ]),
  95. h("div.subject", [@row.subject]),
  96. h("div.sent", [Time.date(@row.date_added, "full")]),
  97. if @row.folder == "sent"
  98. h("div.to.username", ["To: ", @renderUsernameLink(@row.to, @row.to_address)])
  99. else
  100. h("div.from.username", ["From: ", @renderUsernameLink(@row.from, @row.from_address)])
  101. ,
  102. h("div.body", {"afterCreate": @renderBody, "updateAnimation": @renderBody}, [@row.body])
  103. ])
  104. window.Message = Message