Im 26.1150.0: коллабы в режиме новых проектов и запросы, которые больше не виснут после invalid_authentication
Im 26.1150.0 вышел в один день с intranet 26.1750.0 и socialnetwork 26.275.0, публичный API в нём не менялся. Мессенджер иначе решает, когда показывать коллабы в режиме новых проектов, объясняет отказ в приглашении и больше не зависает на запросе, который повторяется после invalid_authentication. Коллабам нужны модули intranet и extranet, которых в БУС нет, поэтому на БУС из этого заметят только исправление запросов.
Новое
В режиме новых проектов коллабы видны без настроенного экстранета
Bitrix\Im\V2\Integration\Socialnetwork\Collab\Collab::isAvailable() теперь спрашивает CollabFeature::isAvailableForOpening() из socialnetwork 26.275.0. В режиме новых проектов (опция socialnetwork:new_projects = Y) хватает установленных обязательных модулей коллаб. Включённую фичу (CollabFeature::isOn()), инструмент в настройках портала и настроенный экстранет-сайт в этом режиме больше не проверяют. От isAvailable() зависят папка коллаб, коллабы в «Недавних» и флаг collabAvailable, так что на таком портале пользователи увидят коллабы в мессенджере.
Создание коллаб осталось строгим. Collab::isCreationAvailable() больше не опирается на isAvailable() и сам проверяет фичу, настройку портала, Requirement::check() и права пользователя.
Пригласить гостя в такую коллабу без настроенного экстранета тоже не выйдет: префильтр intranet 26.1750.0 ответит COLLAB_INVITE_EXTRANET_NOT_CONFIGURED. Текст ошибки выведет поле приглашения из intranet.
Отказ в приглашении с текстом сервера
Если при копировании или обновлении ссылки-приглашения сервер вернул один из семи кодов COLLAB_INVITE_*, уведомление мессенджера покажет текст ошибки, пропущенный через Text.encode, а для прочих кодов общий IM_NOTIFIER_DEFAULT_ERROR. За это отвечают CollabNotifier.onCopyLinkError(error), который теперь принимает ошибку, и новый onUpdateLinkError(error). Ошибка без кода при копировании ссылки даёт прежнее сообщение. Коды и пример такой же обработки в своём интерфейсе есть в разборе intranet 26.1750.0.
В окне добавления в коллабу ошибка приглашения гостей больше не оставляет кнопку в состоянии загрузки, повторный клик во время приглашения игнорируется.
Запрос после invalid_authentication больше не зависает
runAction() из im.v2.lib.rest один раз повторяет запрос, если сервер ответил invalid_authentication. Повтор запускался из .catch внутри executor’а new Promise через return handleErrors(...), но возврат из колбэка внешний промис не завершает. Действие, попавшее на протухшую авторизацию, висело: await не возвращал ни результат, ни ошибку. Вдобавок счётчик попыток retryCounter был переменной модуля, общей для всех одновременных запросов. Теперь повтор идёт через resolve(handleErrors(...)), остаток попыток передаётся параметром, а reject отбрасывает из errors всё, что не объект.
В своём коде ту же ошибку сделать легко:
const runWithRetry = (action, config) => new Promise((resolve) => {
BX.ajax.runAction(action, config)
.then(resolve)
.catch(() => resolve(retry(action, config))); // без resolve промис повиснет
});
Мелочи и находки
Свежий socialnetwork мессенджеру не нужен. Collab::isAvailable() проверяет method_exists(CollabFeature::class, 'isAvailableForOpening') и держит копию той же логики на случай, если метода нет. На эталоне БУС im 26.1150.0 встал раньше socialnetwork 26.275.0, и метода в тот момент ещё не было, так что модуль работает при любом порядке установки. Тот же приём подойдёт своему модулю, который завязан на свежий метод соседнего:
<?php
declare(strict_types=1);
namespace Vendor\Portal\Collab;
use Bitrix\Main\Loader;
use Bitrix\Socialnetwork\Collab\CollabFeature;
use Bitrix\Socialnetwork\Collab\Requirement;
final class CollabGate
{
public static function canShowCollabs(): bool
{
if (!Loader::includeModule('socialnetwork')) {
return false;
}
if (method_exists(CollabFeature::class, 'isAvailableForOpening')) {
return CollabFeature::isAvailableForOpening(); // socialnetwork 26.275.0+
}
// старый socialnetwork: показываем, только если всё настроено
return CollabFeature::isOn()
&& CollabFeature::isFeatureEnabledInPortalSettings()
&& Requirement::check()->isSuccess();
}
}