PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / subscriptions / subscribe-modal / subscribe-modal.js
jetpack / modules / subscriptions / subscribe-modal Last commit date
class-jetpack-subscribe-modal.php 2 months ago subscribe-modal.css 7 months ago subscribe-modal.js 1 year ago
subscribe-modal.js
124 lines
1 /* global Jetpack_Subscriptions */
2 const { domReady } = wp;
3 domReady( () => {
4 const modal = document.querySelector( '.jetpack-subscribe-modal' );
5 const modalDismissedCookie = 'jetpack_post_subscribe_modal_dismissed';
6 const skipUrlParam = 'jetpack_skip_subscription_popup';
7
8 function hasEnoughTimePassed() {
9 const lastDismissed = localStorage.getItem( modalDismissedCookie );
10 return lastDismissed ? Date.now() - lastDismissed > Jetpack_Subscriptions.modalInterval : true;
11 }
12
13 // Subscriber ended up here e.g. from emails:
14 // we won't show the modal to them in future since they most likely are already a subscriber.
15 function skipModal() {
16 const url = new URL( window.location.href );
17 if ( url.searchParams.has( skipUrlParam ) ) {
18 url.searchParams.delete( skipUrlParam );
19 window.history.replaceState( {}, '', url );
20 storeCloseTimestamp();
21 return true;
22 }
23
24 return false;
25 }
26
27 if ( ! modal || ! hasEnoughTimePassed() || skipModal() ) {
28 return;
29 }
30
31 const modalLoadTimeout = setTimeout( openModal, Jetpack_Subscriptions.modalLoadTime );
32
33 const targetElement = (
34 document.querySelector( '.entry-content' ) || document.documentElement
35 ).getBoundingClientRect();
36
37 function hasPassedScrollThreshold() {
38 const scrollPosition = window.scrollY + window.innerHeight / 2;
39 const scrollPositionThreshold =
40 targetElement.top +
41 ( targetElement.height * Jetpack_Subscriptions.modalScrollThreshold ) / 100;
42 return scrollPosition > scrollPositionThreshold;
43 }
44
45 function onScroll() {
46 requestAnimationFrame( () => {
47 if ( hasPassedScrollThreshold() ) {
48 openModal();
49 }
50 } );
51 }
52
53 window.addEventListener( 'scroll', onScroll, { passive: true } );
54
55 // This take care of the case where the user has multiple tabs open.
56 function onLocalStorage( event ) {
57 if ( event.key === modalDismissedCookie ) {
58 closeModal();
59 removeEventListeners();
60 }
61 }
62 window.addEventListener( 'storage', onLocalStorage );
63
64 // When the form is submitted, and next modal loads, it'll fire "subscription-modal-loaded" signalling that this form can be hidden.
65 const form = modal.querySelector( 'form' );
66 if ( form ) {
67 form.addEventListener( 'subscription-modal-loaded', closeModal );
68 }
69
70 // User can edit modal, and could remove close link.
71 function onCloseButtonClick( event ) {
72 event.preventDefault();
73 closeModal();
74 }
75 const close = document.getElementsByClassName( 'jetpack-subscribe-modal__close' )[ 0 ];
76 if ( close ) {
77 close.addEventListener( 'click', onCloseButtonClick );
78 }
79
80 function closeOnWindowClick( event ) {
81 if ( event.target === modal ) {
82 closeModal();
83 }
84 }
85
86 function closeModalOnEscapeKeydown( event ) {
87 if ( event.key === 'Escape' ) {
88 closeModal();
89 }
90 }
91
92 function openModal() {
93 // If the user is typing in a form, don't open the modal or has anything else focused.
94 if ( document.activeElement && document.activeElement.tagName !== 'BODY' ) {
95 return;
96 }
97
98 modal.classList.add( 'open' );
99 document.body.classList.add( 'jetpack-subscribe-modal-open' );
100 window.addEventListener( 'keydown', closeModalOnEscapeKeydown );
101 window.addEventListener( 'click', closeOnWindowClick );
102 removeEventListeners();
103 }
104
105 function closeModal() {
106 modal.classList.remove( 'open' );
107 document.body.classList.remove( 'jetpack-subscribe-modal-open' );
108 window.removeEventListener( 'keydown', closeModalOnEscapeKeydown );
109 window.removeEventListener( 'storage', onLocalStorage );
110 window.removeEventListener( 'click', closeOnWindowClick );
111 storeCloseTimestamp();
112 }
113
114 // Remove all event listeners. That would add the modal again.
115 function removeEventListeners() {
116 window.removeEventListener( 'scroll', onScroll );
117 clearTimeout( modalLoadTimeout );
118 }
119
120 function storeCloseTimestamp() {
121 localStorage.setItem( modalDismissedCookie, Date.now() );
122 }
123 } );
124