ZeroMail.coffee 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. window.h = maquette.h
  2. class ZeroMail extends ZeroFrame
  3. init: ->
  4. @params = {}
  5. @site_info = null
  6. @on_site_info = new Promise()
  7. @on_local_storage = new Promise()
  8. @server_info = null
  9. @user = new User()
  10. @users = new Users()
  11. @local_storage = null
  12. createProjector: ->
  13. @leftbar = new Leftbar()
  14. @message_lists = new MessageLists()
  15. @message_show = new MessageShow()
  16. @message_create = new MessageCreate()
  17. @route(base.href.replace(/.*?\?/, ""), document.location.hash)
  18. @projector = maquette.createProjector()
  19. @projector.replace($("#MessageLists"), @message_lists.render)
  20. @projector.replace($("#MessageShow"), @message_show.render)
  21. @projector.replace($("#Leftbar"), @leftbar.render)
  22. @projector.merge($("#MessageCreate"), @message_create.render)
  23. # Update every minute to keep time since fields up-to date
  24. setInterval ( ->
  25. Page.projector.scheduleRender()
  26. ), 60*1000
  27. # Route site urls
  28. route: (query) ->
  29. @params = Text.parseQuery(query)
  30. @log "Route", @params
  31. if @params.to
  32. @message_create.show(@params.to)
  33. @cmd "wrapperReplaceState", [{}, "", @createUrl("to", "")] # Remove to parameter from url
  34. if @params.url == "Sent"
  35. @leftbar.folder_active = "sent"
  36. # Add/remove/change parameter to current site url
  37. createUrl: (key, val) ->
  38. params = JSON.parse(JSON.stringify(@params)) # Clone
  39. if typeof key == "Object"
  40. vals = key
  41. for key, val of keys
  42. params[key] = val
  43. else
  44. params[key] = val
  45. return "?"+Text.encodeQuery(params)
  46. getLocalStorage: ->
  47. @on_site_info.then =>
  48. @cmd "wrapperGetLocalStorage", [], (@local_storage) =>
  49. @local_storage ?= {}
  50. @local_storage.read ?= {}
  51. @local_storage.deleted ?= []
  52. @local_storage.parsed ?= {}
  53. @local_storage.parsed.last_secret ?= {} # Last parsed secrets: {user_address: last_parsed_secret_id, ...}
  54. @local_storage.parsed.last_message ?= {} # Last parsed messages: {user_address: last_parsed_message_id, ...}
  55. @local_storage.parsed.my_secret ?= {} # Secrets sent to me: {user_address: secret_id}
  56. @local_storage.parsed.my_message ?= {} # Decrypted messages: {user_address: [message_id, ...], ...}
  57. @on_local_storage.resolve(@local_storage)
  58. saveLocalStorage: (cb) ->
  59. if @local_storage
  60. @cmd "wrapperSetLocalStorage", @local_storage, (res) =>
  61. if cb then cb(res)
  62. onOpenWebsocket: (e) =>
  63. @cmd "siteInfo", {}, (site_info) =>
  64. @setSiteInfo(site_info)
  65. @cmd "serverInfo", {}, (server_info) =>
  66. @setServerInfo(server_info)
  67. # Parse incoming requests from UiWebsocket server
  68. onRequest: (cmd, params) ->
  69. if cmd == "setSiteInfo" # Site updated
  70. @setSiteInfo(params)
  71. else
  72. @log "Unknown command", params
  73. setSiteInfo: (site_info) ->
  74. @site_info = site_info
  75. if site_info.event?[0] == "cert_changed"
  76. @getLocalStorage()
  77. @leftbar.onSiteInfo(site_info)
  78. @user.onSiteInfo(site_info)
  79. @message_create.onSiteInfo(site_info)
  80. @message_lists.onSiteInfo(site_info)
  81. @projector.scheduleRender()
  82. @getLocalStorage()
  83. @on_site_info.resolve()
  84. setServerInfo: (server_info) ->
  85. @server_info = server_info
  86. @projector.scheduleRender()
  87. window.Page = new ZeroMail()
  88. setTimeout ( ->
  89. window.Page.createProjector()
  90. ), 1