mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							99 lines
						
					
					
						
							2.5 KiB
						
					
					
				
			
		
		
	
	
							99 lines
						
					
					
						
							2.5 KiB
						
					
					
				| const requestCache = new Map()
 | |
| const cacheTtl = 10 * 1000
 | |
| 
 | |
| function isPreloadable (linkElement) {
 | |
|   const href = linkElement.getAttribute('href')
 | |
| 
 | |
|   if (!href || href === '#' || linkElement.dataset.turbo === 'false' || linkElement.dataset.prefetch === 'false') {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   if (linkElement.origin !== document.location.origin) {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   if (!['http:', 'https:'].includes(linkElement.protocol)) {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   if (linkElement.pathname + linkElement.search === document.location.pathname + document.location.search) {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   if (linkElement.dataset.turboMethod && linkElement.dataset.turboMethod !== 'get') {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   return true
 | |
| }
 | |
| 
 | |
| function mouseoverListener (event) {
 | |
|   let linkElement
 | |
| 
 | |
|   if (event.target.tagName === 'A') {
 | |
|     linkElement = event.target
 | |
|   } else {
 | |
|     linkElement = event.target.closest('a')
 | |
|   }
 | |
| 
 | |
|   if (!linkElement) {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   if (!isPreloadable(linkElement)) {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   const url = linkElement.getAttribute('href')
 | |
|   const loc = new URL(url, location.protocol + '//' + location.host)
 | |
|   const absoluteUrl = loc.toString()
 | |
| 
 | |
|   const cached = requestCache.get(absoluteUrl)
 | |
| 
 | |
|   if (cached && cached.ttl > new Date()) {
 | |
|     return
 | |
|   }
 | |
| 
 | |
|   const requestOptions = {
 | |
|     credentials: 'same-origin',
 | |
|     headers: { Accept: 'text/html, application/xhtml+xml', 'VND.PREFETCH': 'true' },
 | |
|     method: 'GET',
 | |
|     redirect: 'follow'
 | |
|   }
 | |
| 
 | |
|   if (linkElement.dataset.turboFrame && linkElement.dataset.turboFrame !== '_top') {
 | |
|     requestOptions.headers['Turbo-Frame'] = linkElement.dataset.turboFrame
 | |
|   } else if (linkElement.dataset.turboFrame !== '_top') {
 | |
|     const turboFrame = linkElement.closest('turbo-frame')
 | |
| 
 | |
|     if (turboFrame) {
 | |
|       requestOptions.headers['Turbo-Frame'] = turboFrame.id
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   requestCache.set(absoluteUrl, { request: fetch(absoluteUrl, requestOptions), ttl: new Date(new Date().getTime() + cacheTtl) })
 | |
| }
 | |
| 
 | |
| function turboBeforeFetchRequest (event) {
 | |
|   if (event.target.tagName !== 'FORM' && event.detail.fetchOptions.method === 'GET') {
 | |
|     const cached = requestCache.get(event.detail.url.toString())
 | |
| 
 | |
|     if (cached && cached.ttl > new Date()) {
 | |
|       event.detail.response = cached.request
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   requestCache.clear()
 | |
| }
 | |
| 
 | |
| function start () {
 | |
|   if (!window.turboInstantClickEnabled) {
 | |
|     document.addEventListener('turbo:before-fetch-request', turboBeforeFetchRequest)
 | |
|     document.addEventListener('mouseover', mouseoverListener, { capture: true, passive: true })
 | |
|   }
 | |
| 
 | |
|   window.turboInstantClickEnabled = true
 | |
| }
 | |
| 
 | |
| export { start }
 |