1 line
7.9 KiB
JavaScript
1 line
7.9 KiB
JavaScript
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_mobileBookmarkJump?.removeAttribute("hidden"),a.classList.add("current-bookmark"),a.setAttribute("data-bookmark-color",r))}function fcn_setMobileMenuBookmarks(){fcn_mobileBookmarkList.innerHTML="";const o=Object.entries(fcn_bookmarks.data),e=_$("#mobile-bookmark-template");if(o.length>0){const a=document.createDocumentFragment();o.forEach((([o,{color:r,progress:t,link:n,chapter:k,"paragraph-id":c}])=>{const s=e.content.cloneNode(!0),m=s.querySelector(".mobile-menu__bookmark");m.classList.add(`bookmark-${o}`),m.dataset.color=r,s.querySelector(".mobile-menu__bookmark-progress > div > div").style.width=`${t.toFixed(1)}%`,s.querySelector(".mobile-menu__bookmark a").href=`${n}#paragraph-${c}`,s.querySelector(".mobile-menu__bookmark a span").innerText=k,s.querySelector(".mobile-menu-bookmark-delete-button").setAttribute("data-bookmark-id",o),a.appendChild(s)})),fcn_mobileBookmarkList.appendChild(a),fcn_bookmarkDeleteHandler(_$$(".mobile-menu-bookmark-delete-button"))}else{const o=document.createElement("li");o.classList.add("no-bookmarks"),o.textContent=fcn_mobileBookmarkList.dataset.empty,fcn_mobileBookmarkList.appendChild(o)}}function fcn_showBookmarkCards(){if(!fcn_bookmarks||!fcn_bookmarksSmallCardBlock||!fcn_bookmarksSmallCardTemplate||Object.keys(fcn_bookmarks.data).length<1||_$(".bookmark-card"))return;fcn_bookmarksSmallCardBlock.classList.remove("hidden"),_$(".bookmarks-block__no-bookmarks")?.remove(),_$$(".show-if-bookmarks").forEach((o=>o.classList.remove("hidden")));let o=parseInt(fcn_bookmarksSmallCardBlock.dataset.count);const e=document.createDocumentFragment();Object.entries(fcn_bookmarks.data).sort(((o,e)=>new Date(e[1].date)-new Date(o[1].date))).forEach((([a,{color:r,progress:t,link:n,chapter:k,"paragraph-id":c,date:s,image:m,thumb:i,content:d}])=>{if(0==o)return;o--;const l=fcn_bookmarksSmallCardTemplate.content.cloneNode(!0),f=new Date(s).toLocaleDateString(navigator.language??"en-US",{year:"2-digit",month:"short",day:"numeric"});m&&l.querySelector(".bookmark-card__image")?(l.querySelector(".bookmark-card__image").href=m,l.querySelector(".bookmark-card__image img").src=i):l.querySelector(".bookmark-card__image")?.remove(),l.querySelector(".bookmark-card__excerpt").innerHTML+=d,l.querySelector(".bookmark-card").classList.add(`bookmark-${a}`),l.querySelector(".bookmark-card").dataset.color=r,l.querySelector(".bookmark-card__title > a").href=`${n}#paragraph-${c}`,l.querySelector(".bookmark-card__title > a").innerText=k,l.querySelector(".bookmark-card__percentage").innerText=`${t.toFixed(1)} %`,l.querySelector(".bookmark-card__progress").style.width=`calc(${t.toFixed(1)}% - var(--bookmark-progress-offset, 0px))`,l.querySelector("time").innerText=f,l.querySelector(".button-delete-bookmark").setAttribute("data-bookmark-id",a),e.appendChild(l)})),fcn_bookmarksSmallCardBlock.querySelector("ul").appendChild(e),fcn_bookmarkDeleteHandler(_$$(".button-delete-bookmark"))}function fcn_bookmarkDeleteHandler(o){("object"==typeof o?o:[o]).forEach((o=>{o.addEventListener("click",(o=>{fcn_removeBookmark(o.currentTarget.dataset.bookmarkId),fcn_setBookmarks(fcn_bookmarks),Object.keys(fcn_bookmarks.data).length<1&&(_$(".bookmarks-block")?.classList.add("hidden"),_$$(".show-if-bookmarks").forEach((o=>{o.classList.add("hidden")})))}))}))}function fcn_removeBookmark(o){const e=_$(".chapter__article"),a=_$(".current-bookmark");delete fcn_bookmarks.data[o],e&&e.id==o&&(fcn_jumpToBookmarkButtons.forEach((o=>{o.classList.add("hidden")})),fcn_mobileBookmarkJump?.setAttribute("hidden",!0),a&&(a.classList.remove("current-bookmark"),a.removeAttribute("data-bookmark-color"))),_$$(`.bookmark-${o}`)?.forEach((o=>{o.remove()}))}fcn_initializeLocalBookmarks(),document.addEventListener("fcnUserDataReady",(o=>{fcn_initializeUserBookmarks(o)})),fcn_jumpToBookmarkButtons.forEach((o=>{o.addEventListener("click",(()=>{_$(`[data-paragraph-id="${fcn_bookmarks.data[_$("article").id]["paragraph-id"]}"]`).scrollIntoView({behavior:"smooth"})}))})); |