menuStore.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. if (!P5MENU_URL) throw "Missing P5MENU_URL"
  2. if (!VERSION) throw "Missing P5Menu VERSION"
  3. function p5UI__MenuStore() {
  4. var _subscribers = []
  5. function _subscribe( fn ) { // fn( { bookmarks, idsBookmarks, objects, urls } )
  6. _subscribers.push( fn )
  7. }
  8. function _update( data ) { // data: { bookmarks, idsBookmarks, objects, urls }
  9. data.objects.sort(function (a, b) {
  10. if (a.label.toLowerCase() > b.label.toLowerCase()) return 1
  11. if (a.label.toLowerCase() < b.label.toLowerCase()) return -1
  12. return 0
  13. })
  14. data.urls.sort(function (a, b) {
  15. if (a.label.toLowerCase() > b.label.toLowerCase()) return 1
  16. if (a.label.toLowerCase() < b.label.toLowerCase()) return -1
  17. return 0
  18. })
  19. _set('version', data.version)
  20. _set('bookmarks', data.bookmarks)
  21. _set('idsBookmarks', data.idsBookmarks)
  22. _set('objects', data.objects)
  23. _set('urls', data.urls)
  24. var data = _getData()
  25. _subscribers.forEach(function (fn) {
  26. fn(data)
  27. })
  28. }
  29. function _forceUpdate() {
  30. var data = _getData()
  31. _subscribers.forEach(function (fn) {
  32. fn(data)
  33. })
  34. }
  35. function _getData() {
  36. return {
  37. version: _get('version'),
  38. bookmarks: _get('bookmarks'),
  39. idsBookmarks: _get('idsBookmarks'),
  40. objects: _get('objects'),
  41. urls: _get('urls')
  42. }
  43. }
  44. function _hasData() {
  45. var data = _getData()
  46. return (
  47. parseInt(data.version || 0) === parseInt(VERSION)
  48. && (
  49. null !== data.bookmarks
  50. || null !== data.idsBookmarks
  51. || null !== data.objects
  52. || null !== data.urls
  53. )
  54. )
  55. }
  56. function _set(type, value) {
  57. global.localStorage.setItem('p5Menu.' + type, JSON.stringify(value))
  58. }
  59. function _get(type, value) {
  60. var val = global.localStorage.getItem('p5Menu.' + type)
  61. return val ? JSON.parse(val) : null
  62. }
  63. function _remoteUpdate(postData) {
  64. var options =
  65. window.fetch(P5MENU_URL
  66. , (!postData)
  67. ? { method: 'GET',
  68. headers: { 'Content-Type': 'application/json' },
  69. credentials: 'same-origin',
  70. }
  71. : { method: 'POST',
  72. headers: { 'Content-Type': 'application/json' },
  73. credentials: 'same-origin',
  74. body: JSON.stringify(postData)
  75. }
  76. ).then(function (response) {
  77. return response.json()
  78. }).then(function (response) {
  79. if ('success' === response.type) {
  80. _update(response.body)
  81. } else {
  82. // err...
  83. }
  84. })
  85. }
  86. function _clearCache() {
  87. global.localStorage.removeItem('p5Menu.' + 'urls')
  88. global.localStorage.removeItem('p5Menu.' + 'objects')
  89. global.localStorage.removeItem('p5Menu.' + 'bookmarks')
  90. global.localStorage.removeItem('p5Menu.' + 'idsBookmarks')
  91. global.localStorage.removeItem('p5Menu.' + 'version')
  92. }
  93. return {
  94. subscribe: _subscribe,
  95. update: _update,
  96. forceUpdate: _forceUpdate,
  97. remoteUpdate: _remoteUpdate,
  98. getData: _getData,
  99. hasData: _hasData,
  100. clearCache: _clearCache,
  101. }
  102. }
  103. global.p5UI__MenuStore = p5UI__MenuStore()