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;