File indexing completed on 2025-05-04 05:31:15
0001 import React, { useState } from 'react'; 0002 import {generatePagesArray, renderPages} from '../product-media-slider-helpers'; 0003 0004 function ComicsReaderWrapper(props){ 0005 const [ loading, setLoading ] = useState('Loading...'); 0006 const [ comicBookInitiated, setComicBookInitiated ] = useState(false); 0007 const [ pages, setPages ] = useState([]); 0008 const [ viewedPagesCount, setViewedPagesCount ] = useState(0); 0009 const [ comicBookReadIsReported, setComicBookReadIsReported ] = useState(false); 0010 0011 /* INIT */ 0012 0013 React.useEffect(() => { 0014 if (props.slideIndex === props.currentSlide){ 0015 setComicBookInitiated(true); 0016 initComicBook(); 0017 } 0018 },[props.slideIndex,props.currentSlide]); 0019 0020 React.useEffect(() => { 0021 console.log(viewedPages); 0022 if (viewedPagesCount > 3 && comicBookReadIsReported === false){ 0023 reportComicBookRead(); 0024 } 0025 },[viewedPages]) 0026 0027 function initComicBook(){ 0028 const url = json_server_comics + "/api/files/toc?id="+props.slide.file_id+"&format=json"; 0029 $.ajax({url:url}).done(function(res){ 0030 const pages = renderPages(res.files,props.slide.file_id); 0031 setPages(pages); 0032 }); 0033 } 0034 0035 function onViewPage(){ 0036 const newViewedPagedCount = viewedPagesCount + 1; 0037 setViewedPagesCount(newViewedPagedCount); 0038 } 0039 0040 function reportComicBookRead(){ 0041 console.log('report book reading') 0042 console.log(props); 0043 const comicReadReportUrl = "https://" + window.location.hostname + "/p/" + props.product.project_id + '/startmediaviewajax?collection_id='+props.slide.collection_id+'&file_id='+props.slide.file_id+'&type_id=3'; 0044 $.ajax({url: comicReadReportUrl}).done(function(res) { 0045 console.log(res); 0046 setComicBookReadIsReported(true); 0047 }); 0048 } 0049 0050 0051 /* COMPONENT */ 0052 let comicsReaderDisplay = <span id="ajax-loader"></span> 0053 if (pages.length > 0){ 0054 comicsReaderDisplay = ( 0055 <ComicBookReader 0056 pages={pages} 0057 slideIndex={props.slideIndex} 0058 comicsFileName={props.slide.title} 0059 onFullScreenToggle={props.onFullScreenToggle} 0060 isFullScreen={props.isFullScreen} 0061 onViewPage={(page) => onViewPage(page)} 0062 /> 0063 ) 0064 } 0065 0066 return ( 0067 <div id="comics-reader-wrapper"> 0068 {comicsReaderDisplay} 0069 </div> 0070 ) 0071 } 0072 0073 function ComicBookReader(props){ 0074 0075 const [ loading, setLoading ] = useState(false); 0076 const [ displayType, setDisplayType ] = useState("single") 0077 const [ pages, setPages ] = useState(generatePagesArray(props.pages,displayType)); 0078 const [ currentPage, setCurrentPage ] = useState(0) 0079 const [ totalPages, setTotalPages ] = useState(pages.length) 0080 const [ viewMode, setViewMode ] = useState('normal'); 0081 0082 React.useEffect(() => { 0083 initComicReader() 0084 },[]) 0085 0086 function initComicReader(){ 0087 const bookBlockElement = document.getElementById('bb-bookblock'); 0088 0089 if (bookBlockElement){ 0090 $(document).ready(function() { 0091 window.comicSwiper = new Swiper('.comic-book-reader' , { 0092 speed: 400, 0093 initialSlide: 0, 0094 observer: true, 0095 observeParents: true, 0096 preloadImages: true, 0097 updateOnImagesReady: true, 0098 nested:true, 0099 threshold:0, 0100 onSlideChangeStart: function(swiper){ 0101 setCurrentPage(swiper.activeIndex); 0102 } 0103 }); 0104 window.comicSwiper.update() 0105 }); 0106 } else { 0107 0108 setTimeout(() => { 0109 initComicReader(); 0110 }, 500); 0111 } 0112 } 0113 0114 function onComicReaderNavClick(val){ 0115 let nextPage; 0116 if (val === "first") nextPage = 0; 0117 else if (val === "last") nextPage = totalPages; 0118 else if (val === "prev") nextPage = currentPage === 0 ? 0 : currentPage - 1; 0119 else if (val === "next") nextPage = currentPage === totalPages ? totalPages : currentPage + 1; 0120 window.comicSwiper.slideTo(nextPage) 0121 props.onViewPage(nextPage); 0122 } 0123 0124 function onBeforeFlip(page){ 0125 return false; 0126 } 0127 0128 function readerOnEndFlip(page,isLimit){ 0129 setCurrentPage(isLimit + 1); 0130 return false; 0131 } 0132 0133 let comicBookDisplay; 0134 if (loading) comicPages = <img src="../../flatui/img/ajax-loader.gif"/> 0135 else { 0136 const comicPages = pages.map((p,index) => ( 0137 <div className="swiper-slide" key={index}> 0138 <img src={p}/> 0139 </div> 0140 )) 0141 0142 comicBookDisplay = ( 0143 <div id="bb-bookblock" className="swiper-wrapper"> 0144 {comicPages} 0145 </div> 0146 ) 0147 } 0148 0149 return ( 0150 <div className={"comic-book-reader swiper-container " + viewMode}> 0151 {comicBookDisplay} 0152 <div className="nav-container"> 0153 <nav> 0154 <a id="bb-nav-counter">{ ( currentPage + 1 ) + "/" + totalPages }</a> 0155 <a id="bb-nav-first" onClick={() => onComicReaderNavClick('first')}><span className="glyphicon glyphicon-step-backward"></span></a> 0156 <a id="bb-nav-prev" onClick={() => onComicReaderNavClick('prev')}><span className="glyphicon glyphicon-triangle-left"></span></a> 0157 <a id="bb-nav-next" onClick={() => onComicReaderNavClick('next')}><span className="glyphicon glyphicon-triangle-right"></span></a> 0158 <a id="bb-nav-last" onClick={() => onComicReaderNavClick('last')}><span className="glyphicon glyphicon-step-forward"></span></a> 0159 <a id="bb-nav-viewmode" onClick={() => props.onFullScreenToggle(props.isFullScreen === true ? false : true)}><span className="glyphicon glyphicon-fullscreen"></span></a> 0160 </nav> 0161 <span className="title">{props.comicsFileName}</span> 0162 </div> 0163 </div> 0164 ) 0165 } 0166 0167 export default ComicsReaderWrapper;