Compare commits

...

19 Commits

Author SHA1 Message Date
Saúl Ibarra Corretgé
e95f2f7341 fixup! 2022-12-02 15:58:52 +00:00
Saúl Ibarra Corretgé
c56db8af77 fixup devcontainer 2022-12-02 15:55:22 +00:00
Saúl Ibarra Corretgé
a66c770053 fix(build) use http for GitHub codespaces 2022-12-02 15:15:56 +00:00
Saúl Ibarra Corretgé
2eaa87a719 Create devcontainer.json 2022-12-02 15:50:01 +01:00
Saúl Ibarra Corretgé
a2e8a7f28f fix(toolbox) hide drawer after toggling camera
Fixes: https://github.com/jitsi/jitsi-meet/issues/12628
2022-12-02 15:31:44 +01:00
Pawel Domas
af072c3070 fix: get the current conference
state['features/base/conference'].conference is not the right way to get the current conference.
See getCurrentConference selector - it accounts for joining and other states.
2022-12-01 16:02:35 -05:00
Jaya Allamsetty
f42772ec5b chore(deps) lib-jitsi-meet@latest
https://github.com/jitsi/lib-jitsi-meet/compare/v1539.0.0+eb4873d2...v1541.0.0+9b34e0f7
2022-11-29 15:28:51 -05:00
Gabriel Borlea
2556a7ab77 fix(face-landmarks): assign empty array to facelandmarks in speakerstats if undefined 2022-11-29 19:12:43 +01:00
Charles Zablit
3cbf160f2b fix: always display transcription (#12325)
* feat: always display transcription

* fix: unused import
2022-11-29 09:50:19 -06:00
Дамян Минков
744960bb1a feat: Several module optimizations to avoid constant parsing of jids. (#12594)
* feat: Several module optimizations to avoid constant parsing of jids.

Caches the parsed values in a rotating table with limited size.
Skips constant creating of a stanza with never changing values - create it once and then just clone it.

* squash: Fixes extract_subdomain multiple values.

* squash: Fix table values when there is a nil element.

* squash: Fix skipping the roomless IQs.

* squash: Fix comments.
2022-11-28 14:18:59 -06:00
Дамян Минков
76471a0ea9 feat: Modules for implementing visitor nodes. (#12593)
* feat: Modules for implementing visitor nodes.

Still WIP, uses visitor nodes prosodies where we create the main participants and forward the visitors to watch. Used for huge conferences.

* squash: Fix comments.
2022-11-28 14:18:33 -06:00
Robert Pintilii
0ba033e07d ref(TS) Improve TS (#12612)
Remove unnecessary @ts-ignores
Remove unnecessary eslint-disable
2022-11-28 12:52:45 +02:00
Robert Pintilii
cb3fb3ada9 ref(TS) Convert some features to TS (#12611) 2022-11-28 12:52:24 +02:00
Calinteodor
48a6472b3b feat(lobby/prejoin/native): style updates (#12615)
feat(lobby/prejoin/native): style updates (#12615)
2022-11-25 13:59:45 +02:00
Roberto Vieira
691e92b7ec fix(ios) make initialPositionInSuperView a variable
Fixes: https://github.com/jitsi/jitsi-meet/issues/12446
2022-11-25 10:44:27 +01:00
Calin-Teodor
6e36340a83 feat(conference): fixed padding 2022-11-24 19:41:56 +02:00
Mihaela Dumitru
ae424c95de chore(whiteboard): bump excalidraw version (#12614) 2022-11-24 17:43:08 +02:00
Mihaela Dumitru
95b2979eb3 feat(whiteboard): use jitsi room name for socket io connection (#12610) 2022-11-24 14:20:40 +02:00
_norbert
a0c130568b fix(lang) update Hungarian translation 2022-11-23 19:33:13 +01:00
136 changed files with 1276 additions and 777 deletions

View File

@@ -0,0 +1,15 @@
{
"name": "Jitsi Meet Dev Container",
"image": "mcr.microsoft.com/devcontainers/universal:2",
"features": {
"ghcr.io/devcontainers/features/node:1": {
"version": "16"
}
},
"hostRequirements": {
"cpus": 4,
"memory": "8gb",
"storage": "32gb"
},
"postCreateCommand": "bash -i -c 'nvm use && npm install && cp tsconfig.web.json tsconfig.json'"
}

1
globals.d.ts vendored
View File

@@ -14,6 +14,7 @@ declare global {
registerShortcut: Function;
unregisterShortcut: Function;
openDialog: Function;
enable: Function;
}
};
const interfaceConfig: any;

View File

@@ -46,7 +46,7 @@ public class PiPViewCoordinator {
}
}
public let initialPositionInSuperView: Position = .lowerRightCorner
public var initialPositionInSuperView: Position = .lowerRightCorner
// Unused. Remove on the next major release.
@available(*, deprecated, message: "The PiP window size is now fixed to 150px.")

View File

@@ -27,6 +27,25 @@
"audioOnly": {
"audioOnly": "Alacsony sávszélesség"
},
"breakoutRooms": {
"actions": {
"add": "Pihenőszoba hozzáadása",
"autoAssign": "Automatikus hozzárendelés a pihenőszobákhoz",
"close": "Bezárás",
"join": "Csatlakozás",
"leaveBreakoutRoom": "Pihenőszoba elhagyása",
"more": "Bővebben",
"remove": "Eltávolítás",
"sendToBreakoutRoom": "Résztvevő áthelyezése ide:"
},
"defaultName": "Pihenőszoba #{{index}}",
"mainRoom": "Fő szoba",
"notifications": {
"joined": "Csatlakozva a \"{{name}}\" pihenőszobához",
"joinedMainRoom": "Csatlakozva a fő szobához",
"joinedTitle": "Pihenőszobák"
}
},
"calendarSync": {
"addMeetingURL": "Értekezlet hivatkozásának hozzáadása",
"confirmAddLink": "Hozzáadható egy Jitsi hivatkozás az eseményhez?",
@@ -46,6 +65,7 @@
"today": "Ma"
},
"chat": {
"enter": "Belépés a szobába",
"error": "Hiba: az üzenetet nem sikerült elküldeni. Hiba oka: {{error}}",
"fieldPlaceHolder": "Írja ide az üzenetét",
"messageTo": "Privát üzenet a felhasználónak: {{recipient}}",
@@ -58,14 +78,21 @@
"noMessagesMessage": "A találkozón még nincsenek üzenetek. Itt kezdhet beszélgetést!",
"privateNotice": "Privát üzenet a felhasználónak: {{recipient}}",
"sendButton": "Küldés",
"tabs": {
"chat": "Csevegés",
"polls": "Szavazás"
},
"title": "Csevegés",
"titleWithPolls": "Csevegés",
"you": "neked"
"titleWithPolls": "Csevegés és szavazás",
"you": "te"
},
"chromeExtensionBanner": {
"buttonText": "Chrome kiterjesztés telepítése",
"dontShowAgain": "Ne jelenjen meg újra",
"installExtensionText": "Kiterjesztés telepítése a Google Calendar és az Office 365 integrációjához"
"installExtensionText": "Kiterjesztés telepítése a Google Calendar és az Office 365 integrációjához",
"raiseHandAction": "Kéz felemelése",
"reactionSounds": "Hangok kikapcsolása",
"reactionSoundsForAll": "Hangok kikapcsolása mindenkinek"
},
"connectingOverlay": {
"joiningRoom": "Kapcsolódás az értekezlethez…"
@@ -189,12 +216,18 @@
"dismiss": "Elutasítás",
"displayNameRequired": "Helló! Mi a neve?",
"done": "Kész",
"enterDisplayName": "Adja meg itt a nevét",
"e2eeDescription": "A végpontok közötti titkosítás jelenleg KÍSÉRLETES. Ne feledje, hogy a végpontok közötti titkosítás bekapcsolása hatékonyan letiltja a szerveroldali szolgáltatásokat, például: telefonos részvételt. Ne feledje azt is, hogy az értekezlet csak olyan felhasználók számára működik, akik olyan böngészőkből csatlakoznak, amelyek támogatják a beilleszthető adatfolyamokat.",
"e2eeLabel": "Végpontok közötti titkosítás engedélyezése",
"embedMeeting": "Meeting beágyazása",
"enterDisplayName": "Adja meg a nevét",
"error": "Hiba",
"externalInstallationMsg": "Telepíteni kell a munkaasztal megosztására való kiterjesztést.",
"externalInstallationTitle": "Kiterjesztésre van szükség",
"goToStore": "Ugrás az alkalmazásbolthoz",
"gracefulShutdown": "Jelenleg a szolgáltatás karbantartás miatt nem elérhető. Később próbálja meg ismét.",
"grantModeratorDialog": "Biztos, hogy moderátori jogokat kíván adni a következőnek: {{participantName}}?",
"grantModeratorTitle": "Moderátori jogok megadása",
"hideShareAudioHelper": "Ne mutassa ezt az ablakot többé",
"incorrectPassword": "Helytelen felhasználói név és jelszó",
"incorrectRoomLockPassword": "Helytelen jelszó",
"inlineInstallExtension": "Telepítés azonnal",
@@ -217,21 +250,34 @@
"maxUsersLimitReached": "A lehetséges résztvevők maximális száma elérve. A konferencia tele van. Lépjen kapcsolatba az értekezlet tulajdonosával vagy próbálkozzon később!",
"maxUsersLimitReachedTitle": "A lehetséges résztvevők maximális száma elérve",
"micConstraintFailedError": "A mikrofon nem felel meg bizonyos kikötéseknek.",
"micNotFoundError": "Nem található mikrofon.",
"micNotFoundError": "A mikrofon nem található.",
"micNotSendingData": "A számítógép beállításai között kell visszahangosítani a mikrofont vagy beállítani a hangfelvétel szintjét",
"micNotSendingDataTitle": "A mikrofon le van némítva a rendszerbeállításokban",
"micPermissionDeniedError": "Nem adott engedélyt a mikrofon használatához. Csatlakozhat a beszélgetéshez, de a többiek nem fogják Önt hallani. A címsorban lévő kamera ikonnal lehet ezt helyrehozni.",
"micUnknownError": "Ismeretlen ok miatt nem lehet a mikrofont használni.",
"moderationAudioLabel": "Engedélyezze a résztvevőknek saját némításuk feloldását",
"moderationVideoLabel": "Engedélyezze a résztvevőknek saját kamerájuk elindítását",
"muteEveryoneDialog": "Valóban mindenki elnémítható? Nem fogja tudni visszahangosítani, de ő önmagát bármikor vissza tudja majd hangosítani.",
"muteEveryoneElseDialog": "Némítás után már nem fogja tudni visszahangosítani, de ő önmagát bármikor vissza tudja hangosítani.",
"muteEveryoneElseTitle": "Mindenki elnémítása, kivéve: {{whom}}?",
"muteEveryoneElsesVideoDialog": "A kamera letiltása után nem tudja újra bekapcsolni, de ők bármikor újra bekapcsolhatják.",
"muteEveryoneElsesVideoTitle": "Mindenki kamerájának tilátsa, kivéve {{whom}}?",
"muteEveryoneSelf": "önmagamat",
"muteEveryoneStartMuted": "Mindenki elnémítva kezd ezután",
"muteEveryoneTitle": "Mindenki elnémítása?",
"muteEveryonesVideoDialog": "A résztvevők bármikor be tudják kapcsolni a kamerájukat.",
"muteEveryonesVideoDialogModerationOn": "A résztvevők bármikor kérhetik videójuk bekapcsolását.",
"muteEveryonesVideoTitle": "Minden résztvevő kameráját leállítja?",
"muteParticipantBody": "Nem fogja tudni visszahangosítani, de ő önmagát bármikor vissza tudja majd hangosítani.",
"muteParticipantButton": "Némítás",
"muteParticipantDialog": "Valóban elnémítható ez a résztvevő? Nem fogja tudni visszahangosítani, de ő önmagát bármikor vissza tudja majd hangosítani.",
"muteParticipantTitle": "Elnémítható a résztvevő?",
"muteParticipantsVideoBody": "Ön nem tudja újra bekapcsolni a kamerát, de ők bármikor újra bekapcsolhatják.",
"muteParticipantsVideoButton": "Kamera leállítása",
"muteParticipantsVideoDialog": "Biztosan le akarja tiltani ennek a résztvevőnek a kameráját? Ön nem tudja újra bekapcsolni a kamerát, de ők bármikor újra bekapcsolhatják.",
"muteParticipantsVideoDialogModerationOn": "Are you sure you want to turn off this participant's camera? You won't be able to turn the camera back on and neither will they.",
"muteParticipantsVideoTitle": "Letiltja ennek a résztvevőnek a kameráját?",
"password": "Jelszó",
"passwordLabel": "Az értekezletet zárolta egy résztvevő. Csatlakozáshoz adja meg a $t(lockRoomPassword).",
"passwordNotSupported": "Az értekezlet $t(lockRoomPassword) beállítása nem támogatott.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) nem támogatott",
@@ -249,6 +295,7 @@
"remoteControlShareScreenWarning": "Vegye figyelembe, hogy ha megnyomja az „Engedélyezés” lehetőséget, akkor megosztja a képernyőt!",
"remoteControlStopMessage": "A távoli munkamenet irányítása befejeződött!",
"remoteControlTitle": "Távoli asztal vezérlése",
"remoteUserControls": "{{username}} vezérlői",
"removePassword": "$t(lockRoomPassword) eltávolítása",
"removeSharedVideoMsg": "Valóban eltávolítható a megosztott videó?",
"removeSharedVideoTitle": "Megosztott videó eltávolítása",
@@ -267,11 +314,14 @@
"sendPrivateMessageTitle": "Privátban legyen elküldve?",
"serviceUnavailable": "Szolgáltatás nem elérhető",
"sessTerminated": "Hívás megszakadt",
"shareAudio": "Tovább",
"shareAudioTitle": "Hang megosztása",
"shareVideoLinkError": "Adjon meg egy helyes linket.",
"shareVideoTitle": "Videó megosztása",
"shareYourScreen": "Képernyő megosztása",
"shareYourScreenDisabled": "Képernyőmegosztás letiltva.",
"shareYourScreenDisabledForGuest": "Vendég nem végezhet képernyőmegosztást.",
"sharedVideoLinkPlaceholder": "YouTube link vagy közvetlen videó link",
"startLiveStreaming": "Élő közvetítés kezdése",
"startRecording": "Felvétel indítása",
"startRemoteControlErrorMessage": "Hiba történt a távoli vezérlés munkamenetének indítása közben!",
@@ -287,6 +337,7 @@
"transcribing": "Átirat készítése",
"unlockRoom": "Értekezlet $t(lockRoomPassword) eltávolítása",
"userPassword": "felhasználói jelszó",
"videoLink": "Videó link",
"yourEntireScreen": "A teljes képernyő"
},
"documentSharing": {
@@ -367,11 +418,16 @@
"showSpeakerStats": "Beszéd statisztikák megjelenítése",
"toggleChat": "Csevegés megnyitása vagy bezárása",
"toggleFilmstrip": "Videó bélyegképek megjelenítése vagy elrejtése",
"toggleParticipantsPane": "A résztvevők panel megjelenítése vagy elrejtése",
"toggleScreensharing": "Váltás kamera és képernyőmegosztás között",
"toggleShortcuts": "Gyorsbillentyűk megjelenítése vagy elrejtése",
"videoMute": "Kamera elindítása vagy leállítása",
"videoQuality": "Hívás minőségének kezelése"
},
"largeVideo": {
"screenIsShared": "Ön megosztja a képernyőjét",
"showMeWhatImSharing": "Látni szeretném mit osztok meg"
},
"liveStreaming": {
"busy": "Dolgozunk a közvetítési erőforrások felszabadításán. Kísérelje meg újra néhány perc múlva.",
"busyTitle": "Jelenleg minden közvetítő foglalt",
@@ -405,6 +461,44 @@
"unavailableTitle": "Élő közvetítés elérhetetlen",
"youtubeTerms": "YouTube szolgáltatási feltételek"
},
"lobby": {
"admit": "Engedélyezés",
"admitAll": "Mindet engedélyez",
"allow": "Engedélyez",
"backToKnockModeButton": "Csatlakozási kérelem küldése",
"chat": "Chat",
"dialogTitle": "Lobby mód",
"disableDialogContent": "A lobby mód jelenleg elérhető. Lehetőséged van csak azokat behívni a megbeszélésre, akik erre jogosultak általad. Szeretnéd kikapcsolni?",
"disableDialogSubmit": "Elutasítás",
"emailField": "Írd be az email címed",
"enableDialogPasswordField": "Jelszó megadása (választható)",
"enableDialogSubmit": "Elfogadás",
"enableDialogText": "A Lobby mód lehetővé teszi a megbeszélés védelmét azáltal, hogy csak a moderátor hivatalos jóváhagyása után engedi be az embereket.",
"enterPasswordButton": "Adja meg az értekezlet jelszavát",
"enterPasswordTitle": "Adja meg a jelszót az értekezlethez való csatlakozáshoz",
"errorMissingPassword": "Kérjük, adja meg az értekezlet jelszavát",
"invalidPassword": "Helytelen jelszó",
"joinRejectedMessage": "Csatlakozási kérelmét egy moderátor elutasította.",
"joinRejectedTitle": "Csatlakozási kérelem elutasítva.",
"joinTitle": "Csatlakozás az értekezlethez",
"joinWithPasswordMessage": "Csatlakozás jelszóval, kérjük várjon...",
"joiningMessage": "Amint valaki elfogadja kérését, csatlakoztatjuk az értekezlethez",
"joiningTitle": "Értekezlethez csatlakozás kérése...",
"joiningWithPasswordTitle": "Csatlakozás jelszóval...",
"knockButton": "Csatlakozási kérelem küldése",
"knockTitle": "Valaki szeretne csatlakozni az értekezlethez",
"nameField": "Adja meg a nevét",
"notificationLobbyAccessDenied": "{{targetParticipantName}} elutasításra került a csatlakozásod {{originParticipantName}} által",
"notificationLobbyAccessGranted": "{{targetParticipantName}} a csatlakozozásod elfogadva lett {{originParticipantName}} által",
"notificationLobbyDisabled": "Lobby tiltva lett {{originParticipantName}} által.",
"notificationLobbyEnabled": "Lobby engedélyezve lett {{originParticipantName}} által.",
"notificationTitle": "Lobby",
"passwordField": "Adja meg az értekezlet jelszavát",
"passwordJoinButton": "Csatlakozás",
"reject": "Elutasít",
"rejectAll": "Mindet elutasít",
"toggleLabel": "Lobby engedélyezése"
},
"localRecording": {
"clientState": {
"off": "Kikapcsolva",
@@ -449,11 +543,18 @@
"focus": "Konferencia fókusza",
"focusFail": "{{component}} nem elérhető újrapróbálkozás {{ms}} másodperc múlva",
"grantedTo": "Moderátori jogok biztosítva {{to}} számára!",
"hostAskedUnmute": "Kérlek hangosítsd vissza a mikrofonod.",
"invitedOneMember": "{{name}} meg lett hívva",
"invitedThreePlusMembers": "{{name}} és {{count}} másik felhasználó meg lett hívva",
"invitedTwoMembers": "{{first}} és {{second}} lett meghívva",
"kickParticipant": "{{kicked}} résztvevőt kirúgta {{kicker}}",
"leftOneMember": "{{name}} elhagyta az értekezletet",
"leftThreePlusMembers": "{{name}} és mások elhagyták az értekezletet",
"leftTwoMembers": "{{first}} és {{second}} elhagyták az értekezletet",
"localRecordingStarted": "{{name}} elkezdte rögzíteni az értekezletet.",
"localRecordingStopped": "{{name}} leállította a rögzítést.",
"me": "Én",
"moderationInEffectTitle": "A moderátor elnémította a mikrofonját",
"moderator": "Moderátori jogok biztosítva!",
"muted": "A beszélgetést elnémítva kezdte meg.",
"mutedRemotelyDescription": "Bármikor visszahangosíthatja magát, ha készen áll a beszédre. Némítsa le magát ismét, ha a felesleges zajoktól meg kívánja védeni az értekezletet.",
@@ -462,6 +563,10 @@
"newDeviceAction": "Alkalmaz",
"newDeviceAudioTitle": "Új hangeszköz észlelve",
"newDeviceCameraTitle": "Új kamera észlelve",
"noiseSuppressionFailedTitle": "Nem sikerült elindítani a zajcsökkentést",
"noiseSuppressionNoTrackDescription": "Kérjük, először kapcsolja ki a mikrofon némítását.",
"noiseSuppressionStereoDescription": "A sztereó zajcsökkentés jelenleg nem támogatott.",
"participantWantsToJoin": "Csatlakozni szeretne az értekezlethez",
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) egy másik résztvevő által eltávolítva",
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) egy másik résztvevő által beállítva",
"raisedHand": "{{name}} beszélni szeretne.",
@@ -472,9 +577,115 @@
"suboptimalExperienceTitle": "Böngészőhiba",
"unmute": "Visszahangosítás"
},
"participantsPane": {
"actions": {
"allow": "Engedélyezés a résztvevőknek, hogy:",
"allowVideo": "Videó engedélyezése",
"askUnmute": "Kérje a némítás feloldását",
"audioModeration": "A némítást feloldhassák",
"blockEveryoneMicCamera": "Block everyone's mic and camera",
"invite": "Meghívás",
"moreModerationActions": "További moderálási opciók",
"moreModerationControls": "További moderálási vezérlők",
"moreParticipantOptions": "Résztvevő további beállításai",
"mute": "Némítás",
"muteAll": "Mindenkit elnémít",
"muteEveryoneElse": "Mute everyone else",
"stopEveryonesVideo": "Mindenki videójának leállítása",
"stopVideo": "Videó leállítása",
"unblockEveryoneMicCamera": "Unblock everyone's mic and camera",
"videoModeration": "Elindíthassák a videójukat"
},
"close": "Bezár",
"header": "Résztvevők",
"headings": {
"lobby": "Lobby ({{count}})",
"participantsList": "Résztvevők ({{count}})",
"waitingLobby": "Lobby-ban várakozók ({{count}})"
},
"search": "Résztvevők keresése"
},
"passwordDigitsOnly": "Legfeljebb {{number}} szám",
"passwordSetRemotely": "egy másik résztvevő által beállítva",
"polls": {
"answer": {
"skip": "Kihagyás",
"submit": "Küldés"
},
"by": "Létrehozta: {{ name }}",
"create": {
"addOption": "Opció hozzáadása",
"answerPlaceholder": "Opció {{index}}",
"cancel": "Mégsem",
"create": "Szavazás létrehozása",
"pollOption": "Opció {{index}}",
"pollQuestion": "Szavazás kérdése",
"questionPlaceholder": "Írja le a kérdést",
"removeOption": "Opció eltávolítása",
"send": "Küldés"
},
"notification": {
"description": "Szavazás megnyitása",
"title": "Új szavazás létrehozva"
},
"results": {
"changeVote": "Módosítás",
"empty": "Még nincsenek szavazások. Indítson szavazást itt!",
"hideDetailedResults": "Részletek elrejtése",
"showDetailedResults": "Részletek",
"vote": "Szavazás"
}
},
"poweredby": "Működteti a",
"prejoin": {
"audioAndVideoError": "Hang és videó hiba:",
"audioDeviceProblem": "Hiba lépett fel az hangeszközzel",
"audioOnlyError": "Hang hiba:",
"audioTrackError": "Nem lehet a hangot rögzíteni.",
"callMe": "Hívj fel",
"callMeAtNumber": "Hívj fel ezen a számon:",
"calling": "Hívás",
"configuringDevices": "Eszköz beállítás...",
"connectedWithAudioQ": "Csak hanggal szeretne csatlakozni?",
"connection": {
"good": "Az internet kapcsolat jónak tűnik!",
"nonOptimal": "Az internet kapcsolat nem optimális",
"poor": "Az internet kapcsolat nagyon gyenge!"
},
"connectionDetails": {
"goodQuality": "Fantasztikus! A média minősége kiváló lesz."
},
"copyAndShare": "Másolom és megosztom az értekezlet linkjét",
"dialInMeeting": "Behívás az értekezletbe",
"dialInPin": "Behívás az értkezeletbe és megadom a PIN kódot:",
"dialing": "Tárcsázás",
"doNotShow": "Ne mutassa mégegyszer ezt a képernyőt",
"errorDialOut": "Nem sikerült a behívás",
"errorDialOutDisconnected": "Nem sikerült a behívás. Kapcsolat bontása",
"errorDialOutFailed": "Nem sikerült a behívás. Hiba a hívásban",
"errorDialOutStatus": "Hiba a hívás státusz megadásában",
"errorMissingName": "Kérlet add meg a neved, hogy csatlakozhass a megbeszéléshez",
"errorNoPermissions": "Engedélyeznie kell a mikrofonhoz és a kamerához való hozzáférést",
"errorStatusCode": "Hiba a hiváskor, hiba kód: {{status}}",
"errorValidation": "Hívószám validációs hiba",
"iWantToDialIn": "Hívni szeretném",
"initiated": "Hívás felépítés",
"joinAudioByPhone": "Csatlakozás telefon beszélgetéssel",
"joinMeeting": "Csatlakozás",
"joinMeetingInLowBandwidthMode": "Csatlakozás alacsony sávszélességi módban",
"joinWithoutAudio": "Csatlakozás hang nélkül",
"keyboardShortcuts": "Gyorsbillentyűk engedélyezése",
"linkCopied": "A link a vágólapra másolva",
"lookGood": "A mikrofon megfelelően működik",
"or": "vagy",
"premeeting": "Csatlakozás előtt",
"screenSharingError": "Képernyő megosztás hiba:",
"showScreen": "Csatlakozás előtti kamerakép",
"startWithPhone": "Kezdés telefonhanggal",
"videoOnlyError": "Videó hiba:",
"videoTrackError": "Nem sikerült a videó megjelenítés.",
"viewAllNumbers": "Összes szám megjelenítése"
},
"presenceStatus": {
"busy": "Foglalt",
"calling": "Hívás…",
@@ -509,13 +720,19 @@
"failedToStart": "A felvétel indítása meghiúsult",
"fileSharingdescription": "Felvétel megosztása az értekezlet résztvevőivel",
"live": "ÉLŐ",
"localRecordingNoNotificationWarning": "A felvételt nem közöljük más résztvevőkkel. Értesítenie kell velük, hogy a találkozót rögzítették.",
"localRecordingStartWarning": "A megbeszélésből való kilépés előtt feltétlenül állítsa le a felvételt, hogy elmentse azt.",
"localRecordingStartWarningTitle": "Állítsa le a felvételt a mentéshez",
"localRecordingWarning": "Győződjön meg arról, hogy az aktuális lapot választotta a megfelelő videó és hang használatához. A felvétel jelenleg 1 GB-ra van korlátozva, ami körülbelül 100 perc.",
"loggedIn": "Belépve mint {{userName}}",
"off": "Felvétel leállítva",
"offBy": "{{name}} leállította a felvételt",
"on": "Felvétel",
"onBy": "{{name}} elindította a felvételt",
"onlyRecordSelf": "Csak az én hang- és videófolyamomat rögzítse",
"pending": "Értekezlet rögzítésének előkészítése…",
"rec": "REC",
"saveLocalRecording": "Felvétel mentése helyileg (béta)",
"serviceDescription": "A felvételt a rögzítési szolgáltatás veszi fel",
"serviceName": "Felvétel szolgáltatás",
"signIn": "Belépés",
@@ -527,6 +744,12 @@
"sectionList": {
"pullToRefresh": "Húzás a frissítéshez"
},
"security": {
"about": "Hozzáadhat jelszót az értekezlethez. A résztvevőknek meg kell adniuk a jelszót, mielőtt csatlakozhatnak az értekezlethez.",
"aboutReadOnly": "A moderátor résztvevői hozzáadhatnak egy jelszót az értekezlethez. A résztvevőknek meg kell adniuk a jelszót, mielőtt csatlakozhatnak az értekezlethez.",
"header": "Biztonsági beállítások",
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button."
},
"settings": {
"calendar": {
"about": "A {{appName}} naptárintegráció a naptár biztonságos elérésére szolgál, így olvasni tudja a soron következő eseményeket.",
@@ -535,8 +758,13 @@
"signedIn": "Jelenleg ehhez az címhez tartozó naptár eseményei érhetőek el: {{email}}. Alább a „szétkapcsolás” gombra kattintva lehet leállítani a naptár eseményeinek elérését.",
"title": "Naptár"
},
"desktopShareFramerate": "Képernyőmegosztás sebessége (FPS)",
"desktopShareHighFpsWarning": "A nagyobb képkockasebesség az asztali megosztásnál hatással lehet a sávszélességre. Az új beállítások érvénybe léptetéséhez újra kell indítania a képernyőmegosztást.",
"desktopShareWarning": "Az új beállítások érvénybe léptetéséhez újra kell indítania a képernyőmegosztást.",
"devices": "Eszközök",
"followMe": "Mindenki engem kövessen",
"framesPerSecond": "képkocka / másodperc",
"incomingMessage": "Bejövő üzenet",
"language": "Nyelv",
"loggedIn": "Belépve mint {{name}}",
"microphones": "Mikrofonok",
@@ -544,12 +772,22 @@
"more": "Továbbiak",
"name": "Név",
"noDevice": "Nincs",
"participantJoined": "Résztvevő csatlakozott",
"participantKnocking": "Résztvevő belépett a lobby-ba",
"participantLeft": "Résztvevő kilépett",
"playSounds": "Hangok lejátszása a következőkhöz:",
"reactions": "Meeting reakciók",
"sameAsSystem": "Rendszerhang ({{label}})",
"selectAudioOutput": "Hangkimenet",
"selectCamera": "Kamera",
"selectMic": "Mikrofon",
"selfView": "Saját kép",
"sounds": "Hangok",
"speakers": "Hangszórók",
"startAudioMuted": "Mindenki elnémítva kezd",
"startReactionsMuted": "Reakció hangok némítása mindenki számára",
"startVideoMuted": "Mindenki videó nélkül kezd",
"talkWhileMuted": "Lenémított beszéd",
"title": "Beállítások"
},
"settingsView": {
@@ -577,14 +815,23 @@
},
"speaker": "Hangszóró",
"speakerStats": {
"angry": "Mérges",
"disgusted": "Felháborodott",
"fearful": "Félelmetes",
"happy": "Boldog",
"hours": "{{count}} h",
"minutes": "{{count}} perc",
"name": "Név",
"neutral": "Semleges",
"sad": "Szomorú",
"search": "Keresés",
"seconds": "{{count}} mp",
"speakerStats": "Beszélő statisztika",
"speakerTime": "Beszélő ideje"
"speakerTime": "Beszélő ideje",
"surprised": "Meglepett"
},
"startupoverlay": {
"genericTitle": "Az értekezlethez engedélyezni kell a mikrofont és kamerát.",
"policyText": " ",
"title": "A {{app}} használni szeretné a mikrofont és a kamerát."
},
@@ -599,36 +846,49 @@
"Settings": "Beállítások átváltása",
"audioOnly": "Csak a hang átváltása",
"audioRoute": "Hangeszköz kijelölése",
"boo": "Szomorú",
"callQuality": "Videóminőség kezelése",
"cc": "Feliratok átváltása",
"chat": "Csevegés ablak átváltása",
"clap": "Taps",
"document": "Megosztott dokumentum átváltása",
"download": "Alkalmazás letöltése",
"embedMeeting": "Meeting beágyazása",
"feedback": "Visszajelzés küldése",
"fullScreen": "Teljes képernyő átváltása",
"grantModerator": "Moderátori jogok megadása",
"hangup": "Beszélgetés elhagyása",
"help": "Súgó",
"invite": "Személyek meghívása",
"kick": "Résztvevő kirúgása",
"laugh": "Nevetés",
"like": "Hüvelykujj fel",
"localRecording": "Helyi felvétel vezérlőelemeinek átváltása",
"lockRoom": "Értekezlet jelszavának átváltása",
"moreActions": "További műveltek menü átváltása",
"moreActionsMenu": "További műveltek menü",
"moreActions": "További műveletek menü átváltása",
"moreActionsMenu": "További műveletek menü",
"moreOptions": "További beállítások megjelenítése",
"mute": "Hang némításának átváltása",
"muteEveryone": "Mindenki elnémítása",
"muteEveryonesVideoStream": "Mindenki videójának leállítása",
"noiseSuppression": "Zajcsökkentés",
"participants": "Résztvevők",
"pip": "Kép és képben mód átváltása",
"privateMessage": "Privát üzenet küldése",
"profile": "Adja meg a profilját",
"raiseHand": "Kéz felemelésének átváltása",
"recording": "Felvétel átváltása",
"remoteMute": "Résztvevők némítása",
"security": "Biztonsági Beállítások",
"shareRoom": "Valaki meghívása",
"shareYourScreen": "Képernyőmegosztás átváltása",
"shareaudio": "Hang megosztása",
"sharedvideo": "Videó megosztásának átváltása",
"shortcuts": "Gyorsbillentyűk átváltása",
"show": "Megjelenítés a színpadon",
"silence": "Néma",
"speakerStats": "Beszélő statisztika átváltása",
"surprised": "Meglepett",
"tileView": "Mozaikos nézet átváltása",
"toggleCamera": "Kamera átváltása",
"toggleFilmstrip": "Filmszalag átváltása",
@@ -639,13 +899,18 @@
"audioOnlyOff": "Alacsony sávszélességű mód letiltása",
"audioOnlyOn": "Alacsony sávszélességű mód engedélyezése",
"audioRoute": "Hangeszköz kijelölése",
"audioSettings": "Hangbeállítások",
"authenticate": "Hitelesítés",
"boo": "Szomorú",
"callQuality": "Videominőség kezelése",
"chat": "Csevegés megnyitása / bezárása",
"clap": "Taps",
"closeChat": "Csevegés bezárása",
"disableReactionSounds": "Kikapcsolhatja a reakcióhangokat a Meeting-en",
"documentClose": "Megosztott dokumentum bezárása",
"documentOpen": "Megosztott dokumentum megnyitása",
"download": "Alkalmazás letöltése",
"embedMeeting": "Meeting beágyazása",
"enterFullScreen": "Teljes képernyős megtekintés",
"enterTileView": "Mozaikos nézet indítása",
"exitFullScreen": "Kilépés a teljes képernyőből",
@@ -654,6 +919,10 @@
"hangup": "Kilépés",
"help": "Súgó",
"invite": "Személyek meghívása",
"joinBreakoutRoom": "Csatlakozás a pihenőszobához",
"laugh": "Nevetés",
"leaveBreakoutRoom": "Pihenőszoba elhagyása",
"like": "Hüvelykujj fel",
"login": "Bejelentkezés",
"logout": "Kijelentkezés",
"lowerYourHand": "Kéz leengedése",
@@ -666,28 +935,42 @@
"noAudioSignalDialInDesc": "Be is tárcsázhat:",
"noAudioSignalDialInLinkDesc": "Betárcsázási számok",
"noAudioSignalTitle": "Nincs bemenet a mikrofonjáról!",
"noiseSuppression": "Zajcsökkentés",
"noisyAudioInputDesc": "Úgy tűnik, hogy ez a mikrofon zajos. Le kellene némítani vagy cserélni az eszközt.",
"noisyAudioInputTitle": "Zajosnak tűnik a mikrofonja!",
"openChat": "Csevegés megnyitása",
"participants": "Résztvevők",
"pip": "Belépés kép a képben módba",
"privateMessage": "Privát üzenet küldése",
"profile": "Adja meg a profilját",
"raiseHand": "Kéz felemelése / leengedése",
"raiseYourHand": "Kéz felemelése",
"reactionBoo": "Boo reakció küldése",
"reactionClap": "Tapsolás reakció küldése",
"reactionLaugh": "Nevetés reakció küldése",
"reactionLike": "Hüvelykujj fel reakció küldése",
"reactionSilence": "Néma arc reakció küldése",
"reactionSurprised": "Meglepett reakció küldése",
"security": "Biztonsági Beállítások",
"selectBackground": "Háttér beállítása",
"shareRoom": "Valaki meghívása",
"shareaudio": "Hang megosztása",
"sharedvideo": "Videó megosztása",
"shortcuts": "Gyorsbillentyűk megtekintése",
"silence": "Néma",
"speakerStats": "Beszélő statisztika",
"startScreenSharing": "Képernyőmegosztás kezdése",
"startSubtitles": "Feliratok kezdése",
"startvideoblur": "Háttér elhomályosítása",
"stopScreenSharing": "Képernyőmegosztás leállítása",
"stopSharedVideo": "Videó leállítása",
"stopSharedVideo": "Kamera leállítása",
"stopSubtitles": "Felirat leállítása",
"stopvideoblur": "Háttér elhomályosításának letiltása",
"surprised": "Meglepett",
"talkWhileMutedPopup": "Úgy tűnik beszélni szeretne, de le van némítva.",
"tileViewToggle": "Mozaikos nézet átváltása",
"toggleCamera": "Kamera átváltása",
"videoSettings": "Videóbeállítások",
"videomute": "Kamera indítása / leállítása"
},
"transcribing": {
@@ -725,12 +1008,15 @@
"pending": "{{displayName}} -t meghívta"
},
"videoStatus": {
"adjustFor": "Igazítsa a legjobb:",
"audioOnly": "CsH",
"audioOnlyExpanded": "Jelenleg az alacsony sávszélességű mód az aktív, vagyis csak hangot lehet fogadni és képernyőmegosztást.",
"bestPerformance": "Teljesítményhez",
"callQuality": "Videominőség",
"hd": "MF",
"hdTooltip": "Magas felbontású videó megtekintése",
"highDefinition": "Magas felbontású",
"highestQuality": "Minőséghez",
"labelTooiltipNoVideo": "Nincs videó",
"labelTooltipAudioOnly": "Alacsony sávszélességű mód aktiválva",
"ld": "AF",
@@ -738,6 +1024,7 @@
"lowDefinition": "Alacsony felbontású",
"onlyAudioAvailable": "„Csak hang” mód elérhető",
"onlyAudioSupported": "Csak a hang támogatott ebben a böngészőben.",
"performanceSettings": "Teljesítménybeállítások",
"sd": "SF",
"sdTooltip": "Szabványos felbontású videó megtekintése",
"standardDefinition": "Szabványos felbontású"
@@ -745,7 +1032,10 @@
"videothumbnail": {
"domute": "Némítás",
"domuteOthers": "Mindenki más elnémítása",
"domuteVideoOfOthers": "Mindenki más kamerájának letiltása",
"flip": "Tükrözés",
"grantModerator": "Moderátori jogok megadása",
"hideSelfView": "Saját kép elrejtése",
"kick": "Kirúgás",
"moderator": "Moderátor",
"mute": "A résztvevő le van némítva",
@@ -754,6 +1044,29 @@
"show": "Megjelenítés a színpadon",
"videomute": "A résztvevő leállította a kameráját"
},
"virtualBackground": {
"addBackground": "Háttér hozzáadása",
"apply": "Alkalmaz",
"backgroundEffectError": "Hiba a háttér effekt hozzáadásnál.",
"blur": "Elmosódott",
"deleteImage": "Delete image",
"desktopShare": "Asztal megosztása",
"desktopShareError": "Nem lehet asztalt megosztani",
"image1": "Tengerpart",
"image2": "Fehér semleges fal",
"image3": "Fehér üres szoba",
"image4": "Fekete állólámpa",
"image5": "Hegy",
"image6": "Erdő",
"image7": "Napfelkelte",
"none": "Nincs",
"pleaseWait": "Kérjük várjon...",
"removeBackground": "Háttér eltávolítása",
"slightBlur": "Enyhén elmosódott",
"title": "Virtuális háttérképek",
"uploadedImage": "Feltöltött kép {{index}}"
},
"volumeSlider": "Hangerő szabályzó",
"welcomepage": {
"accessibilityLabel": {
"join": "Koppintson a csatlakozáshoz",
@@ -771,17 +1084,20 @@
"getHelp": "Segítség kérése",
"go": "Indítás",
"goSmall": "Indítás",
"headerSubtitle": "Biztonságos és magas színvonalú konferenciák",
"info": "Információ",
"jitsiOnMobile": "Jitsi Mobil töltse le az app-ot, és indítson megbeszélést bárhonnan",
"join": "LÉTREHOZ /HOZZÁAD",
"privacy": "Adatvédelem",
"recentList": "Legutóbbi",
"recentListDelete": "Törlés",
"recentListDelete": "Lista törlés",
"recentListEmpty": "A legutóbbi lista jelenleg üres. Csevegjen a csapattal és minden előző értekezlet itt lesz megtalálható.",
"reducedUIText": "Üdvözlet a {{app}} programban!",
"roomNameAllowedChars": "Az értekezlet neve nem tartalmazhatja a következő karaktereket: ?, &, :, ', \", %, #.",
"roomname": "Adja meg a szoba nevét",
"roomnameHint": "Adja meg a kívánt nevet vagy URL-t, amelyhez csatlakozni szeretne. Bármiképp elnevezheti, csak ossza meg az értekezlet résztvevőivel, hogy ők ugyanezt a nevet tudják majd megadni.",
"sendFeedback": "Visszajelzés küldése",
"startMeeting": "Csatlakozás",
"terms": "Feltételek",
"title": "Biztonságos, maradéktalanul felszerelt és teljesen ingyenes videokonferencia"
}

View File

@@ -563,7 +563,6 @@
"lobby": {
"admit": "Admit",
"admitAll": "Admit all",
"allow": "Allow",
"backToKnockModeButton": "Ask to join",
"chat": "Chat",
"dialogTitle": "Lobby mode",

22
package-lock.json generated
View File

@@ -27,7 +27,7 @@
"@giphy/react-components": "5.6.0",
"@giphy/react-native-sdk": "1.7.0",
"@hapi/bourne": "2.0.0",
"@jitsi/excalidraw": "https://github.com/jitsi/excalidraw/releases/download/v0.0.11/jitsi-excalidraw-0.0.11.tgz",
"@jitsi/excalidraw": "https://github.com/jitsi/excalidraw/releases/download/v0.0.12/jitsi-excalidraw-0.0.12.tgz",
"@jitsi/js-utils": "2.0.4",
"@jitsi/logger": "2.0.0",
"@jitsi/rnnoise-wasm": "0.1.0",
@@ -74,7 +74,7 @@
"js-md5": "0.6.1",
"js-sha512": "0.8.0",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1539.0.0+eb4873d2/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1541.0.0+9b34e0f7/lib-jitsi-meet.tgz",
"lodash": "4.17.21",
"moment": "2.29.4",
"moment-duration-format": "2.2.2",
@@ -3746,9 +3746,9 @@
}
},
"node_modules/@jitsi/excalidraw": {
"version": "0.0.11",
"resolved": "https://github.com/jitsi/excalidraw/releases/download/v0.0.11/jitsi-excalidraw-0.0.11.tgz",
"integrity": "sha512-R0om5mYmjjozmJ6i5PXPSQy8/kiMTCqk/QVxOVryEUlHps4UeLNx+Gb/tjzNBN/C6db6ea+Vxt/l27nh9frphg==",
"version": "0.0.12",
"resolved": "https://github.com/jitsi/excalidraw/releases/download/v0.0.12/jitsi-excalidraw-0.0.12.tgz",
"integrity": "sha512-WFzaH5GCZLA5DTSZ6ReqAz9g53mSgi+211zTC7AFZUYZme5tzKpPg55AKkJZA3ZIRikkbKaEfP/dC4QOH5NMmA==",
"license": "MIT",
"peerDependencies": {
"react": "^17.0.2",
@@ -13497,8 +13497,8 @@
},
"node_modules/lib-jitsi-meet": {
"version": "0.0.0",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1539.0.0+eb4873d2/lib-jitsi-meet.tgz",
"integrity": "sha512-hEu5nmljbOVKPHIcCpW6GTFzZpWDOAfplKTkNdvrIyNgMiIjHhUgmMzF+IGicd7KPud3z8aQ+0HFnpcxO/T6ZA==",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1541.0.0+9b34e0f7/lib-jitsi-meet.tgz",
"integrity": "sha512-A+QkH3v0XzLSxumHC7LHWXLmFHTqrJ/1YCbWFd/eHjDGXVyFCPeazYBpsNdGZMHfEBzG9FLdQCEOxyzBY7yIAA==",
"license": "Apache-2.0",
"dependencies": {
"@jitsi/js-utils": "2.0.0",
@@ -23178,8 +23178,8 @@
"dev": true
},
"@jitsi/excalidraw": {
"version": "https://github.com/jitsi/excalidraw/releases/download/v0.0.11/jitsi-excalidraw-0.0.11.tgz",
"integrity": "sha512-R0om5mYmjjozmJ6i5PXPSQy8/kiMTCqk/QVxOVryEUlHps4UeLNx+Gb/tjzNBN/C6db6ea+Vxt/l27nh9frphg=="
"version": "https://github.com/jitsi/excalidraw/releases/download/v0.0.12/jitsi-excalidraw-0.0.12.tgz",
"integrity": "sha512-WFzaH5GCZLA5DTSZ6ReqAz9g53mSgi+211zTC7AFZUYZme5tzKpPg55AKkJZA3ZIRikkbKaEfP/dC4QOH5NMmA=="
},
"@jitsi/js-utils": {
"version": "2.0.4",
@@ -30510,8 +30510,8 @@
}
},
"lib-jitsi-meet": {
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1539.0.0+eb4873d2/lib-jitsi-meet.tgz",
"integrity": "sha512-hEu5nmljbOVKPHIcCpW6GTFzZpWDOAfplKTkNdvrIyNgMiIjHhUgmMzF+IGicd7KPud3z8aQ+0HFnpcxO/T6ZA==",
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1541.0.0+9b34e0f7/lib-jitsi-meet.tgz",
"integrity": "sha512-A+QkH3v0XzLSxumHC7LHWXLmFHTqrJ/1YCbWFd/eHjDGXVyFCPeazYBpsNdGZMHfEBzG9FLdQCEOxyzBY7yIAA==",
"requires": {
"@jitsi/js-utils": "2.0.0",
"@jitsi/logger": "2.0.0",

View File

@@ -32,7 +32,7 @@
"@giphy/react-components": "5.6.0",
"@giphy/react-native-sdk": "1.7.0",
"@hapi/bourne": "2.0.0",
"@jitsi/excalidraw": "https://github.com/jitsi/excalidraw/releases/download/v0.0.11/jitsi-excalidraw-0.0.11.tgz",
"@jitsi/excalidraw": "https://github.com/jitsi/excalidraw/releases/download/v0.0.12/jitsi-excalidraw-0.0.12.tgz",
"@jitsi/js-utils": "2.0.4",
"@jitsi/logger": "2.0.0",
"@jitsi/rnnoise-wasm": "0.1.0",
@@ -79,7 +79,7 @@
"js-md5": "0.6.1",
"js-sha512": "0.8.0",
"jwt-decode": "2.2.0",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1539.0.0+eb4873d2/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1541.0.0+9b34e0f7/lib-jitsi-meet.tgz",
"lodash": "4.17.21",
"moment": "2.29.4",
"moment-duration-format": "2.2.2",

View File

@@ -1,5 +1,3 @@
/* eslint-disable lines-around-comment */
import logger from '../logger';
import AbstractHandler, { IEvent } from './AbstractHandler';
@@ -103,8 +101,10 @@ export default class AmplitudeHandler extends AbstractHandler {
return {
sessionId: amplitude.getInstance().getSessionId(),
// @ts-ignore
deviceId: amplitude.getInstance().options.deviceId,
// @ts-ignore
userId: amplitude.getInstance().options.userId
};

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import { createStartMutedConfigurationEvent } from '../../analytics/AnalyticsEvents';
import { sendAnalytics } from '../../analytics/functions';
import { appNavigate } from '../../app/actions';
@@ -111,6 +110,7 @@ function _addConferenceListeners(conference: IJitsiConference, dispatch: IStore[
JitsiConferenceEvents.CONFERENCE_LEFT,
(...args: any[]) => {
dispatch(conferenceTimestampChanged(0));
// @ts-ignore
dispatch(conferenceLeft(conference, ...args));
});

View File

@@ -71,6 +71,7 @@ export interface IJitsiConference {
muteParticipant: Function;
myLobbyUserId: Function;
myUserId: Function;
off: Function;
on: Function;
removeTrack: Function;
replaceTrack: Function;

View File

@@ -316,6 +316,7 @@ export interface IConfig {
sdkKey?: string;
tileTime?: number;
};
googleApiApplicationClientID?: string;
gravatar?: {
baseUrl?: string;
disabled?: boolean;
@@ -366,6 +367,7 @@ export interface IConfig {
localSubject?: string;
locationURL?: URL;
maxFullResolutionParticipants?: number;
microsoftApiApplicationClientID?: string;
moderatedRoomServiceUrl?: string;
mouseMoveCallbackInterval?: number;
noticeMessage?: string;

View File

@@ -1,6 +1,6 @@
/* eslint-disable lines-around-comment */
// @ts-ignore
import Bourne from '@hapi/bourne';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { jitsiLocalStorage } from '@jitsi/js-utils';
import _ from 'lodash';

View File

@@ -77,6 +77,7 @@ export interface IConfigState extends IConfig {
analysis?: {
obfuscateRoomName?: boolean;
};
disableRemoteControl?: boolean;
error?: Error;
}

View File

@@ -16,6 +16,7 @@ import { ConnectionFailedError } from './actions.any';
export interface IConnectionState {
connecting?: any;
connection?: {
addFeature: Function;
disconnect: Function;
getJid: () => string;
getLogs: () => Object;

View File

@@ -1,8 +1,8 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
// @ts-ignore
import { Container } from '../../react/base';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { styleTypeToObject } from '../../styles';

View File

@@ -477,18 +477,19 @@ export function participantMutedUs(participant: any, track: any) {
/**
* Action to create a virtual screenshare participant.
*
* @param {(string)} sourceName - JitsiTrack instance.
* @param {(boolean)} local - JitsiTrack instance.
* @param {(string)} sourceName - The source name of the JitsiTrack instance.
* @param {(boolean)} local - Whether it's a local or remote participant.
* @param {JitsiConference} conference - The conference instance for which the participant is to be created.
* @returns {Function}
*/
export function createVirtualScreenshareParticipant(sourceName: string, local: boolean) {
export function createVirtualScreenshareParticipant(sourceName: string, local: boolean, conference: any) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const ownerId = getVirtualScreenshareParticipantOwnerId(sourceName);
const ownerName = getParticipantDisplayName(state, ownerId);
dispatch(participantJoined({
conference: state['features/base/conference'].conference,
conference,
fakeParticipant: local ? FakeParticipant.LocalScreenShare : FakeParticipant.RemoteScreenShare,
id: sourceName,
name: ownerName

View File

@@ -1,9 +1,7 @@
/* eslint-disable lines-around-comment */
// @ts-ignore
import { getGravatarURL } from '@jitsi/js-utils/avatar';
import { IReduxState, IStore } from '../../app/types';
// @ts-ignore
import { isStageFilmstripAvailable } from '../../filmstrip/functions';
import { IStateful } from '../app/types';
import { GRAVATAR_BASE_URL } from '../avatar/constants';
@@ -20,6 +18,7 @@ import {
PARTICIPANT_ROLE,
WHITEBOARD_PARTICIPANT_ICON
} from './constants';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { preloadImage } from './preloadImage';
import { FakeParticipant, IParticipant } from './types';

View File

@@ -46,7 +46,7 @@ function _updateScreenshareParticipants({ getState, dispatch }: IStore) {
if (getMultipleVideoSendingSupportFeatureFlag(state)) {
if (!localScreenShare && newLocalSceenshareSourceName) {
dispatch(createVirtualScreenshareParticipant(newLocalSceenshareSourceName, true));
dispatch(createVirtualScreenshareParticipant(newLocalSceenshareSourceName, true, conference));
}
if (localScreenShare && !newLocalSceenshareSourceName) {
@@ -68,7 +68,7 @@ function _updateScreenshareParticipants({ getState, dispatch }: IStore) {
}
if (addedScreenshareSourceNames.length) {
addedScreenshareSourceNames.forEach(id => dispatch(createVirtualScreenshareParticipant(id, false)));
addedScreenshareSourceNames.forEach(id => dispatch(
createVirtualScreenshareParticipant(id, false, conference)));
}
}

View File

@@ -10,8 +10,8 @@ import { navigate }
from '../../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
// @ts-ignore
import { screen } from '../../../../mobile/navigation/routes';
// @ts-ignore
import { SETTINGS_ENABLED, getFeatureFlag } from '../../../flags';
import { SETTINGS_ENABLED } from '../../../flags/constants';
import { getFeatureFlag } from '../../../flags/functions';
import { connect } from '../../../redux/functions';
/**

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import _ from 'lodash';
import { AnyAction } from 'redux';

View File

@@ -1,6 +1,5 @@
/* eslint-disable lines-around-comment */
import { IReduxState, IStore } from '../../app/types';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { setPictureInPictureEnabled } from '../../mobile/picture-in-picture/functions';
import { setAudioOnly } from '../audio-only/actions';
@@ -8,7 +7,6 @@ import JitsiMeetJS from '../lib-jitsi-meet';
import { destroyLocalDesktopTrackIfExists, replaceLocalTrack } from './actions.any';
import { getLocalVideoTrack, isLocalVideoTrackDesktop } from './functions';
/* eslint-enable lines-around-comment */
export * from './actions.any';

View File

@@ -8,7 +8,6 @@ import { showNotification } from '../../notifications/actions';
import { NOTIFICATION_TIMEOUT_TYPE } from '../../notifications/constants';
// @ts-ignore
import { stopReceiver } from '../../remote-control/actions';
// @ts-ignore
import { setScreenAudioShareState, setScreenshareAudioTrack } from '../../screen-share/actions';
import { isAudioOnlySharing, isScreenVideoShared } from '../../screen-share/functions';
// @ts-ignore

View File

@@ -1,4 +1,3 @@
// @ts-ignore
import React from 'react';
import { useTranslation } from 'react-i18next';
import {

View File

@@ -1,8 +1,8 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { TouchableRipple } from 'react-native-paper';
import Icon from '../../../icons/components/Icon';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import styles from '../../../react/components/native/styles';
import { IIconButtonProps } from '../../../react/types';

View File

@@ -1,5 +1,3 @@
// @flow
import {
REFRESH_CALENDAR,
SET_CALENDAR_AUTHORIZATION,
@@ -19,8 +17,7 @@ import {
* isInteractive: boolean
* }}
*/
export function refreshCalendar(
forcePermission: boolean = false, isInteractive: boolean = true) {
export function refreshCalendar(forcePermission = false, isInteractive = true) {
return {
type: REFRESH_CALENDAR,
forcePermission,
@@ -39,7 +36,7 @@ export function refreshCalendar(
* authorization: ?string
* }}
*/
export function setCalendarAuthorization(authorization: ?string) {
export function setCalendarAuthorization(authorization?: string) {
return {
type: SET_CALENDAR_AUTHORIZATION,
authorization

View File

@@ -1,13 +1,15 @@
// @flow
// @ts-expect-error
import { generateRoomWithoutSeparator } from '@jitsi/js-utils/random';
import type { Dispatch } from 'redux';
import { getDefaultURL } from '../app/functions';
import { openDialog } from '../base/dialog';
import { IStore } from '../app/types';
import { openDialog } from '../base/dialog/actions';
import { refreshCalendar } from './actions';
import {
UpdateCalendarEventDialog
// @ts-ignore
} from './components';
import { addLinkToCalendarEntry } from './functions.native';
@@ -35,11 +37,13 @@ export function openUpdateCalendarEventDialog(eventId: string) {
* @returns {Function}
*/
export function updateCalendarEvent(eventId: string) {
return (dispatch: Dispatch<any>, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const defaultUrl = getDefaultURL(getState);
const roomName = generateRoomWithoutSeparator();
addLinkToCalendarEntry(getState(), eventId, `${defaultUrl}/${roomName}`)
// @ts-ignore
.finally(() => {
dispatch(refreshCalendar(false, false));
});

View File

@@ -1,9 +1,11 @@
// @flow
// @ts-expect-error
import { generateRoomWithoutSeparator } from '@jitsi/js-utils/random';
import type { Dispatch } from 'redux';
import { createCalendarConnectedEvent, sendAnalytics } from '../analytics';
import { createCalendarConnectedEvent } from '../analytics/AnalyticsEvents';
import { sendAnalytics } from '../analytics/functions';
import { IStore } from '../app/types';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { loadGoogleAPI } from '../google-api';
import {
@@ -14,8 +16,8 @@ import {
SET_CALENDAR_PROFILE_EMAIL,
SET_LOADING_CALENDAR_EVENTS
} from './actionTypes';
import { refreshCalendar, setCalendarEvents } from './actions';
import { _getCalendarIntegration, isCalendarEnabled } from './functions';
import { refreshCalendar, setCalendarEvents } from './actions.web';
import { _getCalendarIntegration, isCalendarEnabled } from './functions.web';
import logger from './logger';
export * from './actions.any';
@@ -26,8 +28,8 @@ export * from './actions.any';
*
* @returns {Function}
*/
export function bootstrapCalendarIntegration(): Function {
return (dispatch, getState) => {
export function bootstrapCalendarIntegration() {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
if (!isCalendarEnabled(state)) {
@@ -63,7 +65,7 @@ export function bootstrapCalendarIntegration(): Function {
}
return dispatch(integrationToLoad._isSignedIn())
.then(signedIn => {
.then((signedIn: boolean) => {
if (signedIn) {
dispatch(setIntegrationReady(integrationType));
dispatch(updateProfile(integrationType));
@@ -114,7 +116,7 @@ export function openUpdateCalendarEventDialog(
* msAuthState: Object
* }}
*/
export function setCalendarAPIAuthState(newState: ?Object) {
export function setCalendarAPIAuthState(newState?: Object) {
return {
type: SET_CALENDAR_AUTH_STATE,
msAuthState: newState
@@ -130,7 +132,7 @@ export function setCalendarAPIAuthState(newState: ?Object) {
* error: Object
* }}
*/
export function setCalendarError(error: ?Object) {
export function setCalendarError(error?: Object) {
return {
type: SET_CALENDAR_ERROR,
error
@@ -146,7 +148,7 @@ export function setCalendarError(error: ?Object) {
* email: string
* }}
*/
export function setCalendarProfileEmail(newEmail: ?string) {
export function setCalendarProfileEmail(newEmail?: string) {
return {
type: SET_CALENDAR_PROFILE_EMAIL,
email: newEmail
@@ -196,8 +198,8 @@ export function setIntegrationReady(integrationType: string) {
* signed into.
* @returns {Function}
*/
export function signIn(calendarType: string): Function {
return (dispatch: Dispatch<any>) => {
export function signIn(calendarType: string) {
return (dispatch: IStore['dispatch']) => {
const integration = _getCalendarIntegration(calendarType);
if (!integration) {
@@ -210,7 +212,7 @@ export function signIn(calendarType: string): Function {
.then(() => dispatch(updateProfile(calendarType)))
.then(() => dispatch(refreshCalendar()))
.then(() => sendAnalytics(createCalendarConnectedEvent()))
.catch(error => {
.catch((error: any) => {
logger.error(
'Error occurred while signing into calendar integration',
error);
@@ -228,10 +230,10 @@ export function signIn(calendarType: string): Function {
* @param {string} calendarId - The id of the calendar to use.
* @returns {Function}
*/
export function updateCalendarEvent(id: string, calendarId: string): Function {
return (dispatch: Dispatch<any>, getState: Function) => {
export function updateCalendarEvent(id: string, calendarId: string) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const { integrationType } = getState()['features/calendar-sync'];
const { integrationType = '' } = getState()['features/calendar-sync'];
const integration = _getCalendarIntegration(integrationType);
if (!integration) {
@@ -240,7 +242,7 @@ export function updateCalendarEvent(id: string, calendarId: string): Function {
const { locationURL } = getState()['features/base/connection'];
const newRoomName = generateRoomWithoutSeparator();
let href = locationURL.href;
let href = locationURL?.href ?? '';
href.endsWith('/') || (href += '/');
@@ -275,8 +277,8 @@ export function updateCalendarEvent(id: string, calendarId: string): Function {
* should be updated.
* @returns {Function}
*/
export function updateProfile(calendarType: string): Function {
return (dispatch: Dispatch<any>) => {
export function updateProfile(calendarType: string) {
return (dispatch: IStore['dispatch']) => {
const integration = _getCalendarIntegration(calendarType);
if (!integration) {
@@ -284,7 +286,7 @@ export function updateProfile(calendarType: string): Function {
}
return dispatch(integration.getCurrentEmail())
.then(email => {
.then((email: string) => {
dispatch(setCalendarProfileEmail(email));
});
};

View File

@@ -1,8 +1,6 @@
// @flow
import md5 from 'js-md5';
import { APP_LINK_SCHEME, parseURIString } from '../base/util';
import { APP_LINK_SCHEME, parseURIString } from '../base/util/uri';
import { setCalendarEvents } from './actions';
import { MAX_LIST_LENGTH } from './constants';
@@ -16,7 +14,8 @@ const ALLDAY_EVENT_LENGTH = 23 * 60 * 60 * 1000;
* @param {Object} entry - The calendar entry.
* @returns {boolean}
*/
function _isDisplayableCalendarEntry(entry) {
function _isDisplayableCalendarEntry(entry: { allDay: boolean; attendees: Object[];
endDate: number; startDate: number; }) {
// Entries are displayable if:
// - Ends in the future (future or ongoing events)
// - Is not an all day event and there is only one attendee (these events
@@ -45,7 +44,8 @@ export function _updateCalendarEntries(events: Array<Object>) {
return;
}
// eslint-disable-next-line no-invalid-this
// @ts-ignore
// eslint-disable-next-line @typescript-eslint/no-invalid-this
const { dispatch, getState } = this;
const knownDomains = getState()['features/base/known-domains'];
const entryMap = new Map();
@@ -106,7 +106,7 @@ export function _updateCalendarEntries(events: Array<Object>) {
* @param {string} negativePattern - The negative pattern.
* @returns {string}
*/
function _checkPattern(str, positivePattern, negativePattern) {
function _checkPattern(str: string, positivePattern: string, negativePattern: string) {
const positiveRegExp = new RegExp(positivePattern, 'gi');
let positiveMatch = positiveRegExp.exec(str);
@@ -129,7 +129,7 @@ function _checkPattern(str, positivePattern, negativePattern) {
* @private
* @returns {CalendarEntry}
*/
function _parseCalendarEntry(event, knownDomains) {
function _parseCalendarEntry(event: any, knownDomains: string[]) {
if (event) {
const url = _getURLFromEvent(event, knownDomains);
const startDate = Date.parse(event.startDate);
@@ -170,7 +170,8 @@ function _parseCalendarEntry(event, knownDomains) {
* @private
* @returns {string}
*/
function _getURLFromEvent(event, knownDomains) {
function _getURLFromEvent(event: { description: string; location: string; notes: string; title: string;
url: string; }, knownDomains: string[]) {
const linkTerminatorPattern = '[^\\s<>$]';
const urlRegExp
= `http(s)?://(${knownDomains.join('|')})/${linkTerminatorPattern}+`;

View File

@@ -1,15 +1,17 @@
// @flow
import { NativeModules, Platform } from 'react-native';
import RNCalendarEvents from 'react-native-calendar-events';
import type { Store } from 'redux';
import { CALENDAR_ENABLED, getFeatureFlag } from '../base/flags';
import { IReduxState, IStore } from '../app/types';
import { IStateful } from '../base/app/types';
import { CALENDAR_ENABLED } from '../base/flags/constants';
import { getFeatureFlag } from '../base/flags/functions';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { getShareInfoText } from '../invite';
import { setCalendarAuthorization } from './actions';
import { setCalendarAuthorization } from './actions.native';
import { FETCH_END_DAYS, FETCH_START_DAYS } from './constants';
import { _updateCalendarEntries } from './functions';
import { _updateCalendarEntries } from './functions.native';
import logger from './logger';
export * from './functions.any';
@@ -23,10 +25,10 @@ export * from './functions.any';
* @returns {Promise<*>}
*/
export function addLinkToCalendarEntry(
state: Object, id: string, link: string): Promise<any> {
state: IReduxState, id: string, link: string): Promise<any> {
return new Promise((resolve, reject) => {
getShareInfoText(state, link, true).then(shareInfoText => {
RNCalendarEvents.findEventById(id).then(event => {
getShareInfoText(state, link, true).then((shareInfoText: string) => {
RNCalendarEvents.findEventById(id).then((event: any) => {
const updateText
= event.description
? `${event.description}\n\n${shareInfoText}`
@@ -43,6 +45,7 @@ export function addLinkToCalendarEntry(
})
};
// @ts-ignore
RNCalendarEvents.saveEvent(event.title, updateObject)
.then(resolve, reject);
}, reject);
@@ -61,7 +64,7 @@ export function addLinkToCalendarEntry(
* @returns {boolean} If the app has enabled the calendar feature, {@code true};
* otherwise, {@code false}.
*/
export function isCalendarEnabled(stateful: Function | Object) {
export function isCalendarEnabled(stateful: IStateful) {
const flag = getFeatureFlag(stateful, CALENDAR_ENABLED);
if (typeof flag !== 'undefined') {
@@ -85,9 +88,9 @@ export function isCalendarEnabled(stateful: Function | Object) {
* @returns {void}
*/
export function _fetchCalendarEntries(
store: Store<*, *>,
store: IStore,
maybePromptForPermission: boolean,
forcePermission: ?boolean) {
forcePermission?: boolean) {
const { dispatch, getState } = store;
const promptForPermission
= (maybePromptForPermission
@@ -104,6 +107,8 @@ export function _fetchCalendarEntries(
endDate.setDate(endDate.getDate() + FETCH_END_DAYS);
RNCalendarEvents.fetchAllEvents(
// @ts-ignore
startDate.getTime(),
endDate.getTime(),
[])
@@ -126,7 +131,7 @@ export function _fetchCalendarEntries(
* @private
* @returns {Promise}
*/
function _ensureCalendarAccess(promptForPermission, dispatch) {
function _ensureCalendarAccess(promptForPermission: boolean | undefined, dispatch: IStore['dispatch']) {
return new Promise((resolve, reject) => {
RNCalendarEvents.checkPermissions()
.then(status => {

View File

@@ -1,12 +1,13 @@
// @flow
import { toState } from '../base/redux';
/* eslint-disable lines-around-comment */
import { IStore } from '../app/types';
import { IStateful } from '../base/app/types';
import { toState } from '../base/redux/functions';
import {
clearCalendarIntegration,
setCalendarError,
setLoadingCalendarEvents
} from './actions';
} from './actions.web';
export * from './functions.any';
import {
CALENDAR_TYPE,
@@ -14,10 +15,13 @@ import {
FETCH_END_DAYS,
FETCH_START_DAYS
} from './constants';
import { _updateCalendarEntries } from './functions';
import { _updateCalendarEntries } from './functions.web';
import logger from './logger';
// @ts-ignore
import { googleCalendarApi } from './web/googleCalendar';
// @ts-ignore
import { microsoftCalendarApi } from './web/microsoftCalendar';
/* eslint-enable lines-around-comment */
/**
* Determines whether the calendar feature is enabled by the web.
@@ -27,7 +31,7 @@ import { microsoftCalendarApi } from './web/microsoftCalendar';
* @returns {boolean} If the app has enabled the calendar feature, {@code true};
* otherwise, {@code false}.
*/
export function isCalendarEnabled(stateful: Function | Object) {
export function isCalendarEnabled(stateful: IStateful) {
const {
enableCalendarIntegration,
googleApiApplicationClientID,
@@ -37,26 +41,24 @@ export function isCalendarEnabled(stateful: Function | Object) {
return Boolean(enableCalendarIntegration && (googleApiApplicationClientID || microsoftApiApplicationClientID));
}
/* eslint-disable no-unused-vars */
/**
* Reads the user's calendar and updates the stored entries if need be.
*
* @param {Object} store - The redux store.
* @param {boolean} maybePromptForPermission - Flag to tell the app if it should
* @param {boolean} _maybePromptForPermission - Flag to tell the app if it should
* prompt for a calendar permission if it wasn't granted yet.
* @param {boolean|undefined} forcePermission - Whether to force to re-ask for
* @param {boolean|undefined} _forcePermission - Whether to force to re-ask for
* the permission or not.
* @private
* @returns {void}
*/
export function _fetchCalendarEntries(
store: Object,
maybePromptForPermission: boolean,
forcePermission: ?boolean) {
/* eslint-enable no-unused-vars */
store: IStore,
_maybePromptForPermission: boolean,
_forcePermission?: boolean) {
const { dispatch, getState } = store;
const { integrationType } = getState()['features/calendar-sync'];
const { integrationType = '' } = getState()['features/calendar-sync'];
const integration = _getCalendarIntegration(integrationType);
if (!integration) {
@@ -69,7 +71,7 @@ export function _fetchCalendarEntries(
dispatch(integration.load())
.then(() => dispatch(integration._isSignedIn()))
.then(signedIn => {
.then((signedIn: boolean) => {
if (signedIn) {
return Promise.resolve();
}
@@ -80,13 +82,13 @@ export function _fetchCalendarEntries(
})
.then(() => dispatch(integration.getCalendarEntries(
FETCH_START_DAYS, FETCH_END_DAYS)))
.then(events => _updateCalendarEntries.call({
.then((events: Object[]) => _updateCalendarEntries.call({
dispatch,
getState
}, events))
.then(() => {
dispatch(setCalendarError());
}, error => {
}, (error: any) => {
logger.error('Error fetching calendar.', error);
if (error.error === ERRORS.AUTH_FAILED) {

View File

@@ -1,5 +1,3 @@
// @flow
import { getLogger } from '../base/logging/functions';
export default getLogger('features/calendar-sync');

View File

@@ -1,8 +1,8 @@
// @flow
import { SET_CONFIG } from '../base/config';
import { ADD_KNOWN_DOMAINS } from '../base/known-domains';
import { MiddlewareRegistry, equals } from '../base/redux';
import { IStore } from '../app/types';
import { SET_CONFIG } from '../base/config/actionTypes';
import { ADD_KNOWN_DOMAINS } from '../base/known-domains/actionTypes';
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
import { equals } from '../base/redux/functions';
import { APP_STATE_CHANGED } from '../mobile/background/actionTypes';
import { REFRESH_CALENDAR } from './actionTypes';
@@ -70,7 +70,7 @@ MiddlewareRegistry.register(store => next => action => {
* @private
* @returns {void}
*/
function _maybeClearAccessStatus(store, { appState }) {
function _maybeClearAccessStatus(store: IStore, { appState }: { appState: string; }) {
appState === 'background'
&& store.dispatch(setCalendarAuthorization(undefined));
}

View File

@@ -29,7 +29,11 @@ const DEFAULT_STATE = {
export interface ICalendarSyncState {
authorization?: string;
error?: Object;
events: Array<Object>;
events: Array<{
calendarId: string;
id: string;
url: string;
}>;
integrationReady: boolean;
integrationType?: string;
isLoadingEvents?: boolean;

View File

@@ -47,6 +47,7 @@ import {
} from './constants';
import { getUnreadCount } from './functions';
import { INCOMING_MSG_SOUND_FILE } from './sounds';
/* eslint-enable lines-around-comment */
/**
* Timeout for when to show the privacy notice after a private message was received.

View File

@@ -462,7 +462,7 @@ class Conference extends AbstractConference<Props, State> {
{/* eslint-disable-next-line react/jsx-no-bind */}
<AlwaysOnLabels createOnPress = { this._createOnPress } />
</View>
{this._renderNotificationsContainer()}
{ this._renderNotificationsContainer() }
<KnockingParticipantList />
</SafeAreaView>

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
import { useDispatch } from 'react-redux';
@@ -9,6 +8,7 @@ import Button from '../../../../base/ui/components/native/Button';
import { BUTTON_TYPES } from '../../../../base/ui/constants.native';
import EndMeetingIcon from './EndMeetingIcon';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import styles from './styles';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback, useState } from 'react';
import { TouchableOpacity, View } from 'react-native';
import { useDispatch, useSelector } from 'react-redux';
@@ -17,7 +16,6 @@ import { IconMic, IconMicSlash } from '../../../../base/icons/svg';
import { MEDIA_TYPE } from '../../../../base/media/constants';
import { isLocalTrackMuted } from '../../../../base/tracks/functions';
import { isAudioMuteButtonDisabled } from '../../../../toolbox/functions.any';
// @ts-ignore
import { muteLocal } from '../../../../video-menu/actions';
// @ts-ignore

View File

@@ -131,16 +131,16 @@ export default {
roomTimer: {
...BaseTheme.typography.bodyShortBold,
color: BaseTheme.palette.text01,
paddingHorizontal: 8,
paddingVertical: 6,
textAlign: 'center'
},
roomTimerView: {
backgroundColor: BaseTheme.palette.ui03,
borderRadius: BaseTheme.shape.borderRadius,
height: 32,
justifyContent: 'center',
minHeight: 32,
paddingHorizontal: BaseTheme.spacing[2],
paddingVertical: BaseTheme.spacing[1],
minWidth: 50
},

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector } from 'react-redux';
@@ -6,9 +5,9 @@ import { useDispatch, useSelector } from 'react-redux';
import { IReduxState } from '../../../app/types';
import { IconArrowDown } from '../../../base/icons/svg/index';
import Label from '../../../base/label/components/web/Label';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { Tooltip } from '../../../base/tooltip';
// @ts-ignore
import { setTopPanelVisible } from '../../../filmstrip/actions.web';
const ToggleTopPanelLabel = () => {

View File

@@ -1,6 +1,5 @@
/* eslint-disable lines-around-comment */
import BaseTheme from '../../../base/ui/components/BaseTheme.native';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { INDICATOR_DISPLAY_THRESHOLD } from '../AbstractConnectionIndicator';

View File

@@ -1,5 +1,3 @@
/* eslint-disable lines-around-comment */
import { Theme } from '@mui/material';
import { withStyles } from '@mui/styles';
import clsx from 'clsx';
@@ -29,11 +27,13 @@ import AbstractConnectionIndicator, {
type State as AbstractState,
INDICATOR_DISPLAY_THRESHOLD,
mapStateToProps as _abstractMapStateToProps
// @ts-ignore
} from '../AbstractConnectionIndicator';
// @ts-ignore
import ConnectionIndicatorContent from './ConnectionIndicatorContent';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { ConnectionIndicatorIcon } from './ConnectionIndicatorIcon';
@@ -228,6 +228,7 @@ class ConnectionIndicator extends AbstractConnectionIndicator<Props, IState> {
<Popover
className = { clsx(classes.container, visibilityClass) }
content = { <ConnectionIndicatorContent
// @ts-ignore
inheritedStats = { this.state.stats }
participantId = { participantId } /> }
@@ -236,6 +237,7 @@ class ConnectionIndicator extends AbstractConnectionIndicator<Props, IState> {
onPopoverClose = { this._onHidePopover }
onPopoverOpen = { this._onShowPopover }
position = { statsPopoverPosition }
// @ts-ignore
visible = { this.state.popoverVisible }>
{ this._renderIndicator() }
@@ -259,6 +261,7 @@ class ConnectionIndicator extends AbstractConnectionIndicator<Props, IState> {
_isConnectionStatusInactive,
_isConnectionStatusInterrupted,
_connectionIndicatorInactiveDisabled
// @ts-ignore
} = this.props;
@@ -305,6 +308,7 @@ class ConnectionIndicator extends AbstractConnectionIndicator<Props, IState> {
// @ts-ignore
return this.state.showIndicator
// @ts-ignore
|| this.props.alwaysVisible
|| _isConnectionStatusInterrupted
@@ -348,6 +352,7 @@ class ConnectionIndicator extends AbstractConnectionIndicator<Props, IState> {
_videoTrack,
classes,
iconSize
// @ts-ignore
} = this.props;
@@ -399,5 +404,6 @@ export function _mapStateToProps(state: IReduxState, ownProps: Props) {
}
export default translate(connect(_mapStateToProps)(
// @ts-ignore
withStyles(styles)(ConnectionIndicator)));

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import Tabs from '@atlaskit/tabs';
import React, { PureComponent } from 'react';
import { WithTranslation } from 'react-i18next';
@@ -8,6 +7,7 @@ import { hideDialog } from '../../base/dialog/actions';
import { translate } from '../../base/i18n/functions';
import { connect } from '../../base/redux/functions';
import Dialog from '../../base/ui/components/web/Dialog';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { obtainDesktopSources } from '../functions';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector } from 'react-redux';
@@ -11,9 +10,9 @@ import {
} from '../../../base/participants/functions';
import { updateSettings } from '../../../base/settings/actions';
import { withPixelLineHeight } from '../../../base/styles/functions.web';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { Tooltip } from '../../../base/tooltip';
// @ts-ignore
import { getIndicatorsTooltipPosition } from '../../../filmstrip/functions.web';
import { appendSuffix } from '../../functions';

View File

@@ -1,5 +1,3 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { useSelector } from 'react-redux';
import { makeStyles } from 'tss-react/mui';
@@ -12,11 +10,9 @@ import {
isWhiteboardParticipant
} from '../../../base/participants/functions';
import { withPixelLineHeight } from '../../../base/styles/functions.web';
// @ts-ignore
import { getLargeVideoParticipant } from '../../../large-video/functions';
import { isToolboxVisible } from '../../../toolbox/functions.web';
// @ts-ignore
import { isLayoutTileView } from '../../../video-layout';
import { isLayoutTileView } from '../../../video-layout/functions.web';
import DisplayNameBadge from './DisplayNameBadge';

View File

@@ -43,7 +43,7 @@ export function authorizeDropbox() {
* expireDate: number
* }}
*/
export function updateDropboxToken(token: string, rToken: string, expireDate: number) {
export function updateDropboxToken(token?: string, rToken?: string, expireDate?: number) {
return {
type: UPDATE_DROPBOX_TOKEN,
token,

View File

@@ -17,12 +17,10 @@ import { IconArrowDown, IconArrowUp } from '../../../base/icons/svg';
import { IParticipant } from '../../../base/participants/types';
import { connect } from '../../../base/redux/functions';
import { shouldHideSelfView } from '../../../base/settings/functions.web';
// @ts-ignore
import { showToolbox } from '../../../toolbox/actions.web';
import { isButtonEnabled, isToolboxVisible } from '../../../toolbox/functions.web';
// @ts-ignore
import { getCurrentLayout } from '../../../video-layout';
import { LAYOUTS } from '../../../video-layout/constants';
import { getCurrentLayout } from '../../../video-layout/functions.web';
import {
setFilmstripVisible,
setTopPanelVisible,
@@ -30,7 +28,6 @@ import {
setUserFilmstripWidth,
setUserIsResizing,
setVisibleRemoteParticipants
// @ts-ignore
} from '../../actions';
import {
ASPECT_RATIO_BREAKPOINT,
@@ -46,7 +43,6 @@ import {
getVerticalViewMaxWidth,
isStageFilmstripTopPanel,
shouldRemoteVideosBeVisible
// @ts-ignore
} from '../../functions';
// @ts-ignore

View File

@@ -6,8 +6,6 @@ import { IReduxState } from '../../../app/types';
import { IconPin } from '../../../base/icons/svg';
import { getParticipantById } from '../../../base/participants/functions';
import BaseIndicator from '../../../base/react/components/web/BaseIndicator';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { getPinnedActiveParticipants, isStageFilmstripAvailable } from '../../functions.web';
/**

View File

@@ -39,10 +39,8 @@ import { hideGif, showGif } from '../../../gifs/actions';
import { getGifDisplayMode, getGifForParticipant } from '../../../gifs/functions';
// @ts-ignore
import { PresenceLabel } from '../../../presence-status';
// @ts-ignore
import { getCurrentLayout } from '../../../video-layout';
import { LAYOUTS } from '../../../video-layout/constants';
// @ts-ignore
import { getCurrentLayout } from '../../../video-layout/functions.web';
import { togglePinStageParticipant } from '../../actions';
import {
DISPLAY_MODE_TO_CLASS_NAME,
@@ -60,7 +58,6 @@ import {
isStageFilmstripAvailable,
isVideoPlayable,
showGridInVerticalView
// @ts-ignore
} from '../../functions';
// @ts-ignore
@@ -1188,7 +1185,7 @@ function _mapStateToProps(state: IReduxState, ownProps: any): Object {
const _audioTrack = isLocal
? getLocalAudioTrack(tracks)
: getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.AUDIO, id);
const _currentLayout = getCurrentLayout(state);
const _currentLayout = getCurrentLayout(state) ?? '';
let size: any = {};
let _isMobilePortrait = false;
const {

View File

@@ -1,5 +1,3 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { useSelector } from 'react-redux';
import { makeStyles } from 'tss-react/mui';

View File

@@ -1,5 +1,3 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { useSelector } from 'react-redux';
import { makeStyles } from 'tss-react/mui';
@@ -9,11 +7,11 @@ import { isMobileBrowser } from '../../../base/environment/utils';
import { isScreenShareParticipantById } from '../../../base/participants/functions';
import ConnectionIndicator from '../../../connection-indicator/components/web/ConnectionIndicator';
import { STATS_POPOVER_POSITION, THUMBNAIL_TYPE } from '../../constants';
// @ts-ignore
import { getIndicatorsTooltipPosition } from '../../functions.web';
import PinnedIndicator from './PinnedIndicator';
import RaisedHandIndicator from './RaisedHandIndicator';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import StatusIndicators from './StatusIndicators';
import VideoMenuTriggerButton from './VideoMenuTriggerButton';

View File

@@ -4,8 +4,6 @@ import { getParticipantCountWithFake } from '../base/participants/functions';
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
import { clientResized } from '../base/responsive-ui/actions';
import { shouldHideSelfView } from '../base/settings/functions.web';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { selectParticipantInLargeVideo } from '../large-video/actions.any';
import { getParticipantsPaneOpen } from '../participants-pane/functions';
import { setOverflowDrawer } from '../toolbox/actions.web';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import { GiphyFetch, TrendingOptions } from '@giphy/js-fetch-api';
import { Grid } from '@giphy/react-components';
import React, { useCallback, useEffect, useState } from 'react';
@@ -13,8 +12,8 @@ import Input from '../../../base/ui/components/web/Input';
import { sendMessage } from '../../../chat/actions.any';
import { SCROLL_SIZE } from '../../../filmstrip/constants';
import { toggleReactionsMenuVisibility } from '../../../reactions/actions.web';
// @ts-ignore
import { setOverflowMenuVisible } from '../../../toolbox/actions.web';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { Drawer, JitsiPortal } from '../../../toolbox/components/web';
import { showOverflowDrawer } from '../../../toolbox/functions.web';

View File

@@ -12,8 +12,7 @@ import { connect } from '../../../../base/redux/functions';
import Dialog from '../../../../base/ui/components/web/Dialog';
import { isDynamicBrandingDataLoaded } from '../../../../dynamic-branding/functions.any';
import { isVpaasMeeting } from '../../../../jaas/functions';
// @ts-ignore
import { getActiveSession } from '../../../../recording';
import { getActiveSession } from '../../../../recording/functions';
// @ts-ignore
import { updateDialInNumbers } from '../../../actions';
import {

View File

@@ -4,8 +4,6 @@ import { useStore } from 'react-redux';
import { makeStyles } from 'tss-react/mui';
import { translate } from '../../base/i18n/functions';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { setSeeWhatIsBeingShared } from '../actions.web';
const useStyles = makeStyles()(theme => {

View File

@@ -1,21 +1,22 @@
// @flow
import React, { PureComponent } from 'react';
import { ScrollView, Text, TouchableOpacity, View } from 'react-native';
import { View } from 'react-native';
import { Avatar } from '../../../base/avatar';
import { translate } from '../../../base/i18n';
import { isLocalParticipantModerator } from '../../../base/participants';
import { translate } from '../../../base/i18n/functions';
import { isLocalParticipantModerator } from '../../../base/participants/functions';
import { connect } from '../../../base/redux';
import { handleLobbyChatInitialized } from '../../../chat/actions.any';
import Button from '../../../base/ui/components/native/Button';
import { BUTTON_TYPES } from '../../../base/ui/constants.native';
import { handleLobbyChatInitialized } from '../../../chat/actions.native';
import { navigate } from '../../../mobile/navigation/components/conference/ConferenceNavigationContainerRef';
import { screen } from '../../../mobile/navigation/routes';
import { setKnockingParticipantApproval } from '../../actions';
import { HIDDEN_EMAILS } from '../../constants';
import ParticipantItem
from '../../../participants-pane/components/native/ParticipantItem';
import { setKnockingParticipantApproval } from '../../actions.native';
import { getKnockingParticipants, getLobbyEnabled, showLobbyChatButton } from '../../functions';
import styles from './styles';
/**
* Props type of the component.
*/
@@ -44,12 +45,7 @@ export type Props = {
/**
* The Redux Dispatch function.
*/
dispatch: Function,
/**
* Function to be used to translate i18n labels.
*/
t: Function
dispatch: Function
};
/**
@@ -74,68 +70,47 @@ class KnockingParticipantList extends PureComponent<Props> {
* @inheritdoc
*/
render() {
const { _participants, _visible, _showChatButton, t } = this.props;
const { _participants, _visible, _showChatButton } = this.props;
if (!_visible) {
return null;
}
return (
<ScrollView
style = { styles.knockingParticipantList }>
<>
{ _participants.map(p => (
<View
key = { p.id }
style = { styles.knockingParticipantListEntry }>
<Avatar
<ParticipantItem
displayName = { p.name }
size = { 48 }
url = { p.loadableAvatarUrl } />
<View style = { styles.knockingParticipantListDetails }>
<Text style = { styles.knockingParticipantListText }>
{ p.name }
</Text>
{ p.email && !HIDDEN_EMAILS.includes(p.email) && (
<Text style = { styles.knockingParticipantListText }>
{ p.email }
</Text>
) }
</View>
<TouchableOpacity
onPress = { this._onRespondToParticipant(p.id, true) }
style = { [
styles.knockingParticipantListButton,
styles.knockingParticipantListPrimaryButton
] }>
<Text style = { styles.knockingParticipantListText }>
{ t('lobby.allow') }
</Text>
</TouchableOpacity>
<TouchableOpacity
onPress = { this._onRespondToParticipant(p.id, false) }
style = { [
styles.knockingParticipantListButton,
styles.knockingParticipantListSecondaryButton
] }>
<Text style = { styles.knockingParticipantListText }>
{ t('lobby.reject') }
</Text>
</TouchableOpacity>
{_showChatButton(p) ? (
<TouchableOpacity
onPress = { this._onInitializeLobbyChat(p.id) }
style = { [
styles.knockingParticipantListButton,
styles.knockingParticipantListSecondaryButton
] }>
<Text style = { styles.knockingParticipantListText }>
{ t('lobby.chat') }
</Text>
</TouchableOpacity>
) : null}
isKnockingParticipant = { true }
key = { p.id }
participantID = { p.id }>
<Button
labelKey = { 'lobby.admit' }
onClick = { this._onRespondToParticipant(p.id, true) }
style = { styles.lobbyButtonAdmit }
type = { BUTTON_TYPES.PRIMARY } />
{
_showChatButton(p)
? (
<Button
labelKey = { 'lobby.chat' }
onClick = { this._onInitializeLobbyChat(p.id) }
style = { styles.lobbyButtonChat }
type = { BUTTON_TYPES.SECONDARY } />
) : null
}
<Button
labelKey = { 'lobby.reject' }
onClick = { this._onRespondToParticipant(p.id, false) }
style = { styles.lobbyButtonReject }
type = { BUTTON_TYPES.DESTRUCTIVE } />
</ParticipantItem>
</View>
)) }
</ScrollView>
</>
);
}
@@ -168,6 +143,7 @@ class KnockingParticipantList extends PureComponent<Props> {
if (this.props._isPollsDisabled) {
return navigate(screen.conference.chat);
}
navigate(screen.conference.chatandpolls.main);
};
}

View File

@@ -16,6 +16,7 @@ import { LargeVideo } from '../../../large-video/components';
import { navigate }
from '../../../mobile/navigation/components/lobby/LobbyNavigationContainerRef';
import { screen } from '../../../mobile/navigation/routes';
import { preJoinStyles } from '../../../prejoin/components/native/styles';
import AudioMuteButton from '../../../toolbox/components/AudioMuteButton';
import VideoMuteButton from '../../../toolbox/components/VideoMuteButton';
import AbstractLobbyScreen, {
@@ -48,32 +49,39 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
* @inheritdoc
*/
render() {
const { _aspectRatio } = this.props;
const { _aspectRatio, _roomName } = this.props;
let contentWrapperStyles;
let contentContainerStyles;
let largeVideoContainerStyles;
if (_aspectRatio === ASPECT_RATIO_NARROW) {
contentWrapperStyles = styles.contentWrapper;
largeVideoContainerStyles = styles.largeVideoContainer;
contentWrapperStyles = preJoinStyles.contentWrapper;
largeVideoContainerStyles = preJoinStyles.largeVideoContainer;
contentContainerStyles = styles.contentContainer;
} else {
contentWrapperStyles = styles.contentWrapperWide;
largeVideoContainerStyles = styles.largeVideoContainerWide;
contentContainerStyles = styles.contentContainerWide;
contentWrapperStyles = preJoinStyles.contentWrapperWide;
largeVideoContainerStyles = preJoinStyles.largeVideoContainerWide;
contentContainerStyles = preJoinStyles.contentContainerWide;
}
return (
<JitsiScreen
safeAreaInsets = { [ 'left' ] }
safeAreaInsets = { [ 'right' ] }
style = { contentWrapperStyles }>
<BrandingImageBackground />
<View style = { largeVideoContainerStyles }>
<View style = { preJoinStyles.displayRoomNameBackdrop }>
<Text
numberOfLines = { 1 }
style = { preJoinStyles.preJoinRoomName }>
{ _roomName }
</Text>
</View>
<LargeVideo />
</View>
<View style = { contentContainerStyles }>
{ this._renderContent() }
{ this._renderToolbarButtons() }
{ this._renderContent() }
</View>
</JitsiScreen>
);
@@ -122,15 +130,10 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
*/
_renderJoining() {
return (
<View>
<View style = { styles.lobbyWaitingFragmentContainer }>
<Text style = { styles.lobbyTitle }>
{ this.props.t('lobby.joiningTitle') }
</Text>
<Text
numberOfLines = { 1 }
style = { styles.lobbyRoomName }>
{ this.props._roomName }
</Text>
<LoadingIndicator
color = { BaseTheme.palette.icon01 }
style = { styles.loadingIndicator } />
@@ -153,7 +156,7 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
return (
<Input
customStyles = {{ input: styles.customInput }}
customStyles = {{ input: preJoinStyles.customInput }}
onChange = { this._onChangeDisplayName }
placeholder = { t('lobby.nameField') }
value = { displayName } />
@@ -178,19 +181,15 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
const { _passwordJoinFailed, t } = this.props;
return (
<View style = { styles.formWrapper }>
<Input
autoCapitalize = 'none'
autoCompleteType = 'off'
customStyles = {{ input: styles.customInput }}
onChange = { this._onChangePassword }
placeholder = { t('lobby.passwordField') }
secureTextEntry = { true }
value = { this.state.password } />
{ _passwordJoinFailed && <Text style = { styles.fieldError }>
{ t('lobby.invalidPassword') }
</Text> }
</View>
<Input
autoCapitalize = 'none'
autoCompleteType = 'off'
customStyles = {{ input: styles.customInput }}
error = { _passwordJoinFailed }
onChange = { this._onChangePassword }
placeholder = { t('lobby.passwordField') }
secureTextEntry = { true }
value = { this.state.password } />
);
}
@@ -201,20 +200,20 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
*/
_renderPasswordJoinButtons() {
return (
<View style = { styles.passwordJoinButtonsWrapper }>
<View style = { styles.passwordJoinButtons }>
<Button
accessibilityLabel = 'lobby.passwordJoinButton'
disabled = { !this.state.password }
labelKey = { 'lobby.passwordJoinButton' }
onClick = { this._onJoinWithPassword }
style = { preJoinStyles.joinButton }
type = { BUTTON_TYPES.PRIMARY } />
<Button
accessibilityLabel = 'lobby.backToKnockModeButton'
labelKey = 'lobby.backToKnockModeButton'
onClick = { this._onSwitchToKnockMode }
style = { styles.lobbyButton }
type = { BUTTON_TYPES.PRIMARY } />
<Button
accessibilityLabel = 'lobby.passwordJoinButton'
disabled = { !this.state.password }
labelKey = 'lobby.passwordJoinButton'
onClick = { this._onJoinWithPassword }
style = { styles.lobbyButton }
type = { BUTTON_TYPES.PRIMARY } />
style = { preJoinStyles.joinButton }
type = { BUTTON_TYPES.TERTIARY } />
</View>
);
}
@@ -225,21 +224,12 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
* @inheritdoc
*/
_renderToolbarButtons() {
const { _aspectRatio } = this.props;
let toolboxContainerStyles;
if (_aspectRatio === ASPECT_RATIO_NARROW) {
toolboxContainerStyles = styles.toolboxContainer;
} else {
toolboxContainerStyles = styles.toolboxContainerWide;
}
return (
<View style = { toolboxContainerStyles }>
<View style = { preJoinStyles.toolboxContainer }>
<AudioMuteButton
styles = { styles.buttonStylesBorderless } />
styles = { preJoinStyles.buttonStylesBorderless } />
<VideoMuteButton
styles = { styles.buttonStylesBorderless } />
styles = { preJoinStyles.buttonStylesBorderless } />
</View>
);
}
@@ -254,14 +244,14 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
const { displayName } = this.state;
return (
<View style = { styles.standardButtonWrapper }>
<View style = { styles.formWrapper }>
{
_knocking && _isLobbyChatActive
&& <Button
accessibilityLabel = 'toolbar.openChat'
labelKey = 'toolbar.openChat'
onClick = { this._onNavigateToLobbyChat }
style = { styles.openChatButton }
style = { preJoinStyles.joinButton }
type = { BUTTON_TYPES.PRIMARY } />
}
{
@@ -271,7 +261,7 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
disabled = { !displayName }
labelKey = 'lobby.knockButton'
onClick = { this._onAskToJoin }
style = { styles.lobbyButton }
style = { preJoinStyles.joinButton }
type = { BUTTON_TYPES.PRIMARY } />
}
{
@@ -280,7 +270,7 @@ class LobbyScreen extends AbstractLobbyScreen<Props> {
accessibilityLabel = 'lobby.enterPasswordButton'
labelKey = 'lobby.enterPasswordButton'
onClick = { this._onSwitchToPasswordMode }
style = { styles.enterPasswordButton }
style = { preJoinStyles.joinButton }
type = { BUTTON_TYPES.PRIMARY } />
}
</View>

View File

@@ -1,32 +1,8 @@
// @flow
import BaseTheme from '../../../base/ui/components/BaseTheme.native';
const SECONDARY_COLOR = BaseTheme.palette.border04;
const lobbyText = {
...BaseTheme.typography.heading5,
color: BaseTheme.palette.text01,
textAlign: 'center'
};
export default {
buttonStylesBorderless: {
iconStyle: {
color: BaseTheme.palette.icon01,
fontSize: 24
},
style: {
flexDirection: 'row',
justifyContent: 'center',
marginHorizontal: BaseTheme.spacing[3],
height: 24,
width: 24
},
underlayColor: 'transparent'
},
lobbyChatWrapper: {
backgroundColor: BaseTheme.palette.ui01,
alignItems: 'stretch',
@@ -35,118 +11,32 @@ export default {
height: '100%'
},
lobbyChatHeader: {
flexDirection: 'row',
padding: 20
},
lobbyChatTitle: {
color: BaseTheme.palette.text01,
fontSize: 20,
fontWeight: 'bold',
flexShrink: 1
},
lobbyChatCloseButton: {
fontSize: 24,
marginLeft: BaseTheme.spacing[3],
marginTop: BaseTheme.spacing[1],
color: BaseTheme.palette.icon01
},
contentWrapper: {
flex: 1
},
contentWrapperWide: {
flex: 1,
flexDirection: 'row'
},
largeVideoContainer: {
minHeight: '50%'
},
largeVideoContainerWide: {
height: '100%',
marginRight: 'auto',
position: 'absolute',
width: '50%'
passwordJoinButtons: {
top: 40
},
contentContainer: {
alignSelf: 'center',
display: 'flex',
justifyContent: 'center',
minHeight: '50%',
paddingHorizontal: BaseTheme.spacing[3],
width: 400
},
contentContainerWide: {
alignItems: 'center',
height: '100%',
backgroundColor: BaseTheme.palette.uiBackground,
bottom: 0,
display: 'flex',
height: 388,
justifyContent: 'center',
left: '50%',
paddingHorizontal: BaseTheme.spacing[3],
position: 'absolute',
width: '50%'
},
toolboxContainer: {
alignItems: 'center',
display: 'flex',
flexDirection: 'row',
justifyContent: 'center',
marginTop: BaseTheme.spacing[3]
},
toolboxContainerWide: {
flexDirection: 'row',
justifyContent: 'center',
marginTop: BaseTheme.spacing[3]
},
displayNameText: {
fontWeight: 'bold',
marginVertical: 10
},
editButton: {
alignSelf: 'flex-end',
paddingHorizontal: 10
},
editIcon: {
color: 'black',
fontSize: 16
width: '100%',
zIndex: 1
},
formWrapper: {
alignSelf: 'stretch',
justifyContent: 'center',
marginTop: 38
alignItems: 'center',
justifyContent: 'center'
},
customInput: {
marginHorizontal: BaseTheme.spacing[3],
textAlign: 'center'
},
fieldError: {
color: BaseTheme.palette.warning03,
marginLeft: BaseTheme.spacing[3],
fontSize: 16
},
fieldLabel: {
...BaseTheme.typography.heading6,
color: BaseTheme.palette.text01,
textAlign: 'center'
},
standardButtonWrapper: {
alignSelf: 'stretch'
position: 'relative',
textAlign: 'center',
top: BaseTheme.spacing[6],
width: 352
},
joiningMessage: {
@@ -155,84 +45,58 @@ export default {
textAlign: 'center'
},
passwordJoinButtonsWrapper: {
alignItems: 'stretch',
alignSelf: 'stretch',
marginHorizontal: BaseTheme.spacing[3]
},
loadingIndicator: {
marginBottom: BaseTheme.spacing[3]
},
participantBox: {
alignItems: 'center',
alignSelf: 'stretch',
borderColor: SECONDARY_COLOR,
borderRadius: 4,
borderWidth: 1,
marginVertical: 18,
paddingVertical: 12
},
lobbyButton: {
marginTop: BaseTheme.spacing[3]
},
openChatButton: {
marginHorizontal: BaseTheme.spacing[3],
marginTop: BaseTheme.spacing[3]
},
enterPasswordButton: {
marginHorizontal: BaseTheme.spacing[3],
marginTop: BaseTheme.spacing[3]
},
// KnockingParticipantList
knockingParticipantList: {
alignSelf: 'stretch',
backgroundColor: 'rgba(22, 38, 55, 0.8)',
flexDirection: 'column'
backgroundColor: BaseTheme.palette.ui01
},
knockingParticipantListButton: {
borderRadius: 4,
marginHorizontal: 3,
paddingHorizontal: 10,
paddingVertical: 5
},
knockingParticipantListDetails: {
flex: 1,
marginLeft: 10
marginLeft: BaseTheme.spacing[2]
},
knockingParticipantListEntry: {
alignItems: 'center',
flexDirection: 'row',
padding: 10
},
knockingParticipantListPrimaryButton: {
backgroundColor: 'rgb(3, 118, 218)'
},
knockingParticipantListSecondaryButton: {
backgroundColor: 'transparent'
backgroundColor: BaseTheme.palette.ui01,
flexDirection: 'row'
},
knockingParticipantListText: {
color: 'white'
},
lobbyTitle: {
...lobbyText
lobbyButtonAdmit: {
position: 'absolute',
right: 184,
top: 6
},
lobbyRoomName: {
...lobbyText,
marginBottom: BaseTheme.spacing[2]
lobbyButtonChat: {
position: 'absolute',
right: 104,
top: 6
},
lobbyButtonReject: {
position: 'absolute',
right: 16,
top: 6
},
lobbyTitle: {
...BaseTheme.typography.heading5,
color: BaseTheme.palette.text01,
marginBottom: BaseTheme.spacing[3],
textAlign: 'center'
},
lobbyWaitingFragmentContainer: {
height: 260
}
};

View File

@@ -7,8 +7,6 @@ import { isLocalParticipantModerator } from '../../../base/participants/function
import { connect } from '../../../base/redux/functions';
import Switch from '../../../base/ui/components/web/Switch';
import { isInBreakoutRoom } from '../../../breakout-rooms/functions';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { toggleLobbyMode } from '../../actions';
interface IProps extends WithTranslation {

View File

@@ -1,9 +1,9 @@
/* eslint-disable lines-around-comment */
import ReducerRegistry from '../../base/redux/ReducerRegistry';
import { set } from '../../base/redux/functions';
// @ts-ignore
import CallKit from './CallKit';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import ConnectionService from './ConnectionService';
import { _SET_CALL_INTEGRATION_SUBSCRIPTIONS } from './actionTypes';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import { IReduxState } from '../../app/types';
import { translate } from '../../base/i18n/functions';
import {
@@ -9,9 +8,9 @@ import { connect } from '../../base/redux/functions';
import {
AbstractButton,
type AbstractButtonProps
// @ts-ignore
} from '../../base/toolbox/components';
// @ts-ignore
import { setOverflowMenuVisible } from '../../toolbox/actions';
import { toggleNoiseSuppression } from '../actions';
import { isNoiseSuppressionEnabled } from '../functions';

View File

@@ -10,6 +10,7 @@ export function isOldJitsiMeetElectronApp() {
return false;
}
// @ts-ignore
const match = navigator.userAgent.match(/(JitsiMeet)\s*\/\s*((\d+)\.[^\s]*)/);
if (!Array.isArray(match) || match.length < 3) {

View File

@@ -33,7 +33,6 @@ const BreakoutRoomParticipantItem = ({ item, room }: Props) => {
return (
<ParticipantItem
displayName = { item.displayName || defaultRemoteDisplayName }
isKnockingParticipant = { false }
isModerator = { isParticipantModerator(item) }
key = { item.jid }
onPress = { onPress }

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
import { useDispatch } from 'react-redux';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { useSelector } from 'react-redux';
@@ -11,6 +10,7 @@ import ContextMenu from '../../../../../base/ui/components/web/ContextMenu';
import ContextMenuItemGroup from '../../../../../base/ui/components/web/ContextMenuItemGroup';
import { getBreakoutRooms } from '../../../../../breakout-rooms/functions';
import { showOverflowDrawer } from '../../../../../toolbox/functions.web';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import SendToRoomButton from '../../../../../video-menu/components/web/SendToRoomButton';
import { AVATAR_SIZE } from '../../../../constants';

View File

@@ -1,18 +1,14 @@
// @flow
import React, { useCallback } from 'react';
import { useDispatch } from 'react-redux';
import { hasRaisedHand } from '../../../base/participants';
import Button from '../../../base/ui/components/native/Button';
import { BUTTON_TYPES } from '../../../base/ui/constants.native';
import { approveKnockingParticipant } from '../../../lobby/actions.native';
import { showContextMenuReject } from '../../actions.native';
import { MEDIA_STATE } from '../../constants';
import { setKnockingParticipantApproval } from '../../../lobby/actions.native';
import ParticipantItem from './ParticipantItem';
import styles from './styles';
type Props = {
/**
@@ -23,25 +19,26 @@ type Props = {
export const LobbyParticipantItem = ({ participant: p }: Props) => {
const dispatch = useDispatch();
const admit = useCallback(() => dispatch(approveKnockingParticipant(p.id), [ dispatch ]));
const openContextMenuReject = useCallback(() => dispatch(showContextMenuReject(p), [ dispatch ]));
const admit = useCallback(() => dispatch(setKnockingParticipantApproval(p.id, true), [ dispatch ]));
const reject = useCallback(() => dispatch(setKnockingParticipantApproval(p.id, false), [ dispatch ]));
return (
<ParticipantItem
audioMediaState = { MEDIA_STATE.NONE }
displayName = { p.name }
isKnockingParticipant = { true }
local = { p.local }
onPress = { openContextMenuReject }
participant = { p }
participantID = { p.id }
raisedHand = { hasRaisedHand(p) }
videoMediaState = { MEDIA_STATE.NONE }>
key = { p.id }
participantID = { p.id } >
<Button
accessibilityLabel = 'lobby.reject'
labelKey = 'lobby.reject'
onClick = { reject }
style = { styles.lobbyButtonReject }
type = { BUTTON_TYPES.DESTRUCTIVE } />
<Button
accessibilityLabel = 'lobby.admit'
labelKey = 'lobby.admit'
onClick = { admit }
style = { styles.participantActionsButtonAdmit }
style = { styles.lobbyButtonAdmit }
type = { BUTTON_TYPES.PRIMARY } />
</ParticipantItem>
);

View File

@@ -32,8 +32,8 @@ const LobbyParticipantList = () => {
const title = (
<View style = { styles.lobbyListDetails } >
<Text style = { styles.lobbyListDescription }>
{t('participantsPane.headings.waitingLobby',
{ count: participants.length })}
{ t('participantsPane.headings.waitingLobby',
{ count: participants.length }) }
</Text>
{
participants.length > 1 && (

View File

@@ -1,5 +1,3 @@
// @flow
import React, { PureComponent } from 'react';
import { translate } from '../../../base/i18n';
@@ -152,7 +150,6 @@ class MeetingParticipantItem extends PureComponent<Props> {
audioMediaState = { _audioMediaState }
disableModeratorIndicator = { _disableModeratorIndicator }
displayName = { _displayName }
isKnockingParticipant = { false }
isModerator = { _isModerator }
local = { _local }
onPress = { this._onPress }
@@ -202,5 +199,3 @@ function mapStateToProps(state, ownProps): Object {
export default translate(connect(mapStateToProps)(MeetingParticipantItem));

View File

@@ -77,7 +77,7 @@ function ParticipantItem({
children,
displayName,
disableModeratorIndicator,
isKnockingParticipant,
isKnockingParticipant = false,
isModerator,
local,
onPress,
@@ -109,11 +109,11 @@ function ParticipantItem({
numberOfLines = { 1 }
style = { styles.participantName }>
{ displayName }
{local && ` (${t('chat.you')})` }
{ local && ` (${t('chat.you')})` }
</Text>
</View>
{isModerator && !disableModeratorIndicator
&& <Text style = { styles.moderatorLabel }>{t('videothumbnail.moderator')}</Text>
{ isModerator && !disableModeratorIndicator
&& <Text style = { styles.moderatorLabel }>{ t('videothumbnail.moderator') }</Text>
}
</View>
{
@@ -121,8 +121,8 @@ function ParticipantItem({
&& <>
{ raisedHand && <RaisedHandIndicator /> }
<View style = { styles.participantStatesContainer }>
<View style = { styles.participantStateVideo }>{VideoStateIcons[videoMediaState]}</View>
<View>{AudioStateIcons[audioMediaState]}</View>
<View style = { styles.participantStateVideo }>{ VideoStateIcons[videoMediaState] }</View>
<View>{ AudioStateIcons[audioMediaState] }</View>
</View>
</>
}

View File

@@ -56,6 +56,12 @@ const contextMenuItem = {
export default {
participantActionsButtonAdmit: {
marginRight: BaseTheme.spacing[3],
position: 'absolute',
right: 88
},
participantActionsButtonReject: {
marginRight: BaseTheme.spacing[3],
position: 'absolute',
right: 0
@@ -69,8 +75,6 @@ export default {
participantContainer: {
alignItems: 'center',
borderBottomColor: BaseTheme.palette.field01Hover,
borderBottomWidth: 2,
display: 'flex',
flexDirection: 'row',
height: BaseTheme.spacing[9],
@@ -81,6 +85,8 @@ export default {
participantContent: {
alignItems: 'center',
borderBottomColor: BaseTheme.palette.field01Hover,
borderBottomWidth: 2.4,
display: 'flex',
flexDirection: 'row',
height: '100%',
@@ -145,7 +151,17 @@ export default {
},
lobbyListContent: {
height: '16%'
height: '24%'
},
lobbyButtonAdmit: {
position: 'absolute',
right: 16
},
lobbyButtonReject: {
position: 'absolute',
right: 104
},
lobbyListDescription: {
@@ -170,11 +186,11 @@ export default {
},
meetingListContainer: {
height: '58%'
height: '56%'
},
meetingListFullContainer: {
height: '82%'
height: '80%'
},
meetingListDescription: {
@@ -183,7 +199,7 @@ export default {
},
collapsibleRoomContainer: {
height: '30%'
height: '32%'
},
participantsPaneContainer: {

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector } from 'react-redux';
@@ -29,14 +28,10 @@ import {
import ContextMenu from '../../../base/ui/components/web/ContextMenu';
import ContextMenuItemGroup from '../../../base/ui/components/web/ContextMenuItemGroup';
import { isInBreakoutRoom } from '../../../breakout-rooms/functions';
import {
openSettingsDialog,
shouldShowModeratorSettings
// @ts-ignore
} from '../../../settings';
import { openSettingsDialog } from '../../../settings/actions';
import { SETTINGS_TABS } from '../../../settings/constants';
// @ts-ignore
import { MuteEveryonesVideoDialog } from '../../../video-menu/components';
import { shouldShowModeratorSettings } from '../../../settings/functions.web';
import MuteEveryonesVideoDialog from '../../../video-menu/components/web/MuteEveryonesVideoDialog';
const useStyles = makeStyles()(theme => {
return {

View File

@@ -1,5 +1,3 @@
// eslint-disable-next-line lines-around-comment
import React, { useCallback, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useSelector } from 'react-redux';
@@ -12,8 +10,6 @@ import Button from '../../../base/ui/components/web/Button';
import ContextMenu from '../../../base/ui/components/web/ContextMenu';
import ContextMenuItemGroup from '../../../base/ui/components/web/ContextMenuItemGroup';
import { BUTTON_TYPES } from '../../../base/ui/constants.web';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { showLobbyChatButton } from '../../../lobby/functions';
import { ACTION_TRIGGER, MEDIA_STATE } from '../../constants';
import { useLobbyActions } from '../../hooks';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector } from 'react-redux';
@@ -11,6 +10,7 @@ import { IconCheck, IconCloseLarge } from '../../../base/icons/svg';
import { withPixelLineHeight } from '../../../base/styles/functions.web';
import { admitMultiple } from '../../../lobby/actions.web';
import { getKnockingParticipants, getLobbyEnabled } from '../../../lobby/functions';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { Drawer, JitsiPortal } from '../../../toolbox/components/web';
import { showOverflowDrawer } from '../../../toolbox/functions.web';

View File

@@ -1,5 +1,4 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector } from 'react-redux';
@@ -18,8 +17,7 @@ import useContextMenu from '../../../base/ui/hooks/useContextMenu.web';
import { normalizeAccents } from '../../../base/util/strings.web';
import { getBreakoutRooms, getCurrentRoomId, isInBreakoutRoom } from '../../../breakout-rooms/functions';
import { showOverflowDrawer } from '../../../toolbox/functions.web';
// @ts-ignore
import { muteRemote } from '../../../video-menu/actions.any';
import { muteRemote } from '../../../video-menu/actions.web';
import { getSortedParticipantIds, shouldRenderInviteButton } from '../../functions';
import { useParticipantDrawer } from '../../hooks';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useDispatch, useSelector } from 'react-redux';
@@ -14,8 +13,7 @@ import ClickableIcon from '../../../base/ui/components/web/ClickableIcon';
import { BUTTON_TYPES } from '../../../base/ui/constants.web';
import { findAncestorByClass } from '../../../base/ui/functions.web';
import { isAddBreakoutRoomButtonVisible } from '../../../breakout-rooms/functions';
// @ts-ignore
import { MuteEveryoneDialog } from '../../../video-menu/components/';
import MuteEveryoneDialog from '../../../video-menu/components/web/MuteEveryoneDialog';
import { close } from '../../actions.web';
import {
getParticipantsPaneOpen,
@@ -23,6 +21,7 @@ import {
isMuteAllVisible
} from '../../functions';
import { AddBreakoutRoomButton } from '../breakout-rooms/components/web/AddBreakoutRoomButton';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { RoomList } from '../breakout-rooms/components/web/RoomList';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { Text, View } from 'react-native';
import { useSelector } from 'react-redux';

View File

@@ -1,5 +1,4 @@
/* eslint-disable lines-around-comment */
// @ts-ignore
import React from 'react';
import Button from '../../../base/ui/components/web/Button';

View File

@@ -1,5 +1,4 @@
// @flow
// @ts-expect-error
import { Transport } from '../../../modules/transport';
import {
@@ -30,7 +29,7 @@ export function suspendDetected() {
* type: string
* }}
*/
export function setTransport(transport: ?Transport) {
export function setTransport(transport?: Transport) {
return {
type: SET_TRANSPORT,
transport

View File

@@ -1,16 +1,11 @@
// @flow
import {
PostMessageTransportBackend,
Transport
} from '../../../modules/transport';
// @ts-expect-error
import { PostMessageTransportBackend, Transport } from '../../../modules/transport';
import {
CONFERENCE_JOINED,
CONFERENCE_LEFT
} from '../base/conference';
import { MiddlewareRegistry } from '../base/redux';
import { destroyLocalTracks } from '../base/tracks';
} from '../base/conference/actionTypes';
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
import { destroyLocalTracks } from '../base/tracks/actions';
import { SUSPEND_DETECTED } from './actionTypes';
import {
@@ -18,8 +13,6 @@ import {
suspendDetected
} from './actions';
declare var APP: Object;
MiddlewareRegistry.register(store => next => action => {
const result = next(action);
const { dispatch, getState } = store;
@@ -34,7 +27,7 @@ MiddlewareRegistry.register(store => next => action => {
})
});
transport.on('event', event => {
transport.on('event', (event: { event: string; name: string; }) => {
if (event && event.name === 'power-monitor' && event.event === 'suspend') {
dispatch(suspendDetected());

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import { v4 as uuidv4 } from 'uuid';
import { IStore } from '../app/types';
@@ -17,6 +16,7 @@ import {
getLocalVideoTrack
} from '../base/tracks/functions';
import { openURLInBrowser } from '../base/util/openURLInBrowser';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { executeDialOutRequest, executeDialOutStatusRequest, getDialInfoPageURL } from '../invite/functions';
import { showErrorNotification } from '../notifications/actions';

View File

@@ -10,8 +10,7 @@ import {
StyleProp,
Text,
TextStyle,
View,
ViewStyle
View
} from 'react-native';
import { useDispatch, useSelector } from 'react-redux';
@@ -45,8 +44,9 @@ import AudioMuteButton from '../../../toolbox/components/AudioMuteButton';
import VideoMuteButton from '../../../toolbox/components/VideoMuteButton';
import { isDisplayNameRequired } from '../../functions';
import { IPrejoinProps } from '../../types';
// @ts-ignore
import styles from '../styles';
import { preJoinStyles as styles } from './styles';
const Prejoin: React.FC<IPrejoinProps> = ({ navigation }: IPrejoinProps) => {
@@ -166,29 +166,27 @@ const Prejoin: React.FC<IPrejoinProps> = ({ navigation }: IPrejoinProps) => {
// @ts-ignore
styles = { styles.buttonStylesBorderless } />
</View>
<View style = { styles.formWrapper as StyleProp<ViewStyle> }>
<Input
// @ts-ignore
customStyles = {{ input: styles.customInput }}
onChange = { onChangeDisplayName }
placeholder = { t('dialog.enterDisplayName') }
value = { displayName } />
<Button
accessibilityLabel = 'prejoin.joinMeeting'
disabled = { joinButtonDisabled }
labelKey = 'prejoin.joinMeeting'
// @ts-ignore
onClick = { !isJoining && onJoin }
style = { styles.joinButton }
type = { PRIMARY } />
<Button
accessibilityLabel = 'prejoin.joinMeetingInLowBandwidthMode'
disabled = { joinButtonDisabled }
labelKey = 'prejoin.joinMeetingInLowBandwidthMode'
onClick = { onJoinLowBandwidth }
style = { styles.joinButton }
type = { TERTIARY } />
</View>
<Input
// @ts-ignore
customStyles = {{ input: styles.customInput }}
onChange = { onChangeDisplayName }
placeholder = { t('dialog.enterDisplayName') }
value = { displayName } />
<Button
accessibilityLabel = 'prejoin.joinMeeting'
disabled = { joinButtonDisabled }
labelKey = 'prejoin.joinMeeting'
// @ts-ignore
onClick = { !isJoining && onJoin }
style = { styles.joinButton }
type = { PRIMARY } />
<Button
accessibilityLabel = 'prejoin.joinMeetingInLowBandwidthMode'
disabled = { joinButtonDisabled }
labelKey = 'prejoin.joinMeetingInLowBandwidthMode'
onClick = { onJoinLowBandwidth }
style = { styles.joinButton }
type = { TERTIARY } />
</View>
</JitsiScreen>
);

View File

@@ -1,7 +1,7 @@
import BaseTheme from '../../base/ui/components/BaseTheme.native';
import BaseTheme from '../../../base/ui/components/BaseTheme.native';
export default {
export const preJoinStyles = {
joinButton: {
marginTop: BaseTheme.spacing[3],
@@ -78,11 +78,6 @@ export default {
width: 148
},
formWrapper: {
alignItems: 'center',
justifyContent: 'center'
},
customInput: {
textAlign: 'center',
width: 352

View File

@@ -1,5 +1,3 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { WithTranslation } from 'react-i18next';
import { makeStyles } from 'tss-react/mui';
@@ -9,6 +7,7 @@ import { Avatar } from '../../../../base/avatar';
import { translate } from '../../../../base/i18n/functions';
import Icon from '../../../../base/icons/components/Icon';
import { IconCloseLarge } from '../../../../base/icons/svg';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import Label from '../Label';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import { Theme } from '@mui/material';
import { ClassNameMap, withStyles } from '@mui/styles';
import clsx from 'clsx';
@@ -14,10 +13,10 @@ import { translate } from '../../../base/i18n/functions';
import { raiseHand } from '../../../base/participants/actions';
import { getLocalParticipant, hasRaisedHand } from '../../../base/participants/functions';
import GifsMenu from '../../../gifs/components/web/GifsMenu';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import GifsMenuButton from '../../../gifs/components/web/GifsMenuButton';
import { isGifEnabled, isGifsMenuOpen } from '../../../gifs/functions';
// @ts-ignore
import { dockToolbox } from '../../../toolbox/actions.web';
import { addReactionToBuffer } from '../../actions.any';
import { toggleReactionsMenuVisibility } from '../../actions.web';

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import React, { useCallback } from 'react';
import { WithTranslation } from 'react-i18next';
import { useSelector } from 'react-redux';
@@ -8,6 +7,7 @@ import { isMobileBrowser } from '../../../base/environment/utils';
import { translate } from '../../../base/i18n/functions';
import { IconArrowUp } from '../../../base/icons/svg';
import { connect } from '../../../base/redux/functions';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import ToolboxButtonWithIconPopup from '../../../base/toolbox/components/web/ToolboxButtonWithIconPopup';
import { toggleReactionsMenuVisibility } from '../../actions.web';

View File

@@ -14,11 +14,9 @@ import {
} from '../../../base/dialog';
// @ts-ignore
import { StyleType } from '../../../base/styles';
// @ts-ignore
import { authorizeDropbox, updateDropboxToken } from '../../../dropbox';
import { authorizeDropbox, updateDropboxToken } from '../../../dropbox/actions';
import { isVpaasMeeting } from '../../../jaas/functions';
import { RECORDING_TYPES } from '../../constants';
// @ts-ignore
import { supportsLocalRecording } from '../../functions';
/**

View File

@@ -7,8 +7,6 @@ import { getRoomName } from '../../../base/conference/functions';
import { MEDIA_TYPE } from '../../../base/media/constants';
import { getLocalTrack, getTrackState } from '../../../base/tracks/functions';
import { inIframe } from '../../../base/util/iframeUtils';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { stopLocalVideoRecording } from '../../actions.any';
interface ISelfRecording {

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import { Theme } from '@mui/material';
import { withStyles } from '@mui/styles';
import React from 'react';
@@ -11,14 +10,15 @@ import { IconHighlight } from '../../../../base/icons/svg';
import { MEET_FEATURES } from '../../../../base/jwt/constants';
import Label from '../../../../base/label/components/web/Label';
import { connect } from '../../../../base/redux/functions';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { Tooltip } from '../../../../base/tooltip';
import BaseTheme from '../../../../base/ui/components/BaseTheme.web';
// @ts-ignore
import { maybeShowPremiumFeatureDialog } from '../../../../jaas/actions';
import AbstractHighlightButton, {
type Props as AbstractProps,
_abstractMapStateToProps
// @ts-ignore
} from '../AbstractHighlightButton';
@@ -193,6 +193,7 @@ export class HighlightButton extends AbstractHighlightButton<Props, IState> {
_visible,
classes,
t
// @ts-ignore
} = this.props;

View File

@@ -14,7 +14,6 @@ import Button from '../../../../base/ui/components/web/Button';
import Switch from '../../../../base/ui/components/web/Switch';
import { BUTTON_TYPES } from '../../../../base/ui/constants.web';
import { RECORDING_TYPES } from '../../../constants';
// @ts-ignore
import { getRecordingDurationEstimation } from '../../../functions';
import AbstractStartRecordingDialogContent, {
IProps,

View File

@@ -1,17 +1,20 @@
// @flow
// @ts-ignore
import $ from 'jquery';
import React from 'react';
import { openDialog } from '../base/dialog';
import { IStore } from '../app/types';
import { openDialog } from '../base/dialog/actions';
import { JitsiConferenceEvents } from '../base/lib-jitsi-meet';
import { pinParticipant } from '../base/participants/actions';
import {
getParticipantDisplayName,
getPinnedParticipant,
getVirtualScreenshareParticipantByOwnerId,
pinParticipant
} from '../base/participants';
import { getLocalDesktopTrack, toggleScreensharing } from '../base/tracks';
import { NOTIFICATION_TIMEOUT_TYPE, showNotification } from '../notifications';
getVirtualScreenshareParticipantByOwnerId
} from '../base/participants/functions';
import { toggleScreensharing } from '../base/tracks/actions';
import { getLocalDesktopTrack } from '../base/tracks/functions';
import { showNotification } from '../notifications/actions';
import { NOTIFICATION_TIMEOUT_TYPE } from '../notifications/constants';
import { isScreenVideoShared } from '../screen-share/functions';
import {
@@ -23,6 +26,8 @@ import {
SET_RECEIVER_TRANSPORT,
SET_REQUESTED_PARTICIPANT
} from './actionTypes';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import { RemoteControlAuthorizationDialog } from './components';
import {
DISCO_REMOTE_CONTROL_FEATURE,
@@ -43,9 +48,8 @@ import logger from './logger';
/**
* Listeners.
*/
let permissionsReplyListener, receiverEndpointMessageListener, stopListener;
declare var APP: Object;
let permissionsReplyListener: Function | undefined,
receiverEndpointMessageListener: Function, stopListener: Function | undefined;
/**
* Signals that the remote control authorization dialog should be displayed.
@@ -72,7 +76,7 @@ export function openRemoteControlAuthorizationDialog(participantId: string) {
* @returns {Function}
*/
export function setRemoteControlActive(active: boolean) {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { active: oldActive } = state['features/remote-control'];
const { conference } = state['features/base/conference'];
@@ -82,7 +86,7 @@ export function setRemoteControlActive(active: boolean) {
type: REMOTE_CONTROL_ACTIVE,
active
});
conference.setLocalParticipantProperty('remoteControlSessionStatus', active);
conference?.setLocalParticipantProperty('remoteControlSessionStatus', active);
}
};
}
@@ -95,7 +99,7 @@ export function setRemoteControlActive(active: boolean) {
* @returns {Function}
*/
export function requestRemoteControl(userId: string) {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const enabled = isRemoteControlEnabled(state);
@@ -110,11 +114,11 @@ export function requestRemoteControl(userId: string) {
const { conference } = state['features/base/conference'];
permissionsReplyListener = (participant, event) => {
permissionsReplyListener = (participant: any, event: any) => {
dispatch(processPermissionRequestReply(participant.getId(), event));
};
conference.on(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, permissionsReplyListener);
conference?.on(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, permissionsReplyListener);
dispatch({
type: SET_REQUESTED_PARTICIPANT,
@@ -140,8 +144,8 @@ export function requestRemoteControl(userId: string) {
* @param {EndpointMessage} event - The permission request event.
* @returns {Function}
*/
export function processPermissionRequestReply(participantId: string, event: Object) {
return (dispatch: Function, getState: Function) => {
export function processPermissionRequestReply(participantId: string, event: any) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { action, name, type } = event;
const { requestedParticipant } = state['features/remote-control'].controller;
@@ -162,11 +166,11 @@ export function processPermissionRequestReply(participantId: string, event: Obje
const { conference } = state['features/base/conference'];
stopListener = (participant, stopEvent) => {
stopListener = (participant: any, stopEvent: { name: string; type: string; }) => {
dispatch(handleRemoteControlStoppedEvent(participant.getId(), stopEvent));
};
conference.on(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, stopListener);
conference?.on(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, stopListener);
dispatch(resume());
@@ -206,7 +210,9 @@ export function processPermissionRequestReply(participantId: string, event: Obje
const virtualScreenshareParticipantId = getVirtualScreenshareParticipantByOwnerId(state, participantId);
const pinnedId = pinnedParticipant?.id;
// @ts-ignore
if (virtualScreenshareParticipantId && pinnedId !== virtualScreenshareParticipantId) {
// @ts-ignore
dispatch(pinParticipant(virtualScreenshareParticipantId));
} else if (!virtualScreenshareParticipantId && pinnedId !== participantId) {
dispatch(pinParticipant(participantId));
@@ -226,7 +232,7 @@ export function processPermissionRequestReply(participantId: string, event: Obje
* @property {string} type - The function process only events with name REMOTE_CONTROL_MESSAGE_NAME.
* @returns {void}
*/
export function handleRemoteControlStoppedEvent(participantId: Object, event: Object) {
export function handleRemoteControlStoppedEvent(participantId: Object, event: { name: string; type: string; }) {
return (dispatch: Function, getState: Function) => {
const state = getState();
const { name, type } = event;
@@ -246,8 +252,8 @@ export function handleRemoteControlStoppedEvent(participantId: Object, event: Ob
* @param {boolean} notifyRemoteParty - If true a endpoint message to the controlled participant will be sent.
* @returns {void}
*/
export function stopController(notifyRemoteParty: boolean = false) {
return (dispatch: Function, getState: Function) => {
export function stopController(notifyRemoteParty = false) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { controlled } = state['features/remote-control'].controller;
@@ -265,7 +271,7 @@ export function stopController(notifyRemoteParty: boolean = false) {
logger.log('Stopping remote control controller.');
conference.off(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, stopListener);
conference?.off(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, stopListener);
stopListener = undefined;
dispatch(pause());
@@ -289,7 +295,7 @@ export function stopController(notifyRemoteParty: boolean = false) {
* @returns {Function}
*/
export function clearRequest() {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const { conference } = getState()['features/base/conference'];
dispatch({
@@ -297,7 +303,7 @@ export function clearRequest() {
requestedParticipant: undefined
});
conference.off(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, permissionsReplyListener);
conference?.off(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, permissionsReplyListener);
permissionsReplyListener = undefined;
};
}
@@ -313,7 +319,7 @@ export function clearRequest() {
* transport: Transport
* }}
*/
export function setReceiverTransport(transport: Object) {
export function setReceiverTransport(transport?: Object) {
return {
type: SET_RECEIVER_TRANSPORT,
transport
@@ -326,7 +332,7 @@ export function setReceiverTransport(transport: Object) {
* @returns {Function}
*/
export function enableReceiver() {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { enabled } = state['features/remote-control'].receiver;
@@ -349,7 +355,8 @@ export function enableReceiver() {
});
connection.addFeature(DISCO_REMOTE_CONTROL_FEATURE, true);
receiverEndpointMessageListener = (participant, message) => {
receiverEndpointMessageListener = (participant: any, message: {
action: string; name: string; type: string; }) => {
dispatch(endpointMessageReceived(participant.getId(), message));
};
conference.on(JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED, receiverEndpointMessageListener);
@@ -401,7 +408,7 @@ export function disableReceiver() {
* @param {boolean} [dontNotifyRemoteParty] - If true a endpoint message to the controller participant will be sent.
* @returns {Function}
*/
export function stopReceiver(dontNotifyLocalParty: boolean = false, dontNotifyRemoteParty: boolean = false) {
export function stopReceiver(dontNotifyLocalParty = false, dontNotifyRemoteParty = false) {
return (dispatch: Function, getState: Function) => {
const state = getState();
const { receiver } = state['features/remote-control'];
@@ -450,8 +457,9 @@ export function stopReceiver(dontNotifyLocalParty: boolean = false, dontNotifyRe
* name REMOTE_CONTROL_MESSAGE_NAME.
* @returns {Function}
*/
export function endpointMessageReceived(participantId: string, message: Object) {
return (dispatch: Function, getState: Function) => {
export function endpointMessageReceived(participantId: string, message: {
action: string; name: string; type: string; }) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const { action, name, type } = message;
if (name !== REMOTE_CONTROL_MESSAGE_NAME) {
@@ -472,7 +480,7 @@ export function endpointMessageReceived(participantId: string, message: Object)
if (type === EVENTS.stop) {
dispatch(stopReceiver(false, true));
} else { // forward the message
transport.sendEvent(message);
transport?.sendEvent(message);
}
} // else ignore
} else {
@@ -489,7 +497,7 @@ export function endpointMessageReceived(participantId: string, message: Object)
* @returns {Function}
*/
export function deny(participantId: string) {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { conference } = state['features/base/conference'];
@@ -507,7 +515,7 @@ export function deny(participantId: string) {
* @returns {Function}
*/
export function sendStartRequest() {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const tracks = state['features/base/tracks'];
const track = getLocalDesktopTrack(tracks);
@@ -518,7 +526,7 @@ export function sendStartRequest() {
return Promise.reject(new Error('Cannot identify screen for the remote control session'));
}
return transport.sendRequest({
return transport?.sendRequest({
name: REMOTE_CONTROL_MESSAGE_NAME,
type: REQUESTS.start,
sourceId
@@ -534,7 +542,7 @@ export function sendStartRequest() {
* @returns {Function}
*/
export function grant(participantId: string) {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
dispatch({
type: SET_CONTROLLER,
controller: participantId
@@ -555,7 +563,7 @@ export function grant(participantId: string) {
true,
false,
{ desktopSharingSources: [ 'screen' ] }
))
)) // @ts-ignore
.then(() => dispatch(sendStartRequest()));
}
@@ -566,7 +574,7 @@ export function grant(participantId: string) {
type: EVENTS.permissions,
action: PERMISSIONS_ACTIONS.grant
}))
.catch(error => {
.catch((error: any) => {
logger.error(error);
sendRemoteControlEndpointMessage(conference, participantId, {
@@ -591,14 +599,16 @@ export function grant(participantId: string) {
* @param {Event} event - The mouse event.
* @returns {Function}
*/
export function mouseClicked(type: string, event: Object) {
return (dispatch: Function, getState: Function) => {
export function mouseClicked(type: string, event: React.MouseEvent) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { conference } = state['features/base/conference'];
const { controller } = state['features/remote-control'];
sendRemoteControlEndpointMessage(conference, controller.controlled, {
type,
// @ts-ignore
button: event.which
});
};
@@ -610,8 +620,8 @@ export function mouseClicked(type: string, event: Object) {
* @param {Event} event - The mouse event.
* @returns {Function}
*/
export function mouseMoved(event: Object) {
return (dispatch: Function, getState: Function) => {
export function mouseMoved(event: React.MouseEvent) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const area = getRemoteConrolEventCaptureArea();
if (!area) {
@@ -637,8 +647,8 @@ export function mouseMoved(event: Object) {
* @param {Event} event - The mouse event.
* @returns {Function}
*/
export function mouseScrolled(event: Object) {
return (dispatch: Function, getState: Function) => {
export function mouseScrolled(event: { deltaX: number; deltaY: number; }) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { conference } = state['features/base/conference'];
const { controller } = state['features/remote-control'];
@@ -658,8 +668,8 @@ export function mouseScrolled(event: Object) {
* @param {Event} event - The key event.
* @returns {Function}
*/
export function keyPressed(type: string, event: Object) {
return (dispatch: Function, getState: Function) => {
export function keyPressed(type: string, event: React.KeyboardEvent) {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { conference } = state['features/base/conference'];
const { controller } = state['features/remote-control'];
@@ -680,7 +690,7 @@ export function keyPressed(type: string, event: Object) {
* @returns {Function}
*/
export function resume() {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const area = getRemoteConrolEventCaptureArea();
const state = getState();
const { controller } = state['features/remote-control'];
@@ -695,22 +705,22 @@ export function resume() {
// FIXME: Once the keyboard shortcuts are using react/redux.
APP.keyboardshortcut.enable(false);
area.mousemove(event => {
area.mousemove((event: React.MouseEvent) => {
dispatch(mouseMoved(event));
});
area.mousedown(event => dispatch(mouseClicked(EVENTS.mousedown, event)));
area.mouseup(event => dispatch(mouseClicked(EVENTS.mouseup, event)));
area.dblclick(event => dispatch(mouseClicked(EVENTS.mousedblclick, event)));
area.mousedown((event: React.MouseEvent) => dispatch(mouseClicked(EVENTS.mousedown, event)));
area.mouseup((event: React.MouseEvent) => dispatch(mouseClicked(EVENTS.mouseup, event)));
area.dblclick((event: React.MouseEvent) => dispatch(mouseClicked(EVENTS.mousedblclick, event)));
area.contextmenu(() => false);
area[0].onwheel = event => {
area[0].onwheel = (event: any) => {
event.preventDefault();
event.stopPropagation();
dispatch(mouseScrolled(event));
return false;
};
$(window).keydown(event => dispatch(keyPressed(EVENTS.keydown, event)));
$(window).keyup(event => dispatch(keyPressed(EVENTS.keyup, event)));
$(window).keydown((event: React.KeyboardEvent) => dispatch(keyPressed(EVENTS.keydown, event)));
$(window).keyup((event: React.KeyboardEvent) => dispatch(keyPressed(EVENTS.keyup, event)));
dispatch({
type: CAPTURE_EVENTS,
@@ -730,7 +740,7 @@ export function resume() {
* @returns {Function}
*/
export function pause() {
return (dispatch: Function, getState: Function) => {
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
const state = getState();
const { controller } = state['features/remote-control'];
const { controlled, isCapturingEvents } = controller;

View File

@@ -1,6 +1,9 @@
// @flow
import React from 'react';
// @ts-expect-error
import VideoLayout from '../../../modules/UI/videolayout/VideoLayout';
import { IReduxState, IStore } from '../app/types';
import { IJitsiConference } from '../base/conference/reducer';
import JitsiMeetJS from '../base/lib-jitsi-meet';
import { enableReceiver, stopReceiver } from './actions';
@@ -14,7 +17,7 @@ import logger from './logger';
* @param {*} state - The redux state.
* @returns {boolean} - True if the remote control is enabled and false otherwise.
*/
export function isRemoteControlEnabled(state: Object) {
export function isRemoteControlEnabled(state: IReduxState) {
return !state['features/base/config'].disableRemoteControl && JitsiMeetJS.isDesktopSharingEnabled();
}
@@ -27,8 +30,8 @@ export function isRemoteControlEnabled(state: Object) {
* @returns {boolean} - True if the message was sent successfully and false otherwise.
*/
export function sendRemoteControlEndpointMessage(
conference: Object,
to: ?string,
conference: IJitsiConference | undefined,
to: string | undefined,
event: Object) {
if (!to) {
logger.warn('Remote control: Skip sending remote control event. Params:', to);
@@ -37,7 +40,7 @@ export function sendRemoteControlEndpointMessage(
}
try {
conference.sendEndpointMessage(to, {
conference?.sendEndpointMessage(to, {
name: REMOTE_CONTROL_MESSAGE_NAME,
...event
});
@@ -59,7 +62,7 @@ export function sendRemoteControlEndpointMessage(
* @param {Store} store - The redux store.
* @returns {void}
*/
export function onRemoteControlAPIEvent(event: Object, { getState, dispatch }: Object) {
export function onRemoteControlAPIEvent(event: { type: string; }, { getState, dispatch }: IStore) {
switch (event.type) {
case EVENTS.supported:
logger.log('Remote Control supported.');
@@ -93,7 +96,7 @@ export function getRemoteConrolEventCaptureArea() {
* @param {KeyboardEvent} event - The event.
* @returns {KEYS} The key that is pressed or undefined.
*/
export function getKey(event: Object) {
export function getKey(event: React.KeyboardEvent) {
return keyboardEventToKey(event);
}
@@ -103,7 +106,7 @@ export function getKey(event: Object) {
* @param {KeyboardEvent} event - The event.
* @returns {Array} With possible values: "shift", "control", "alt", "command".
*/
export function getModifiers(event: Object) {
export function getModifiers(event: React.KeyboardEvent) {
const modifiers = [];
if (event.shiftKey) {

View File

@@ -1,3 +1,5 @@
import React from 'react';
/**
* Enumerates the supported keys.
* NOTE: The maps represents physical keys on the keyboard, not chars.
@@ -145,6 +147,7 @@ const keyCodeToKey = {
* Generate codes for digit keys (0-9).
*/
for (let i = 0; i < 10; i++) {
// @ts-ignore
keyCodeToKey[i + 48] = `${i}`;
}
@@ -154,7 +157,7 @@ for (let i = 0; i < 10; i++) {
for (let i = 0; i < 26; i++) {
const keyCode = i + 65;
keyCodeToKey[keyCode] = String.fromCharCode(keyCode).toLowerCase();
keyCodeToKey[keyCode as keyof typeof keyCodeToKey] = String.fromCharCode(keyCode).toLowerCase();
}
/**
@@ -163,6 +166,6 @@ for (let i = 0; i < 26; i++) {
* @param {KeyboardEvent} event - The event.
* @returns {KEYS} - The key on the keyboard.
*/
export function keyboardEventToKey(event) {
return keyCodeToKey[event.which];
export function keyboardEventToKey(event: React.KeyboardEvent) {
return keyCodeToKey[event.which as keyof typeof keyCodeToKey];
}

View File

@@ -1,5 +1,3 @@
// @flow
import { getLogger } from '../base/logging/functions';
export default getLogger('features/remote-control');

View File

@@ -1,10 +1,10 @@
// @flow
// @ts-expect-error
import { PostMessageTransportBackend, Transport } from '@jitsi/js-utils/transport';
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../base/app';
import { CONFERENCE_JOINED } from '../base/conference';
import { PARTICIPANT_LEFT } from '../base/participants';
import { MiddlewareRegistry } from '../base/redux';
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../base/app/actionTypes';
import { CONFERENCE_JOINED } from '../base/conference/actionTypes';
import { PARTICIPANT_LEFT } from '../base/participants/actionTypes';
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
import {
clearRequest, setReceiverTransport, setRemoteControlActive, stopController, stopReceiver
@@ -51,7 +51,7 @@ MiddlewareRegistry.register(store => next => async action => {
if (transport) {
// We expect here that even if we receive the supported event earlier
// it will be cached and we'll receive it.
transport.on('event', event => {
transport.on('event', (event: { name: string; type: string; }) => {
if (event.name === REMOTE_CONTROL_MESSAGE_NAME) {
onRemoteControlAPIEvent(event, store);

View File

@@ -34,7 +34,12 @@ export interface IRemoteControlState {
receiver: {
controller?: string;
enabled: boolean;
transport?: Object;
transport?: {
dispose: Function;
on: Function;
sendEvent: Function;
sendRequest: Function;
};
};
}

View File

@@ -1,12 +1,10 @@
// @flow
import {
getParticipantById,
getVirtualScreenshareParticipantByOwnerId,
getVirtualScreenshareParticipantOwnerId,
isScreenShareParticipant
} from '../base/participants';
import { StateListenerRegistry } from '../base/redux';
} from '../base/participants/functions';
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
import { pause, resume } from './actions';
@@ -15,7 +13,7 @@ import { pause, resume } from './actions';
*/
StateListenerRegistry.register(
/* selector */ state => {
const { participantId } = state['features/large-video'];
const { participantId = '' } = state['features/large-video'];
const { controller } = state['features/remote-control'];
const { controlled } = controller;

View File

@@ -1,4 +1,3 @@
/* eslint-disable lines-around-comment */
import Spinner from '@atlaskit/spinner';
import React, { useCallback } from 'react';
import { useTranslation } from 'react-i18next';
@@ -102,6 +101,7 @@ const useStyles = makeStyles()(theme => {
border: '1px solid',
borderColor: theme.palette.ui05,
backgroundColor: theme.palette.field01,
// @ts-ignore
color: theme.palette.field02,
borderRadius: theme.shape.borderRadius,
@@ -151,6 +151,7 @@ function SalesforceLinkDialog() {
const renderSpinner = () => (
<div className = { classes.spinner }>
<Spinner
// @ts-ignore
isCompleting = { false }
size = 'medium' />

View File

@@ -1,9 +1,9 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { WithTranslation } from 'react-i18next';
// @ts-ignore
import { AbstractDialogTab } from '../../../base/dialog';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import type { Props as AbstractDialogTabProps } from '../../../base/dialog';
import { translate } from '../../../base/i18n/functions';

View File

@@ -13,7 +13,6 @@ import type { Props as AbstractDialogTabProps } from '../../../base/dialog';
import { translate } from '../../../base/i18n/functions';
import Button from '../../../base/ui/components/web/Button';
import Input from '../../../base/ui/components/web/Input';
// @ts-ignore
import { openLogoutDialog } from '../../actions';
/**

View File

@@ -23,7 +23,6 @@ import {
submitMoreTab,
submitProfileTab,
submitSoundsTab
// @ts-ignore
} from '../../actions';
import { SETTINGS_TABS } from '../../constants';
import {
@@ -31,7 +30,6 @@ import {
getMoreTabProps,
getProfileTabProps,
getSoundsTabProps
// @ts-ignore
} from '../../functions';
// @ts-ignore

View File

@@ -1,9 +1,9 @@
/* eslint-disable lines-around-comment */
import React from 'react';
import { WithTranslation } from 'react-i18next';
// @ts-ignore
import { AbstractDialogTab } from '../../../base/dialog';
// eslint-disable-next-line lines-around-comment
// @ts-ignore
import type { Props as AbstractDialogTabProps } from '../../../base/dialog';
import { translate } from '../../../base/i18n/functions';

Some files were not shown because too many files have changed in this diff Show More