mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Fix:epub ereader on mobile #1854
This commit is contained in:
		
							parent
							
								
									a8bc1df3e7
								
							
						
					
					
						commit
						36b1f43f4c
					
				| @ -280,7 +280,10 @@ export default { | |||||||
|       reader.rendition = reader.book.renderTo('viewer', { |       reader.rendition = reader.book.renderTo('viewer', { | ||||||
|         width: this.readerWidth, |         width: this.readerWidth, | ||||||
|         height: this.readerHeight * 0.8, |         height: this.readerHeight * 0.8, | ||||||
|         spread: 'auto' |         spread: 'auto', | ||||||
|  |         snap: true, | ||||||
|  |         manager: 'continuous', | ||||||
|  |         flow: 'paginated' | ||||||
|       }) |       }) | ||||||
| 
 | 
 | ||||||
|       // load saved progress |       // load saved progress | ||||||
| @ -295,21 +298,11 @@ export default { | |||||||
|         reader.rendition.on('relocated', reader.relocated) |         reader.rendition.on('relocated', reader.relocated) | ||||||
|         reader.rendition.on('keydown', reader.keyUp) |         reader.rendition.on('keydown', reader.keyUp) | ||||||
| 
 | 
 | ||||||
|         let touchStart = 0 |  | ||||||
|         let touchEnd = 0 |  | ||||||
|         reader.rendition.on('touchstart', (event) => { |         reader.rendition.on('touchstart', (event) => { | ||||||
|           touchStart = event.changedTouches[0].screenX |           this.$emit('touchstart', event) | ||||||
|         }) |         }) | ||||||
| 
 |  | ||||||
|         reader.rendition.on('touchend', (event) => { |         reader.rendition.on('touchend', (event) => { | ||||||
|           touchEnd = event.changedTouches[0].screenX |           this.$emit('touchend', event) | ||||||
|           const touchDistanceX = Math.abs(touchEnd - touchStart) |  | ||||||
|           if (touchStart < touchEnd && touchDistanceX > 120) { |  | ||||||
|             this.next() |  | ||||||
|           } |  | ||||||
|           if (touchStart > touchEnd && touchDistanceX > 120) { |  | ||||||
|             this.prev() |  | ||||||
|           } |  | ||||||
|         }) |         }) | ||||||
| 
 | 
 | ||||||
|         // load ebook cfi locations |         // load ebook cfi locations | ||||||
|  | |||||||
| @ -11,10 +11,10 @@ | |||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|     <div class="absolute top-0 right-20 bg-bg text-gray-100 border-b border-l border-r border-gray-400 z-20 rounded-b-md px-2 h-9 flex items-center text-center"> |     <div class="absolute top-0 right-20 bg-bg text-gray-100 border-b border-l border-r border-gray-400 z-20 rounded-b-md px-2 h-9 hidden md:flex items-center text-center"> | ||||||
|       <p class="font-mono">{{ page }} / {{ numPages }}</p> |       <p class="font-mono">{{ page }} / {{ numPages }}</p> | ||||||
|     </div> |     </div> | ||||||
|     <div class="absolute top-0 right-40 bg-bg text-gray-100 border-b border-l border-r border-gray-400 z-20 rounded-b-md px-2 h-9 flex items-center text-center"> |     <div class="absolute top-0 right-40 bg-bg text-gray-100 border-b border-l border-r border-gray-400 z-20 rounded-b-md px-2 h-9 hidden md:flex items-center text-center"> | ||||||
|       <ui-icon-btn icon="zoom_out" :size="8" :disabled="!canScaleDown" borderless class="mr-px" @click="zoomOut" /> |       <ui-icon-btn icon="zoom_out" :size="8" :disabled="!canScaleDown" borderless class="mr-px" @click="zoomOut" /> | ||||||
|       <ui-icon-btn icon="zoom_in" :size="8" :disabled="!canScaleUp" borderless class="ml-px" @click="zoomIn" /> |       <ui-icon-btn icon="zoom_in" :size="8" :disabled="!canScaleUp" borderless class="ml-px" @click="zoomIn" /> | ||||||
|     </div> |     </div> | ||||||
|  | |||||||
| @ -10,10 +10,10 @@ | |||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|     <div class="absolute top-4 left-1/2 transform -translate-x-1/2"> |     <div class="absolute top-4 left-1/2 transform -translate-x-1/2"> | ||||||
|       <h1 class="text-lg sm:text-xl md:text-2xl mb-1" style="line-height: 1.15; font-weight: 100"> |       <h1 :data-type="ebookType" class="text-lg sm:text-xl md:text-2xl mb-1 data-[type=comic]:hidden" style="line-height: 1.15; font-weight: 100"> | ||||||
|         <span style="font-weight: 600">{{ abTitle }}</span> |         <span style="font-weight: 600">{{ abTitle }}</span> | ||||||
|         <span v-if="abAuthor" style="display: inline"> – </span> |         <span v-if="abAuthor" class="hidden md:inline"> – </span> | ||||||
|         <span v-if="abAuthor">{{ abAuthor }}</span> |         <span v-if="abAuthor" class="hidden md:inline">{{ abAuthor }}</span> | ||||||
|       </h1> |       </h1> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
| @ -23,7 +23,7 @@ | |||||||
|       </button> |       </button> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|     <component v-if="componentName" ref="readerComponent" :is="componentName" :library-item="selectedLibraryItem" :player-open="!!streamLibraryItem" :keep-progress="keepProgress" :file-id="ebookFileId" @hook:mounted="readerMounted" /> |     <component v-if="componentName" ref="readerComponent" :is="componentName" :library-item="selectedLibraryItem" :player-open="!!streamLibraryItem" :keep-progress="keepProgress" :file-id="ebookFileId" @touchstart="touchstart" @touchend="touchend" @hook:mounted="readerMounted" /> | ||||||
| 
 | 
 | ||||||
|     <!-- TOC side nav --> |     <!-- TOC side nav --> | ||||||
|     <div v-if="tocOpen" class="w-full h-full fixed inset-0 bg-black/20 z-20" @click.stop.prevent="toggleToC"></div> |     <div v-if="tocOpen" class="w-full h-full fixed inset-0 bg-black/20 z-20" @click.stop.prevent="toggleToC"></div> | ||||||
| @ -58,7 +58,7 @@ | |||||||
|           <p class="text-xl md:text-3xl text-white truncate">{{ $strings.HeaderEreaderSettings }}</p> |           <p class="text-xl md:text-3xl text-white truncate">{{ $strings.HeaderEreaderSettings }}</p> | ||||||
|         </div> |         </div> | ||||||
|       </template> |       </template> | ||||||
|       <div class="p-2 md:p-8 w-full text-base py-2 rounded-lg bg-bg shadow-lg border border-black-300 relative overflow-x-hidden overflow-y-auto" style="max-height: 80vh"> |       <div class="px-2 py-4 md:p-8 w-full text-base rounded-lg bg-bg shadow-lg border border-black-300 relative overflow-x-hidden overflow-y-auto" style="max-height: 80vh"> | ||||||
|         <div class="flex items-center mb-4"> |         <div class="flex items-center mb-4"> | ||||||
|           <div class="w-40"> |           <div class="w-40"> | ||||||
|             <p class="text-lg">{{ $strings.LabelTheme }}:</p> |             <p class="text-lg">{{ $strings.LabelTheme }}:</p> | ||||||
| @ -92,6 +92,12 @@ | |||||||
| export default { | export default { | ||||||
|   data() { |   data() { | ||||||
|     return { |     return { | ||||||
|  |       touchstartX: 0, | ||||||
|  |       touchstartY: 0, | ||||||
|  |       touchendX: 0, | ||||||
|  |       touchendY: 0, | ||||||
|  |       touchstartTime: 0, | ||||||
|  |       touchIdentifier: null, | ||||||
|       chapters: [], |       chapters: [], | ||||||
|       tocOpen: false, |       tocOpen: false, | ||||||
|       showSettings: false, |       showSettings: false, | ||||||
| @ -262,11 +268,61 @@ export default { | |||||||
|     prev() { |     prev() { | ||||||
|       if (this.$refs.readerComponent?.prev) this.$refs.readerComponent.prev() |       if (this.$refs.readerComponent?.prev) this.$refs.readerComponent.prev() | ||||||
|     }, |     }, | ||||||
|  |     handleGesture() { | ||||||
|  |       // Touch must be less than 1s. Must be > 60px drag and X distance > Y distance | ||||||
|  |       const touchTimeMs = Date.now() - this.touchstartTime | ||||||
|  |       if (touchTimeMs >= 1000) { | ||||||
|  |         console.log('Touch too long', touchTimeMs) | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       const touchDistanceX = Math.abs(this.touchendX - this.touchstartX) | ||||||
|  |       const touchDistanceY = Math.abs(this.touchendY - this.touchstartY) | ||||||
|  |       const touchDistance = Math.sqrt(Math.pow(this.touchstartX - this.touchendX, 2) + Math.pow(this.touchstartY - this.touchendY, 2)) | ||||||
|  |       if (touchDistance < 60) { | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (touchDistanceX < 60 || touchDistanceY > touchDistanceX) { | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (this.touchendX < this.touchstartX) { | ||||||
|  |         this.next() | ||||||
|  |       } | ||||||
|  |       if (this.touchendX > this.touchstartX) { | ||||||
|  |         this.prev() | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     touchstart(e) { | ||||||
|  |       // Ignore rapid touch | ||||||
|  |       if (this.touchstartTime && Date.now() - this.touchstartTime < 250) { | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       this.touchstartX = e.touches[0].screenX | ||||||
|  |       this.touchstartY = e.touches[0].screenY | ||||||
|  |       this.touchstartTime = Date.now() | ||||||
|  |       this.touchIdentifier = e.touches[0].identifier | ||||||
|  |     }, | ||||||
|  |     touchend(e) { | ||||||
|  |       if (this.touchIdentifier !== e.changedTouches[0].identifier) { | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       this.touchendX = e.changedTouches[0].screenX | ||||||
|  |       this.touchendY = e.changedTouches[0].screenY | ||||||
|  |       this.handleGesture() | ||||||
|  |     }, | ||||||
|     registerListeners() { |     registerListeners() { | ||||||
|       this.$eventBus.$on('reader-hotkey', this.hotkey) |       this.$eventBus.$on('reader-hotkey', this.hotkey) | ||||||
|  |       document.body.addEventListener('touchstart', this.touchstart) | ||||||
|  |       document.body.addEventListener('touchend', this.touchend) | ||||||
|     }, |     }, | ||||||
|     unregisterListeners() { |     unregisterListeners() { | ||||||
|       this.$eventBus.$off('reader-hotkey', this.hotkey) |       this.$eventBus.$off('reader-hotkey', this.hotkey) | ||||||
|  |       document.body.removeEventListener('touchstart', this.touchstart) | ||||||
|  |       document.body.removeEventListener('touchend', this.touchend) | ||||||
|     }, |     }, | ||||||
|     loadEreaderSettings() { |     loadEreaderSettings() { | ||||||
|       try { |       try { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user