Jake Vanderwerf
2 days ago 235ce5716edc2f7cbe80fdccf26eac7269587839
assets/js/concise/FrontendFavourites.js
@@ -1,21 +1,41 @@
class FrontendFavourites {
class Favourites {
   constructor() {
      // Initialize DataStore for queue persistence
      this.store = new window.jvbStore({
         name: 'favourites',
         endpoint: 'favourites',
         useIndexedDB: true,
         TTL: Infinity,
         showLoading: false,
         filters: {
            user: jvbSettings.currentUser,
            content: 'all',
            order: 'desc',
            orderby: 'date',
            page: 1,
            all: true,
         }
      });
      let store = window.jvbStore.register(
         'favourites',
         {
            storeName: 'favourites',
            keyPath: 'id',
            endpoint: 'favourites',
            headers: {
               'X-Action-Nonce': window.auth.getNonce('favourites')
            },
            indexes: [
               {name: 'content', keyPath: 'content'},
               {name: 'listId', keyPath: 'listId'},
            ],
            TTL: 6 * 60 * 1000,
            showLoading: false,
            filters: {
               user: window.auth.getUser(),
               content: 'all',
               order: 'desc',
               orderby: 'date',
               page: 1,
               all: true,
            }
         });
      this.store = store.favourites;
      // this.listStore = window.jvbStore.register(
      //    'favourites_lists',
      //    {
      //       storeName: 'lists',
      //       keyPath: 'listId',
      //       endpoint: 'favourites/lists',
      //       TTL: 6 * 60 * 1000,
      //    });
      this.store.subscribe((event, data) => {
         switch (event) {
@@ -32,12 +52,10 @@
         }
      });
      this.store.fetch();
   }
   toggleFavourite(button) {
      if (!jvbSettings.currentUser) {
      if (!window.auth.getUser()) {
         window.location.href = jvbSettings.redirect + '&action=register&type=favourites';
         return;
      }
@@ -53,27 +71,156 @@
      // Update button icon
      button.innerHTML = jvbSettings.icons[button.classList.contains('favourited') ? 'heart-filled' : 'heart'];
      this.store.setItem(button.dataset.id, {
         target_id: button.dataset.id,
         action: action,
         type: button.dataset.type,
         artist: button.dataset.artist,
      });
      window.debouncer.schedule(
         `favourite-${button.dataset.id}`,
         this.postFavourite({
            user: window.auth.getUser(),
            target_id: button.dataset.id,
            action: action,
            type: button.dataset.type
         }),
         100
      );
   }
   isFavourited(content, id){
      if(!jvbSettings.currentUser){
         return false;
   async postFavourite(args) {
      await window.auth.fetch(
         `${jvbSettings.api}favourites`,
         {
            method: 'POST',
            headers: {
               'X-Action-Nonce': window.auth.getNonce('favourites')
            },
            body: args
         }
      );
      if (args.action === 'add') {
         await this.store.setItem(button.dataset.id, {
            target_id: button.dataset.id,
            action: action,
            type: button.dataset.type,
         }).then(()=>{});
      } else {
         await this.store.delete(button.dataset.id).then(()=>{});
      }
      let item = this.store.getItem(id);
      return (item) ? item.action === 'add' : false;
   }
   // async toggleFavourite(itemType, itemId) {
   //    const favId = `${this.userId}_${itemType}_${itemId}`;
   //    const existing = this.store.get(favId);
   //
   //    if (existing) {
   //       // Remove favorite
   //       await this.store.delete(favId);
   //
   //       // Queue for server deletion
   //       if (window.jvbQueue) {
   //          window.jvbQueue.addOperation({
   //             type: 'remove_favourite',
   //             endpoint: 'favourites',
   //             data: { favId }
   //          });
   //       }
   //
   //       return false; // Not favorited anymore
   //
   //    } else {
   //       // Add favorite
   //       const favourite = {
   //          id: favId,
   //          userId: this.userId,
   //          itemType,
   //          itemId,
   //          listId: 'default',
   //          timestamp: Date.now()
   //       };
   //
   //       await this.store.save(favourite);
   //
   //       // Queue for server save
   //       if (window.jvbQueue) {
   //          window.jvbQueue.addOperation({
   //             type: 'add_favourite',
   //             endpoint: 'favourites',
   //             data: favourite
   //          });
   //       }
   //
   //       return true; // Now favorited
   //    }
   // }
   // async createList(name, visibility = 'private') {
   //    const list = {
   //       listId: `list_${Date.now()}`,
   //       userId: this.userId,
   //       name,
   //       visibility,
   //       created: Date.now(),
   //       itemCount: 0
   //    };
   //
   //    await this.listsStore.save(list);
   //
   //    // Queue for server
   //    if (window.jvbQueue) {
   //       window.jvbQueue.addOperation({
   //          type: 'create_list',
   //          endpoint: 'favourite-lists',
   //          data: list
   //       });
   //    }
   //
   //    return list;
   // }
   //
   // async addToList(listId, itemType, itemId) {
   //    const favId = `${this.userId}_${itemType}_${itemId}_${listId}`;
   //
   //    const favourite = {
   //       id: favId,
   //       userId: this.userId,
   //       itemType,
   //       itemId,
   //       listId,
   //       timestamp: Date.now()
   //    };
   //
   //    await this.store.save(favourite);
   //
   //    // Update list count
   //    const list = this.listsStore.get(listId);
   //    if (list) {
   //       list.itemCount++;
   //       await this.listsStore.save(list);
   //    }
   //
   //    // Queue for server
   //    if (window.jvbQueue) {
   //       window.jvbQueue.addOperation({
   //          type: 'add_to_list',
   //          endpoint: 'favourites',
   //          data: favourite
   //       });
   //    }
   // }
   isFavourited(itemType, itemId) {
      const favId = `${this.userId}_${itemType}_${itemId}`;
      return this.store.get(favId) !== undefined;
   }
}
document.addEventListener('DOMContentLoaded', function() {
   window.jvbFavourites = false;
   if (jvbSettings.currentUser !== '') {
      window.jvbFavourites = new FrontendFavourites();
   }
   window.auth.subscribe((event) => {
      if (event === 'auth-loaded') {
         window.jvbFavourites = new Favourites();
      }
   });
});