diff --git a/bigbluebutton-html5/client/meetingClient.jsx b/bigbluebutton-html5/client/meetingClient.jsx index 4e7267a4f9de..2b090d20cb21 100755 --- a/bigbluebutton-html5/client/meetingClient.jsx +++ b/bigbluebutton-html5/client/meetingClient.jsx @@ -38,7 +38,7 @@ import PLUGIN_CONFIGURATION_QUERY from '/imports/ui/components/plugins-engine/qu const Startup = () => { const loadingContextInfo = useContext(LoadingContext); useEffect(() => { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); }, []); // Logs all uncaught exceptions to the client logger window.addEventListener('error', (e) => { diff --git a/bigbluebutton-html5/imports/startup/client/intlLoader.tsx b/bigbluebutton-html5/imports/startup/client/intlLoader.tsx index 87e0b8287750..54726442bb43 100644 --- a/bigbluebutton-html5/imports/startup/client/intlLoader.tsx +++ b/bigbluebutton-html5/imports/startup/client/intlLoader.tsx @@ -126,7 +126,7 @@ const IntlLoader: React.FC = ({ const foundLocales = typedResp.filter((locale) => locale instanceof Object) as LocaleJson[]; if (foundLocales.length === 0) { const error = `${{ logCode: 'intl_fetch_locale_error' }},Could not fetch any locale file for ${languageSets.join(', ')}`; - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); logger.error(error); throw new Error(error); } @@ -137,15 +137,15 @@ const IntlLoader: React.FC = ({ setCurrentLocale(replacedLocale); setMessages(mergedLocale); if (!init) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); } }).catch((error) => { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error(error); }); }) .catch(() => { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error('unable to fetch localized messages'); }); }, []); diff --git a/bigbluebutton-html5/imports/ui/components/common/loading-screen/component.jsx b/bigbluebutton-html5/imports/ui/components/common/loading-screen/component.jsx index 9e2d8f008ee2..7683c040584d 100644 --- a/bigbluebutton-html5/imports/ui/components/common/loading-screen/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/common/loading-screen/component.jsx @@ -1,16 +1,13 @@ import React from 'react'; import Styled from './styles'; -const LoadingScreen = ({ children }) => ( +const LoadingScreen = () => (
- - {children} - ); diff --git a/bigbluebutton-html5/imports/ui/components/common/loading-screen/loading-screen-HOC/component.tsx b/bigbluebutton-html5/imports/ui/components/common/loading-screen/loading-screen-HOC/component.tsx index 1d7ede17cd04..2894f6dac0af 100644 --- a/bigbluebutton-html5/imports/ui/components/common/loading-screen/loading-screen-HOC/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/common/loading-screen/loading-screen-HOC/component.tsx @@ -3,16 +3,14 @@ import LoadingScreen from '../component'; interface LoadingContent { isLoading: boolean; - loadingMessage: string; } interface LoadingContextContent extends LoadingContent { - setLoading: (isLoading: boolean, loadingMessage: string) => void; + setLoading: (isLoading: boolean) => void; } export const LoadingContext = React.createContext({ isLoading: false, - loadingMessage: '', setLoading: () => { }, }); @@ -25,17 +23,14 @@ const LoadingScreenHOC: React.FC = ({ }) => { const [loading, setLoading] = React.useState({ isLoading: false, - loadingMessage: '', }); return ( { + setLoading: (isLoading: boolean) => { setLoading({ isLoading, - loadingMessage, }); }, }} @@ -43,9 +38,7 @@ const LoadingScreenHOC: React.FC = ({ { loading.isLoading ? ( - -

{loading.loadingMessage}

-
+ ) : null } diff --git a/bigbluebutton-html5/imports/ui/components/common/loading-screen/styles.js b/bigbluebutton-html5/imports/ui/components/common/loading-screen/styles.js index b0b40dba24a7..81733d52eacb 100644 --- a/bigbluebutton-html5/imports/ui/components/common/loading-screen/styles.js +++ b/bigbluebutton-html5/imports/ui/components/common/loading-screen/styles.js @@ -1,7 +1,6 @@ import styled, { css, keyframes } from 'styled-components'; import { mdPaddingX } from '/imports/ui/stylesheets/styled-components/general'; -import { loaderBg, loaderBullet, colorWhite } from '/imports/ui/stylesheets/styled-components/palette'; -import { fontSizeLarge } from '/imports/ui/stylesheets/styled-components/typography'; +import { loaderBg, loaderBullet } from '/imports/ui/stylesheets/styled-components/palette'; const Background = styled.div` position: fixed; @@ -57,16 +56,9 @@ const Bounce2 = styled.div` `} `; -const Message = styled.div` - font-size: ${fontSizeLarge}; - color: ${colorWhite}; - text-align: center; -`; - export default { Background, Spinner, Bounce1, Bounce2, - Message, }; diff --git a/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx b/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx index 7368a06eb795..df19a2418a56 100644 --- a/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/connection-manager/component.tsx @@ -97,11 +97,11 @@ const ConnectionManager: React.FC = ({ children }): Reac BBBWeb.index().then(({ data }) => { setGraphqlUrl(data.graphqlWebsocketUrl); }).catch((error) => { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error('Error fetching GraphQL URL: '.concat(error.message || '')); }); logger.info('Fetching GraphQL URL'); - loadingContextInfo.setLoading(true, '1/2'); + loadingContextInfo.setLoading(true); }, []); useEffect(() => { @@ -155,12 +155,12 @@ const ConnectionManager: React.FC = ({ children }): Reac useEffect(() => { logger.info('Connecting to GraphQL server'); - loadingContextInfo.setLoading(true, '2/2'); + loadingContextInfo.setLoading(true); if (graphqlUrl) { const urlParams = new URLSearchParams(window.location.search); const sessionToken = urlParams.get('sessionToken'); if (!sessionToken) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error('Missing session token'); } sessionStorage.setItem('sessionToken', sessionToken); @@ -215,7 +215,7 @@ const ConnectionManager: React.FC = ({ children }): Reac } if (error && typeof error === 'object' && 'code' in error && error.code === 4403) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); setTerminalError('Server refused the connection'); return false; } @@ -233,7 +233,7 @@ const ConnectionManager: React.FC = ({ children }): Reac on: { error: (error) => { logger.error('Graphql Client Error:', error); - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); connectionStatus.setConnectedStatus(false); setErrorCounts((prev: number) => prev + 1); }, @@ -259,7 +259,7 @@ const ConnectionManager: React.FC = ({ children }): Reac // message ID -1 as a signal to terminate the session // it contains a prop message.messageId which can be used to show a proper error to the user logger.error({ logCode: 'graphql_server_closed_connection', extraInfo: message }, 'Graphql Server closed the connection'); - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); const payload = message.payload as ErrorPayload[]; if (payload[0].messageId) { setTerminalError(new Error(payload[0].message, { cause: payload[0].messageId })); @@ -277,12 +277,12 @@ const ConnectionManager: React.FC = ({ children }): Reac ); wsLink = ApolloLink.from([payloadSizeCheckLink, errorLink, graphWsLink]); wsLink.setOnError((error) => { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error('Error: on apollo connection'.concat(JSON.stringify(error) || '')); }); apolloContextHolder.setLink(subscription); } catch (error) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error('Error creating WebSocketLink: '.concat(JSON.stringify(error) || '')); } let client; @@ -295,7 +295,7 @@ const ConnectionManager: React.FC = ({ children }): Reac setApolloClient(client); apolloContextHolder.setClient(client); } catch (error) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error('Error creating Apollo Client: '.concat(JSON.stringify(error) || '')); } } diff --git a/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx b/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx index f440e2054de3..21327b46b600 100644 --- a/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/join-handler/custom-users-settings/component.tsx @@ -100,11 +100,7 @@ const CustomUsersSettings: React.FC = ({ /> ) : null} {loading ? ( - -
- Loading... -
-
+ ) : null} ); diff --git a/bigbluebutton-html5/imports/ui/components/join-handler/guest-wait/component.tsx b/bigbluebutton-html5/imports/ui/components/join-handler/guest-wait/component.tsx index 364a46f26bfa..efa12c54a303 100644 --- a/bigbluebutton-html5/imports/ui/components/join-handler/guest-wait/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/join-handler/guest-wait/component.tsx @@ -125,7 +125,7 @@ const GuestWait: React.FC = (props) => { const sessionToken = getSearchParam('sessionToken'); if (loadingContextInfo.isLoading) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); } if (!sessionToken) { diff --git a/bigbluebutton-html5/imports/ui/components/join-handler/presenceManager/component.tsx b/bigbluebutton-html5/imports/ui/components/join-handler/presenceManager/component.tsx index 5df4098f3f51..a83b06984e35 100644 --- a/bigbluebutton-html5/imports/ui/components/join-handler/presenceManager/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/join-handler/presenceManager/component.tsx @@ -121,7 +121,7 @@ const PresenceManager: React.FC = ({ useEffect(() => { if (isGuestAllowed) { timeoutRef.current = setTimeout(() => { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); throw new Error('Authentication timeout'); }, connectionTimeout); } @@ -155,7 +155,7 @@ const PresenceManager: React.FC = ({ useEffect(() => { if (joinErrorCode) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); } }, [joinErrorCode, joinErrorMessage]); @@ -204,7 +204,7 @@ const PresenceManagerContainer: React.FC = ({ chi const loadingContextInfo = useContext(LoadingContext); if (loading || userInfoLoading) return null; if (error || userInfoError) { - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); logger.debug(`Error on user authentication: ${error}`); } diff --git a/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx b/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx index fe82e6583c36..7447ed9a0d70 100644 --- a/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/meeting-ended/component.tsx @@ -380,7 +380,7 @@ const MeetingEnded: React.FC = ({ useEffect(() => { // Sets Loading to falsed and removes loading splash screen - loadingContextInfo.setLoading(false, ''); + loadingContextInfo.setLoading(false); // Stops all media tracks window.dispatchEvent(new Event('StopAudioTracks')); // get the media tag from the session storage diff --git a/bigbluebutton-html5/imports/ui/components/settings-loader/component.tsx b/bigbluebutton-html5/imports/ui/components/settings-loader/component.tsx index e3caddefe85a..d0a6ef1e7fd9 100644 --- a/bigbluebutton-html5/imports/ui/components/settings-loader/component.tsx +++ b/bigbluebutton-html5/imports/ui/components/settings-loader/component.tsx @@ -93,11 +93,7 @@ const SettingsLoader: React.FC = (props) => { /> ) : null} {loading ? ( - -
- Loading... -
-
+ ) : null} ); diff --git a/bigbluebutton-tests/playwright/layouts/layouts.spec.js b/bigbluebutton-tests/playwright/layouts/layouts.spec.js index 945f5a708447..c6075dd8c55a 100644 --- a/bigbluebutton-tests/playwright/layouts/layouts.spec.js +++ b/bigbluebutton-tests/playwright/layouts/layouts.spec.js @@ -33,7 +33,8 @@ test.describe('Layout', { tag: '@ci' }, () => { await layouts.customLayout(); }); - test("Update everyone's layout", async () => { + test("Update everyone's layout", { tag: '@flaky' }, async () => { + // snapshot comparison failing due to unexpected zooming slide after layout update await layouts.updateEveryone(); }); }); diff --git a/bigbluebutton-tests/playwright/parameters/parameters.spec.js b/bigbluebutton-tests/playwright/parameters/parameters.spec.js index 81f1ac569c8e..8c3672dd8a39 100644 --- a/bigbluebutton-tests/playwright/parameters/parameters.spec.js +++ b/bigbluebutton-tests/playwright/parameters/parameters.spec.js @@ -478,7 +478,8 @@ test.describe.parallel('Custom Parameters', { tag: '@ci' }, () => { await customParam.hidePresentationOnJoin(); }); - test('Force restore presentation on new events', { tag: '@ci' }, async ({ browser, context, page }) => { + test('Force restore presentation on new events', { tag: ['@ci', '@flaky'] }, async ({ browser, context, page }) => { + // tagged as flaky because it's restoring presentation right after minimizing it due to unexpected zooming slide const customParam = new CustomParameters(browser, context); await customParam.initModPage(page); await customParam.initUserPage(true, context, { useModMeetingId: true, joinParameter: c.forceRestorePresentationOnNewEvents }); diff --git a/bigbluebutton-tests/playwright/whiteboard/whiteboard.spec.js b/bigbluebutton-tests/playwright/whiteboard/whiteboard.spec.js index 68a34b5ec9ac..b0cd31d35669 100644 --- a/bigbluebutton-tests/playwright/whiteboard/whiteboard.spec.js +++ b/bigbluebutton-tests/playwright/whiteboard/whiteboard.spec.js @@ -1,5 +1,4 @@ const { test } = require('../fixtures'); -const { Draw } = require('./draw'); const { DrawRectangle } = require('./drawRectangle'); const { DrawEllipse } = require('./drawEllipse'); const { DrawTriangle } = require('./drawTriangle'); @@ -10,7 +9,6 @@ const { DrawStickyNote } = require('./drawStickyNote'); const { Pan } = require('./pan'); const { Eraser } = require('./eraser'); const { DrawArrow } = require('./drawArrow'); -const { MultiUsers } = require('../user/multiusers'); const { encodeCustomParams } = require('../parameters/util'); const { PARAMETER_HIDE_PRESENTATION_TOAST } = require('../core/constants'); const { DeleteDrawing } = require('./deleteDrawing'); @@ -22,7 +20,12 @@ const { ShapeOptions } = require('./shapeOptions'); const hidePresentationToast = encodeCustomParams(PARAMETER_HIDE_PRESENTATION_TOAST); -test.describe.parallel('Whiteboard tools', { tag: '@ci' }, () => { +//! @flaky note: +// all whiteboard tests are flagged as flaky due to unexpected zooming slides +// only avoiding those assertions won't be enough as most of the tests are relying only on snapshot comparisons +// so together with the further fix + re-enablement of the tests, they will need to have non-snapshot assertions added as well +// P.S. 1. the failures seems to be noticeable only on the CI +test.describe.parallel('Whiteboard tools', { tag: ['@ci', '@flaky'] }, () => { test.beforeEach(({ browserName }) => { test.skip(browserName !== 'chromium', 'Drawing visual regression tests are enabled only for Chromium');