/** * Native WordPress post-lock coordinator for live FrontEdit sessions. * * Reads: SFE.Api.apiCall, SFE.ManagerData.postId * Exposes: SFE.PostLockManager { beginLockClaim, ensureLock, handleLockedError } */ (function() { 'use strict'; window.MWP = window.MWP || {}; window.MWP.SFE = window.MWP.SFE || {}; const SFE = window.MWP.SFE; let ownsLock = false; let refreshTimer = null; let pendingClaim = null; /** * Prevent editor and draft-preview Escape handlers from closing an active * editing session while the post-lock decision is on screen. * * Window capture runs before the document-level editor lifecycle handlers. * * @param {KeyboardEvent} event Keyboard event. * @returns {void} */ window.addEventListener('keydown', (event) => { if ( event.key === 'Escape' && document.querySelector('.mwp-sfe-post-lock-modal.is-open') ) { event.preventDefault(); event.stopImmediatePropagation(); } }, true); function escapeHtml(value) { return String(value).replace(/[&<>"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[char]); } function showLockModal(owner = {}) { return new Promise((resolve) => { const modal = document.createElement('div'); modal.className = 'mwp-sfe-post-lock-modal is-open'; modal.setAttribute('data-mwp-sfe-control', 'post-lock-modal'); modal.innerHTML = `
`; document.body.appendChild(modal); modal.querySelector('.mwp-sfe-post-lock-cancel').addEventListener('click', () => { modal.remove(); resolve(false); }); modal.querySelector('.mwp-sfe-post-lock-takeover').addEventListener('click', () => { modal.remove(); resolve(true); }); }); } function beginRefresh() { if (refreshTimer) return; refreshTimer = window.setInterval(async () => { if (!ownsLock) return; try { await SFE.Api.apiCall('/post-lock/claim', { post_id: SFE.ManagerData.postId }); } catch (error) { ownsLock = false; clearInterval(refreshTimer); refreshTimer = null; } }, 60000); } /** * Start one shared lock-claim operation for the current post. * * Opening an editor does not need to wait for this request, but every * published-content mutation must await the returned promise before it * reaches the server. Sharing the promise keeps concurrent editor opens and * saves from issuing competing claims or bypassing the pending decision. * * @returns {Promise} Whether this user holds the post lock. */ function beginLockClaim() { if (ownsLock) return Promise.resolve(true); if (pendingClaim) return pendingClaim; pendingClaim = (async () => { try { await SFE.Api.apiCall('/post-lock/claim', { post_id: SFE.ManagerData.postId }); } catch (error) { if (error.message !== 'POST_LOCKED' || !await showLockModal(error?.payload?.lock?.owner)) return false; try { await SFE.Api.apiCall('/post-lock/claim', { post_id: SFE.ManagerData.postId, take_over: true }); } catch (_) { return false; } } ownsLock = true; beginRefresh(); return true; })(); pendingClaim.finally(() => { pendingClaim = null; }); return pendingClaim; } /** * Wait until the current user's native WordPress post lock is held. * * @returns {Promise} Whether this user holds the post lock. */ async function ensureLock() { return beginLockClaim(); } async function handleLockedError(error) { ownsLock = false; if (error?.message !== 'POST_LOCKED') return false; if (!await showLockModal(error?.payload?.lock?.owner)) return false; try { await SFE.Api.apiCall('/post-lock/claim', { post_id: SFE.ManagerData.postId, take_over: true }); ownsLock = true; beginRefresh(); return true; } catch (_) { return false; } } SFE.PostLockManager = { beginLockClaim, ensureLock, handleLockedError }; })();

About the author


Popular Categories


Useful Links

Links I found useful and wanted to share.


Search the website

Mobile Application Development - AVENTLE Private Limited

Mobile App Development

Canlı karşılaşmalara yüksek oranlarla bahis yapmak için bettilt kategorisi kullanılıyor.

Today, we live in the world that is on the move, more than 70% of your visitors are mobile users. No matter what business it is, mobile applications are very essential to tap new customers and retain the already existing one’s.

Screen size doesn’t matter

Hi Res Images and Quality Content

We wont limit

User Experience is a bonus for us

User feels the taste of tailoring

mobile-app-development

Why stick to a phone App with no friends

Sometimes Internet can be a pain

There is always a need for speed

Money Making is the basic need

Your Words our Commands

  • Fast & Responsive
  • Distributed in App Stores
  • Intuitive user input and output
  • Don’t require an internet connection
  • Better user experience
  • Expensive Development
  • Leverage device APIs
  • Require Internet Connection with Api’s
  • Loads the code using a web view
  • Less Expensive
  • Less Development time
  • Can’t customize the application to individual platforms