From 89f2e84cc16a42d8747f09ce9aff3352774ab8a0 Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Tue, 7 Jan 2025 01:37:50 +0300 Subject: [PATCH 01/12] Do not count streamIdInUseCounter in case of reconnection --- react/src/pages/AntMedia.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/react/src/pages/AntMedia.js b/react/src/pages/AntMedia.js index 8a0f1818..47ede572 100644 --- a/react/src/pages/AntMedia.js +++ b/react/src/pages/AntMedia.js @@ -1361,7 +1361,7 @@ function AntMedia(props) { }); //just run once when component is mounted - }, []); //eslint-disable-line + }, []); //eslint-disable-line useEffect(() => { if (devices.length > 0) { @@ -1786,13 +1786,16 @@ function AntMedia(props) { } else if (error.indexOf("no_stream_exist") !== -1) { setIsNoSreamExist(true); } else if (error.indexOf("streamIdInUse") !== -1) { - streamIdInUseCounter++; - if (streamIdInUseCounter > 3) { - console.log("This stream id is already in use. You may be logged in on another device."); - setLeaveRoomWithError("Streaming is already active with your username. Please check that you're not using it in another browser tab."); - setLeftTheRoom(true); - setIsJoining(false); - setIsReconnectionInProgress(false); + // if the stream id is in use when reconnection, don't display the error + if (!reconnecting) { + streamIdInUseCounter++; + if (streamIdInUseCounter > 3) { + console.log("This stream id is already in use. You may be logged in on another device."); + setLeaveRoomWithError("Streaming is already active with your username. Please check that you're not using it in another browser tab."); + setLeftTheRoom(true); + setIsJoining(false); + setIsReconnectionInProgress(false); + } } } else if (error.indexOf("data_channel_error") !== -1) { errorMessage = "There was a error during data channel communication"; @@ -3176,7 +3179,8 @@ function AntMedia(props) { speedTestCounter, setRoomName, setPublishStreamId, - settings + settings, + setReconnectingForUnitTests }} > {props.children} From ea78a13263462c8081b17828135f078d73800975 Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Tue, 7 Jan 2025 11:37:22 +0300 Subject: [PATCH 02/12] Remove setReconnectingForUnitTests from context --- react/src/pages/AntMedia.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/react/src/pages/AntMedia.js b/react/src/pages/AntMedia.js index 47ede572..5575eac4 100644 --- a/react/src/pages/AntMedia.js +++ b/react/src/pages/AntMedia.js @@ -3179,8 +3179,7 @@ function AntMedia(props) { speedTestCounter, setRoomName, setPublishStreamId, - settings, - setReconnectingForUnitTests + settings }} > {props.children} From 910ab32c6dfd252d439b5ba4cc456426497a460d Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Wed, 8 Jan 2025 12:54:26 +0300 Subject: [PATCH 03/12] Add raising hand integration test code --- react/.env.development.webinar | 2 +- test/test_webinar.py | 58 ++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/react/.env.development.webinar b/react/.env.development.webinar index 3db73e0a..3a56e68d 100644 --- a/react/.env.development.webinar +++ b/react/.env.development.webinar @@ -28,7 +28,7 @@ REACT_APP_FOOTER_MESSAGE_BUTTON_VISIBILITY=true REACT_APP_FOOTER_PARTICIPANT_LIST_BUTTON_VISIBILITY=true REACT_APP_FOOTER_END_CALL_BUTTON_VISIBILITY=true REACT_APP_FOOTER_CLOCK_VISIBILITY=true -REACT_APP_FOOTER_PUBLISHER_REQUEST_BUTTON_VISIBILITY=false +REACT_APP_FOOTER_PUBLISHER_REQUEST_BUTTON_VISIBILITY=true # Option menu buttons configurations REACT_APP_OPTION_MENU_GENERAL_SETTINGS_BUTTON_VISIBILITY=false diff --git a/test/test_webinar.py b/test/test_webinar.py index 16662619..816d94ff 100644 --- a/test/test_webinar.py +++ b/test/test_webinar.py @@ -184,6 +184,14 @@ def join_room_as_player(self, participant, room, skip_speed_test=False): return handle + def accept_raising_hand_request(self, participant): + accept_button = self.chrome.get_element_with_retry(By.ID,"approve-become-speaker-"+participant) + self.chrome.click_element(accept_button) + + def reject_raising_hand_request(self, participant): + reject_button = self.chrome.get_element_with_retry(By.ID,"reject-become-speaker-"+participant) + self.chrome.click_element(reject_button) + def add_presenter_to_listener_room(self, presenter): add_button = self.chrome.get_element(By.ID,"add-presenter-"+presenter) self.chrome.click_element(add_button) @@ -752,6 +760,56 @@ def _test_admin_video_card_controls(self): wait.until(lambda x: self.chrome.get_element_in_element(presenterA_video_card, By.XPATH, ".//button[@type='button' and @aria-label='turn-off-camera']") is not None) + self.chrome.close_all() + + def test_raising_hand(self): + # create a room and join as admin and 2 players + room = "room"+str(random.randint(100, 999)) + handle_admin = self.join_room_as_admin("admin", room) + handle_player_A = self.join_room_as_player("playerA", room) + handle_player_B = self.join_room_as_player("playerB", room) + + wait = self.chrome.get_wait() + + # switch to playerA and raise hand + self.chrome.switch_to_tab(handle_player_A) + + raise_hand_button = self.chrome.get_element_with_retry(By.ID, "request-to-publisher-button") + self.chrome.click_element(raise_hand_button) + + # switch to admin and check if playerA is in the request list + self.chrome.switch_to_tab(handle_admin) + + self.open_close_publisher_request_list_drawer() + + time.sleep(15) + + self.accept_raising_hand_request("playerA") + + # switch to playerA and join the room + self.chrome.switch_to_tab(handle_player_A) + + join_button = self.chrome.get_element_with_retry(By.ID,"room_join_button") + self.chrome.click_element(join_button) + + time.sleep(5) + + meeting_gallery = self.chrome.get_element_with_retry(By.ID,"meeting-gallery") + + assert(meeting_gallery.is_displayed()) + + wait.until(lambda x: len(self.get_participants()) == 2) + + # switch to admin and join the room + self.chrome.switch_to_tab(handle_admin) + + wait.until(lambda x: len(self.get_participants()) == 2) + + # switch to playerB and join the room + self.chrome.switch_to_tab(handle_player_B) + + wait.until(lambda x: len(self.get_participants()) == 0) + self.chrome.close_all() if __name__ == '__main__': From 645cd924cc1c7fc62fce4f70f8083a97cae356d0 Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Wed, 8 Jan 2025 13:49:32 +0300 Subject: [PATCH 04/12] Update test_webinar.py --- test/test_webinar.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test_webinar.py b/test/test_webinar.py index 816d94ff..1adbe663 100644 --- a/test/test_webinar.py +++ b/test/test_webinar.py @@ -765,9 +765,9 @@ def _test_admin_video_card_controls(self): def test_raising_hand(self): # create a room and join as admin and 2 players room = "room"+str(random.randint(100, 999)) - handle_admin = self.join_room_as_admin("admin", room) - handle_player_A = self.join_room_as_player("playerA", room) - handle_player_B = self.join_room_as_player("playerB", room) + handle_admin = self.join_room_as_admin("admin", room, True) + handle_player_A = self.join_room_as_player("playerA", room, True) + handle_player_B = self.join_room_as_player("playerB", room, True) wait = self.chrome.get_wait() From 53965869d39e430d5a8a89183c832492650db7ca Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Wed, 8 Jan 2025 15:06:31 +0300 Subject: [PATCH 05/12] Organise handlePublisherRequest button --- react/src/Components/Footer/Footer.js | 4 +++- react/src/Components/PublisherRequestTab.js | 10 ++++++---- react/src/pages/AntMedia.js | 7 ++++++- react/src/pages/MeetingRoom.js | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/react/src/Components/Footer/Footer.js b/react/src/Components/Footer/Footer.js index 09604210..c1e27405 100644 --- a/react/src/Components/Footer/Footer.js +++ b/react/src/Components/Footer/Footer.js @@ -222,7 +222,9 @@ function Footer(props) { props?.handlePublisherRequest()} + handlePublisherRequest={()=> { + props?.handlePublisherRequest() + }} /> : null} diff --git a/react/src/Components/PublisherRequestTab.js b/react/src/Components/PublisherRequestTab.js index e47bb926..06cdf86b 100644 --- a/react/src/Components/PublisherRequestTab.js +++ b/react/src/Components/PublisherRequestTab.js @@ -3,11 +3,11 @@ import Stack from "@mui/material/Stack"; import Grid from "@mui/material/Grid"; import Typography from "@mui/material/Typography"; import Button from "@mui/material/Button"; -import {styled} from "@mui/material/styles"; +import {styled, useTheme} from "@mui/material/styles"; import { SvgIcon } from "./SvgIcon"; const PublisherRequestName = styled(Typography)(({ theme }) => ({ - color: "#000", + color: theme.palette?.participantListIcon?.primary, fontWeight: 500, fontSize: 14, })); @@ -20,6 +20,8 @@ const PinBtn = styled(Button)(({ theme }) => ({ })); function PublisherRequestTab(props) { + const theme = useTheme(); + const getPublisherRequestItem = (streamId) => { return ( - + {props?.requestSpeakerList.length} diff --git a/react/src/pages/AntMedia.js b/react/src/pages/AntMedia.js index 6491cdf5..e429b29e 100644 --- a/react/src/pages/AntMedia.js +++ b/react/src/pages/AntMedia.js @@ -3451,7 +3451,7 @@ function AntMedia(props) { handleParticipantListOpen={(open) => handleParticipantListOpen(open)} requestSpeakerList={requestSpeakerList} handlePublisherRequestListOpen={(open) => setPublisherRequestListDrawerOpen(open)} - handlePublisherRequest={()=>{}} + handlePublisherRequest={()=>handlePublisherRequest()} setLeftTheRoom={(left) => setLeftTheRoom(left)} addFakeParticipant={() => addFakeParticipant()} removeFakeParticipant={() => removeFakeParticipant()} @@ -3520,10 +3520,15 @@ function AntMedia(props) { setPublisherRequestListDrawerOpen={(open) => setPublisherRequestListDrawerOpen(open)} /> approveBecomeSpeakerRequest(streamId)} rejectBecomeSpeakerRequest={(streamId) => rejectBecomeSpeakerRequest(streamId)} requestSpeakerList={requestSpeakerList} publishStreamId={publishStreamId} + handleMessageDrawerOpen={(open) => handleMessageDrawerOpen(open)} + handleParticipantListOpen={(open) => handleParticipantListOpen(open)} + handleEffectsOpen={(open) => handleEffectsOpen(open)} + setPublisherRequestListDrawerOpen={(open) => setPublisherRequestListDrawerOpen(open)} /> )} diff --git a/react/src/pages/MeetingRoom.js b/react/src/pages/MeetingRoom.js index cb443b87..01952693 100644 --- a/react/src/pages/MeetingRoom.js +++ b/react/src/pages/MeetingRoom.js @@ -252,7 +252,7 @@ const MeetingRoom = React.memo((props) => { requestSpeakerList={props?.requestSpeakerList} publisherRequestListDrawerOpen={props?.publisherRequestListDrawerOpen} handlePublisherRequestListOpen={props?.handlePublisherRequestListOpen} - handlePublisherRequest={props?.handlePublisherRequest} + handlePublisherRequest={()=> {props?.handlePublisherRequest()}} setLeftTheRoom={props?.setLeftTheRoom} addFakeParticipant={props?.addFakeParticipant} removeFakeParticipant={props?.removeFakeParticipant} From 3c4a4f272c8b71bd29df6abefbae57a2937dff43 Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Thu, 9 Jan 2025 10:31:00 +0300 Subject: [PATCH 06/12] Pass role as prop --- react/src/pages/AntMedia.js | 1 + react/src/pages/WaitingRoom.js | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/react/src/pages/AntMedia.js b/react/src/pages/AntMedia.js index e429b29e..6b4e62e5 100644 --- a/react/src/pages/AntMedia.js +++ b/react/src/pages/AntMedia.js @@ -3398,6 +3398,7 @@ function AntMedia(props) { pinVideo={(streamId) => pinVideo(streamId)} isAdmin={isAdmin} publishStreamId={publishStreamId} + role={role} /> ) : ( <> diff --git a/react/src/pages/WaitingRoom.js b/react/src/pages/WaitingRoom.js index 5ef267c7..3f837147 100755 --- a/react/src/pages/WaitingRoom.js +++ b/react/src/pages/WaitingRoom.js @@ -70,9 +70,9 @@ function WaitingRoom(props) { }; React.useEffect(() => { - if (conference.role === WebinarRoles.TempListener) { + if (props?.role === WebinarRoles.TempListener) { const tempLocalVideo = document.getElementById("localVideo"); - conference?.localVideoCreate(tempLocalVideo); + props?.localVideoCreate(tempLocalVideo); console.log("TempListener local video created"); } }, []); @@ -319,7 +319,7 @@ function WaitingRoom(props) { @@ -414,7 +414,7 @@ function WaitingRoom(props) { "You can choose whether to open your camera and microphone before you get into room" )} - {conference.role === WebinarRoles.TempListener ? ( + {props?.role === WebinarRoles.TempListener ? (
{ @@ -438,7 +438,7 @@ function WaitingRoom(props) { : null} - {conference.role !== WebinarRoles.TempListener ? ( + {props?.role !== WebinarRoles.TempListener ? ( From 74805af8f4a5a6f9f81ce42a6771c1307b4ae603 Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Mon, 13 Jan 2025 03:31:45 +0300 Subject: [PATCH 07/12] Refactor raise hand integration test --- react/src/Components/PublisherRequestTab.js | 2 ++ test/test_webinar.py | 40 ++++++++++++++++----- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/react/src/Components/PublisherRequestTab.js b/react/src/Components/PublisherRequestTab.js index 06cdf86b..633a7e6e 100644 --- a/react/src/Components/PublisherRequestTab.js +++ b/react/src/Components/PublisherRequestTab.js @@ -37,6 +37,7 @@ function PublisherRequestTab(props) { {props?.approveBecomeSpeakerRequest(streamId);}} @@ -45,6 +46,7 @@ function PublisherRequestTab(props) { {props?.rejectBecomeSpeakerRequest(streamId);}} diff --git a/test/test_webinar.py b/test/test_webinar.py index 1adbe663..5e6d91e3 100644 --- a/test/test_webinar.py +++ b/test/test_webinar.py @@ -141,7 +141,7 @@ def join_room_as_player(self, participant, room, skip_speed_test=False): app = "/"+self.test_app_name if self.url.endswith("localhost:3000"): app = "" - handle = self.chrome.open_in_new_tab(self.url+app+"/"+room+"?playOnly=true&role=listener&streamName=" + participant + ("&enterDirectly=true" if skip_speed_test else "")) + handle = self.chrome.open_in_new_tab(self.url+app+"/"+room+"?playOnly=true&role=listener&streamName=" + participant + "&streamId=" + participant + ("&enterDirectly=true" if skip_speed_test else "")) wait = self.chrome.get_wait() @@ -766,15 +766,15 @@ def test_raising_hand(self): # create a room and join as admin and 2 players room = "room"+str(random.randint(100, 999)) handle_admin = self.join_room_as_admin("admin", room, True) - handle_player_A = self.join_room_as_player("playerA", room, True) - handle_player_B = self.join_room_as_player("playerB", room, True) + handle_player_A = self.join_room_as_player("playerA", room, False) + handle_player_B = self.join_room_as_player("playerB", room, False) wait = self.chrome.get_wait() # switch to playerA and raise hand self.chrome.switch_to_tab(handle_player_A) - raise_hand_button = self.chrome.get_element_with_retry(By.ID, "request-to-publisher-button") + raise_hand_button = self.chrome.get_element_with_retry(By.ID, "request-publish-button") self.chrome.click_element(raise_hand_button) # switch to admin and check if playerA is in the request list @@ -791,6 +791,32 @@ def test_raising_hand(self): join_button = self.chrome.get_element_with_retry(By.ID,"room_join_button") self.chrome.click_element(join_button) + + time.sleep(5) + speedTestCircularProgress = self.chrome.get_element_with_retry(By.ID,"speed-test-modal-circle-progress-bar", retries=20) + assert(speedTestCircularProgress.is_displayed()) + + time.sleep(5) + + timeoutCounter = 0 + + isSpeedTestFinished = False + isSpeedTestFailed = False + + while not isSpeedTestFailed and not isSpeedTestFinished and timeoutCounter < 100: + time.sleep(1) + timeoutCounter += 1 + script = "return window.conference.speedTestObject;" + result_json = self.chrome.execute_script(script) + if result_json is not None: + isSpeedTestFinished = result_json["isfinished"] + isSpeedTestFailed = result_json["isfailed"] + + speedTestModalJoinButton = self.chrome.get_element_with_retry(By.ID,"speed-test-modal-join-button") + + self.chrome.print_ss_as_base64() + + self.chrome.click_element(speedTestModalJoinButton) time.sleep(5) @@ -800,16 +826,14 @@ def test_raising_hand(self): wait.until(lambda x: len(self.get_participants()) == 2) - # switch to admin and join the room + # switch to admin self.chrome.switch_to_tab(handle_admin) wait.until(lambda x: len(self.get_participants()) == 2) - # switch to playerB and join the room + # switch to playerB self.chrome.switch_to_tab(handle_player_B) - wait.until(lambda x: len(self.get_participants()) == 0) - self.chrome.close_all() if __name__ == '__main__': From 1ce3f1775b30b67fdc8c79db624e7f1d5c43a2c6 Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Mon, 13 Jan 2025 03:36:34 +0300 Subject: [PATCH 08/12] Add integration test --- react/src/__tests__/pages/AntMedia.test.js | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/react/src/__tests__/pages/AntMedia.test.js b/react/src/__tests__/pages/AntMedia.test.js index 66480ef4..c6012406 100644 --- a/react/src/__tests__/pages/AntMedia.test.js +++ b/react/src/__tests__/pages/AntMedia.test.js @@ -2275,6 +2275,37 @@ describe('AntMedia Component', () => { consoleSpy.mockRestore(); }); + it('streamIdInUseCounter is not incremented due to reconnection is true', async () => { + const consoleSpy = jest.spyOn(console, 'log').mockImplementation(); + + const {container} = render( + + + + + ); + + + await waitFor(() => { + expect(webRTCAdaptorConstructor).not.toBe(undefined); + }); + + await act(async () => { + webRTCAdaptorConstructor.callback("reconnection_attempt_for_player"); + }); + + await act(async () => { + webRTCAdaptorConstructor.callbackError("streamIdInUse", "Stream ID is in use"); + webRTCAdaptorConstructor.callbackError("streamIdInUse", "Stream ID is in use"); + webRTCAdaptorConstructor.callbackError("streamIdInUse", "Stream ID is in use"); + webRTCAdaptorConstructor.callbackError("streamIdInUse", "Stream ID is in use"); + }); + + expect(consoleSpy).not.toHaveBeenCalledWith("This stream id is already in use. You may be logged in on another device."); + + consoleSpy.mockRestore(); + }); + it('updates allParticipants and participantUpdated when subtrackList is provided', async () => { const { container } = render( From a2d54e226e605f1ca7356bff3d45cc8fa701015f Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Mon, 13 Jan 2025 03:45:24 +0300 Subject: [PATCH 09/12] Add get_request_publish_button function --- .../Footer/Components/MoreOptionsButton.js | 2 +- test/test_webinar.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/react/src/Components/Footer/Components/MoreOptionsButton.js b/react/src/Components/Footer/Components/MoreOptionsButton.js index 6612a6d6..368a5274 100644 --- a/react/src/Components/Footer/Components/MoreOptionsButton.js +++ b/react/src/Components/Footer/Components/MoreOptionsButton.js @@ -225,7 +225,7 @@ function MoreOptionsButton(props) { - {t("Request becoming publisher")} + {t("Request becoming publisher")} : null} diff --git a/test/test_webinar.py b/test/test_webinar.py index 5e6d91e3..8e6d8321 100644 --- a/test/test_webinar.py +++ b/test/test_webinar.py @@ -762,6 +762,16 @@ def _test_admin_video_card_controls(self): self.chrome.close_all() + def get_request_publish_button(self): + rp_button = None + if(self.chrome.is_element_exist(By.ID, "request-publish-button")): + rp_button = self.chrome.get_element(By.ID, "request-publish-button") + else: + more_button = self.chrome.get_element_with_retry(By.ID, "more-button") + self.chrome.click_element(more_button) + rp_button = self.chrome.get_element_with_retry(By.ID, "more-options-request-publish-button") + return rp_button + def test_raising_hand(self): # create a room and join as admin and 2 players room = "room"+str(random.randint(100, 999)) @@ -774,7 +784,7 @@ def test_raising_hand(self): # switch to playerA and raise hand self.chrome.switch_to_tab(handle_player_A) - raise_hand_button = self.chrome.get_element_with_retry(By.ID, "request-publish-button") + raise_hand_button = self.get_request_publish_button() self.chrome.click_element(raise_hand_button) # switch to admin and check if playerA is in the request list From 687fba70c34b1391fa9cc14677bd875f2902e968 Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Mon, 13 Jan 2025 04:08:27 +0300 Subject: [PATCH 10/12] Update .env.production.webinar --- react/.env.production.webinar | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/react/.env.production.webinar b/react/.env.production.webinar index 743dd7a0..75b0d3c5 100644 --- a/react/.env.production.webinar +++ b/react/.env.production.webinar @@ -28,7 +28,7 @@ REACT_APP_FOOTER_MESSAGE_BUTTON_VISIBILITY=true REACT_APP_FOOTER_PARTICIPANT_LIST_BUTTON_VISIBILITY=true REACT_APP_FOOTER_END_CALL_BUTTON_VISIBILITY=true REACT_APP_FOOTER_CLOCK_VISIBILITY=true -REACT_APP_FOOTER_PUBLISHER_REQUEST_BUTTON_VISIBILITY=false +REACT_APP_FOOTER_PUBLISHER_REQUEST_BUTTON_VISIBILITY=true # Option menu buttons configurations REACT_APP_OPTION_MENU_GENERAL_SETTINGS_BUTTON_VISIBILITY=false From c7392f69b7d0dee06ec28ab2a129f0477b8dd48c Mon Sep 17 00:00:00 2001 From: Mustafa BOLEKEN Date: Mon, 13 Jan 2025 04:24:27 +0300 Subject: [PATCH 11/12] Rename Publisher Request List --- react/src/Components/Footer/Components/MoreOptionsButton.js | 2 +- react/src/Components/Footer/Footer.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/react/src/Components/Footer/Components/MoreOptionsButton.js b/react/src/Components/Footer/Components/MoreOptionsButton.js index 368a5274..72de6057 100644 --- a/react/src/Components/Footer/Components/MoreOptionsButton.js +++ b/react/src/Components/Footer/Components/MoreOptionsButton.js @@ -214,7 +214,7 @@ function MoreOptionsButton(props) { - {t("Publisher Request List")} + {t("Publisher Request List")} : null} diff --git a/react/src/Components/Footer/Footer.js b/react/src/Components/Footer/Footer.js index c1e27405..d99a5ec7 100644 --- a/react/src/Components/Footer/Footer.js +++ b/react/src/Components/Footer/Footer.js @@ -272,6 +272,7 @@ function Footer(props) { Date: Mon, 13 Jan 2025 04:39:23 +0300 Subject: [PATCH 12/12] Fix deploy issue --- .github/workflows/build-and-deploy.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index d454429a..fb017b3f 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -87,7 +87,7 @@ jobs: sed -i "s#^REACT_APP_TURN_SERVER_URL=.*#REACT_APP_TURN_SERVER_URL=\"turn:${{ secrets.STAGING_TURN_URL }}\"#" .env.production sed -i "s#^REACT_APP_TURN_SERVER_USERNAME=.*#REACT_APP_TURN_SERVER_USERNAME=\"${{ secrets.STAGING_TURN_USERNAME }}\"#" .env.production sed -i "s#^REACT_APP_TURN_SERVER_CREDENTIAL=.*#REACT_APP_TURN_SERVER_CREDENTIAL=\"${{ secrets.STAGING_TURN_PASSWORD }}\"#" .env.production - npm install --legacy-peer-deps + npm install --force npm run build cd .. if [ -d "webapp/src/main/webapp/static" ] && [ "$(ls -A webapp/src/main/webapp/static)" ]; then @@ -118,7 +118,7 @@ jobs: sed -i "s#^REACT_APP_TURN_SERVER_URL=.*#REACT_APP_TURN_SERVER_URL=\"turn:${{ secrets.STAGING_TURN_URL }}\"#" .env.production sed -i "s#^REACT_APP_TURN_SERVER_USERNAME=.*#REACT_APP_TURN_SERVER_USERNAME=\"${{ secrets.STAGING_TURN_USERNAME }}\"#" .env.production sed -i "s#^REACT_APP_TURN_SERVER_CREDENTIAL=.*#REACT_APP_TURN_SERVER_CREDENTIAL=\"${{ secrets.STAGING_TURN_PASSWORD }}\"#" .env.production - npm install --legacy-peer-deps + npm install --force npm run build cd .. if [ -d "webapp/src/main/webapp/static" ] && [ "$(ls -A webapp/src/main/webapp/static)" ]; then @@ -187,7 +187,7 @@ jobs: echo "ls:" ls -al cd react - npm install --include=dev --legacy-peer-deps + npm install --include=dev --force npm test - name: Upload coverage to Codecov @@ -374,7 +374,7 @@ jobs: sed -i "s#^REACT_APP_TURN_SERVER_URL=.*#REACT_APP_TURN_SERVER_URL=\"turn:${{ secrets.STAGING_TURN_URL }}\"#" .env.production sed -i "s#^REACT_APP_TURN_SERVER_USERNAME=.*#REACT_APP_TURN_SERVER_USERNAME=\"${{ secrets.STAGING_TURN_USERNAME }}\"#" .env.production sed -i "s#^REACT_APP_TURN_SERVER_CREDENTIAL=.*#REACT_APP_TURN_SERVER_CREDENTIAL=\"${{ secrets.STAGING_TURN_PASSWORD }}\"#" .env.production - npm install --legacy-peer-deps + npm install --force npm run build cd .. if [ -d "webapp/src/main/webapp/static" ] && [ "$(ls -A webapp/src/main/webapp/static)" ]; then