Files
cabinet/assets/components/misSession.js
T
2026-05-28 12:09:28 +03:00

119 lines
3.8 KiB
JavaScript

/**
* MIS (webSDK / widget.sovamed.ru) session helpers.
* Symfony login (ROLE_USER) and MIS session are independent.
*/
function MisSessionError() {
this.name = 'MisSessionError';
this.message = 'MIS session is not authenticated';
}
function isAuthenticated(webSDK) {
return Boolean(webSDK?.data?.user?.authenticated);
}
function ensureAuthenticated(webSDK) {
return new Promise(function(resolve, reject) {
if (isAuthenticated(webSDK)) {
resolve(webSDK);
return;
}
if (typeof webSDK?.isLoggedIn === 'function') {
webSDK.isLoggedIn(webSDK.sdkOrigin).then(function(result) {
if (result?.authenticated) {
resolve(webSDK);
return;
}
reject(new MisSessionError());
}).catch(function() {
reject(new MisSessionError());
});
return;
}
reject(new MisSessionError());
});
}
function removeSdkOverlayModals() {
document.querySelectorAll('.wr-sdk-widget-modal').forEach(function(modal) {
modal.remove();
});
}
/**
* Move #iframeProtocol from SDK overlay into cabinet bootstrap popup.
* openConference() must be called without container (SDK applies Guest URL fix).
*/
function mountConferenceInPopup(popup) {
var iframe = document.getElementById('iframeProtocol');
var popupBody = popup?.querySelector('#popup-body');
if (!iframe || !popupBody) {
return false;
}
removeSdkOverlayModals();
popupBody.innerHTML = '';
popupBody.appendChild(iframe);
iframe.style.width = '100%';
iframe.style.border = 'none';
iframe.style.height = (window.innerHeight - 100) + 'px';
var fullScreenBtn = popup.querySelector('.full-scren-modal');
if (fullScreenBtn) {
fullScreenBtn.classList.remove('d-none');
}
popup.querySelector('.modal-dialog').classList = 'modal-dialog';
popup.querySelector('.modal-content').classList = 'modal-content';
popup.querySelector('.modal-title').innerHTML = 'Онлайн консультация';
if (typeof $ !== 'undefined' && typeof $(popup).modal === 'function') {
$(popup).modal('show');
}
return true;
}
function showMisSessionExpired(popup) {
if (!popup) {
window.location.pathname = '/logout';
return;
}
popup.querySelector('.modal-dialog').classList = 'modal-dialog';
popup.querySelector('.modal-title').innerHTML = 'Сессия виджета истекла';
popup.querySelector('#popup-body').innerHTML =
'<p class="mb-3">Личный кабинет открыт, но сессия виджета записи (MIS) истекла. ' +
'Для оплаты и онлайн-приёма нужно войти снова — повторная авторизация в iframe не требуется.</p>' +
'<button type="button" class="btn btn-outline-secondary w-100" id="mis-session-relogin">Войти снова</button>';
popup.querySelector('#mis-session-relogin').addEventListener('click', function() {
window.location.pathname = '/logout';
});
if (typeof $ !== 'undefined' && typeof $(popup).modal === 'function') {
$(popup).modal('show');
}
}
function handleMisSessionFailure(popup, error, logContext) {
if (error instanceof MisSessionError || error?.name === 'MisSessionError') {
showMisSessionExpired(popup);
return true;
}
return false;
}
module.exports = {
MisSessionError: MisSessionError,
isAuthenticated: isAuthenticated,
ensureAuthenticated: ensureAuthenticated,
mountConferenceInPopup: mountConferenceInPopup,
showMisSessionExpired: showMisSessionExpired,
handleMisSessionFailure: handleMisSessionFailure,
};