|
428 | 428 | window.Hydro = new HydroCore(); |
429 | 429 |
|
430 | 430 | document.addEventListener('alpine:init', () => { |
431 | | - Alpine.directive('hydro-action', (el, { expression }, { effect, cleanup }) => { |
432 | | - effect(() => { |
433 | | - const customEvent = el.getAttribute('hydro-event'); |
434 | | - const eventName = customEvent || (el.tagName === 'FORM' ? 'submit' : 'click'); |
435 | | - const delay = el.getAttribute('hydro-delay'); |
436 | | - const autorun = el.getAttribute('hydro-autorun'); |
437 | | - |
438 | | - if (autorun) { |
439 | | - setTimeout(() => window.Hydro.hydroAction(el), delay || 0) |
440 | | - } else { |
441 | | - const eventHandler = async (event) => { |
442 | | - event.preventDefault(); |
443 | | - if (el.disabled) { |
444 | | - return; |
445 | | - } |
446 | | - |
447 | | - setTimeout(() => window.Hydro.hydroAction(el, eventName), delay || 0) |
448 | | - }; |
449 | | - el.addEventListener(eventName, eventHandler); |
450 | | - cleanup(() => { |
451 | | - el.removeEventListener(eventName, eventHandler); |
452 | | - }); |
453 | | - } |
454 | | - }); |
455 | | - }); |
456 | | - |
457 | | - Alpine.directive('hydro-on', (el, { value, expression }, { effect, cleanup }) => { |
458 | | - effect(() => { |
459 | | - const eventHandler = async (event) => { |
460 | | - event.preventDefault(); |
461 | | - if (el.disabled) { |
462 | | - return; |
463 | | - } |
464 | | - |
465 | | - setTimeout(() => window.Hydro.hydroAction(el, value, expression), 200) |
466 | | - }; |
467 | | - |
468 | | - el.addEventListener(value, eventHandler); |
469 | | - cleanup(() => { |
470 | | - el.removeEventListener(value, eventHandler); |
471 | | - }); |
472 | | - }); |
473 | | - }); |
474 | | - |
475 | 431 | Alpine.directive('hydro-dispatch', (el, { expression }, { effect, cleanup }) => { |
476 | 432 | effect(() => { |
477 | 433 | if (!document.contains(el)) { |
@@ -553,6 +509,42 @@ document.addEventListener('alpine:init', () => { |
553 | 509 | }); |
554 | 510 | }); |
555 | 511 | }).before('on'); |
| 512 | + |
| 513 | + Alpine.directive('hydro-polling', Alpine.skipDuringClone((el, { value, expression, modifiers }, { effect, cleanup }) => { |
| 514 | + let isQueued = false; |
| 515 | + let interval; |
| 516 | + const component = window.Hydro.findComponent(el); |
| 517 | + const time = parseInt(modifiers[0].replace('ms', '')); |
| 518 | + |
| 519 | + const setupInterval = () => { |
| 520 | + interval = setInterval(async () => { |
| 521 | + if (document.hidden) { |
| 522 | + isQueued = true; |
| 523 | + clearInterval(interval); |
| 524 | + return; |
| 525 | + } |
| 526 | + |
| 527 | + await window.Hydro.hydroAction(el, component, { name: expression }, null); |
| 528 | + }, time); |
| 529 | + } |
| 530 | + |
| 531 | + const handleVisibilityChange = async () => { |
| 532 | + if (!document.hidden && isQueued) { |
| 533 | + isQueued = false; |
| 534 | + await window.Hydro.hydroAction(el, component, { name: expression }); |
| 535 | + setupInterval(); |
| 536 | + } |
| 537 | + } |
| 538 | + |
| 539 | + document.addEventListener('visibilitychange', handleVisibilityChange); |
| 540 | + setupInterval(); |
| 541 | + |
| 542 | + cleanup(() => { |
| 543 | + document.removeEventListener('visibilitychange', handleVisibilityChange); |
| 544 | + clearInterval(interval); |
| 545 | + }); |
| 546 | + |
| 547 | + })); |
556 | 548 |
|
557 | 549 | Alpine.directive('on-hydro-event', (el, { expression }, { effect, cleanup }) => { |
558 | 550 | effect(() => { |
@@ -581,7 +573,6 @@ document.addEventListener('alpine:init', () => { |
581 | 573 | }); |
582 | 574 | }); |
583 | 575 |
|
584 | | - |
585 | 576 | let currentBoostUrl; |
586 | 577 |
|
587 | 578 | Alpine.directive('hydro-link', (el, { expression }, { effect, cleanup }) => { |
|
0 commit comments