/** @odoo-module **/ import { busService } from '@bus/services/bus_service'; import { imStatusService } from '@bus/im_status_service'; import { multiTabService } from '@bus/multi_tab_service'; import { makeMultiTabToLegacyEnv } from '@bus/services/legacy/make_multi_tab_to_legacy_env'; import { makeBusServiceToLegacyEnv } from '@bus/services/legacy/make_bus_service_to_legacy_env'; import { makeFakePresenceService } from '@bus/../tests/helpers/mock_services'; import { ChatWindowManagerContainer } from '@mail/components/chat_window_manager_container/chat_window_manager_container'; import { DialogManagerContainer } from '@mail/components/dialog_manager_container/dialog_manager_container'; import { DiscussContainer } from '@mail/components/discuss_container/discuss_container'; import { PopoverManagerContainer } from '@mail/components/popover_manager_container/popover_manager_container'; import { messagingService } from '@mail/services/messaging_service'; import { systrayService } from '@mail/services/systray_service'; import { makeMessagingToLegacyEnv } from '@mail/utils/make_messaging_to_legacy_env'; import { registry } from '@web/core/registry'; import { patchWithCleanup } from "@web/../tests/helpers/utils"; import { createWebClient } from "@web/../tests/webclient/helpers"; const ROUTES_TO_IGNORE = [ '/web/webclient/load_menus', '/web/dataset/call_kw/res.users/load_views', '/web/dataset/call_kw/res.users/systray_get_activities' ]; const WEBCLIENT_PARAMETER_NAMES = new Set(['legacyParams', 'mockRPC', 'serverData', 'target', 'webClientClass']); const SERVICES_PARAMETER_NAMES = new Set([ 'legacyServices', 'loadingBaseDelayDuration', 'messagingBeforeCreationDeferred', 'messagingBus', 'services', ]); /** * Add required components to the main component registry. */ function setupMainComponentRegistry() { const mainComponentRegistry = registry.category('main_components'); mainComponentRegistry.add('ChatWindowManagerContainer', { Component: ChatWindowManagerContainer }); mainComponentRegistry.add('DialogManagerContainer', { Component: DialogManagerContainer }); registry.category('actions').add('mail.action_discuss', DiscussContainer); mainComponentRegistry.add('PopoverManagerContainer', { Component: PopoverManagerContainer }); } /** * Setup both legacy and new service registries. * * @param {Object} param0 * @param {Object} [param0.services] * @param {number} [param0.loadingBaseDelayDuration=0] * @param {Promise} [param0.messagingBeforeCreationDeferred=Promise.resolve()] * Deferred that let tests block messaging creation and simulate resolution. * Useful for testing components behavior when messaging is not yet created. * @param {EventBus} [param0.messagingBus] * @returns {LegacyRegistry} The registry containing all the legacy services that will be passed * to the webClient as a legacy parameter. */ function setupMessagingServiceRegistries({ loadingBaseDelayDuration = 0, messagingBeforeCreationDeferred = Promise.resolve(), messagingBus, services, }) { const serviceRegistry = registry.category('services'); patchWithCleanup(messagingService, { async _startModelManager(modelManager, messagingValues) { modelManager.isDebug = true; const _super = this._super.bind(this); await messagingBeforeCreationDeferred; return _super(modelManager, messagingValues); }, }); const messagingValues = { start() { return { isInQUnitTest: true, disableAnimation: true, loadingBaseDelayDuration, messagingBus, userNotificationManager: { canPlayAudio: false }, }; } }; services = { bus_service: busService, im_status: imStatusService, messaging: messagingService, messagingValues, presence: makeFakePresenceService({ isOdooFocused: () => true, }), systrayService, multi_tab: multiTabService, ...services, }; Object.entries(services).forEach(([serviceName, service]) => { serviceRegistry.add(serviceName, service); }); registry.category('wowlToLegacyServiceMappers').add('bus_service_to_legacy_env', makeBusServiceToLegacyEnv); registry.category('wowlToLegacyServiceMappers').add('multi_tab_to_legacy_env', makeMultiTabToLegacyEnv); registry.category('wowlToLegacyServiceMappers').add('messaging_service_to_legacy_env', makeMessagingToLegacyEnv); } /** * Creates a properly configured instance of WebClient, with the messaging service and all it's * dependencies initialized. * * @param {Object} param0 * @param {Object} [param0.serverData] * @param {Object} [param0.services] * @param {Object} [param0.loadingBaseDelayDuration] * @param {Object} [param0.messagingBeforeCreationDeferred] * @param {EventBus} [param0.messagingBus] The event bus to be used by messaging. * @returns {WebClient} */ async function getWebClientReady(param0) { setupMainComponentRegistry(); const servicesParameters = {}; const param0Entries = Object.entries(param0); for (const [parameterName, value] of param0Entries) { if (SERVICES_PARAMETER_NAMES.has(parameterName)) { servicesParameters[parameterName] = value; } } setupMessagingServiceRegistries(servicesParameters); const webClientParameters = {}; for (const [parameterName, value] of param0Entries) { if (WEBCLIENT_PARAMETER_NAMES.has(parameterName)) { webClientParameters[parameterName] = value; } } return createWebClient(webClientParameters); } export { getWebClientReady, ROUTES_TO_IGNORE, };