Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
0a728b77a8 chore(ci): bump actions/cache from 4.2.0 to 5.0.4
Bumps [actions/cache](https://github.com/actions/cache) from 4.2.0 to 5.0.4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4.2.0...668228422ae6a00e4ad889ee87cd7109ec5666a7)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 5.0.4
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-26 14:17:52 +00:00
19 changed files with 171 additions and 235 deletions

View File

@@ -97,7 +97,7 @@ jobs:
bundler-cache: true
- run: npx react-native info
- name: Cache CocoaPods
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7
with:
path: |
ios/Pods
@@ -136,7 +136,7 @@ jobs:
npm -v
- run: npm install
- name: Cache Gradle dependencies
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7
with:
path: /root/.gradle
key: ${{ runner.os }}-gradle-${{ hashFiles('android/**/*.gradle*', 'android/gradle.properties', 'android/gradle/wrapper/gradle-wrapper.properties') }}
@@ -181,7 +181,7 @@ jobs:
ruby-version: '3.4'
bundler-cache: true
- name: Cache CocoaPods
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2.0
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 #v5.0.4
with:
path: |
ios/Pods
@@ -208,24 +208,6 @@ jobs:
-framework ios/sdk/out/ios-device.xcarchive/Products/Library/Frameworks/JitsiMeetSDK.framework \
-output ios/sdk/out/JitsiMeetSDK.xcframework
- run: ls -lR ios/sdk/out
react-native-sdk-build:
name: Build mobile SDK (React Native)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f #v6.3.0
with:
node-version-file: '.nvmrc'
cache: 'npm'
- name: Check Node / npm versions
run: |
node -v
npm -v
- run: npm install
- run: |
cd react-native-sdk
node update_sdk_dependencies.js
npm install
debian-build:
name: Test Debian packages build
runs-on: ubuntu-latest

View File

@@ -114,9 +114,6 @@
"error": "Fel: ditt meddelande skickades inte. Orsak: {{error}}",
"everyone": "Alla",
"fieldPlaceHolder": "Skriv ditt meddelande här",
"fileAccessibleTitle": "{{user}} laddade upp en fil",
"fileAccessibleTitleMe": "jag laddade upp en fil",
"fileDeleted": "En fil raderades",
"guestsChatIndicator": "(gäst)",
"lobbyChatMessageTo": "Skicka meddelande",
"message": "Meddelande",
@@ -126,16 +123,8 @@
"messagebox": "Skriv ett meddelande",
"newMessages": "Nytt meddelande",
"nickname": {
"featureChat": "chatt",
"featureClosedCaptions": "textning",
"featureFileSharing": "fildelning",
"featurePolls": "omröstningar",
"popover": "Välj ett namn",
"title": "Skriv in ett namn för att börja använda chatten",
"titleWith1Features": "Ange ett smeknamn för att använda {{feature1}}",
"titleWith2Features": "Ange ett smeknamn för att använda {{feature1}} och {{feature2}}",
"titleWith3Features": "Ange ett smeknamn för att använda {{feature1}}, {{feature2}} och {{feature3}}",
"titleWith4Features": "Ange ett smeknamn för att använda {{feature1}}, {{feature2}}, {{feature3}} och {{feature4}}",
"titleWithCC": "Skriv in ett namn för att börja använda chatten och för undertexter",
"titleWithPolls": "Skriv in ett namn för att börja använda chatten och omröstningar",
"titleWithPollsAndCC": "Skriv in ett namn för att börja använda chatten, omröstningar och undertexter",
@@ -227,9 +216,6 @@
"video_ssrc": "Video SSRC:",
"yes": "Ja"
},
"customPanel": {
"close": "Stäng"
},
"dateUtils": {
"earlier": "Tidigare",
"today": "Idag",
@@ -244,10 +230,10 @@
"downloadMobileApp": "Ladda ner mobilappen",
"ifDoNotHaveApp": "Om du inte har appen än:",
"ifHaveApp": "Om du redan har appen:",
"joinInApp": "Delta i det här mötet med din app",
"joinInApp": "Delta i detta möte med din app",
"joinInAppNew": "Delta i appen",
"joinInBrowser": "Delta på webben",
"launchMeetingLabel": "Hur vill du delta i det här mötet?",
"launchMeetingLabel": "Hur vill du delta i detta möte?",
"launchWebButton": "Starta på webben",
"noDesktopApp": "",
"noMobileApp": "Har du inte appen?",
@@ -294,7 +280,7 @@
"Submit": "Skicka",
"Understand": "Jag förstår, låt min mikrofon vara avstängd tillsvidare",
"UnderstandAndUnmute": "Jag förstår, starta min mikrofon",
"WaitForHostNoAuthMsg": "Konferensen har ännu inte startat eftersom ingen värd har anlänt ännu. Var god vänta.",
"WaitForHostNoAuthMsg": "Konferensen har ännu inte startat eftersom ingen värd har anlänt ännu. Vänligen vänta.",
"WaitingForHostButton": "Vänta på värd",
"WaitingForHostTitle": "Väntar på värden…",
"Yes": "Ja",
@@ -344,7 +330,7 @@
"contactSupport": "Kontakta kundtjänst",
"copied": "Kopierad",
"copy": "Kopiera",
"demoteParticipantDialog": "Är du säker på att du vill flytta den här deltagaren till tittare?",
"demoteParticipantDialog": "Are you sure you want to move this participant to viewer? Är du säker på att du vill flytta denna deltagaren till tittare",
"demoteParticipantTitle": "Flytta till tittare",
"dismiss": "Förkasta",
"displayNameRequired": "Hej, vad heter du?",
@@ -358,18 +344,18 @@
"enterDisplayName": "Ange namn",
"error": "Fel",
"errorRoomCreationRestriction": "Du försökte gå med för snabbt, kom tillbaka om en stund.",
"gracefulShutdown": "Vår tjänst är för tillfället nedstängd för underhåll. Försök senare.",
"grantModeratorDialog": "Är du säker på att du vill göra den här deltagaren till moderator?",
"gracefulShutdown": "Vår tjänst är för tillfället nedstängd för underhåll. Vänligen försök senare.",
"grantModeratorDialog": "Är du säker du vill göra denna deltagare till en moderator?",
"grantModeratorTitle": "Godkänn moderator",
"hide": "Dölj",
"hideShareAudioHelper": "Visa inte den här dialogen igen ",
"hideShareAudioHelper": "Visa inte denna dialog igen ",
"incorrectPassword": "Fel användarnamn eller lösenord",
"incorrectRoomLockPassword": "Felaktigt lösenord",
"internalError": "Ett fel uppstod. Fel: {{error}}",
"internalErrorTitle": "Internt fel",
"kickMessage": "Du kan kontakta {{participantDisplayName}} för mer information.",
"kickParticipantButton": "Ta bort deltagaren från mötet",
"kickParticipantDialog": "Vill du ta bort den här deltagaren från mötet?",
"kickParticipantDialog": "Vill du ta bort denna deltagaren från mötet?",
"kickParticipantTitle": "Tysta deltagaren?",
"kickSystemTitle": "Du har blivit borttagen från mötet",
"kickTitle": "{{participantDisplayName}} tog bort dig från mötet",
@@ -383,9 +369,6 @@
"lockRoom": "Lägg till möte $t(lockRoomPasswordUppercase)",
"lockTitle": "Låsning misslyckades",
"login": "Logga in",
"loginFailed": "Inloggningen misslyckades.",
"loginOnResume": "Din autentiseringssession har gått ut. Du måste logga in igen för att fortsätta mötet.",
"loginPopupBlocked": "Inloggningsfönstret blockerades av din webbläsare.",
"loginQuestion": "Är du säker på att du vill logga in och lämna mötet",
"logoutQuestion": "Är du säker på att du vill logga ut och lämna konferensen?",
"logoutTitle": "Logga ut",
@@ -430,18 +413,18 @@
"muteParticipantsVideoBody": "Du kommer inte att kunna aktivera kameran igen. Däremot kan deltagaren kunna aktivera sin egen kamera när som.",
"muteParticipantsVideoBodyModerationOn": "Du och deltagarna kommer inte att kunna aktivera kameran igen.",
"muteParticipantsVideoButton": "Inaktivera kamera",
"muteParticipantsVideoDialog": "Är du säker du vill inaktivera den här deltagarens kamera. Du kommer inte att kunna aktivera den igen. Däremot kan deltagaren kunna aktivera sin egen kamera när som.",
"muteParticipantsVideoDialog": "Är du säker du vill inaktivera denna deltagares kamera. Du kommer inte att kunna aktivera den igen. Däremot kan deltagaren kunna aktivera sin egen kamera när som.",
"muteParticipantsVideoDialogModerationOn": "Är du säker på att du vill inaktivera den här deltagarens kamera? Du kommer inte att kunna aktivera kameran igen och inte de heller.",
"muteParticipantsVideoTitle": "Inaktivera den här deltagarens kamera?",
"muteParticipantsVideoTitle": "Inaktivera denna deltagares kamera?",
"noDropboxToken": "Ingen giltig dropbox tecken",
"password": "Lösenord",
"passwordLabel": "Mötet har låsts av en deltagare. Ange $t(lockRoomPassword) för att gå med.",
"passwordNotSupported": "Att sätta ett $t(lockRoomPassword) för mötesrummet stöds ej.",
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) stöds inte",
"passwordRequired": "$t(lockRoomPasswordUppercase) krävs",
"permissionCameraRequiredError": "Behörighet krävs för att delta med kamera i det här mötet. Ändra detta i \"Inställningar\".",
"permissionCameraRequiredError": "Tillåtelse krävs för att delta med kamera i denna möte. Var god skaffa detta i \"inställningar\".",
"permissionErrorTitle": "Tillåtelse krävs",
"permissionMicRequiredError": "Behörighet krävs för att delta med mikrofon i det här mötet. Ändra detta i \"Inställningar\".",
"permissionMicRequiredError": "Tillåtelse krävs för att delta med mikrofon i denna möte. Var god skaffa detta i \"inställningar\".",
"readMore": "Mer",
"recentlyUsedObjects": "Dina senaste använda objekt",
"recording": "Inspelning",
@@ -469,14 +452,12 @@
"screenSharingFailed": "Oops! Något gick fel, skärmdelning kunde ej startas.",
"screenSharingFailedTitle": "Skärmdelning misslyckades!",
"screenSharingPermissionDeniedError": "Något är fel med åtkomstinställningarna för skärmdelningen. Ladda om sidan och försök igen.",
"screenshareStoppedDiskSpace": "Det här händer om du använde macOS flytande verktygsfält för att stoppa skärmdelningen. Det har inte stöd för att starta den igen.",
"screenshareStoppedTitle": "Skärmdelningen stoppades via systemet",
"searchInSalesforce": "Sök i Salesforce",
"searchResults": "Sökresultat ({{count}})",
"searchResultsDetailsError": "Något gick fel när ägardata hämtades.",
"searchResultsError": "Något gick fel när data hämtades.",
"searchResultsNotFound": "Inga sökresultat hittades.",
"searchResultsTryAgain": "Försök med andra sökord.",
"searchResultsTryAgain": "Try using alternative keywords.",
"sendPrivateMessage": "Du har fått ett privat meddelande. Tänkte du svara på det privat, eller vill du skicka ditt meddelande till alla deltagare?",
"sendPrivateMessageCancel": "Skicka till alla deltagare",
"sendPrivateMessageOk": "Skicka privat",
@@ -539,7 +520,7 @@
"tokenAuthFailedWithReasons": "Förlåt, du har inte tillåtelse att gå med i det här samtalet. Troliga anledingar: {{reason}}",
"tokenAuthUnsupported": "Token URL är inte tillåten",
"transcribing": "Transkriberar",
"unauthenticatedAccessDisabled": "Det här samtalet kräver identifiering. Logga in för att fortsätta.",
"unauthenticatedAccessDisabled": "Detta samtalet kräver identifiering. Logga in för att fortsätta.",
"unlockRoom": "Ta bort möte $t(lockRoomPassword)",
"user": "Användare",
"userIdentifier": "Användar-ID",
@@ -562,7 +543,7 @@
"title": "Delade dokument"
},
"e2ee": {
"labelToolTip": "Ljud- och videokommunikation för det här samtalet är krypterad från dator till dator"
"labelToolTip": "Ljud- och videokommunikation för detta samtal är krypterad från dator till dator"
},
"embedMeeting": {
"title": "Bädda in möte"
@@ -595,7 +576,6 @@
"newFileNotification": "{{ participantName }} delade '{{ fileName }}'",
"removeFile": "Ta bort",
"removeFileSuccess": "Filen togs bort",
"uploadDisabled": "Inte tillåtet att ladda upp filer. Be en moderator om behörighet för den åtgärden.",
"uploadFailedDescription": "Snälla försök igen.",
"uploadFailedTitle": "Överföring misslyckades",
"uploadFile": "Dela fil"
@@ -623,7 +603,7 @@
"conferenceURL": "Länk:",
"copyNumber": "Kopiera nummer",
"country": "Land",
"dialANumber": "Om du vill gå med i mötet ringer du något av de här numren och fyller sedan i PIN-koden.",
"dialANumber": "Om du vill gå med i mötet ringer du något av dessa nummer och fyller sedan i PIN-koden.",
"dialInConferenceID": "PIN-kod:",
"dialInNotSupported": "Tyvärr stöds inte inringning just nu.",
"dialInNumber": "Inringning:",
@@ -655,14 +635,14 @@
"sipAudioOnly": "SIP endast ljud address",
"title": "Dela",
"tooltip": "Dela länk och information om inringning för mötet",
"upgradeOptions": "Kontrollera om uppgraderingsalternativen är på",
"upgradeOptions": "Vänligen kontrollera om uppgraderingsalternativen är på",
"whiteboardError": "Problem att ladda whiteboard, var god försök senare."
},
"inlineDialogFailure": {
"msg": "Vi slirade lite.",
"retry": "Försök igen",
"support": "Support",
"supportMsg": "Om det här fortsätter att hända, kontakta"
"supportMsg": "Om detta fortsätter hända kontakta"
},
"inviteDialog": {
"alertText": "Det gick inte att bjuda in alla deltagare.",
@@ -729,14 +709,13 @@
"streamIdHelp": "Vad är det här?",
"title": "Direktsändning",
"unavailableTitle": "Livesändning otillgänglig",
"youTubeGoLiveWarning": "Kom ihåg att klicka på \"Gå live\" i YouTube Studio om autostart/autostopp är inaktiverade.",
"youtubeTerms": "Tjänstevillkor för YouTube"
},
"lobby": {
"backToKnockModeButton": "Tillbaka till väntrum",
"chat": "Chatt",
"dialogTitle": "Väntrum",
"disableDialogContent": "Väntrumsläge är för närvarande aktiverat. Den här funktionen säkerställer att oönskade deltagare inte kan gå med i ditt möte. Vill du inaktivera det?",
"disableDialogContent": "Väntrumsläge är för närvarande aktiverat. Denna funktion säkerställer att oönskade deltagare inte kan gå med i ditt möte. Vill du inaktivera det?",
"disableDialogSubmit": "Inaktivera",
"emailField": "Skriv in din mailadress",
"enableDialogPasswordField": "Ange lösenord (valfritt)",
@@ -830,7 +809,7 @@
"desktopMutedRemotelyTitle": "Din skärmdelning har avslutats av {{participantDisplayName}}",
"disabledIframe": "Inbäddning är endast avsedd för demonstrationsändamål, så det här samtalet kommer att kopplas ner om {{timeout}} minuter.",
"disabledIframeSecondaryNative": "Inbäddning {{domain}} är endast avsedd för demonstrationsändamål, så det här samtalet kommer att kopplas ner om {{timeout}} minuter.",
"disabledIframeSecondaryWeb": "Bädda in {{domain}} är bara till för demo, så det här samtalet kommer att kopplas bort inom {{timeout}} minuter. Var god använd <a href='{{jaasDomain}}' rel='nooper noreferrer' target='_blank'>Jitsi som tjänst</a> för att bädda in i produktion.",
"disabledIframeSecondaryWeb": "Bädda in {{domain}} är bara till för demo, så detta samtal kommer att kopplas bort inom {{timeout}} minuter. Var god använd <a href='{{jaasDomain}}' rel='nooper noreferrer' target='_blank'>Jitsi som tjänst</a> för att bädda in i produktion.",
"disconnected": "frånkopplad",
"displayNotifications": "Visa aviseringar för",
"dontRemindMe": "Påminn mig inte",
@@ -853,7 +832,7 @@
"linkToSalesforce": "Länk till Salesforce",
"linkToSalesforceDescription": "Du kan länka mötessammanfattningen till ett Salesforce-objekt.",
"linkToSalesforceError": "Det gick inte att länka mötet till Salesforce",
"linkToSalesforceKey": "Länka det här mötet",
"linkToSalesforceKey": "Länka detta möte",
"linkToSalesforceProgress": "Länkar möte till Salesforce…",
"linkToSalesforceSuccess": "Mötet länkades till Salesforce",
"localRecordingStarted": "{{name}} har påbörjat en lokal inspelning.",
@@ -879,7 +858,7 @@
"newDeviceAudioTitle": "Ny ljudenhet hittad",
"newDeviceCameraTitle": "Ny kamera hittad",
"nextToSpeak": "Du är näst i kö för att prata",
"noiseSuppressionDesktopAudioDescription": "Brusreducering kan inte aktiveras när du delar skrivbordsljud, inaktivera det och försök igen.",
"noiseSuppressionDesktopAudioDescription": "Brusreducering kan inte aktiveras när du delar skrivbordsljud, vänligen inaktivera det och försök igen.",
"noiseSuppressionFailedTitle": "Det gick inte att starta brusreducering",
"noiseSuppressionStereoDescription": "Brusreducering i stereoljud stöds för närvarande inte.",
"oldElectronClientDescription1": "Den version av Jitsi meet som används är gammal och har säkerhetsluckor. Var god uppdatera till den senaste versionen.",
@@ -907,7 +886,7 @@
"suboptimalExperienceTitle": "Webbläsarvarning",
"suggestRecordingAction": "Starta",
"suggestRecordingDescription": "Vill du starta en inspelning?",
"suggestRecordingTitle": "Spela in det här mötett",
"suggestRecordingTitle": "Spela in detta mötet",
"unmute": "Slå på mikrofonen",
"unmuteScreen": "Starta skärmdelning",
"unmuteVideo": "Starta kamera",
@@ -1002,7 +981,7 @@
},
"notification": {
"description": "Öppna fliken omröstningar för att rösta",
"title": "En ny omröstning har blivit tillagd till det här mötet"
"title": "En ny omröstning har blivit tillagd till detta möte"
},
"results": {
"changeVote": "Ändra din röst",
@@ -1035,7 +1014,7 @@
"audioHighQuality": "Vi förväntar oss att ditt ljud har utmärkt kvalitet.",
"audioLowNoVideo": "Vi förväntar oss att din ljudkvalitet är låg och ingen video.",
"goodQuality": "Grymt bra! Din mediekvalitet kommer att bli bra.",
"noMediaConnectivity": "Vi kunde inte upprätta mediaanslutning för det här testet. Det orsakas vanligtvis av en brandvägg eller NAT.",
"noMediaConnectivity": "Vi kunde inte hitta ett sätt att upprätta mediaanslutning för detta test. Detta orsakas vanligtvis av en brandvägg eller NAT.",
"noVideo": "Vi förväntar oss att din video kommer ha låg kvalitet eller inte fungera.",
"testFailed": "Anslutningstestet stötte på oväntade problem, men det behöver inte påverka din upplevelse.",
"undetectable": "Om du fortfarande inte kan ringa i webbläsaren rekommenderar vi att du ser till att dina högtalare, mikrofon och kamera är korrekt inställda, att du har beviljat din webbläsare rättigheter att använda din mikrofon och kamera och att din webbläsarversion är uppdaterad.",
@@ -1049,7 +1028,7 @@
"dialInMeeting": "Ring in till mötet",
"dialInPin": "Ring in till mötet och ange PIN-kod:",
"dialing": "Ringer",
"doNotShow": "Visa inte den här rutan igen",
"doNotShow": "Visa inte denna ruta igen",
"errorDialOut": "Kunde inte ringa ut",
"errorDialOutDisconnected": "Kunde inte ringa ut. Kopplar ner",
"errorDialOutFailed": "Kunde inte ringa ut. Samtal misslyckades",
@@ -1103,7 +1082,7 @@
"raisedHandsLabel": "Antal uppräckta händer",
"record": {
"already": {
"linked": "Mötet är redan länkat till det här Salesforce-objekt."
"linked": "Mötet är redan länkat till detta Salesforce-objekt."
},
"type": {
"account": "Konto",
@@ -1142,7 +1121,7 @@
"localRecordingVideoWarning": "För att spela in din video måste du ha den på när du startar inspelningen",
"localRecordingWarning": "Se till att du väljer den aktuella fliken för att kunna använda rätt video och ljud.",
"loggedIn": "Inloggad som {{userName}}",
"noMicPermission": "Mikrofonspåret kunde inte skapas. Ge tillstånd att använda mikrofonen.",
"noMicPermission": "Mikrofonspåret kunde inte skapas. Vänligen ge tillstånd att använda mikrofonen.",
"noStreams": "Ingen ljud- eller videoström upptäcktes.",
"off": "Inspelningen avslutades",
"offBy": "{{name}} avslutade inspelningen",
@@ -1267,7 +1246,7 @@
"version": "Version"
},
"share": {
"dialInfoText": "\n\n=====\n\nVill du istället ringa in via telefon?\n\n{{defaultDialInNumber}} Klicka på den här länken för att se telefonnumret för det här mötet\n{{dialInfoPageUrl}}",
"dialInfoText": "\n\n=====\n\nVill du istället ringa in via telefon?\n\n{{defaultDialInNumber}} Klicka på den här länken för att se telefonnumret för detta möte\n{{dialInfoPageUrl}}",
"mainText": "Klicka på länken för att delta i mötet:\n{{roomUrl}}"
},
"speaker": "Talare",
@@ -1319,7 +1298,6 @@
"chat": "Öppna eller stäng chattfönster",
"clap": "Applådera",
"closeChat": "Stäng chatten",
"closeCustomPanel": "Stäng",
"closeMoreActions": "Stäng menyn för fler åtgärder",
"closeParticipantsPane": "Stäng deltagarfönstret",
"closedCaptions": "Undertexter",
@@ -1425,11 +1403,9 @@
"chat": "Öppna / stäng chatten",
"clap": "Klappa",
"closeChat": "Stäng chatt",
"closeCustomPanel": "Stäng",
"closeParticipantsPane": "Stäng deltagarrutan",
"closeReactionsMenu": "Stäng meny för reaktioner",
"closedCaptions": "Undertexter",
"copilot": "Copilot",
"disableNoiseSuppression": "Inaktivera brusreducering",
"disableReactionSounds": "Du kan inaktivera reaktionsljud för det här mötet",
"documentClose": "Stäng delat dokument",
@@ -1444,7 +1420,6 @@
"exitFullScreen": "Stäng fullskärm",
"exitTileView": "Stäng panelvy",
"feedback": "Lämna återkoppling",
"fileSharing": "Fildelning",
"giphy": "Växla GIPHY-menyn",
"hangup": "Lämna",
"help": "Hjälp",
@@ -1480,7 +1455,6 @@
"openReactionsMenu": "Öppna meny för reaktioner",
"participants": "Deltagare",
"pip": "Öppna bild-i-bild-läge",
"polls": "Omröstningar",
"privateMessage": "Skicka privat meddelande",
"profile": "Redigera din profil",
"raiseHand": "Räck upp / ta ner din hand",
@@ -1607,7 +1581,6 @@
"addBackground": "Lägg till bakgrund",
"apply": "Tillämpa",
"backgroundEffectError": "Det gick inte att tillämpa bakgrundseffekt.",
"backgroundLimitReached": "Gränsen för anpassade bakgrunder har nåtts",
"blur": "Oskärpa",
"deleteImage": "Ta bort bild",
"desktopShare": "Dela skrivbord",
@@ -1620,8 +1593,7 @@
"image6": "Skog",
"image7": "Soluppgång",
"none": "Ingen",
"oldestBackgroundRemoved": "Den äldsta anpassade bakgrunden har tagits bort för att lägga till den nya.",
"pleaseWait": "Var god vänta…",
"pleaseWait": "Vänligen vänta…",
"removeBackground": "Ta bort bakgrunden",
"slightBlur": "Lätt oskärpa",
"title": "Virtuella bakgrunder",
@@ -1693,7 +1665,7 @@
"recentListEmpty": "Inga tidigare möten. Chatta med ditt team och hitta alla tidigare möten där.",
"recentMeetings": "Dina senaste möten",
"reducedUIText": "Välkommen till {{app}}!",
"roomNameAllowedChars": "Mötesnamn kan inte innehålla de här tecknen: ?, &,:, ', \",%, #.",
"roomNameAllowedChars": "Mötesnamn kan inte innehålla dessa tecken: ?, &,:, ', \",%, #.",
"roomname": "Skriv in rumsnamn",
"roomnameHint": "Ange namnet eller URL:en till mötesrummet du vill ansluta till. Du kan hitta på ett nytt namn, berätta då för de andra du tänker möta så de anger samma namn.",
"sendFeedback": "Ge återkoppling",

View File

@@ -701,7 +701,6 @@
"changeSignIn": "Switch accounts.",
"choose": "Choose a live stream",
"chooseCTA": "Choose a streaming option. You're currently logged in as {{email}}.",
"chooseCTAWithChangeSignIn": "Choose a streaming option. You're currently logged in as {{email}}. <0>Switch accounts.</0>",
"enterStreamKey": "Enter your YouTube live stream key here.",
"error": "Live Streaming failed. Please try again.",
"errorAPI": "An error occurred while accessing your YouTube broadcasts. Please try logging in again.",

View File

@@ -843,8 +843,12 @@ function initCommands() {
const activeSession = getActiveSession(state, mode);
APP.store.dispatch(toggleScreenshotCaptureSummary(false));
conference.stopRecording(activeSession?.id);
if (activeSession && activeSession.id) {
APP.store.dispatch(toggleScreenshotCaptureSummary(false));
conference.stopRecording(activeSession.id);
} else {
logger.error('No recording or streaming session found');
}
},
'initiate-private-chat': participantId => {
const state = APP.store.getState();

10
package-lock.json generated
View File

@@ -66,7 +66,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/v2143.0.0+733e66c6/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2140.0.0+fe26afb0/lib-jitsi-meet.tgz",
"lodash-es": "4.17.23",
"null-loader": "4.0.1",
"optional-require": "1.0.3",
@@ -18593,8 +18593,8 @@
},
"node_modules/lib-jitsi-meet": {
"version": "0.0.0",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2143.0.0+733e66c6/lib-jitsi-meet.tgz",
"integrity": "sha512-scK3ziZG0ceS6i2HzAc/SQWktL98TnfXsg7UmE+YueJpScxisE2ZRwLlAAWPidya4es3dbXixg+JdQEICEuZhQ==",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2140.0.0+fe26afb0/lib-jitsi-meet.tgz",
"integrity": "sha512-kB0VNqd+Ov0aXXY4JssH1A/sb/o5DhKUlfIwsqvqTqlXpX+UI2fmp3OQxB+3dka/SUXvyyeAbzvy7h0Ui5ADqw==",
"license": "Apache-2.0",
"dependencies": {
"@jitsi/js-utils": "^2.6.7",
@@ -40145,8 +40145,8 @@
}
},
"lib-jitsi-meet": {
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2143.0.0+733e66c6/lib-jitsi-meet.tgz",
"integrity": "sha512-scK3ziZG0ceS6i2HzAc/SQWktL98TnfXsg7UmE+YueJpScxisE2ZRwLlAAWPidya4es3dbXixg+JdQEICEuZhQ==",
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2140.0.0+fe26afb0/lib-jitsi-meet.tgz",
"integrity": "sha512-kB0VNqd+Ov0aXXY4JssH1A/sb/o5DhKUlfIwsqvqTqlXpX+UI2fmp3OQxB+3dka/SUXvyyeAbzvy7h0Ui5ADqw==",
"requires": {
"@jitsi/js-utils": "^2.6.7",
"@jitsi/logger": "2.1.1",

View File

@@ -72,7 +72,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/v2143.0.0+733e66c6/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v2140.0.0+fe26afb0/lib-jitsi-meet.tgz",
"lodash-es": "4.17.23",
"null-loader": "4.0.1",
"optional-require": "1.0.3",

View File

@@ -1 +1,6 @@
*.tgz
tsconfig.json
.npmrc
.git
.gitignore
node_modules

View File

@@ -2,7 +2,8 @@
"name": "@jitsi/react-native-sdk",
"version": "0.0.0",
"description": "React Native SDK for Jitsi Meet.",
"main": "index.tsx",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"license": "Apache-2.0",
"author": "",
"homepage": "https://jitsi.org",
@@ -92,9 +93,27 @@
"@babel/plugin-proposal-optional-chaining": "0.0.0"
},
"scripts": {
"build": "tsc -p tsconfig.json",
"postinstall": "node sdk_instructions.js",
"prepare": "node prepare_sdk.js"
"prepare": "node prepare_sdk.js && npm run build"
},
"files": [
"dist",
"android",
"ios",
"index.tsx",
"jitsi-meet-rnsdk.podspec",
"prepare_sdk.js",
"sdk_instructions.js",
"update_dependencies.js",
"update_sdk_dependencies.js",
"README.md",
"images",
"sounds",
"lang",
"modules",
"react"
],
"bugs": {
"url": "https://github.com/jitsi/jitsi-meet/issues"
},

View File

@@ -0,0 +1,17 @@
{
"extends": "../tsconfig.native.json",
"compilerOptions": {
"outDir": "./dist",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"emitDeclarationOnly": false
},
"include": [
"index.tsx"
],
"exclude": [
"node_modules",
"dist"
]
}

View File

@@ -0,0 +1,41 @@
import React from 'react';
import ReactDOM from 'react-dom';
import { I18nextProvider } from 'react-i18next';
import { isMobileBrowser } from '../../../base/environment/utils';
import i18next from '../../../base/i18n/i18next';
import { parseURLParams } from '../../../base/util/parseURLParams';
import { DIAL_IN_INFO_PAGE_PATH_NAME } from '../../constants';
import DialInSummary from '../dial-in-summary/web/DialInSummary';
import NoRoomError from './NoRoomError.web';
/**
* TODO: This seems unused, so we can drop it.
*/
document.addEventListener('DOMContentLoaded', () => {
// @ts-ignore
const { room } = parseURLParams(window.location, true, 'search');
const { href } = window.location;
const ix = href.indexOf(DIAL_IN_INFO_PAGE_PATH_NAME);
const url = (ix > 0 ? href.substring(0, ix) : href) + room;
/* eslint-disable-next-line react/no-deprecated */
ReactDOM.render(
<I18nextProvider i18n = { i18next }>
{ room
? <DialInSummary
className = 'dial-in-page'
clickableNumbers = { isMobileBrowser() }
room = { decodeURIComponent(room) }
url = { url } />
: <NoRoomError className = 'dial-in-page' /> }
</I18nextProvider>,
document.getElementById('react')
);
});
window.addEventListener('beforeunload', () => {
/* eslint-disable-next-line react/no-deprecated */
ReactDOM.unmountComponentAtNode(document.getElementById('react')!);
});

View File

@@ -614,7 +614,13 @@ function _registerForNativeEvents(store: IStore) {
const activeSession = getActiveSession(state, mode);
conference.stopRecording(activeSession?.id);
if (!activeSession?.id) {
logger.error('No recording or streaming session found');
return;
}
conference.stopRecording(activeSession.id);
});
eventEmitter.addListener(ExternalAPI.OVERWRITE_CONFIG, ({ config }: any) => {

View File

@@ -57,7 +57,9 @@ export default class AbstractStopLiveStreamDialog extends Component<IProps> {
const { _session } = this.props;
this.props._conference?.stopRecording(_session?.id);
if (_session) {
this.props._conference?.stopRecording(_session.id);
}
return true;
}

View File

@@ -1,9 +1,8 @@
import React from 'react';
import { Trans } from 'react-i18next';
import { connect } from 'react-redux';
import { IReduxState } from '../../../../app/types';
import { translate } from '../../../../base/i18n/functions.web';
import { translate } from '../../../../base/i18n/functions';
import Dialog from '../../../../base/ui/components/web/Dialog';
import Spinner from '../../../../base/ui/components/web/Spinner';
import {
@@ -276,14 +275,19 @@ class StartLiveStreamDialog
;
}
/**
* FIXME: Ideally this help text would be one translation string
* that also accepts the anchor. This can be done using the Trans
* component of react-i18next but I couldn't get it working...
*/
helpText = (
<Trans
components = { [ <a
key = 'change-sign-in'
onClick = { this._onRequestGoogleSignIn } /> ] }
i18nKey = 'liveStreaming.chooseCTAWithChangeSignIn'
t = { t }
values = {{ email: _googleProfileEmail }} />
<div>
{ `${t('liveStreaming.chooseCTA',
{ email: _googleProfileEmail })} ` }
<a onClick = { this._onRequestGoogleSignIn }>
{ t('liveStreaming.changeSignIn') }
</a>
</div>
);
break;

View File

@@ -102,8 +102,8 @@ export default class AbstractStopRecordingDialog<P extends IProps>
if (localRecordingVideoStop) {
dispatch(setVideoMuted(true));
}
} else {
_conference?.stopRecording(_fileRecordingSession?.id);
} else if (_fileRecordingSession) {
_conference?.stopRecording(_fileRecordingSession.id);
this._toggleScreenshotCapture();
}

View File

@@ -2,7 +2,7 @@
-- jwt is used to validate access
-- Copyright (C) 2023-present 8x8, Inc.
local jid = require "util.jid";
local jid_split = require "util.jid".split;
local hashes = require "util.hashes";
local random = require "util.random";
local st = require("util.stanza");
@@ -18,6 +18,7 @@ local muc_domain = module:get_option_string("muc_internal_domain_base", 'interna
local jigasi_brewery_room_jid = module:get_option_string("muc_jigasi_brewery_jid", 'jigasibrewery@' .. muc_domain);
local jigasi_bare_jid = module:get_option_string("muc_jigasi_jid", "jigasi@auth." .. muc_domain_base);
local focus_jid = module:get_option_string("muc_jicofo_brewery_jid", jigasi_brewery_room_jid .. "/focus");
local main_muc_service;
@@ -42,9 +43,9 @@ local function invite_jigasi(conference, phone_no)
--select least stressed Jigasi
local least_stressed_value = math.huge;
local least_stressed_jigasi_occupant;
local least_stressed_jigasi_jid;
for occupant_jid, occupant in jigasi_brewery_room:each_occupant() do
local _, _, resource = jid.split(occupant_jid);
local _, _, resource = jid_split(occupant_jid);
if resource ~= 'focus' then
local occ = occupant:get_presence();
local stats_child = occ:get_child("stats", "http://jitsi.org/protocol/colibri")
@@ -62,7 +63,7 @@ local function invite_jigasi(conference, phone_no)
local stress_level = tonumber(stats_tag.attr.value);
module:log("debug", "Stressed level %s %s ", stress_level, occupant_jid)
if stress_level < least_stressed_value then
least_stressed_jigasi_occupant = occupant;
least_stressed_jigasi_jid = occupant_jid
least_stressed_value = stress_level
end
end
@@ -70,15 +71,18 @@ local function invite_jigasi(conference, phone_no)
end
end
end
module:log("debug", "Least stressed jigasi selected jid %s value %s", least_stressed_jigasi_occupant.jid, least_stressed_value)
if not least_stressed_jigasi_occupant then
module:log("debug", "Least stressed jigasi selected jid %s value %s", least_stressed_jigasi_jid, least_stressed_value)
if not least_stressed_jigasi_jid then
module:log("error", "Cannot invite jigasi from room %s", jigasi_brewery_room.jid)
return 404, 'Jigasi not found'
end
-- invite Jigasi to join the conference
local _, _, jigasi_res = jid_split(least_stressed_jigasi_jid)
local jigasi_full_jid = jigasi_bare_jid .. "/" .. jigasi_res;
local stanza_id = hashes.sha256(random.bytes(8), true);
local invite_jigasi_stanza = st.iq({ xmlns = "jabber:client", type = "set", to = least_stressed_jigasi_occupant.jid, from = focus_jid, id = stanza_id })
local invite_jigasi_stanza = st.iq({ xmlns = "jabber:client", type = "set", to = jigasi_full_jid, from = focus_jid, id = stanza_id })
:tag("dial", { xmlns = "urn:xmpp:rayo:1", from = "fromnumber", to = phone_no })
:tag("header", { xmlns = "urn:xmpp:rayo:1", name = "JvbRoomName", value = conference })

View File

@@ -141,11 +141,6 @@ end
local main_room = get_room_by_name_and_subdomain(session.jitsi_web_query_room, session.jitsi_web_query_prefix);
local occupant_jid = stanza.attr.from;
if not main_room then
module:log('warn', 'No main room found for %s %s', session.jitsi_web_query_room, session.jitsi_web_query_prefix);
return;
end
occupant = main_room:get_occupant_by_real_jid(occupant_jid);
if main_room._data.breakout_rooms_active and not occupant then
@@ -153,13 +148,10 @@ end
-- not in main room, let's check breakout rooms
for breakout_room_jid, subject in pairs(main_room._data.breakout_rooms or {}) do
local breakout_room = get_room_from_jid(breakout_room_jid);
if breakout_room then
occupant = breakout_room:get_occupant_by_real_jid(occupant_jid);
if occupant then
room = breakout_room;
break;
end
occupant = breakout_room:get_occupant_by_real_jid(occupant_jid);
if occupant then
room = breakout_room;
break;
end
end
else

View File

@@ -279,9 +279,7 @@ function Util:process_and_verify_token(session)
-- We're fetching an public key from an ASAP server
local dotFirst = session.auth_token:find("%.");
if not dotFirst then return false, "not-allowed", "Invalid token" end
local headerPartEncoded = basexx.from_url64(session.auth_token:sub(1,dotFirst-1));
if not headerPartEncoded then return false, "not-allowed", "Invalid token" end
local header, err = json_safe.decode(headerPartEncoded);
local header, err = json_safe.decode(basexx.from_url64(session.auth_token:sub(1,dotFirst-1)));
if err then
return false, "not-allowed", "bad token format";
end

View File

@@ -395,113 +395,5 @@ describe('Desktop sharing', () => {
await p4.waitForNinjaIcon(p2EndpointId);
await p4.waitForRemoteVideo(p1EndpointId);
});
/**
* Verifies that when a participant has camera on and starts screenshare, remote participants
* see both the camera tile and the screenshare tile simultaneously.
* Covers: "Turn video & screenshare on — remotes see both" and
* "Camera on before SS starts — receivers still see SS".
*/
it('camera on when screenshare starts — remotes see both tiles', async () => {
await hangupAllParticipants();
await ensureTwoParticipants();
const { p1, p2 } = ctx;
const p2EndpointId = await p2.getEndpointId();
// p2 starts screenshare while camera is already on
await p2.getToolbar().clickDesktopSharingButton();
// p1 should see the screenshare tile for p2
await checkForScreensharingTile(p2, p1);
// p1 should still see the camera video for p2
await p1.waitForRemoteVideo(p2EndpointId);
// p2 should see their own screenshare tile
await checkForScreensharingTile(p2, p2);
await p2.getToolbar().clickStopDesktopSharingButton();
// screenshare tile should be gone, camera should still be visible
await checkForScreensharingTile(p2, p1, true);
await p1.waitForRemoteVideo(p2EndpointId);
});
/**
* Verifies that when a participant joins with video muted, starts screenshare, and then
* enables their camera, remote participants see both tiles simultaneously.
*/
it('join video muted, start screenshare, enable camera — both tiles visible', async () => {
await hangupAllParticipants();
await ensureTwoParticipants();
const { p1, p2 } = ctx;
const p2EndpointId = await p2.getEndpointId();
// Mute p2's camera via toolbar (ensures v0 track exists but is muted)
await p2.getToolbar().clickVideoMuteButton();
await p1.waitForRemoteVideo(p2EndpointId, true);
// p2 starts screenshare while camera is muted
await p2.getToolbar().clickDesktopSharingButton();
// p1 should see the screenshare tile for p2
await checkForScreensharingTile(p2, p1);
// p2 turns on camera
await p2.getToolbar().clickVideoUnmuteButton();
// p1 should now see both the screenshare tile and the camera video
await checkForScreensharingTile(p2, p1);
await p1.waitForRemoteVideo(p2EndpointId);
});
/**
* Verifies that alternating between starting and stopping the camera and screenshare
* in various orders does not break either stream for remote participants.
*/
it('alternating camera and screenshare toggling', async () => {
await hangupAllParticipants();
await ensureTwoParticipants();
const { p1, p2 } = ctx;
const p2EndpointId = await p2.getEndpointId();
// Start SS with camera on — both should be visible
await p2.getToolbar().clickDesktopSharingButton();
await checkForScreensharingTile(p2, p1);
await p1.waitForRemoteVideo(p2EndpointId);
// Stop camera while SS is active — SS should remain visible
await p2.getToolbar().clickVideoMuteButton();
await checkForScreensharingTile(p2, p1);
await p1.waitForRemoteVideo(p2EndpointId, true);
// Re-enable camera while SS is active — both should be visible again
await p2.getToolbar().clickVideoUnmuteButton();
await checkForScreensharingTile(p2, p1);
await p1.waitForRemoteVideo(p2EndpointId);
// Stop SS while camera is on — camera should remain, SS tile gone
await p2.getToolbar().clickStopDesktopSharingButton();
await checkForScreensharingTile(p2, p1, true);
await p1.waitForRemoteVideo(p2EndpointId);
// Start SS again — both should be visible
await p2.getToolbar().clickDesktopSharingButton();
await checkForScreensharingTile(p2, p1);
await p1.waitForRemoteVideo(p2EndpointId);
// Stop camera then SS — both should be gone
await p2.getToolbar().clickVideoMuteButton();
await p2.getToolbar().clickStopDesktopSharingButton();
await checkForScreensharingTile(p2, p1, true);
await p1.waitForRemoteVideo(p2EndpointId, true);
// Re-enable camera to verify it still works after all the toggling
await p2.getToolbar().clickVideoUnmuteButton();
await p1.waitForRemoteVideo(p2EndpointId);
});
});

View File

@@ -257,7 +257,6 @@ function getDevServerConfig() {
warnings: false
}
},
allowedHosts: 'all',
host: 'localhost',
hot: true,
proxy: [