🚬 Битриксовые JS события — или как вьебаца и метаца

Ну че, народ дали задачку — запилить *таймер холда* в Б24.

🚬 Битриксовые JS события — или как вьебаца и метаца

📌 Суть:

⏳ Пока идет звонок через телефонию и оператор жмёт Hold — таймер тикает.

⏹ Отжал — стоп, таймер остановился.

📞 Сбросили трубку, мы или абонент — сделать запись в таблице детализации звонка, где будет показано, сколько были на холде общее время.

🚬 Битриксовые JS события — или как вьебаца и метаца

💡 Первое, что приходит в голову — JS-события:

BX.addCustomEvent('onPullEvent-voximplant', function (command, params) { call_id = params.callId; if (command === 'hold') { const frameDocument = getFrameDocument(); if (frameDocument) { let timerElement = frameDocument.getElementById('timer-display'); let holdTime = frameDocument.getElementById('hold-time'); holdTime.classList.remove('none'); if (timerElement) { globalTimer = true; startTimer(); // Запускаем или продолжаем таймер } } } else if (command === 'unhold') { const frameDocument = getFrameDocument(); if (frameDocument) { if (globalTimer) { stopTimer(); // Останавливаем таймер, сохраняя прошедшее время } } });

Вроде круто и удобно — идентификатор звонка есть, нажатые команды есть, можно работать.

☠ А дальше, внезапно свинью подложили так и жили:

1. Оказывается события onPullEvent-voximplant с командами hold и unhold, срабатывает только 1 раз, дальше если звонок завершился, работать не будет, если поступит следующий звонок.

2. Это сработает только в том случае, если обновить страницу. (уже догадываетесь про мой костыль да?) 😁

Попробовал именно так - работает, но это не выход, а точнее выход но через задний проход.

🥲 Да, мог бы написать в поддержку Битрикс24.

🥲 Да, мог бы дождаться фикса (лет через пять).

Но зачем ждать? если можно схуивертить и написать чисто на обычных JS событиях, привязаться к кнопке.

🤹‍♂ Решения:

1. Забил на стандартные события Битрикса — они кривые и не работают как надо - ебучая балада.

2. Привязался к кнопке Hold/Unhold — тупо отслеживал изменение класса active (да, вот так просто!)

$(parent.document).on('click', 'span.im-phone-call-btn-hold', function () { if ($(this).hasClass('active')) {

3. Вынес часть логики в глобалку — потому что фреймы, потому что Битрикс, сама кнопка была в одном окне, а таймер во встраиваемой области локального приложения и у нее свой контекст, поэтому глобалки частично.

🎉 Зато событие сброса трубки работает железно всегда!

ну хоть тут они умеют делать а не проебываца за чашкой кофе.

BX.addCustomEvent("CallCard::CallStateChanged", function(callState, additionalParams) { switch (callState) { case 'idle': if (window.globalTimer) { const frameDocument = getFrameContext(); if (frameDocument && typeof frameDocument.stopTimer === 'function') { frameDocument.stopTimer(); // Вызываем функцию stopTimer во фрейме } sendElapsedTime(window.call_id, window.elapsedTime); // Отправляем время удержания } break; default: break; } });

📌 Классика жанра:

1 Пишешь код → вроде пашет → радуешься как дитё → ложная эйфория.

2 Через час понимаешь, что это не фича, а баг в особо извращённой форме.

3 Начинаешь метаться между костылями → "ой, а вот так попробуем" → "ну на этот раз точно!".

4 Повторяешь 5 раз, пока не поймёшь, что Битрикс просто троллит тебя.

💡 Вывод:

Закладывай время х2 сразу — и будешь героем, а не оправдывающимся подкаблучником.

(P.S. Если думаешь, что переоцениваешь сроки — скорее всего, ты их всё равно недооценил. Проверено на 150% стресса.) 😈

Подписывайтесь на наш telegram канал:

Там еще и качевая музыка на тему битры.

Начать дискуссию