Message.coffee 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. class Message
  2. constructor: (@message_list, @row) ->
  3. @active = false
  4. @deleted = false
  5. @key = @row.key
  6. if @row.folder == "sent" or Page.local_storage.read[@row.date_added]
  7. @read = true
  8. else
  9. @read = false
  10. @
  11. getBodyPreview: ->
  12. return @row.body[0..80]
  13. markRead: (read = true) ->
  14. if not @read
  15. Page.local_storage.read[@row.date_added] = true
  16. Page.saveLocalStorage()
  17. @read = read
  18. # Handle
  19. handleListClick: =>
  20. @markRead()
  21. @message_list.setActiveMessage(@)
  22. Page.message_show.setMessage(@)
  23. return false
  24. handleDeleteClick: =>
  25. @message_list.deleteMessage(@)
  26. return false
  27. handleReplyClick: =>
  28. Page.message_create.setReplyDetails()
  29. Page.message_create.show()
  30. return false
  31. # Render
  32. renderBody: (node) =>
  33. node.innerHTML = Text.renderMarked(@row.body, {"sanitize": true})
  34. renderBodyPreview: (node) =>
  35. node.textContent = @getBodyPreview()
  36. handleContactClick: (e) =>
  37. Page.message_create.show(e.currentTarget.querySelector(".name").textContent)
  38. return false
  39. renderUsernameLink: (username, address) =>
  40. color = Text.toColor(address)
  41. h("a.username", {href: Page.createUrl("to", username.replace("zeroid.bit", "")), onclick: @handleContactClick},
  42. @renderUsername(username, address)
  43. )
  44. renderUsername: (username, address) =>
  45. color = Text.toColor(address)
  46. [
  47. h("span.name", {"style": "color: #{color}"}, [username.replace("@zeroid.bit", "")])
  48. ]
  49. renderList: ->
  50. h("a.Message", {
  51. "key": @key, "href": "#MessageShow:#{@row.key}",
  52. "onclick": @handleListClick,
  53. "enterAnimation": Animation.slideDown, "exitAnimation": Animation.slideUp,
  54. classes: { "active": @active, "unread": !@read }
  55. }, [
  56. h("div.sent", [Time.since(@row.date_added)]),
  57. h("div.subject", [@row.subject]),
  58. if @row.folder == "sent"
  59. h("div.to.username", ["To: ", @renderUsername(@row.to, @row.to_address)])
  60. else
  61. h("div.from.username", ["From: ", @renderUsername(@row.from, @row.from_address)])
  62. ,
  63. h("div.preview", {"afterCreate": @renderBodyPreview, "updateAnimation": @renderBodyPreview}, [@row.body])
  64. ]
  65. )
  66. renderShow: =>
  67. h("div.Message", {"key": @key, "enterAnimation": Animation.show, "classes": {"deleted": @deleted}}, [
  68. h("div.tools", [
  69. h("a.icon.icon-reply", {href: "#Reply", "title": "Reply message", onclick: @handleReplyClick}),
  70. h("a.icon.icon-trash", {href: "#Delete", "title": "Delete message", onclick: @handleDeleteClick})
  71. ]),
  72. h("div.subject", [@row.subject]),
  73. h("div.sent", [Time.date(@row.date_added, "full")]),
  74. if @row.folder == "sent"
  75. h("div.to.username", ["To: ", @renderUsernameLink(@row.to, @row.to_address)])
  76. else
  77. h("div.from.username", ["From: ", @renderUsernameLink(@row.from, @row.from_address)])
  78. ,
  79. h("div.body", {"afterCreate": @renderBody, "updateAnimation": @renderBody}, [@row.body])
  80. ])
  81. window.Message = Message