menuStore.js 2.5 KB

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