MuteList.coffee 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. class MuteList extends Class
  2. constructor: ->
  3. @mutes = null
  4. @includes = null
  5. @visible = false
  6. @max_height = 0
  7. @updated = false
  8. @siteblocks_serving = []
  9. Page.site_list.on_loaded.then =>
  10. @updateFilterIncludes()
  11. @
  12. update: =>
  13. @need_update = false
  14. Page.cmd "MuteList", [], (res) =>
  15. @mutes = []
  16. for auth_address, mute of res
  17. mute.auth_address = auth_address
  18. mute.site = Page.site_list.sites_byaddress[mute.source]
  19. @mutes.push(mute)
  20. @mutes.sort (a, b) ->
  21. return b.date_added - a.date_added
  22. if not @max_height
  23. @max_height = 100
  24. @updated = true
  25. Page.projector.scheduleRender()
  26. @updateFilterIncludes()
  27. updateFilterIncludes: =>
  28. Page.cmd "filterIncludeList", {all_sites: true, filters: true}, (res) =>
  29. @siteblocks_serving = []
  30. @includes = []
  31. @siteblocks = {}
  32. for include in res
  33. include.site = Page.site_list.sites_byaddress[include.address]
  34. mutes = []
  35. if include.mutes?
  36. for auth_address, mute of include.mutes
  37. mute.auth_address = auth_address
  38. mutes.push(mute)
  39. include.mutes = mutes
  40. siteblocks = []
  41. if include.siteblocks?
  42. for address, siteblock of include.siteblocks
  43. siteblock.address = address
  44. siteblock.include = include
  45. siteblocks.push(siteblock)
  46. @siteblocks[address] = siteblock
  47. include.siteblocks = siteblocks
  48. @includes.push(include)
  49. @includes.sort (a, b) ->
  50. return b.date_added - a.date_added
  51. for site in Page.site_list.sites
  52. address = site.row.address
  53. if @siteblocks[address] and not Page.settings.siteblocks_ignore[address]
  54. @siteblocks[address].site = site
  55. @siteblocks_serving.push(@siteblocks[address])
  56. address_hash = "0x" + site.row.address_hash
  57. if @siteblocks[address_hash] and not Page.settings.siteblocks_ignore[address_hash]
  58. @siteblocks[address_hash].site = site
  59. @siteblocks_serving.push(@siteblocks[address_hash])
  60. @updated = true
  61. Page.projector.scheduleRender()
  62. handleHideClick: =>
  63. @visible = false
  64. setTimeout (=>
  65. @updateFilterIncludes()
  66. ), 1000
  67. @max_height = 0
  68. handleMuteRemoveClick: (e) =>
  69. mute = e.target.mute
  70. if mute.removed
  71. # Re-add
  72. Page.cmd("muteAdd", [mute.auth_address, mute.cert_user_id, mute.reason])
  73. else
  74. # Remove
  75. Page.cmd("muteRemove", mute.auth_address)
  76. mute.removed = not mute.removed
  77. return false
  78. handleIncludeRemoveClick: (e) =>
  79. include = e.currentTarget.include
  80. if include.removed
  81. # Re-add
  82. Page.cmd("filterIncludeAdd", [include.inner_path, include.description, include.address])
  83. else
  84. # Remove
  85. Page.cmd("filterIncludeRemove", {inner_path: include.inner_path, address: include.address})
  86. include.removed = not include.removed
  87. return false
  88. afterUpdate: =>
  89. @updated = false
  90. if @node and @visible
  91. @max_height = @node.offsetHeight + 100
  92. Page.projector.scheduleRender()
  93. storeNode: (node) =>
  94. @node = node
  95. renderMutes: (mutes, mode="mutes") =>
  96. h("div.mutes", [
  97. h("div.mute.mute-head", [
  98. h("div.mute-col", "Muted user"),
  99. h("div.mute-col", {style: "width: 66%"}, "Why?")
  100. ]),
  101. mutes.map (mute) =>
  102. h("div.mute", {key: mute.auth_address, classes: {removed: mute.removed}}, [
  103. h("div.mute-col", [
  104. h("div.cert_user_id", mute.cert_user_id),
  105. h("div.auth_address", mute.auth_address),
  106. ]),
  107. h("div.mute-col", {style: "width: 66%"}, [
  108. h("div.source", if mute.site? then mute.site.row.content.title else mute.source),
  109. h("div.reason", {innerHTML: Text.renderMarked(mute.reason)}),
  110. h("div.date_added", " \u2500 " + Time.since(mute.date_added))
  111. ])
  112. if mode == "mutes"
  113. h("a.action", {href: "#Unmute", onclick: @handleMuteRemoveClick, mute: mute}, "×")
  114. ])
  115. ])
  116. renderSiteblocks: (siteblocks) =>
  117. h("div.siteblocks", [
  118. h("div.mute.mute-head", [
  119. h("div.mute-col", "Blocked site"),
  120. h("div.mute-col", {style: "width: 66%"}, "Why?")
  121. ]),
  122. siteblocks.map (siteblock) =>
  123. h("div.mute", {key: siteblock.address, classes: {removed: siteblock.removed}}, [
  124. h("div.mute-col", [
  125. h("div.cert_user_id", siteblock.name),
  126. h("div.auth_address", siteblock.address),
  127. ]),
  128. h("div.mute-col", {style: "width: 66%"}, [
  129. h("div.reason", {innerHTML: Text.renderMarked(siteblock.reason)}),
  130. h("div.date_added", " \u2500 " + Time.since(siteblock.date_added))
  131. ])
  132. ])
  133. ])
  134. renderIncludes: =>
  135. h("div.includes", [
  136. @includes.map (include) =>
  137. h("div.include", {key: include.address + include.inner_path, classes: {removed: include.removed}}, [
  138. h("h2", h("a.site", {href: include.site.getHref()}, include.site.row.content.title), " \u203A ", h("a.inner_path", {href: "#"}, include.inner_path))
  139. h("a.action", {href: "#Remove+include", onclick: @handleIncludeRemoveClick, include: include},
  140. [h("span.closer", "×"), "deactivate this blocklist"]
  141. )
  142. if include.mutes.length
  143. @renderMutes(include.mutes, "includes")
  144. if include.siteblocks.length
  145. @renderSiteblocks(include.siteblocks)
  146. ])
  147. ])
  148. render: =>
  149. if @need_update
  150. @update()
  151. if not @mutes
  152. return h("div#MuteList", {classes: {visible: false}}, "Muted")
  153. if @updated
  154. @updated = false
  155. setTimeout @afterUpdate
  156. h("div#MuteList", {classes: {visible: @visible}, style: "max-height: #{@max_height}px"}, [
  157. h("a.mute-hide", {href: "#Hide", onclick: @handleHideClick}, "\u2039 Back to feed"),
  158. if @mutes?.length == 0 and @includes?.length == 0
  159. h("div.mute-empty", "Your mute list is empty! :)")
  160. else
  161. h("div", {afterCreate: @storeNode}, [
  162. if @mutes.length > 0
  163. @renderMutes(@mutes)
  164. if @includes
  165. @renderIncludes()
  166. ])
  167. ])
  168. show: =>
  169. @visible = true
  170. Page.site_list.on_loaded.then =>
  171. @need_update = true
  172. Page.projector.scheduleRender()
  173. window.MuteList = MuteList