1 line
2.2 KiB
JavaScript
1 line
2.2 KiB
JavaScript
function fcn_toggleReminder(e,t=null){const i=window.FictioneerApp.Controllers.fictioneerReminders;if(!i)return void fcn_showNotification("Error: Reminders Controller not connected.",3,"warning");const r=FcnUtils.userData();(t=t??!r.reminders.data[e])?r.reminders.data[e]={story_id:parseInt(e),timestamp:Date.now()}:delete r.reminders.data[e],r.lastLoaded=0,FcnUtils.setUserData(r),i.refreshView(),clearTimeout(i.timeout),i.timeout=setTimeout((()=>{FcnUtils.remoteAction("fictioneer_ajax_toggle_reminder",{payload:{set:t,story_id:e}})}),FcnGlobals.debounceRate)}application.register("fictioneer-reminders",class extends Stimulus.Controller{static get targets(){return["toggleButton"]}remindersLoaded=!1;timeout=0;initialize(){fcn()?.userReady?this.#e=!0:document.addEventListener("fcnUserDataReady",(()=>{this.refreshView(),this.#e=!0,this.#t()}))}connect(){window.FictioneerApp.Controllers.fictioneerReminders=this,this.#e&&(this.refreshView(),this.#t())}data(){return this.remindersCachedData=FcnUtils.userData().reminders?.data,Array.isArray(this.remindersCachedData)&&0===this.remindersCachedData.length&&(this.remindersCachedData={}),this.remindersCachedData}isRemembered(e){return!(!FcnUtils.loggedIn()||!this.data()?.[e])}toggleReminder({params:{id:e}}){this.#i()&&(fcn_toggleReminder(e,!this.isRemembered(e)),this.refreshView())}clear(){const e=FcnUtils.userData();e.reminders={data:{}},fcn().setUserData(e),this.refreshView()}refreshView(){this.toggleButtonTargets.forEach((e=>{const t=e.dataset.storyId;e.classList.toggle("_remembered",this.isRemembered(t))}))}#e=!1;#r=!1;#i(){const e=FcnUtils.loggedIn();return e||(this.#s(),this.#r=!0),e}#a(){return this.#i()&&JSON.stringify(this.remindersCachedData??0)!==JSON.stringify(this.data())}#n(){this.refreshInterval||(this.refreshInterval=setInterval((()=>{!this.#r&&this.#a()&&this.refreshView()}),3e4+1e3*Math.random()))}#t(){this.#n(),this.visibilityStateCheck=()=>{this.#i()&&("visible"===document.visibilityState?(this.#r=!1,this.refreshView(),this.#n()):(this.#r=!0,clearInterval(this.refreshInterval),this.refreshInterval=null))},document.addEventListener("visibilitychange",this.visibilityStateCheck)}#s(){clearInterval(this.refreshInterval),document.removeEventListener("visibilitychange",this.visibilityStateCheck)}}); |