Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
calebporzio committed Jul 1, 2023
1 parent 532c10f commit 5c12083
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 10 deletions.
3 changes: 2 additions & 1 deletion packages/alpinejs/src/alpine.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { setReactivityEngine, disableEffectScheduling, reactive, effect, release, raw } from './reactivity'
import { mapAttributes, directive, setPrefix as prefix, prefix as prefixed } from './directives'
import { start, addRootSelector, addInitSelector, closestRoot, findClosest, initTree, destroyTree, interceptInit } from './lifecycle'
import { onAttributeRemoved, mutateDom, deferMutations, flushAndStopDeferringMutations, startObservingMutations, stopObservingMutations } from './mutation'
import { onElRemoved, onAttributeRemoved, mutateDom, deferMutations, flushAndStopDeferringMutations, startObservingMutations, stopObservingMutations } from './mutation'
import { mergeProxies, closestDataStack, addScopeToNode, scope as $data } from './scope'
import { setEvaluator, evaluate, evaluateLater, dontAutoEvaluateFunctions } from './evaluator'
import { transition } from './directives/x-transition'
Expand Down Expand Up @@ -46,6 +46,7 @@ let Alpine = {
setEvaluator,
mergeProxies,
findClosest,
onElRemoved,
closestRoot,
destroyTree,
interceptor, // INTERNAL: not public API and is subject to change without major release.
Expand Down
10 changes: 5 additions & 5 deletions packages/navigate/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { finishAndHideProgressBar, showAndStartProgressBar } from "./bar"
import { transition } from "alpinejs/src/directives/x-transition"
import { swapCurrentPageWithNewHtml } from "./page"
import { fetchHtml } from "./fetch"
import { prefix } from "alpinejs/src/directives"

let enablePersist = true
let showProgressBar = true
Expand All @@ -20,13 +21,12 @@ export default function (Alpine) {
)
}

Alpine.directive('navigate', (el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {
// "persisted" elements will be picked up by .querySelector, not this callback...
if (value === 'persist') return
Alpine.addInitSelector(() => `[${prefix('navigate')}]`)

let shouldPrefetch = modifiers.includes('prefetch') && modifiers.includes('hover')
Alpine.directive('navigate', (el, { value, expression, modifiers }, { evaluateLater, cleanup }) => {
let shouldPrefetchOnHover = modifiers.includes('hover')

shouldPrefetch && whenThisLinkIsHoveredFor(el, 60, () => {
shouldPrefetchOnHover && whenThisLinkIsHoveredFor(el, 60, () => {
let destination = extractDestinationFromLink(el)

prefetchHtml(destination, html => {
Expand Down
32 changes: 32 additions & 0 deletions packages/navigate/src/links.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,35 @@ export function extractDestinationFromLink(linkEl) {
export function createUrlObjectFromString(urlString) {
return new URL(urlString, document.baseURI)
}

let handleLinkClick = () => {}
let handleLinkHover = () => {}

export function whenALinkIsClicked(callback) {
handleLinkClick = callback

initializeLinksForClicking()
}

export function whenALinkIsHovered(callback) {
handleLinkHover = callback

initializeLinksForHovering()
}

export function extractDestinationFromLink(linkEl) {
return new URL(linkEl.getAttribute('href'), document.baseURI)
}

export function hijackNewLinksOnThePage() {
initializeLinksForClicking()
initializeLinksForHovering()
}

function initializeLinksForClicking() {
getLinks().forEach(el => {
el.addEventListener('click', e => {
e.preventDefault()

handleLinkClick(el)
}
8 changes: 4 additions & 4 deletions packages/navigate/src/persist.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ let els = {}
export function storePersistantElementsForLater() {
els = {}

document.querySelectorAll('[x-navigate\\:persist]').forEach(i => {
els[i.getAttribute('x-navigate:persist')] = i
document.querySelectorAll('[x-persist]').forEach(i => {
els[i.getAttribute('x-persist')] = i

Alpine.mutateDom(() => {
i.remove()
Expand All @@ -15,8 +15,8 @@ export function storePersistantElementsForLater() {
}

export function putPersistantElementsBack() {
document.querySelectorAll('[x-navigate\\:persist]').forEach(i => {
let old = els[i.getAttribute('x-navigate:persist')]
document.querySelectorAll('[x-persist]').forEach(i => {
let old = els[i.getAttribute('x-persist')]

old._x_wasPersisted = true

Expand Down

0 comments on commit 5c12083

Please sign in to comment.