Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. /* eslint-env browser */
  2. var HouseFavoritesSingleton = (function () {
  3. var instance;
  4.  
  5. function createInstance() {
  6. return new HouseFavoritesStore();
  7. }
  8.  
  9. return {
  10. getInstance: function () {
  11. if (!instance) {
  12. instance = createInstance();
  13. }
  14. return instance;
  15. }
  16. };
  17. })();
  18.  
  19. var HouseObservableSingleton = (function () {
  20. var instance;
  21.  
  22. function createInstance() {
  23. return new HouseObservable();
  24. }
  25.  
  26. return {
  27. getInstance: function () {
  28. if (!instance) {
  29. instance = createInstance();
  30. }
  31. return instance;
  32. }
  33. };
  34. })();
  35.  
  36. class HouseObservable {
  37. constructor() {
  38. this.observers = [];
  39. }
  40.  
  41. subscribe (observer) {
  42. this.observers.push(observer);
  43.  
  44. HouseFavoritesSingleton.getInstance().ondata = (e) => {
  45. this.observers.forEach((observer) => {
  46. observer.next(e);
  47. });
  48. }
  49. }
  50.  
  51. broadcast(data) {
  52. HouseFavoritesSingleton.getInstance().ondata(data);
  53. }
  54. }
  55.  
  56. class HouseFavoritesStore {
  57. constructor () {
  58. this.ondata().then((resp) => {
  59. houseObservable.broadcast(resp);
  60. });
  61. }
  62.  
  63. toggle (houseCode, liked) {
  64. /*this.toggleFavorite(houseCode, liked).then((resp) => {
  65. houseObservable.broadcast(resp);
  66. });*/
  67. }
  68.  
  69. toggleFavorite(houseCode, liked) { //call some other API method
  70. /*return new Promise((resolve, reject) => {
  71. fetch(`/api/house-favorites/current`, { method: "GET" })
  72. .then(resolve)
  73. .catch(reject); // TODO: proper error handling 😢
  74. });*/
  75. }
  76.  
  77. ondata() {
  78. return new Promise((resolve, reject) => {
  79. fetch(`/api/house-favorites/current`, { method: "GET" })
  80. .then(resolve)
  81. .catch(reject); // TODO: proper error handling 😢
  82. });
  83. }
  84. }
  85.  
  86. let houseObservable = new HouseObservable();
  87.  
  88. class HouseFavoritesToggle extends HTMLElement {
  89. connectedCallback () {
  90.  
  91. HouseObservableSingleton.getInstance().subscribe({
  92. next(houseFavorites) {
  93. //console.log('was called');
  94. houseFavorites.find(code => {
  95. if(code === this.houseCode) {
  96. this.liked = liked;
  97. this.innerHTML = `House #${this.houseCode} (${this.liked})`;
  98. }
  99. })
  100. }
  101. });
  102. }
  103.  
  104. toggleFavorite() {
  105. HouseFavoritesSingleton.getInstance().toggleFavorite(this.houseCode, !this.liked);
  106. }
  107.  
  108. get houseCode () {
  109. return this.getAttribute("house-code");
  110. }
  111. }
  112.  
  113. customElements.define("house-favorites-toggle", HouseFavoritesToggle);
  114.  
  115. // mock AJAX interactions
  116. function fetch(uri, options) {
  117. console.log(options.method, uri);
  118. return new Promise((resolve, reject) => {
  119. setTimeout(_ => {
  120. resolve(["123"]);
  121. }, 200);
  122. });
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement