From ff19135d4edef2e8b46ea44e94da56e5a05bad68 Mon Sep 17 00:00:00 2001 From: Vri Date: Wed, 4 Jan 2023 15:01:27 +0000 Subject: [PATCH 01/19] Translated using Weblate (German) Currently translated at 100.0% (141 of 141 strings) Translation: Element Call/element-call Translate-URL: https://translate.element.io/projects/element-call/element-call/de/ --- public/locales/de/app.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/de/app.json b/public/locales/de/app.json index fbd95384..120f979b 100644 --- a/public/locales/de/app.json +++ b/public/locales/de/app.json @@ -137,5 +137,7 @@ "Whether to enable single-key keyboard shortcuts, e.g. 'm' to mute/unmute the mic.": "Ob Tastenkürzel mit nur einer Taste aktiviert sein sollen, z. B. „m“ um das Mikrofon stumm/aktiv zu schalten.", "Single-key keyboard shortcuts": "Ein-Tasten-Tastenkürzel", "{{name}} (Waiting for video...)": "{{name}} (Warte auf Video …)", - "This feature is only supported on Firefox.": "Diese Funktion wird nur in Firefox unterstützt." + "This feature is only supported on Firefox.": "Diese Funktion wird nur in Firefox unterstützt.", + "<0>Submitting debug logs will help us track down the problem.": "<0>Übermittelte Problemberichte helfen uns, Fehler zu beheben.", + "<0>Oops, something's gone wrong.": "<0>Hoppla, etwas ist schiefgelaufen." } From dcbc3ed8657059abcc21552638f7507f4c0cbb43 Mon Sep 17 00:00:00 2001 From: Linerly Date: Wed, 4 Jan 2023 13:17:56 +0000 Subject: [PATCH 02/19] Translated using Weblate (Indonesian) Currently translated at 100.0% (141 of 141 strings) Translation: Element Call/element-call Translate-URL: https://translate.element.io/projects/element-call/element-call/id/ --- public/locales/id/app.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/id/app.json b/public/locales/id/app.json index 0a236b14..dccfe8ff 100644 --- a/public/locales/id/app.json +++ b/public/locales/id/app.json @@ -137,5 +137,7 @@ "Whether to enable single-key keyboard shortcuts, e.g. 'm' to mute/unmute the mic.": "Apakah pintasan papan ketik seharusnya diaktifkan, mis. 'm' untuk membisukan/menyuarakan mikrofon.", "Single-key keyboard shortcuts": "Pintasan papan ketik satu tombol", "{{name}} (Waiting for video...)": "{{name}} (Menunggu video...)", - "This feature is only supported on Firefox.": "Fitur ini hanya didukung di Firefox." + "This feature is only supported on Firefox.": "Fitur ini hanya didukung di Firefox.", + "<0>Submitting debug logs will help us track down the problem.": "<0>Mengirim catatan pengawakutuan akan membantu kami melacak masalahnya.", + "<0>Oops, something's gone wrong.": "<0>Aduh, ada yang salah." } From d45ea78ddb44b076b9f07131511a9b8658d734bc Mon Sep 17 00:00:00 2001 From: Glandos Date: Thu, 5 Jan 2023 08:40:42 +0000 Subject: [PATCH 03/19] Translated using Weblate (French) Currently translated at 100.0% (141 of 141 strings) Translation: Element Call/element-call Translate-URL: https://translate.element.io/projects/element-call/element-call/fr/ --- public/locales/fr/app.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/fr/app.json b/public/locales/fr/app.json index ebee2856..c8e9cceb 100644 --- a/public/locales/fr/app.json +++ b/public/locales/fr/app.json @@ -137,5 +137,7 @@ "Whether to enable single-key keyboard shortcuts, e.g. 'm' to mute/unmute the mic.": "Bascule sur les raccourcis clavier à touche unique, par exemple « m » pour désactiver / activer le micro.", "Single-key keyboard shortcuts": "Raccourcis clavier en une touche", "{{name}} (Waiting for video...)": "{{name}} (En attente de vidéo…)", - "This feature is only supported on Firefox.": "Cette fonctionnalité est prise en charge dans Firefox uniquement." + "This feature is only supported on Firefox.": "Cette fonctionnalité est prise en charge dans Firefox uniquement.", + "<0>Submitting debug logs will help us track down the problem.": "<0>Soumettre les journaux de débogage nous aidera à déterminer le problème.", + "<0>Oops, something's gone wrong.": "<0>Oups, quelque chose s’est mal passé." } From 49cae76387451197d03ea6b180e13b02e85afef6 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 4 Jan 2023 14:51:16 +0000 Subject: [PATCH 04/19] Translated using Weblate (Ukrainian) Currently translated at 100.0% (141 of 141 strings) Translation: Element Call/element-call Translate-URL: https://translate.element.io/projects/element-call/element-call/uk/ --- public/locales/uk/app.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/uk/app.json b/public/locales/uk/app.json index a88df531..f7c60757 100644 --- a/public/locales/uk/app.json +++ b/public/locales/uk/app.json @@ -137,5 +137,7 @@ "Whether to enable single-key keyboard shortcuts, e.g. 'm' to mute/unmute the mic.": "Чи вмикати/вимикати мікрофон однією клавішею, наприклад, «m» для ввімкнення/вимкнення мікрофона.", "Single-key keyboard shortcuts": "Одноклавішні комбінації клавіш", "{{name}} (Waiting for video...)": "{{name}} (Очікування на відео...)", - "This feature is only supported on Firefox.": "Ця функція підтримується лише в браузері Firefox." + "This feature is only supported on Firefox.": "Ця функція підтримується лише в браузері Firefox.", + "<0>Submitting debug logs will help us track down the problem.": "<0>Надсилання журналів зневадження допоможе нам виявити проблему.", + "<0>Oops, something's gone wrong.": "<0>Йой, щось пішло не за планом." } From de31c099e3e4c673e792b94f9b10b86b4beec04c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 5 Jan 2023 07:21:39 +0000 Subject: [PATCH 05/19] Translated using Weblate (Estonian) Currently translated at 100.0% (141 of 141 strings) Translation: Element Call/element-call Translate-URL: https://translate.element.io/projects/element-call/element-call/et/ --- public/locales/et/app.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/et/app.json b/public/locales/et/app.json index 1a6a1428..0ca2e145 100644 --- a/public/locales/et/app.json +++ b/public/locales/et/app.json @@ -137,5 +137,7 @@ "Whether to enable single-key keyboard shortcuts, e.g. 'm' to mute/unmute the mic.": "Kas kasutame üheklahvilisi kiirklahve, näiteks „m“ mikrofoni sisse/välja lülitamiseks.", "Single-key keyboard shortcuts": "Üheklahvilised kiirklahvid", "{{name}} (Waiting for video...)": "{{name}} (Ootame videovoo algust...)", - "This feature is only supported on Firefox.": "See funktsionaalsus on toetatud vaid Firefoxis." + "This feature is only supported on Firefox.": "See funktsionaalsus on toetatud vaid Firefoxis.", + "<0>Submitting debug logs will help us track down the problem.": "<0>Kui saadad meile vealogid, siis on lihtsam vea põhjust otsida.", + "<0>Oops, something's gone wrong.": "<0>Ohoo, midagi on nüüd katki." } From 62e98f6c47bf743288d9d5c252798b3e8af04bb3 Mon Sep 17 00:00:00 2001 From: Jozef Gaal Date: Wed, 4 Jan 2023 14:51:26 +0000 Subject: [PATCH 06/19] Translated using Weblate (Slovak) Currently translated at 100.0% (141 of 141 strings) Translation: Element Call/element-call Translate-URL: https://translate.element.io/projects/element-call/element-call/sk/ --- public/locales/sk/app.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/sk/app.json b/public/locales/sk/app.json index b8ee171a..98343472 100644 --- a/public/locales/sk/app.json +++ b/public/locales/sk/app.json @@ -137,5 +137,7 @@ "{{displayName}}, your call is now ended": "{{displayName}}, váš hovor je teraz ukončený", "{{count}} people connected|other": "{{count}} osôb pripojených", "{{count}} people connected|one": "{{count}} osoba pripojená", - "This feature is only supported on Firefox.": "Táto funkcia je podporovaná len v prehliadači Firefox." + "This feature is only supported on Firefox.": "Táto funkcia je podporovaná len v prehliadači Firefox.", + "<0>Submitting debug logs will help us track down the problem.": "<0>Odoslanie záznamov ladenia nám pomôže nájsť problém.", + "<0>Oops, something's gone wrong.": "<0>Hups, niečo sa pokazilo." } From 946f564f84119832c256f221dd6f0177769a300a Mon Sep 17 00:00:00 2001 From: Robin Townsend Date: Fri, 6 Jan 2023 10:39:29 -0500 Subject: [PATCH 07/19] Update matrix-js-sdk --- package.json | 2 +- yarn.lock | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 16509120..3d38f488 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "i18next": "^21.10.0", "i18next-browser-languagedetector": "^6.1.8", "i18next-http-backend": "^1.4.4", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#2c8eece5ca5333c6e6a14e8ed53f359ed0e9e9bf", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#bba4a35665b99c988064f8485dce5f0fb525cdc8", "matrix-widget-api": "^1.0.0", "mermaid": "^8.13.8", "normalize.css": "^8.0.1", diff --git a/yarn.lock b/yarn.lock index 783b88dc..b8384d11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1821,6 +1821,11 @@ resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0" integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw== +"@matrix-org/matrix-sdk-crypto-js@^0.1.0-alpha.2": + version "0.1.0-alpha.2" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.2.tgz#a09d0fea858e817da971a3c9f904632ef7b49eb6" + integrity sha512-oVkBCh9YP7H9i4gAoQbZzswniczfo/aIptNa4dxRi4Ff9lSvUCFv6Hvzi7C+90c0/PWZLXjIDTIAWZYmwyd2fA== + "@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz": version "3.2.8" resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz#8d53636d045e1776e2a2ec6613e57330dd9ce856" @@ -10357,11 +10362,12 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#2c8eece5ca5333c6e6a14e8ed53f359ed0e9e9bf": - version "21.2.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/2c8eece5ca5333c6e6a14e8ed53f359ed0e9e9bf" +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#bba4a35665b99c988064f8485dce5f0fb525cdc8": + version "23.0.0" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/bba4a35665b99c988064f8485dce5f0fb525cdc8" dependencies: "@babel/runtime" "^7.12.5" + "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.2" another-json "^0.2.0" bs58 "^5.0.0" content-type "^1.0.4" @@ -10372,6 +10378,7 @@ matrix-events-sdk@0.0.1: qs "^6.9.6" sdp-transform "^2.14.1" unhomoglyph "^1.0.6" + uuid "9" matrix-widget-api@^1.0.0: version "1.1.1" @@ -14294,6 +14301,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@9: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" From 881054e2657fa42606ca59a5f7cb4c9dda79b907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 7 Jan 2023 10:09:20 +0100 Subject: [PATCH 08/19] Hide local volume controls for tiles with no audio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/video-grid/VideoTile.tsx | 20 ++++++++++++-------- src/video-grid/VideoTileContainer.tsx | 2 ++ src/video-grid/useCallFeed.ts | 2 ++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/video-grid/VideoTile.tsx b/src/video-grid/VideoTile.tsx index a7792c6f..afaa48e5 100644 --- a/src/video-grid/VideoTile.tsx +++ b/src/video-grid/VideoTile.tsx @@ -36,6 +36,7 @@ interface Props { mediaRef?: React.RefObject; onOptionsPress?: () => void; localVolume?: number; + hasAudio?: boolean; maximised?: boolean; fullscreen?: boolean; onFullscreen?: () => void; @@ -58,6 +59,7 @@ export const VideoTile = forwardRef( mediaRef, onOptionsPress, localVolume, + hasAudio, maximised, fullscreen, onFullscreen, @@ -74,14 +76,16 @@ export const VideoTile = forwardRef( const toolbarButtons: JSX.Element[] = []; if (connectionState == ConnectionState.Connected && !isLocal) { - toolbarButtons.push( - - ); + if (hasAudio) { + toolbarButtons.push( + + ); + } if (screenshare) { toolbarButtons.push( diff --git a/src/video-grid/VideoTileContainer.tsx b/src/video-grid/VideoTileContainer.tsx index 10f65c72..249c787d 100644 --- a/src/video-grid/VideoTileContainer.tsx +++ b/src/video-grid/VideoTileContainer.tsx @@ -62,6 +62,7 @@ export function VideoTileContainer({ audioMuted, videoMuted, localVolume, + hasAudio, speaking, stream, purpose, @@ -109,6 +110,7 @@ export function VideoTileContainer({ avatar={getAvatar && getAvatar(item.member, width, height)} onOptionsPress={onOptionsPress} localVolume={localVolume} + hasAudio={hasAudio} maximised={maximised} fullscreen={fullscreen} onFullscreen={onFullscreenCallback} diff --git a/src/video-grid/useCallFeed.ts b/src/video-grid/useCallFeed.ts index 229df3cb..719c81d8 100644 --- a/src/video-grid/useCallFeed.ts +++ b/src/video-grid/useCallFeed.ts @@ -25,6 +25,7 @@ interface CallFeedState { videoMuted: boolean; audioMuted: boolean; localVolume: number; + hasAudio: boolean; disposed: boolean | undefined; stream: MediaStream | undefined; purpose: SDPStreamMetadataPurpose | undefined; @@ -38,6 +39,7 @@ function getCallFeedState(callFeed: CallFeed | undefined): CallFeedState { videoMuted: callFeed ? callFeed.isVideoMuted() : true, audioMuted: callFeed ? callFeed.isAudioMuted() : true, localVolume: callFeed ? callFeed.getLocalVolume() : 0, + hasAudio: callFeed ? callFeed.stream.getAudioTracks().length >= 1 : false, disposed: callFeed ? callFeed.disposed : undefined, stream: callFeed ? callFeed.stream : undefined, purpose: callFeed ? callFeed.purpose : undefined, From de5b58792ea57365b5e68ac90f814499d0d52498 Mon Sep 17 00:00:00 2001 From: Robin Townsend Date: Mon, 9 Jan 2023 10:32:05 -0500 Subject: [PATCH 09/19] Update matrix-js-sdk --- package.json | 2 +- yarn.lock | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3d38f488..8f423e5a 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "i18next": "^21.10.0", "i18next-browser-languagedetector": "^6.1.8", "i18next-http-backend": "^1.4.4", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#bba4a35665b99c988064f8485dce5f0fb525cdc8", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#c3d422f5fb1efac400da4c4ade592db3831445f9", "matrix-widget-api": "^1.0.0", "mermaid": "^8.13.8", "normalize.css": "^8.0.1", diff --git a/yarn.lock b/yarn.lock index b8384d11..8b03b142 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10362,9 +10362,9 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#bba4a35665b99c988064f8485dce5f0fb525cdc8": +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#c3d422f5fb1efac400da4c4ade592db3831445f9": version "23.0.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/bba4a35665b99c988064f8485dce5f0fb525cdc8" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/c3d422f5fb1efac400da4c4ade592db3831445f9" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.2" @@ -10375,7 +10375,6 @@ matrix-events-sdk@0.0.1: matrix-events-sdk "0.0.1" matrix-widget-api "^1.0.0" p-retry "4" - qs "^6.9.6" sdp-transform "^2.14.1" unhomoglyph "^1.0.6" uuid "9" @@ -12100,7 +12099,7 @@ qs@6.10.3: dependencies: side-channel "^1.0.4" -qs@^6.10.0, qs@^6.9.6: +qs@^6.10.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== From 449c1c9d79f1c694849fd74e5b5c903118425ac5 Mon Sep 17 00:00:00 2001 From: Robin Townsend Date: Mon, 9 Jan 2023 10:49:01 -0500 Subject: [PATCH 10/19] Try updating Olm to fix type errors --- package.json | 2 +- yarn.lock | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8f423e5a..b271f5d8 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@juggle/resize-observer": "^3.3.1", - "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz", + "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz", "@react-aria/button": "^3.3.4", "@react-aria/dialog": "^3.1.4", "@react-aria/focus": "^3.5.0", diff --git a/yarn.lock b/yarn.lock index 8b03b142..bd5b2ced 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1826,9 +1826,9 @@ resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.2.tgz#a09d0fea858e817da971a3c9f904632ef7b49eb6" integrity sha512-oVkBCh9YP7H9i4gAoQbZzswniczfo/aIptNa4dxRi4Ff9lSvUCFv6Hvzi7C+90c0/PWZLXjIDTIAWZYmwyd2fA== -"@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz": - version "3.2.8" - resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz#8d53636d045e1776e2a2ec6613e57330dd9ce856" +"@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz": + version "3.2.14" + resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz#acd96c00a881d0f462e1f97a56c73742c8dbc984" "@mdx-js/mdx@^1.6.22": version "1.6.22" @@ -10375,6 +10375,7 @@ matrix-events-sdk@0.0.1: matrix-events-sdk "0.0.1" matrix-widget-api "^1.0.0" p-retry "4" + qs "^6.9.6" sdp-transform "^2.14.1" unhomoglyph "^1.0.6" uuid "9" From 4fd76f95995665474499e6e4087607c70c5c27cf Mon Sep 17 00:00:00 2001 From: Robin Townsend Date: Mon, 9 Jan 2023 11:10:59 -0500 Subject: [PATCH 11/19] Work around mute state updates being slow Since the app already determines when someone is speaking, we can use that information to make it less obvious when to-device messages are being slow to deliver mute state updates. --- src/video-grid/VideoTile.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/video-grid/VideoTile.tsx b/src/video-grid/VideoTile.tsx index 8695a7c4..6ed1dd4c 100644 --- a/src/video-grid/VideoTile.tsx +++ b/src/video-grid/VideoTile.tsx @@ -137,7 +137,13 @@ export const VideoTile = forwardRef( ) : (
- {audioMuted && !videoMuted && } + { + /* If the user is speaking, it's safe to say they're unmuted. + Mute state is currently sent over to-device messages, which + aren't quite real-time, so this is an important kludge to make + sure no one appears muted when they've clearly begun talking. */ + audioMuted && !videoMuted && !speaking && + } {videoMuted && } {caption}
From f20fc78bd7a4a5b48ed5f36454c5658b148f99ff Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 12 Jan 2023 11:28:15 +0000 Subject: [PATCH 12/19] Use branch of js-sdk with Olm debugging Pulls in changes from https://github.com/matrix-org/matrix-js-sdk/pull/3055 Not intended to stay long-term. --- package.json | 2 +- yarn.lock | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index b271f5d8..4646ef1e 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "i18next": "^21.10.0", "i18next-browser-languagedetector": "^6.1.8", "i18next-http-backend": "^1.4.4", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#c3d422f5fb1efac400da4c4ade592db3831445f9", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#79575ef3760bb6085b7b770f241b3d32756d5b96", "matrix-widget-api": "^1.0.0", "mermaid": "^8.13.8", "normalize.css": "^8.0.1", diff --git a/yarn.lock b/yarn.lock index bd5b2ced..cf7335d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10362,9 +10362,9 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#c3d422f5fb1efac400da4c4ade592db3831445f9": +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#79575ef3760bb6085b7b770f241b3d32756d5b96": version "23.0.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/c3d422f5fb1efac400da4c4ade592db3831445f9" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/79575ef3760bb6085b7b770f241b3d32756d5b96" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.2" @@ -10375,7 +10375,6 @@ matrix-events-sdk@0.0.1: matrix-events-sdk "0.0.1" matrix-widget-api "^1.0.0" p-retry "4" - qs "^6.9.6" sdp-transform "^2.14.1" unhomoglyph "^1.0.6" uuid "9" From 30688715cd610c77d51e484396039d4b61512106 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 12 Jan 2023 13:20:11 +0000 Subject: [PATCH 13/19] Revert f20fc78bd7a4a5b48ed5f36454c5658b148f99ff --- package.json | 2 +- yarn.lock | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 4646ef1e..b271f5d8 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "i18next": "^21.10.0", "i18next-browser-languagedetector": "^6.1.8", "i18next-http-backend": "^1.4.4", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#79575ef3760bb6085b7b770f241b3d32756d5b96", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#c3d422f5fb1efac400da4c4ade592db3831445f9", "matrix-widget-api": "^1.0.0", "mermaid": "^8.13.8", "normalize.css": "^8.0.1", diff --git a/yarn.lock b/yarn.lock index cf7335d0..bd5b2ced 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10362,9 +10362,9 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#79575ef3760bb6085b7b770f241b3d32756d5b96": +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#c3d422f5fb1efac400da4c4ade592db3831445f9": version "23.0.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/79575ef3760bb6085b7b770f241b3d32756d5b96" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/c3d422f5fb1efac400da4c4ade592db3831445f9" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.2" @@ -10375,6 +10375,7 @@ matrix-events-sdk@0.0.1: matrix-events-sdk "0.0.1" matrix-widget-api "^1.0.0" p-retry "4" + qs "^6.9.6" sdp-transform "^2.14.1" unhomoglyph "^1.0.6" uuid "9" From 5f265344964a2a017b968872475b11d8613884fc Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 12 Jan 2023 15:17:46 +0000 Subject: [PATCH 14/19] Use IndexedDB storage in dev mode, just without the worker As per comment, we can't use workers in Vite dev mode. We previously fell back to the memory store but this ends up with it working significantly differently in dev mode to production, eg. dev mode would always start by doing an initial sync, so old to-device messages would arrive again. There's no need to fall all the way back to the memory store though, we can use the IndexedDB store without the worker. --- src/matrix-utils.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/matrix-utils.ts b/src/matrix-utils.ts index 3e01d162..dc557027 100644 --- a/src/matrix-utils.ts +++ b/src/matrix-utils.ts @@ -94,12 +94,17 @@ export async function initClient( const storeOpts = {} as ICreateClientOpts; - if (indexedDB && localStorage && !import.meta.env.DEV) { + if (indexedDB && localStorage) { storeOpts.store = new IndexedDBStore({ indexedDB: window.indexedDB, localStorage, dbName: SYNC_STORE_NAME, - workerFactory: () => new IndexedDBWorker(), + // We can't use the worker in dev mode because Vite simply doesn't bundle workers + // in dev mode: it expects them to use native modules. Ours don't, and even then only + // Chrome supports it. (It bundles them fine in production mode.) + workerFactory: import.meta.env.DEV + ? undefined + : () => new IndexedDBWorker(), }); } else if (localStorage) { storeOpts.store = new MemoryStore({ localStorage }); From d9b0e08ea2a3cb87f79f4507ece3f4bc147d5380 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 12 Jan 2023 16:20:37 +0000 Subject: [PATCH 15/19] Fix caching headers on Docker image --- config/nginx.conf | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/config/nginx.conf b/config/nginx.conf index 2af6c30c..f7253465 100644 --- a/config/nginx.conf +++ b/config/nginx.conf @@ -2,9 +2,24 @@ server { listen 8080; server_name localhost; + root /app; + location / { - root /app; + # disable cache entriely by default (apart from Etag which is accurate enough) + add_header Cache-Control 'private no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; + if_modified_since off; + expires off; + # also turn off last-modified since they are just the timestamps of the file in the docker image + # and may or may not bear any resemblance to when the resource changed + add_header Last-Modified ""; + try_files $uri /$uri /index.html; } + + # assets can be cached because they have hashed filenames + location /assets { + expires 1w; + add_header Cache-Control "public, no-transform"; + } } From 9ba4ce429fbc86f51a0412a529effdfc103f7bbb Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 12 Jan 2023 17:31:19 +0000 Subject: [PATCH 16/19] Disable keyboard shortcuts when feedback modal is open --- src/room/GroupCallView.tsx | 2 + src/room/InCallView.tsx | 10 ++++ src/room/useGroupCall.ts | 66 +------------------------- src/useKeyboardShortcuts.ts | 92 +++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 64 deletions(-) create mode 100644 src/useKeyboardShortcuts.ts diff --git a/src/room/GroupCallView.tsx b/src/room/GroupCallView.tsx index e10c4df5..8867ed4d 100644 --- a/src/room/GroupCallView.tsx +++ b/src/room/GroupCallView.tsx @@ -75,6 +75,7 @@ export function GroupCallView({ toggleLocalVideoMuted, toggleMicrophoneMuted, toggleScreensharing, + setMicrophoneMuted, requestingScreenshare, isScreensharing, screenshareFeeds, @@ -251,6 +252,7 @@ export function GroupCallView({ localVideoMuted={localVideoMuted} toggleLocalVideoMuted={toggleLocalVideoMuted} toggleMicrophoneMuted={toggleMicrophoneMuted} + setMicrophoneMuted={setMicrophoneMuted} userMediaFeeds={userMediaFeeds} activeSpeaker={activeSpeaker} onLeave={onLeave} diff --git a/src/room/InCallView.tsx b/src/room/InCallView.tsx index 232d001d..2969c9a8 100644 --- a/src/room/InCallView.tsx +++ b/src/room/InCallView.tsx @@ -63,6 +63,7 @@ import { usePrefersReducedMotion } from "../usePrefersReducedMotion"; import { ParticipantInfo } from "./useGroupCall"; import { TileDescriptor } from "../video-grid/TileDescriptor"; import { AudioSink } from "../video-grid/AudioSink"; +import { useKeyboardShortcuts } from "../useKeyboardShortcuts"; const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {}); // There is currently a bug in Safari our our code with cloning and sending MediaStreams @@ -81,6 +82,7 @@ interface Props { toggleLocalVideoMuted: () => void; toggleMicrophoneMuted: () => void; toggleScreensharing: () => void; + setMicrophoneMuted: (muted: boolean) => void; userMediaFeeds: CallFeed[]; activeSpeaker: CallFeed | null; onLeave: () => void; @@ -101,6 +103,7 @@ export function InCallView({ localVideoMuted, toggleLocalVideoMuted, toggleMicrophoneMuted, + setMicrophoneMuted, userMediaFeeds, activeSpeaker, onLeave, @@ -141,6 +144,13 @@ export function InCallView({ const { hideScreensharing } = useUrlParams(); + useKeyboardShortcuts( + !feedbackModalState.isOpen, + toggleMicrophoneMuted, + toggleLocalVideoMuted, + setMicrophoneMuted + ); + useEffect(() => { widget?.api.transport.send( layout === "freedom" diff --git a/src/room/useGroupCall.ts b/src/room/useGroupCall.ts index 77ef38f6..f2d7f27e 100644 --- a/src/room/useGroupCall.ts +++ b/src/room/useGroupCall.ts @@ -32,8 +32,6 @@ import { usePageUnload } from "./usePageUnload"; import { PosthogAnalytics } from "../PosthogAnalytics"; import { TranslatedError, translatedError } from "../TranslatedError"; import { ElementWidgetActions, ScreenshareStartData, widget } from "../widget"; -import { getSetting } from "../settings/useSetting"; -import { useEventTarget } from "../useEvents"; export enum ConnectionState { EstablishingCall = "establishing call", // call hasn't been established yet @@ -60,6 +58,7 @@ export interface UseGroupCallReturnType { toggleLocalVideoMuted: () => void; toggleMicrophoneMuted: () => void; toggleScreensharing: () => void; + setMicrophoneMuted: (muted: boolean) => void; requestingScreenshare: boolean; isScreensharing: boolean; screenshareFeeds: CallFeed[]; @@ -472,68 +471,6 @@ export function useGroupCall(groupCall: GroupCall): UseGroupCallReturnType { } }, [t, updateState]); - const [spacebarHeld, setSpacebarHeld] = useState(false); - - useEventTarget( - window, - "keydown", - useCallback( - (event: KeyboardEvent) => { - // Check if keyboard shortcuts are enabled - const keyboardShortcuts = getSetting("keyboard-shortcuts", true); - if (!keyboardShortcuts) { - return; - } - - if (event.key === "m") { - toggleMicrophoneMuted(); - } else if (event.key == "v") { - toggleLocalVideoMuted(); - } else if (event.key === " ") { - setSpacebarHeld(true); - setMicrophoneMuted(false); - } - }, - [ - toggleLocalVideoMuted, - toggleMicrophoneMuted, - setMicrophoneMuted, - setSpacebarHeld, - ] - ) - ); - - useEventTarget( - window, - "keyup", - useCallback( - (event: KeyboardEvent) => { - // Check if keyboard shortcuts are enabled - const keyboardShortcuts = getSetting("keyboard-shortcuts", true); - if (!keyboardShortcuts) { - return; - } - - if (event.key === " ") { - setSpacebarHeld(false); - setMicrophoneMuted(true); - } - }, - [setMicrophoneMuted, setSpacebarHeld] - ) - ); - - useEventTarget( - window, - "blur", - useCallback(() => { - if (spacebarHeld) { - setSpacebarHeld(false); - setMicrophoneMuted(true); - } - }, [setMicrophoneMuted, setSpacebarHeld, spacebarHeld]) - ); - return { state, localCallFeed, @@ -548,6 +485,7 @@ export function useGroupCall(groupCall: GroupCall): UseGroupCallReturnType { toggleLocalVideoMuted, toggleMicrophoneMuted, toggleScreensharing, + setMicrophoneMuted, requestingScreenshare, isScreensharing, screenshareFeeds, diff --git a/src/useKeyboardShortcuts.ts b/src/useKeyboardShortcuts.ts new file mode 100644 index 00000000..b9d69ec8 --- /dev/null +++ b/src/useKeyboardShortcuts.ts @@ -0,0 +1,92 @@ +/* +Copyright 2022-2023 New Vector Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { useCallback, useState } from "react"; + +import { getSetting } from "./settings/useSetting"; +import { useEventTarget } from "./useEvents"; + +export function useKeyboardShortcuts( + enabled: boolean, + toggleMicrophoneMuted: () => void, + toggleLocalVideoMuted: () => void, + setMicrophoneMuted: (muted: boolean) => void +) { + const [spacebarHeld, setSpacebarHeld] = useState(false); + + useEventTarget( + window, + "keydown", + useCallback( + (event: KeyboardEvent) => { + if (!enabled) return; + // Check if keyboard shortcuts are enabled + const keyboardShortcuts = getSetting("keyboard-shortcuts", true); + if (!keyboardShortcuts) { + return; + } + + if (event.key === "m") { + toggleMicrophoneMuted(); + } else if (event.key == "v") { + toggleLocalVideoMuted(); + } else if (event.key === " ") { + setSpacebarHeld(true); + setMicrophoneMuted(false); + } + }, + [ + enabled, + toggleLocalVideoMuted, + toggleMicrophoneMuted, + setMicrophoneMuted, + setSpacebarHeld, + ] + ) + ); + + useEventTarget( + window, + "keyup", + useCallback( + (event: KeyboardEvent) => { + if (!enabled) return; + // Check if keyboard shortcuts are enabled + const keyboardShortcuts = getSetting("keyboard-shortcuts", true); + if (!keyboardShortcuts) { + return; + } + + if (event.key === " ") { + setSpacebarHeld(false); + setMicrophoneMuted(true); + } + }, + [enabled, setMicrophoneMuted, setSpacebarHeld] + ) + ); + + useEventTarget( + window, + "blur", + useCallback(() => { + if (spacebarHeld) { + setSpacebarHeld(false); + setMicrophoneMuted(true); + } + }, [setMicrophoneMuted, setSpacebarHeld, spacebarHeld]) + ); +} From f2193302c12ee247474ee467edcfc7e91f74a847 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 12 Jan 2023 18:26:21 +0000 Subject: [PATCH 17/19] Prevent mute event spam from key repeats --- src/useKeyboardShortcuts.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/useKeyboardShortcuts.ts b/src/useKeyboardShortcuts.ts index b9d69ec8..6356b525 100644 --- a/src/useKeyboardShortcuts.ts +++ b/src/useKeyboardShortcuts.ts @@ -43,13 +43,14 @@ export function useKeyboardShortcuts( toggleMicrophoneMuted(); } else if (event.key == "v") { toggleLocalVideoMuted(); - } else if (event.key === " ") { + } else if (event.key === " " && !spacebarHeld) { setSpacebarHeld(true); setMicrophoneMuted(false); } }, [ enabled, + spacebarHeld, toggleLocalVideoMuted, toggleMicrophoneMuted, setMicrophoneMuted, From a5977fc9924235ff007c88ad201b3baf6e6609df Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 13 Jan 2023 11:52:40 +0000 Subject: [PATCH 18/19] Rename to useCallViewKeyboardShortcuts --- src/room/InCallView.tsx | 4 ++-- ...seKeyboardShortcuts.ts => useCallViewKeyboardShortcuts.ts} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/{useKeyboardShortcuts.ts => useCallViewKeyboardShortcuts.ts} (98%) diff --git a/src/room/InCallView.tsx b/src/room/InCallView.tsx index 2969c9a8..22145012 100644 --- a/src/room/InCallView.tsx +++ b/src/room/InCallView.tsx @@ -63,7 +63,7 @@ import { usePrefersReducedMotion } from "../usePrefersReducedMotion"; import { ParticipantInfo } from "./useGroupCall"; import { TileDescriptor } from "../video-grid/TileDescriptor"; import { AudioSink } from "../video-grid/AudioSink"; -import { useKeyboardShortcuts } from "../useKeyboardShortcuts"; +import { useCallViewKeyboardShortcuts } from "../useCallViewKeyboardShortcuts"; const canScreenshare = "getDisplayMedia" in (navigator.mediaDevices ?? {}); // There is currently a bug in Safari our our code with cloning and sending MediaStreams @@ -144,7 +144,7 @@ export function InCallView({ const { hideScreensharing } = useUrlParams(); - useKeyboardShortcuts( + useCallViewKeyboardShortcuts( !feedbackModalState.isOpen, toggleMicrophoneMuted, toggleLocalVideoMuted, diff --git a/src/useKeyboardShortcuts.ts b/src/useCallViewKeyboardShortcuts.ts similarity index 98% rename from src/useKeyboardShortcuts.ts rename to src/useCallViewKeyboardShortcuts.ts index b9d69ec8..ccad6a8e 100644 --- a/src/useKeyboardShortcuts.ts +++ b/src/useCallViewKeyboardShortcuts.ts @@ -19,7 +19,7 @@ import { useCallback, useState } from "react"; import { getSetting } from "./settings/useSetting"; import { useEventTarget } from "./useEvents"; -export function useKeyboardShortcuts( +export function useCallViewKeyboardShortcuts( enabled: boolean, toggleMicrophoneMuted: () => void, toggleLocalVideoMuted: () => void, From 1b08a5cac33348d2eebe6081582019ba6db02a20 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 13 Jan 2023 11:56:29 +0000 Subject: [PATCH 19/19] Rename file --- src/{useKeyboardShortcuts.ts => useCallViewKeyboardShortcuts.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{useKeyboardShortcuts.ts => useCallViewKeyboardShortcuts.ts} (100%) diff --git a/src/useKeyboardShortcuts.ts b/src/useCallViewKeyboardShortcuts.ts similarity index 100% rename from src/useKeyboardShortcuts.ts rename to src/useCallViewKeyboardShortcuts.ts