git.fiddlerwoaroof.com
archive-root/run.js
25a661c3
 root = new Vue({
80778634
   el: "#container",
   data: {
     pull_time: null,
     feed_urls: [],
     feeds: {
       feeds: [],
     },
     collapsed: false,
 
     current_feed: {
       metadata: {
         description: null,
         fetch_url: null,
         link: null,
         title: null,
       },
       base_path: null,
       items: [],
25a661c3
     },
79f9884d
 
80778634
     current_item: {
       title: null,
       date: null,
       author: null,
       id: null,
       link: null,
       content: null,
       path: null,
     },
 
     feed_item_counts: {},
 
     likes: [],
     show_likes: true,
   },
 
   computed: {
     feed_visible() {
       return (
         !this.show_likes &&
         this.current_feed.metadata.title !== null &&
         this.current_feed.items.length > 0
       );
     },
 
     item_content() {
       let result = null;
       if (this.current_item.content !== null) {
         result = DOMPurify.sanitize(this.current_item.content, {
           FORBID_TAG: ["style"],
           FORBID_ATTR: ["style"],
         });
       }
       return result;
     },
   },
 
   methods: {
     list_likes() {
       this.likes = [];
       oboe("events.json").node("*", (ev) => {
         let { event } = ev;
         if (event === "like-item") {
           this.likes.unshift(ev);
         }
       });
       this.show_likes = !this.show_likes;
25a661c3
     },
 
80778634
     toggleCollapse() {
       this.collapsed = !this.collapsed;
     },
 
     sanitize(html) {
       return DOMPurify.sanitize(html, {
         FORBID_TAG: ["style"],
         FORBID_ATTR: ["style"],
       });
     },
 
     get_remote_feed: function (path, shouldPushState = true) {
       var promise = new Promise((resolve, reject) => {
         window
           .fetch(path + "index.json")
           .then((resp) => resp.json())
           .then((data) => {
             var result = Object.assign({}, data);
             result.fetch_url = data["fetch-url"];
             result.base_path = path;
             if (shouldPushState) {
               window.history.pushState(
                 {
                   current_feed: result,
                 },
                 "",
                 window.location.pathname
               );
             }
             resolve(result);
6b5fe892
             return promise;
80778634
           }, reject.bind(promise));
       });
       return promise;
     },
79f9884d
 
80778634
     get_feed: function (path) {
       this.get_remote_feed(path)
         .then((result) => Vue.set(this, "current_feed", result))
         .then(() => (this.show_likes = false));
25a661c3
     },
 
80778634
     like(item, feed) {
       fetch("https://srv2.elangley.org/hub/feed_archive", {
         method: "POST",
         body: JSON.stringify({
           event: "like-item",
           item: item.link,
           title: item.title,
           author: item.author,
           "feed-title": feed.metadata.title,
           "feed-link": feed.metadata.link,
         }),
       });
     },
25a661c3
 
80778634
     get_item(path) {
       window
         .fetch(this.current_feed.base_path + path)
         .then((resp) => resp.json())
         .then((data) => {
           fetch("https://srv2.elangley.org/hub/feed_archive", {
             method: "POST",
             body: JSON.stringify({
               event: "read-item",
               item: data.link,
               title: data.title,
               author: data.author,
               "feed-title": this.current_feed.metadata.title,
               "feed-link": this.current_feed.metadata.link,
             }),
           });
           window.history.pushState(
             {
               current_feed: root.current_feed,
               current_item: data,
             },
             "",
             window.location.pathname
           );
           Object.assign(this.current_item, data);
           this.current_item.path = path;
         });
79f9884d
     },
25a661c3
 
80778634
     has_items(feed) {
       var count = this.feed_item_counts[feed.path];
       return count === undefined || count > 0;
     },
   },
 
   ready() {
     oboe("events.json").node("*", (ev) => {
       let { event } = ev;
       if (event === "like-item") {
         this.likes.unshift(ev);
       }
     });
 
     window
       .fetch(baseUrl + "/index.json")
       .then((resp) => resp.json())
       .then(function (data) {
         root.pull_time = data["pull-time"];
         root.feed_urls = data["feed-urls"];
         root.feeds = data.feeds;
         return data;
       })
       .then((data) => {
         root.feeds.forEach((feed) => {
           // console.log(feed);
           this.get_remote_feed(feed.path, false).then((feed_index) =>
             Vue.set(this.feed_item_counts, feed.path, feed_index.items.length)
           );
         });
       });
   },
25a661c3
 });
 
 window.onpopstate = function (ev) {
80778634
   // console.log(ev);
   var current_feed = ev.state.current_feed,
     current_item = ev.state.current_item;
25a661c3
 
80778634
   Object.assign(root.current_feed, current_feed);
25a661c3
 
80778634
   if (current_item !== undefined) {
     Object.assign(root.current_item, current_item);
   }
25a661c3
 };
 
80778634
 document.addEventListener("DOMContentLoaded", function (ev) {
   if (window.history.state !== null) {
     Object.assign(root.current_feed, window.history.state.current_feed);
     if (window.history.state.current_item !== undefined) {
       Object.assign(root.current_item, window.history.state.current_item);
25a661c3
     }
80778634
   }
25a661c3
 });