fictioneer/js/bookmarks.min.js

1 line
7.9 KiB
JavaScript
Raw Normal View History

2024-10-12 23:42:54 +02:00
const fcn_jumpToBookmarkButtons=_$$(".button--bookmark"),fcn_mobileBookmarkJump=_$$$("mobile-menu-bookmark-jump"),fcn_mobileBookmarkList=_$(".mobile-menu__bookmark-list"),fcn_bookmarksSmallCardBlock=_$(".bookmarks-block"),fcn_bookmarksSmallCardTemplate=_$(".bookmark-small-card-template");var fcn_bookmarks,fcn_userBookmarksTimeout;function fcn_initializeLocalBookmarks(){fcn_setBookmarks(fcn_bookmarks=fcn_getBookmarks(),!0),fcn_updateBookmarksView()}function fcn_initializeUserBookmarks(o){fcn_setBookmarks(JSON.parse(o.detail.data.bookmarks),!0),fcn_updateBookmarksView()}function fcn_getBookmarks(){let o=fcn_parseJSON(localStorage.getItem("fcnChapterBookmarks"))??{data:{}};return Array.isArray(o.data)&&0===o.data.length&&(o.data={}),o=fcn_fixBookmarks(o),!o||Object.keys(o).length<1?{data:{}}:o}function fcn_fixBookmarks(o){const e={};for(const a in o.data)if(a.startsWith("ch-")){const r=fcn_fixBookmarksNode(o.data[a]);r&&(e[a]=r)}return{data:e}}function fcn_fixBookmarksNode(o){const e={},a={"paragraph-id":"",progress:0,date:"",color:"",chapter:"",link:"",thumb:"",image:"",story:"",content:""};for(const r in a){if(typeof o[r]!=typeof a[r])return null;e[r]=o[r]}const r=new Date(e.date);return r&&"[object Date]"===Object.prototype.toString.call(r)&&!isNaN(r)||(e.date=(new Date).toISOString()),("number"!=typeof e.progress||e.progress<0)&&(e.progress=0),e}function fcn_setBookmarks(o,e=!1){if("object"==typeof o){if(fcn_bookmarks=o,localStorage.setItem("fcnChapterBookmarks",JSON.stringify(o)),fcn_isLoggedIn){const e=fcn_getUserData();e&&(e.bookmarks=JSON.stringify(o),fcn_setUserData(e))}e||fcn_saveUserBookmarks(o)}}function fcn_updateBookmarksView(){if(!fcn_bookmarks||!fcn_bookmarks.data)return;const o=_$(".profile-bookmarks-stats"),e=Object.keys(fcn_bookmarks.data).length;o&&(o.innerHTML=o.innerHTML.replace("%s",e)),e>0&&_$$(".icon-menu-bookmarks").forEach((o=>{o.classList.remove("hidden")})),fcn_showBookmarkCards(),fcn_showChapterBookmark()}function fcn_saveUserBookmarks(o){fcn_isLoggedIn&&(clearTimeout(fcn_userBookmarksTimeout),o=fcn_fixBookmarks(o),fcn_userBookmarksTimeout=setTimeout((()=>{fcn_ajaxPost({action:"fictioneer_ajax_save_bookmarks",fcn_fast_ajax:1,bookmarks:JSON.stringify(o)}).then((o=>{o.success||(fcn_showNotification(o.data.failure??o.data.error??fictioneer_tl.notification.error,3,"warning"),(o.data.error||o.data.failure)&&console.error("Error:",o.data.error??o.data.failure))})).catch((o=>{o.status&&o.statusText&&fcn_showNotification(`${o.status}: ${o.statusText}`,3,"warning"),console.error(o)}))}),fictioneer_ajax.post_debounce_rate))}function fcn_toggleBookmark(o,e="none"){fcn_bookmarks=fcn_getBookmarks();const a=_$(".chapter__article"),r=_$(".current-bookmark");if(!a)return;const t=fcn_bookmarks.data[a.id];if(t&&t["paragraph-id"]==o&&r)"none"!=e&&e!=t.color?(_$(".current-bookmark").dataset.bookmarkColor=e,t.color=e):fcn_removeBookmark(a.id);else{Object.keys(fcn_bookmarks.data).length>=50&&fcn_removeBookmark(Object.keys(fcn_bookmarks.data)[0]);const t=_$(`[data-paragraph-id="${o}"]`),n=_$$$("chapter-bookmark-data").dataset;fcn_bookmarks.data[a.id]={"paragraph-id":o,progress:100*(fcn_offset(t).top-fcn_offset(t.parentElement).top)/t.parentElement.clientHeight,date:(new Date).toISOString(),color:e,chapter:n.title.trim(),link:n.link,thumb:n.thumb,image:n.image,story:n.storyTitle.trim(),content:t.querySelector("span").innerHTML.substring(0,128)+"…"},fcn_jumpToBookmarkButtons.forEach((o=>{o.classList.remove("hidden")})),fcn_mobileBookmarkJump?.removeAttribute("hidden"),r?.classList.remove("current-bookmark"),t.classList.add("current-bookmark"),t.setAttribute("data-bookmark-color",e)}fcn_setMobileMenuBookmarks(),fcn_setBookmarks(fcn_bookmarks)}function fcn_showChapterBookmark(){_$(".current-bookmark")?.classList.remove("current-bookmark");const o=_$(".chapter__article");if(!o||!fcn_bookmarks.data[o.id])return;const e=fcn_bookmarks.data[o.id]["paragraph-id"],a=_$(`[data-paragraph-id="${e}"]`),r=fcn_bookmarks.data[o.id].color??"none";e&&a&&(fcn_jumpToBookmarkButtons.forEach((o=>{o.classList.remove("hidden")})),fcn_mobil