Compare commits

..

2 Commits

Author SHA1 Message Date
damencho
8cf76b20c7 debug 2025-03-05 07:40:32 -06:00
damencho
44c1633952 feat(tests): Fixes the checks when to use token.
We have few options:
- iframeAPI tests generating tokens via jwtPrivateKeyPath
- tests that just use provided JWT_ACCESS_TOKEN for the first participant to avoid deployments where initial authentication is required
- tests that does not use iframeAPI, but want to use the jwtPrivateKeyPath for a meeting (invite test as JWT_ACCESS_TOKEN does not satisfy some services)
2025-03-04 19:08:04 -06:00
395 changed files with 1096 additions and 1389 deletions

View File

@@ -3,6 +3,12 @@ package org.jitsi.meet.sdk;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.react.bridge.WritableNativeMap;
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
import java.util.HashMap;
/**
* Wraps the name and extra data for events that were broadcasted locally.
*/
@@ -10,21 +16,57 @@ public class BroadcastAction {
private static final String TAG = BroadcastAction.class.getSimpleName();
private final Type type;
private final Bundle data;
private final HashMap<String, Object> data;
public BroadcastAction(Intent intent) {
this.type = Type.buildTypeFromAction(intent.getAction());
this.data = intent.getExtras();
this.data = buildDataFromBundle(intent.getExtras());
}
public Type getType() {
return this.type;
}
public Bundle getData() {
public HashMap<String, Object> getData() {
return this.data;
}
public WritableNativeMap getDataAsWritableNativeMap() {
WritableNativeMap nativeMap = new WritableNativeMap();
for (String key : this.data.keySet()) {
try {
if (this.data.get(key) instanceof Boolean) {
nativeMap.putBoolean(key, (Boolean) this.data.get(key));
} else if (this.data.get(key) instanceof Integer) {
nativeMap.putInt(key, (Integer) this.data.get(key));
} else if (this.data.get(key) instanceof Double) {
nativeMap.putDouble(key, (Double) this.data.get(key));
} else if (this.data.get(key) instanceof String) {
nativeMap.putString(key, (String) this.data.get(key));
} else {
throw new Exception("Unsupported extra data type");
}
} catch (Exception e) {
JitsiMeetLogger.w(TAG + " invalid extra data in event", e);
}
}
return nativeMap;
}
private static HashMap<String, Object> buildDataFromBundle(Bundle bundle) {
HashMap<String, Object> map = new HashMap<>();
if (bundle != null) {
for (String key : bundle.keySet()) {
map.put(key, bundle.get(key));
}
}
return map;
}
enum Type {
SET_AUDIO_MUTED("org.jitsi.meet.SET_AUDIO_MUTED"),
HANG_UP("org.jitsi.meet.HANG_UP"),
@@ -40,9 +82,7 @@ public class BroadcastAction {
SHOW_NOTIFICATION("org.jitsi.meet.SHOW_NOTIFICATION"),
HIDE_NOTIFICATION("org.jitsi.meet.HIDE_NOTIFICATION"),
START_RECORDING("org.jitsi.meet.START_RECORDING"),
STOP_RECORDING("org.jitsi.meet.STOP_RECORDING"),
OVERWRITE_CONFIG("org.jitsi.meet.OVERWRITE_CONFIG"),
SEND_CAMERA_FACING_MODE_MESSAGE("org.jitsi.meet.SEND_CAMERA_FACING_MODE_MESSAGE");
STOP_RECORDING("org.jitsi.meet.STOP_RECORDING");
private final String action;

View File

@@ -91,9 +91,7 @@ public class BroadcastEvent {
VIDEO_MUTED_CHANGED("org.jitsi.meet.VIDEO_MUTED_CHANGED"),
READY_TO_CLOSE("org.jitsi.meet.READY_TO_CLOSE"),
TRANSCRIPTION_CHUNK_RECEIVED("org.jitsi.meet.TRANSCRIPTION_CHUNK_RECEIVED"),
CUSTOM_BUTTON_PRESSED("org.jitsi.meet.CUSTOM_BUTTON_PRESSED"),
CONFERENCE_UNIQUE_ID_SET("org.jitsi.meet.CONFERENCE_UNIQUE_ID_SET"),
RECORDING_STATUS_CHANGED("org.jitsi.meet.RECORDING_STATUS_CHANGED");
CUSTOM_BUTTON_PRESSED("org.jitsi.meet.CUSTOM_BUTTON_PRESSED");
private static final String CONFERENCE_BLURRED_NAME = "CONFERENCE_BLURRED";
private static final String CONFERENCE_FOCUSED_NAME = "CONFERENCE_FOCUSED";
@@ -112,8 +110,6 @@ public class BroadcastEvent {
private static final String READY_TO_CLOSE_NAME = "READY_TO_CLOSE";
private static final String TRANSCRIPTION_CHUNK_RECEIVED_NAME = "TRANSCRIPTION_CHUNK_RECEIVED";
private static final String CUSTOM_BUTTON_PRESSED_NAME = "CUSTOM_BUTTON_PRESSED";
private static final String CONFERENCE_UNIQUE_ID_SET_NAME = "CONFERENCE_UNIQUE_ID_SET";
private static final String RECORDING_STATUS_CHANGED_NAME = "RECORDING_STATUS_CHANGED";
private final String action;
@@ -170,10 +166,6 @@ public class BroadcastEvent {
return TRANSCRIPTION_CHUNK_RECEIVED;
case CUSTOM_BUTTON_PRESSED_NAME:
return CUSTOM_BUTTON_PRESSED;
case CONFERENCE_UNIQUE_ID_SET_NAME:
return CONFERENCE_UNIQUE_ID_SET;
case RECORDING_STATUS_CHANGED_NAME:
return RECORDING_STATUS_CHANGED;
}
return null;

View File

@@ -139,19 +139,4 @@ public class BroadcastIntentHelper {
return intent;
}
public static Intent buildOverwriteConfigIntent(Bundle config) {
Intent intent = new Intent(BroadcastAction.Type.OVERWRITE_CONFIG.getAction());
intent.putExtra("config", config);
return intent;
}
public static Intent buildSendCameraFacingModeMessageIntent(String to, String facingMode) {
Intent intent = new Intent(BroadcastAction.Type.SEND_CAMERA_FACING_MODE_MESSAGE.getAction());
intent.putExtra("to", to);
intent.putExtra("facingMode", facingMode);
return intent;
}
}

View File

@@ -3,9 +3,6 @@ package org.jitsi.meet.sdk;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import com.facebook.react.bridge.Arguments;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
@@ -31,14 +28,7 @@ public class BroadcastReceiver extends android.content.BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
BroadcastAction action = new BroadcastAction(intent);
String actionName = action.getType().getAction();
Bundle data = action.getData();
// For actions without data bundle (like hangup), we create an empty map
// instead of attempting to convert a null bundle to avoid crashes.
if (data != null) {
ReactInstanceManagerHolder.emitEvent(actionName, Arguments.fromBundle(data));
} else {
ReactInstanceManagerHolder.emitEvent(actionName, Arguments.createMap());
}
ReactInstanceManagerHolder.emitEvent(actionName, action.getDataAsWritableNativeMap());
}
}

View File

@@ -101,8 +101,6 @@ class ExternalAPIModule extends ReactContextBaseJavaModule {
constants.put("HIDE_NOTIFICATION", BroadcastAction.Type.HIDE_NOTIFICATION.getAction());
constants.put("START_RECORDING", BroadcastAction.Type.START_RECORDING.getAction());
constants.put("STOP_RECORDING", BroadcastAction.Type.STOP_RECORDING.getAction());
constants.put("OVERWRITE_CONFIG", BroadcastAction.Type.OVERWRITE_CONFIG.getAction());
constants.put("SEND_CAMERA_FACING_MODE_MESSAGE", BroadcastAction.Type.SEND_CAMERA_FACING_MODE_MESSAGE.getAction());
return constants;
}

View File

@@ -272,16 +272,8 @@ public class JitsiMeetActivity extends AppCompatActivity
// }
// protected void onCustomButtonPressed(HashMap<String, Object> extraData) {
// JitsiMeetLogger.i("Custom button pressed: " + extraData);
// }
// protected void onConferenceUniqueIdSet(HashMap<String, Object> extraData) {
// JitsiMeetLogger.i("Conference unique id set: " + extraData);
// }
// protected void onRecordingStatusChanged(HashMap<String, Object> extraData) {
// JitsiMeetLogger.i("Recording status changed: " + extraData);
// }
// JitsiMeetLogger.i("Custom button pressed: " + extraData);
// }
// Activity lifecycle methods
//
@@ -366,18 +358,12 @@ public class JitsiMeetActivity extends AppCompatActivity
case READY_TO_CLOSE:
onReadyToClose();
break;
// case TRANSCRIPTION_CHUNK_RECEIVED:
// onTranscriptionChunkReceived(event.getData());
// break;
// case CUSTOM_BUTTON_PRESSED:
// onCustomButtonPressed(event.getData());
// break;
// case CONFERENCE_UNIQUE_ID_SET:
// onConferenceUniqueIdSet(event.getData());
// break;
// case RECORDING_STATUS_CHANGED:
// onRecordingStatusChanged(event.getData());
// break;
// case TRANSCRIPTION_CHUNK_RECEIVED:
// onTranscriptionChunkReceived(event.getData());
// break;
// case CUSTOM_BUTTON_PRESSED:
// onCustomButtonPressed(event.getData());
// break;
}
}
}

View File

@@ -33,9 +33,10 @@ import org.jitsi.meet.sdk.log.JitsiMeetLogger;
public class JitsiMeetView extends FrameLayout {
/**
* Background color. Should match the background color set in JS.
* Background color used by {@code BaseReactView} and the React Native root
* view.
*/
private static final int BACKGROUND_COLOR = 0xFF040404;
private static final int BACKGROUND_COLOR = 0xFF111111;
/**
* React Native root view.

View File

@@ -2278,10 +2278,8 @@ export default {
* @param {boolean} [requestFeedback=false] if user feedback should be
* @param {string} [hangupReason] the reason for leaving the meeting
* requested
* @param {boolean} [notifyOnConferenceTermination] whether to notify
* the user on conference termination
*/
hangup(requestFeedback = false, hangupReason, notifyOnConferenceTermination) {
hangup(requestFeedback = false, hangupReason) {
APP.store.dispatch(disableReceiver());
this._stopProxyConnection();
@@ -2300,7 +2298,7 @@ export default {
if (requestFeedback) {
const feedbackDialogClosed = (feedbackResult = {}) => {
if (!feedbackResult.wasDialogShown && hangupReason && notifyOnConferenceTermination) {
if (!feedbackResult.wasDialogShown && hangupReason) {
return APP.store.dispatch(
openLeaveReasonDialog(hangupReason)).then(() => feedbackResult);
}

View File

@@ -755,9 +755,6 @@ var config = {
// and microsoftApiApplicationClientID
// enableCalendarIntegration: false,
// Whether to notify when the conference is terminated because it was destroyed.
// notifyOnConferenceDestruction: true,
// The client id for the google APIs used for the calendar integration, youtube livestreaming, etc.
// googleApiApplicationClientID: '<client_id>',
@@ -1567,8 +1564,6 @@ var config = {
// You can enable tokenAuthUrlAutoRedirect which will detect that you have logged in successfully before
// and will automatically redirect to the token service to get the token for the meeting.
// tokenAuthUrlAutoRedirect: false
// An option to respect the context.tenant jwt field compared to the current tenant from the url
// tokenRespectTenant: false,
// You can put an array of values to target different entity types in the invite dialog.
// Valid values are "phone", "room", "sip", "user", "videosipgw" and "email"

View File

@@ -111,7 +111,7 @@ form {
height: $watermarkHeight;
background-size: contain;
background-repeat: no-repeat;
z-index: $watermarkZ;
z-index: $zindex2;
}
.leftwatermark {
@@ -142,7 +142,7 @@ form {
font-size: 11pt;
color: rgba(255,255,255,.50);
text-decoration: none;
z-index: $watermarkZ;
z-index: 100;
}
/**

View File

@@ -174,12 +174,4 @@
}
}
}
@media (max-width: 1024px) { /* Targets iPads and smaller devices */
.item {
.delete-meeting {
display: block !important;
}
}
}
}

View File

@@ -38,8 +38,6 @@ $zindex1: 1;
$zindex2: 2;
$zindex3: 3;
$toolbarZ: 250;
$watermarkZ: 253;
// Place filmstrip videos over toolbar in order
// to make connection info visible.
$filmstripVideosZ: $toolbarZ + 1;

View File

@@ -97,7 +97,4 @@ post_install do |installer|
config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -no-verify-emitted-module-interface'
end
end
# Patch SocketRocket to support TLS 1.3
%x(patch Pods/SocketRocket/SocketRocket/SRSecurityPolicy.m -N < patches/ws-tls13.diff)
end

View File

@@ -2209,6 +2209,6 @@ SPEC CHECKSUMS:
SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d
Yoga: 1dd9dabb9df8fe08f12cd522eae04a2da0e252eb
PODFILE CHECKSUM: 4f6abcf3cec0d9e8e1d5f5d81a35d99adde9ae45
PODFILE CHECKSUM: 8a3e5d019861b37d4159f2d178cc534be3ac528c
COCOAPODS: 1.16.2

View File

@@ -84,10 +84,6 @@
[self _onJitsiMeetViewDelegateEvent:@"CONFERENCE_TERMINATED" withData:data];
}
// - (void)conferenceUniqueIdSet:(NSDictionary *)data {
// [self _onJitsiMeetViewDelegateEvent:@"CONFERENCE_UNIQUE_ID_SET" withData:data];
// }
- (void)conferenceWillJoin:(NSDictionary *)data {
[self _onJitsiMeetViewDelegateEvent:@"CONFERENCE_WILL_JOIN" withData:data];
}
@@ -106,10 +102,6 @@
[self _onJitsiMeetViewDelegateEvent:@"READY_TO_CLOSE" withData:data];
}
// - (void)recordingStatusChanged:(NSDictionary *)data {
// [self _onJitsiMeetViewDelegateEvent:@"RECORDING_STATUS_CHANGED" withData:data];
// }
// - (void)transcriptionChunkReceived:(NSDictionary *)data {
// [self _onJitsiMeetViewDelegateEvent:@"TRANSCRIPTION_CHUNK_RECEIVED" withData:data];
// }

View File

@@ -1,15 +0,0 @@
diff --git a/SocketRocket/SRSecurityPolicy.m b/SocketRocket/SRSecurityPolicy.m
index 3759d26e..271477e8 100644
--- a/SocketRocket/SRSecurityPolicy.m
+++ b/SocketRocket/SRSecurityPolicy.m
@@ -56,8 +56,8 @@ - (instancetype)init
- (void)updateSecurityOptionsInStream:(NSStream *)stream
{
- // Enforce TLS 1.2
- [stream setProperty:(__bridge id)CFSTR("kCFStreamSocketSecurityLevelTLSv1_2") forKey:(__bridge id)kCFStreamPropertySocketSecurityLevel];
+ // Enforce TLS >= 1.2
+ [stream setProperty:(__bridge id)kCFStreamSocketSecurityLevelNegotiatedSSL forKey:(__bridge id)kCFStreamPropertySocketSecurityLevel];
// Validate certificate chain for this stream if enabled.
NSDictionary<NSString *, id> *sslOptions = @{ (__bridge NSString *)kCFStreamSSLValidatesCertificateChain : @(self.certificateChainValidationEnabled) };

View File

@@ -35,7 +35,5 @@ static NSString * const sendEventNotificationName = @"org.jitsi.meet.SendEvent";
- (void)hideNotification:(NSString*)uid;
- (void)startRecording:(NSString*)mode :(NSString*)dropboxToken :(BOOL)shouldShare :(NSString*)rtmpStreamKey :(NSString*)rtmpBroadcastID :(NSString*)youtubeStreamKey :(NSString*)youtubeBroadcastID :(NSDictionary*)extraMetadata :(BOOL)transcription;
- (void)stopRecording:(NSString*)mode :(BOOL)transcription;
- (void)overwriteConfig:(NSDictionary*)config;
- (void)sendCameraFacingModeMessage:(NSString*)to :(NSString*)facingMode;
@end

View File

@@ -32,8 +32,6 @@ static NSString * const showNotificationAction = @"org.jitsi.meet.SHOW_NOTIFICAT
static NSString * const hideNotificationAction = @"org.jitsi.meet.HIDE_NOTIFICATION";
static NSString * const startRecordingAction = @"org.jitsi.meet.START_RECORDING";
static NSString * const stopRecordingAction = @"org.jitsi.meet.STOP_RECORDING";
static NSString * const overwriteConfigAction = @"org.jitsi.meet.OVERWRITE_CONFIG";
static NSString * const sendCameraFacingModeMessageAction = @"org.jitsi.meet.SEND_CAMERA_FACING_MODE_MESSAGE";
@implementation ExternalAPI
@@ -62,9 +60,7 @@ RCT_EXPORT_MODULE();
@"SHOW_NOTIFICATION": showNotificationAction,
@"HIDE_NOTIFICATION": hideNotificationAction,
@"START_RECORDING": startRecordingAction,
@"STOP_RECORDING": stopRecordingAction,
@"OVERWRITE_CONFIG": overwriteConfigAction,
@"SEND_CAMERA_FACING_MODE_MESSAGE": sendCameraFacingModeMessageAction
@"STOP_RECORDING": stopRecordingAction
};
};
@@ -94,9 +90,7 @@ RCT_EXPORT_MODULE();
showNotificationAction,
hideNotificationAction,
startRecordingAction,
stopRecordingAction,
overwriteConfigAction,
sendCameraFacingModeMessageAction
stopRecordingAction
];
}
@@ -240,21 +234,4 @@ RCT_EXPORT_METHOD(sendEvent:(NSString *)name
[self sendEventWithName:stopRecordingAction body:data];
}
- (void)overwriteConfig:(NSDictionary*)config {
NSDictionary *data = @{
@"config": config
};
[self sendEventWithName:overwriteConfigAction body:data];
}
- (void)sendCameraFacingModeMessage:(NSString*)to :(NSString*)facingMode {
NSDictionary *data = @{
@"to": to,
@"facingMode": facingMode
};
[self sendEventWithName:sendCameraFacingModeMessageAction body:data];
}
@end

View File

@@ -54,8 +54,7 @@ typedef NS_ENUM(NSInteger, RecordingMode) {
- (void)toggleCamera;
- (void)showNotification:(NSString * _Nonnull)appearance :(NSString * _Nullable)description :(NSString * _Nullable)timeout :(NSString * _Nullable)title :(NSString * _Nullable)uid;
- (void)hideNotification:(NSString * _Nullable)uid;
- (void)startRecording:(RecordingMode)mode :(NSString * _Nullable)dropboxToken :(BOOL)shouldShare :(NSString * _Nullable)rtmpStreamKey :(NSString * _Nullable)rtmpBroadcastID :(NSString * _Nullable)youtubeStreamKey :(NSString * _Nullable)youtubeBroadcastID :(NSDictionary * _Nullable)extraMetadata :(BOOL)transcription;
- (void)startRecording:(RecordingMode)mode :(NSString * _Nullable)dropboxToken :(BOOL)shouldShare :(NSString * _Nullable)rtmpStreamKey :(NSString * _Nullable)rtmpBroadcastID :(NSString * _Nullable)youtubeStreamKey :(NSString * _Nullable)youtubeBroadcastID :(NSString * _Nullable)extraMetadata :(BOOL)transcription;
- (void)stopRecording:(RecordingMode)mode :(BOOL)transcription;
- (void)overwriteConfig:(NSDictionary * _Nonnull)config;
- (void)sendCameraFacingModeMessage:(NSString * _Nonnull)to :(NSString * _Nullable)facingMode;
@end

View File

@@ -17,8 +17,6 @@
#include <mach/mach_time.h>
#import <UIKit/UIKit.h>
#import "ExternalAPI.h"
#import "JitsiMeet+Private.h"
#import "JitsiMeetConferenceOptions+Private.h"
@@ -27,33 +25,6 @@
#import "RNRootView.h"
#pragma mark UIColor helpers
@interface UIColor (Hex)
+ (UIColor *)colorWithHex:(uint32_t)hex;
+ (UIColor *)colorWithHex:(uint32_t)hex alpha:(CGFloat)alpha;
@end
@implementation UIColor (Hex)
+ (UIColor *)colorWithHex:(uint32_t)hex {
return [self colorWithHex:hex alpha:1.0];
}
+ (UIColor *)colorWithHex:(uint32_t)hex alpha:(CGFloat)alpha {
CGFloat red = ((hex >> 16) & 0xFF) / 255.0;
CGFloat green = ((hex >> 8) & 0xFF) / 255.0;
CGFloat blue = (hex & 0xFF) / 255.0;
return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}
@end
#pragma mark UIColor helpers end
/**
* Backwards compatibility: turn the boolean prop into a feature flag.
*/
@@ -99,8 +70,11 @@ static NSString *recordingModeToString(RecordingMode mode);
* - registers necessary observers
*/
- (void)doInitialize {
// Set a background color which matches the one used in JS.
self.backgroundColor = [UIColor colorWithHex:0x040404 alpha:1];
// Set a background color which is in accord with the JavaScript and Android
// parts of the application and causes less perceived visual flicker than
// the default background color.
self.backgroundColor
= [UIColor colorWithRed:.07f green:.07f blue:.07f alpha:1];
[self registerObservers];
}
@@ -184,7 +158,7 @@ static NSString *recordingModeToString(RecordingMode mode);
[externalAPI hideNotification:uid];
}
- (void)startRecording:(RecordingMode)mode :(NSString * _Nullable)dropboxToken :(BOOL)shouldShare :(NSString * _Nullable)rtmpStreamKey :(NSString * _Nullable)rtmpBroadcastID :(NSString * _Nullable)youtubeStreamKey :(NSString * _Nullable)youtubeBroadcastID :(NSDictionary * _Nullable)extraMetadata :(BOOL)transcription {
- (void)startRecording:(RecordingMode)mode :(NSString *)dropboxToken :(BOOL)shouldShare :(NSString *)rtmpStreamKey :(NSString *)rtmpBroadcastID :(NSString *)youtubeStreamKey :(NSString *)youtubeBroadcastID :(NSDictionary *)extraMetadata :(BOOL)transcription {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI startRecording:recordingModeToString(mode) :dropboxToken :shouldShare :rtmpStreamKey :rtmpBroadcastID :youtubeStreamKey :youtubeBroadcastID :extraMetadata :transcription];
}
@@ -194,16 +168,6 @@ static NSString *recordingModeToString(RecordingMode mode);
[externalAPI stopRecording:recordingModeToString(mode) :transcription];
}
- (void)overwriteConfig:(NSDictionary * _Nonnull)config {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI overwriteConfig:config];
}
- (void)sendCameraFacingModeMessage:(NSString * _Nonnull)to :(NSString * _Nullable)facingMode {
ExternalAPI *externalAPI = [[JitsiMeet sharedInstance] getExternalAPI];
[externalAPI sendCameraFacingModeMessage:to :facingMode];
}
#pragma mark Private methods
- (void)registerObservers {

View File

@@ -130,18 +130,4 @@
*/
- (void)customButtonPressed:(NSDictionary *)data;
/**
* Called when the unique identifier for conference has been set.
*
* The `data` dictionary contains a `sessionId` key.
*/
- (void)conferenceUniqueIdSet:(NSDictionary *)data;
/**
* Called when the recording status has changed.
*
* The `data` dictionary contains a `sessionData` key.
*/
- (void)recordingStatusChanged:(NSDictionary *)data;
@end

View File

@@ -944,7 +944,6 @@
"title": "خيارات الأمان"
},
"settings": {
"audio": "الصوت",
"buttonLabel": "إعدادات",
"calendar": {
"about": "تُستعمَل الرزنامة {{appName}} المدمجة للوصل بأمان إلى رزنامتك، لذا بالإمكان معرفة الأحداث القادمة.",
@@ -968,7 +967,6 @@
"more": "المزيد",
"name": "الاسم",
"noDevice": "لا يوجد",
"notifications": "الإشعارات",
"participantJoined": "انضم مشارك",
"participantKnocking": "دخل المشارك في الردهة",
"participantLeft": "غادر المشارك",
@@ -979,15 +977,13 @@
"selectCamera": "الكاميرا",
"selectMic": "المايكروفون",
"selfView": "عرض ذاتي",
"shortcuts": "اختصارات لوحة المفاتيح",
"sounds": "اصوات",
"speakers": "المذياع (مكبر الصوت)",
"startAudioMuted": "بدء الجميع مكتومي الصوت",
"startReactionsMuted": "كتم رد فعل الصوت للجميع",
"startVideoMuted": "بدء الجميع دون فيديو",
"talkWhileMuted": "تحدث أثناء كتم الصوت",
"title": "الإعدادات",
"video": "الفيديو"
"title": "الإعدادات"
},
"settingsView": {
"advanced": "إعدادات متقدمة",

View File

@@ -359,7 +359,7 @@
"micTimeoutError": "Could not start audio source. Timeout occurred!",
"micUnknownError": "Cannot use microphone for an unknown reason.",
"moderationAudioLabel": "Allow attendees to unmute themselves",
"moderationVideoLabel": "Allow non-moderators to start their video",
"moderationVideoLabel": "Allow attendees to start their video",
"muteEveryoneDialog": "The participants can unmute themselves at any time.",
"muteEveryoneDialogModerationOn": "The participants can send a request to speak at any time.",
"muteEveryoneElseDialog": "Once muted, you won't be able to unmute them, but they can unmute themselves at any time.",
@@ -848,7 +848,7 @@
"actions": {
"admit": "Admit",
"admitAll": "Admit all",
"allow": "Allow non-moderators to:",
"allow": "Allow attendees to:",
"allowVideo": "Allow video",
"askUnmute": "Ask to unmute",
"audioModeration": "Unmute themselves",

6
modules/API/API.js Executable file → Normal file
View File

@@ -1050,12 +1050,6 @@ function initCommands() {
callback(getRoomsInfo(APP.store.getState()));
break;
}
case 'get-shared-document-url': {
const { etherpad } = APP.store.getState()['features/etherpad'];
callback(etherpad?.documentUrl || '');
break;
}
case 'get-p2p-status': {
callback(isP2pActive(APP.store.getState()));
break;

View File

@@ -682,17 +682,6 @@ export default class JitsiMeetExternalAPI extends EventEmitter {
});
}
/**
* Returns the Shared Document Url of the conference.
*
* @returns {Object} Rooms info.
*/
async getSharedDocumentUrl() {
return this._transport.sendRequest({
name: 'get-shared-document-url'
});
}
/**
* Returns whether the conference is P2P.
*

10
package-lock.json generated
View File

@@ -62,7 +62,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/v1922.0.0+25031534/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1919.0.0+d4a47d0e/lib-jitsi-meet.tgz",
"lodash-es": "4.17.21",
"moment": "2.29.4",
"moment-duration-format": "2.2.2",
@@ -16909,8 +16909,8 @@
},
"node_modules/lib-jitsi-meet": {
"version": "0.0.0",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1922.0.0+25031534/lib-jitsi-meet.tgz",
"integrity": "sha512-ZjXYPyorF/fAqz8j4M+P+hN1evhoukrtZVPKa6jAROREh+TLRlS8uUd34llY7IGC4UlGyd30CfEhgsEmWd7/9g==",
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1919.0.0+d4a47d0e/lib-jitsi-meet.tgz",
"integrity": "sha512-0/rTgoaaXwKs4J2+MY4HYh/VbZg3gjNHInhAz+smZGlWsJB8H2qkSNVU0HcTI7WG5LzrzkX4c/eTVpkq8ljLJw==",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
@@ -37637,8 +37637,8 @@
}
},
"lib-jitsi-meet": {
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1922.0.0+25031534/lib-jitsi-meet.tgz",
"integrity": "sha512-ZjXYPyorF/fAqz8j4M+P+hN1evhoukrtZVPKa6jAROREh+TLRlS8uUd34llY7IGC4UlGyd30CfEhgsEmWd7/9g==",
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1919.0.0+d4a47d0e/lib-jitsi-meet.tgz",
"integrity": "sha512-0/rTgoaaXwKs4J2+MY4HYh/VbZg3gjNHInhAz+smZGlWsJB8H2qkSNVU0HcTI7WG5LzrzkX4c/eTVpkq8ljLJw==",
"requires": {
"@jitsi/js-utils": "2.2.1",
"@jitsi/logger": "2.0.2",

View File

@@ -68,7 +68,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/v1922.0.0+25031534/lib-jitsi-meet.tgz",
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1919.0.0+d4a47d0e/lib-jitsi-meet.tgz",
"lodash-es": "4.17.21",
"moment": "2.29.4",
"moment-duration-format": "2.2.2",

View File

@@ -205,7 +205,7 @@ export default class AlwaysOnTop extends Component<any, IState> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
api.on('avatarChanged', this._avatarChangedListener);
api.on('displayNameChange', this._displayNameChangedListener);
api.on('largeVideoChanged', this._videoChangedListener);
@@ -231,7 +231,7 @@ export default class AlwaysOnTop extends Component<any, IState> {
* @inheritdoc
* @returns {void}
*/
override componentDidUpdate(_prevProps: any, prevState: IState) {
componentDidUpdate(_prevProps: any, prevState: IState) {
if (!prevState.visible && this.state.visible) {
this._hideToolbarAfterTimeout();
}
@@ -243,7 +243,7 @@ export default class AlwaysOnTop extends Component<any, IState> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
api.removeListener('avatarChanged', this._avatarChangedListener);
api.removeListener(
'displayNameChange',
@@ -267,7 +267,7 @@ export default class AlwaysOnTop extends Component<any, IState> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<div id = 'alwaysOnTop'>
<Toolbar

View File

@@ -63,7 +63,7 @@ export default class AudioMuteButton extends Component<Props, IState> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
api.on('audioAvailabilityChanged', this._audioAvailabilityListener);
api.on('audioMuteStatusChanged', this._audioMutedListener);
@@ -86,7 +86,7 @@ export default class AudioMuteButton extends Component<Props, IState> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
api.removeListener(
'audioAvailabilityChanged',
this._audioAvailabilityListener);
@@ -165,7 +165,7 @@ export default class AudioMuteButton extends Component<Props, IState> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const toggled = this._isAudioMuted();
return (

View File

@@ -48,7 +48,7 @@ export default class HangupButton extends Component<Props> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<ToolbarButton
accessibilityLabel = { this.accessibilityLabel }

View File

@@ -73,7 +73,7 @@ export default class Toolbar extends Component<Props, IState> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
api.on('videoConferenceJoined', this._videoConferenceJoinedListener);
this._videoConferenceJoinedListener();
@@ -106,7 +106,7 @@ export default class Toolbar extends Component<Props, IState> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
api.removeListener('videoConferenceJoined', this._videoConferenceJoinedListener);
}
@@ -116,7 +116,7 @@ export default class Toolbar extends Component<Props, IState> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const {
className = '',
onMouseOut,

View File

@@ -63,7 +63,7 @@ export default class VideoMuteButton extends Component<Props, State> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
api.on('videoAvailabilityChanged', this._videoAvailabilityListener);
api.on('videoMuteStatusChanged', this._videoMutedListener);
@@ -85,7 +85,7 @@ export default class VideoMuteButton extends Component<Props, State> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
api.removeListener(
'videoAvailabilityChanged',
this._videoAvailabilityListener);
@@ -165,7 +165,7 @@ export default class VideoMuteButton extends Component<Props, State> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const toggled = this._isVideoMuted();
return (

View File

@@ -31,7 +31,7 @@ export class AbstractApp<P extends IProps = IProps> extends BaseApp<P> {
*
* @inheritdoc
*/
override async componentDidMount() {
async componentDidMount() {
await super.componentDidMount();
// If a URL was explicitly specified to this React Component, then
@@ -44,7 +44,7 @@ export class AbstractApp<P extends IProps = IProps> extends BaseApp<P> {
*
* @inheritdoc
*/
override async componentDidUpdate(prevProps: IProps) {
async componentDidUpdate(prevProps: IProps) {
const previousUrl = toURLString(prevProps.url);
const currentUrl = toURLString(this.props.url);
const previousTimestamp = prevProps.timestamp;

View File

@@ -80,7 +80,7 @@ export class App extends AbstractApp<IProps> {
*
* @returns {void}
*/
override async componentDidMount() {
async componentDidMount() {
await super.componentDidMount();
SplashScreen.hide();
@@ -96,7 +96,7 @@ export class App extends AbstractApp<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<JitsiThemePaperProvider>
{ super.render() }

View File

@@ -28,7 +28,7 @@ export class App extends AbstractApp {
* @protected
* @returns {ReactElement}
*/
override _createExtraElement() {
_createExtraElement() {
return (
<JitsiThemeProvider>
<OverlayContainer />
@@ -42,7 +42,7 @@ export class App extends AbstractApp {
*
* @override
*/
override _createMainElement(component: React.ComponentType, props?: Object) {
_createMainElement(component: React.ComponentType, props?: Object) {
return (
<JitsiThemeProvider>
<GlobalStyles />
@@ -57,7 +57,7 @@ export class App extends AbstractApp {
*
* @returns {React$Element}
*/
override _renderDialogContainer() {
_renderDialogContainer() {
return (
<JitsiThemeProvider>
<DialogContainer />

View File

@@ -36,7 +36,7 @@ class AudioLevelIndicator extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { audioLevel: passedAudioLevel } = this.props;
// First make sure we are sensitive enough.

View File

@@ -132,7 +132,7 @@ class LoginDialog extends Component<IProps, IState> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const {
_connecting: connecting,
t

View File

@@ -60,7 +60,7 @@ class WaitForOwnerDialog extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { _isConfirmHidden } = this.props;
return (

View File

@@ -220,7 +220,7 @@ class LoginDialog extends Component<IProps, IState> {
*
* @inheritdoc
*/
override render() {
render() {
const {
_connecting: connecting,
t

View File

@@ -74,7 +74,7 @@ class WaitForOwnerDialog extends PureComponent<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
const {
t
} = this.props;

View File

@@ -67,7 +67,7 @@ export default class BaseApp<P> extends Component<P, IState> {
*
* @inheritdoc
*/
override async componentDidMount() {
async componentDidMount() {
/**
* Make the mobile {@code BaseApp} wait until the {@code AsyncStorage}
* implementation of {@code Storage} initializes fully.
@@ -107,7 +107,7 @@ export default class BaseApp<P> extends Component<P, IState> {
*
* @inheritdoc
*/
override componentWillUnmount() {
componentWillUnmount() {
this.state.store?.dispatch(appWillUnmount(this));
}
@@ -119,7 +119,7 @@ export default class BaseApp<P> extends Component<P, IState> {
*
* @returns {void}
*/
override componentDidCatch(error: Error, info: Object) {
componentDidCatch(error: Error, info: Object) {
logger.error(error, info);
}
@@ -153,7 +153,7 @@ export default class BaseApp<P> extends Component<P, IState> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { route: { component, props }, store } = this.state;
if (store) {

View File

@@ -148,7 +148,7 @@ class Avatar<P extends IProps> extends PureComponent<P, IState> {
*
* @inheritdoc
*/
override componentDidUpdate(prevProps: P) {
componentDidUpdate(prevProps: P) {
const { _corsAvatarURLs, url } = this.props;
if (prevProps.url !== url) {
@@ -170,7 +170,7 @@ class Avatar<P extends IProps> extends PureComponent<P, IState> {
*
* @inheritdoc
*/
override render() {
render() {
const {
_customAvatarBackgrounds,
_initialsBase,

View File

@@ -51,7 +51,7 @@ export default class StatelessAvatar extends Component<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
const { initials, size, style, url } = this.props;
let avatar;

View File

@@ -4,7 +4,7 @@ import { JitsiConferenceErrors } from '../lib-jitsi-meet';
import MiddlewareRegistry from '../redux/MiddlewareRegistry';
import { CONFERENCE_FAILED } from './actionTypes';
import { conferenceLeft } from './actions.native';
import { conferenceLeft } from './actions';
import { TRIGGER_READY_TO_CLOSE_REASONS } from './constants';
import './middleware.any';
@@ -15,20 +15,10 @@ MiddlewareRegistry.register(store => next => action => {
switch (action.type) {
case CONFERENCE_FAILED: {
const { getState } = store;
const state = getState();
const { notifyOnConferenceDestruction = true } = state['features/base/config'];
if (error?.name !== JitsiConferenceErrors.CONFERENCE_DESTROYED) {
break;
}
if (!notifyOnConferenceDestruction) {
dispatch(conferenceLeft(action.conference));
dispatch(appNavigate(undefined));
break;
}
const [ reason ] = error.params;
const reasonKey = Object.keys(TRIGGER_READY_TO_CLOSE_REASONS)[

View File

@@ -122,14 +122,12 @@ MiddlewareRegistry.register(store => next => action => {
}
if (errorName === JitsiConferenceErrors.CONFERENCE_DESTROYED) {
const state = getState();
const { notifyOnConferenceDestruction = true } = state['features/base/config'];
const [ reason ] = action.error.params;
const titlekey = Object.keys(TRIGGER_READY_TO_CLOSE_REASONS)[
Object.values(TRIGGER_READY_TO_CLOSE_REASONS).indexOf(reason)
];
dispatch(hangup(true, i18next.t(titlekey) || reason, notifyOnConferenceDestruction));
dispatch(hangup(true, i18next.t(titlekey) || reason));
}
releaseScreenLock();

View File

@@ -486,7 +486,6 @@ export interface IConfig {
short?: number;
};
notifications?: Array<string>;
notifyOnConferenceDestruction?: boolean;
openSharedDocumentOnJoin?: boolean;
opusMaxAverageBitrate?: number;
p2p?: {
@@ -604,7 +603,6 @@ export interface IConfig {
tokenAuthUrl?: string;
tokenAuthUrlAutoRedirect?: string;
tokenLogoutUrl?: string;
tokenRespectTenant?: string;
toolbarButtons?: Array<ToolbarButton>;
toolbarConfig?: {
alwaysVisible?: boolean;

View File

@@ -182,7 +182,6 @@ export default [
'mouseMoveCallbackInterval',
'notifications',
'notificationTimeouts',
'notifyOnConferenceDestruction',
'openSharedDocumentOnJoin',
'opusMaxAverageBitrate',
'p2p.backToP2PDelay',

View File

@@ -62,11 +62,9 @@ export function connect(id?: string, password?: string) {
* @param {boolean} [requestFeedback] - Whether to attempt showing a
* request for call feedback.
* @param {string} [feedbackTitle] - The feedback title.
* @param {boolean} [notifyOnConferenceTermination] - Whether to notify
* the user on conference termination.
* @returns {Function}
*/
export function hangup(requestFeedback = false, feedbackTitle?: string, notifyOnConferenceTermination?: boolean) {
export function hangup(requestFeedback = false, feedbackTitle?: string) {
// XXX For web based version we use conference hanging up logic from the old app.
return async (dispatch: IStore['dispatch']) => {
if (LocalRecordingManager.isRecordingLocally()) {
@@ -82,6 +80,6 @@ export function hangup(requestFeedback = false, feedbackTitle?: string, notifyOn
});
}
return APP.conference.hangup(requestFeedback, feedbackTitle, notifyOnConferenceTermination);
return APP.conference.hangup(requestFeedback, feedbackTitle);
};
}

View File

@@ -52,7 +52,7 @@ export default class AbstractDialog<P extends IProps, S extends IState = IState>
*
* @inheritdoc
*/
override componentDidMount() {
componentDidMount() {
this._mounted = true;
}
@@ -62,7 +62,7 @@ export default class AbstractDialog<P extends IProps, S extends IState = IState>
*
* @inheritdoc
*/
override componentWillUnmount() {
componentWillUnmount() {
this._mounted = false;
}

View File

@@ -31,7 +31,7 @@ class AlertDialog extends AbstractDialog<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
const { contentKey, t } = this.props;
const content
= typeof contentKey === 'string'

View File

@@ -100,7 +100,7 @@ class BottomSheet extends PureComponent<Props> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const {
addScrollViewPadding,
renderHeader,

View File

@@ -100,7 +100,7 @@ class ConfirmDialog extends AbstractDialog<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
const {
cancelLabel,
children,

View File

@@ -38,7 +38,7 @@ class DialogContainer extends AbstractDialogContainer {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<Fragment>
{this._renderReactions()}

View File

@@ -91,7 +91,7 @@ class InputDialog extends AbstractDialog<IProps, IState> {
*
* @inheritdoc
*/
override render() {
render() {
const {
descriptionKey,
messageKey,

View File

@@ -71,7 +71,7 @@ class PageReloadDialog extends Component<IProps, IPageReloadDialogState> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
const { timeLeft } = this.state;
logger.info(
@@ -88,7 +88,7 @@ class PageReloadDialog extends Component<IProps, IPageReloadDialogState> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
if (this._interval) {
clearInterval(this._interval);
this._interval = undefined;
@@ -157,7 +157,7 @@ class PageReloadDialog extends Component<IProps, IPageReloadDialogState> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { isNetworkFailure, t } = this.props;
const { timeLeft } = this.state;

View File

@@ -3,14 +3,12 @@ import jwtDecode from 'jwt-decode';
import { AnyAction } from 'redux';
import { IStore } from '../../app/types';
import { isVpaasMeeting } from '../../jaas/functions';
import { SET_CONFIG } from '../config/actionTypes';
import { SET_LOCATION_URL } from '../connection/actionTypes';
import { participantUpdated } from '../participants/actions';
import { getLocalParticipant } from '../participants/functions';
import { IParticipant } from '../participants/types';
import MiddlewareRegistry from '../redux/MiddlewareRegistry';
import { parseURIString } from '../util/uri';
import { SET_JWT } from './actionTypes';
import { setJWT } from './actions';
@@ -127,8 +125,6 @@ function _setJWT(store: IStore, next: Function, action: AnyAction) {
const { jwt, type, ...actionPayload } = action;
if (!Object.keys(actionPayload).length) {
const state = store.getState();
if (jwt) {
let jwtPayload;
@@ -154,22 +150,9 @@ function _setJWT(store: IStore, next: Function, action: AnyAction) {
const newUser = user ? { ...user } : {};
let features = context.features;
const { tokenRespectTenant } = state['features/base/config'];
// eslint-disable-next-line max-depth
if (!isVpaasMeeting(state) && tokenRespectTenant && context.tenant) {
// we skip checking vpaas meetings as there are other backend rules in place
// this way vpaas users can still use this field if needed
const { locationURL = { href: '' } as URL } = state['features/base/connection'];
const { tenant = '' } = parseURIString(locationURL.href) || {};
features = context.tenant === tenant ? features : {};
}
_overwriteLocalParticipant(
store, { ...newUser,
features });
features: context.features });
// eslint-disable-next-line max-depth
if (context.user && context.user.role === 'visitor') {
@@ -189,7 +172,7 @@ function _setJWT(store: IStore, next: Function, action: AnyAction) {
// On Web it should eventually be restored from storage, but there's
// no such use case yet.
const { user } = state['features/base/jwt'];
const { user } = store.getState()['features/base/jwt'];
user && _undoOverwriteLocalParticipant(store, user);
}

View File

@@ -48,7 +48,7 @@ export default abstract class ExpandedLabel<P extends IProps> extends Component<
*
* @inheritdoc
*/
override componentDidMount() {
componentDidMount() {
Animated.decay(this.state.opacityAnimation, {
toValue: 1,
velocity: 1,
@@ -61,7 +61,7 @@ export default abstract class ExpandedLabel<P extends IProps> extends Component<
*
* @inheritdoc
*/
override render() {
render() {
return (
<Animated.View
style = { [ styles.expandedLabelContainer,

View File

@@ -89,7 +89,7 @@ export default class Label extends Component<IProps, State> {
*
* @inheritdoc
*/
override componentDidMount() {
componentDidMount() {
this._maybeToggleAnimation({}, this.props);
}
@@ -98,7 +98,7 @@ export default class Label extends Component<IProps, State> {
*
* @inheritdoc
*/
override componentDidUpdate(prevProps: IProps) {
componentDidUpdate(prevProps: IProps) {
this._maybeToggleAnimation(prevProps, this.props);
}
@@ -107,7 +107,7 @@ export default class Label extends Component<IProps, State> {
*
* @inheritdoc
*/
override render() {
render() {
const { icon, text, status, style, iconColor, textStyle } = this.props;
let extraStyle = null;

View File

@@ -165,6 +165,7 @@ function _initLogging({ dispatch, getState }: IStore,
}
Logger.addGlobalTransport(_logCollector);
JitsiMeetJS.addGlobalLogTransport(_logCollector);
dispatch(setLogCollector(_logCollector));
// The JitsiMeetInMemoryLogStorage can not be accessed on mobile through

View File

@@ -72,7 +72,7 @@ export default class AbstractVideoTrack<P extends IProps> extends Component<P> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const videoTrack = _falsy2null(this.props.videoTrack);
let render;

View File

@@ -36,7 +36,7 @@ export default class Audio extends AbstractAudio {
*
* @inheritdoc
*/
override async componentDidUpdate(prevProps: IProps): Promise<void> {
async componentDidUpdate(prevProps: IProps): Promise<void> {
// source is different !! call didunmount and call didmount
if (prevProps.src !== this.props.src) {
await this.componentWillUnmount();
@@ -49,7 +49,7 @@ export default class Audio extends AbstractAudio {
*
* @returns {void}
*/
override async componentDidMount() {
async componentDidMount() {
this._sound
= this.props.src
? new Sound(
@@ -63,7 +63,7 @@ export default class Audio extends AbstractAudio {
*
* @returns {void}
*/
override async componentWillUnmount() {
async componentWillUnmount() {
if (this._sound) {
this._sound.release();
this._sound = null;
@@ -94,7 +94,7 @@ export default class Audio extends AbstractAudio {
* @inheritdoc
* @returns {null}
*/
override render() {
render() {
// TODO react-native-webrtc's RTCView doesn't do anything with the audio
// MediaStream specified to it so it's easier at the time of this
// writing to not render anything.

View File

@@ -64,7 +64,7 @@ export default class Video extends Component<IProps> {
*
* @inheritdoc
*/
override componentDidMount() {
componentDidMount() {
// RTCView currently does not support media events, so just fire
// onPlaying callback when <RTCView> is rendered.
const { onPlaying } = this.props;
@@ -78,7 +78,7 @@ export default class Video extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement|null}
*/
override render() {
render() {
const { onPress, stream, zoomEnabled } = this.props;
if (stream) {

View File

@@ -18,7 +18,7 @@ class VideoTrack extends AbstractVideoTrack<IProps> {
* @override
* @returns {ReactElement}
*/
override render() {
render() {
return (
<View style = { styles.video } >
{ super.render() }

View File

@@ -197,7 +197,7 @@ class VideoTransform extends Component<IProps, IState> {
*
* @inheritdoc
*/
override componentDidUpdate(prevProps: IProps, prevState: IState) {
componentDidUpdate(prevProps: IProps, prevState: IState) {
if (prevProps.streamId !== this.props.streamId) {
this._storeTransform(prevProps.streamId, prevState.transform);
this._restoreTransform(this.props.streamId);
@@ -209,7 +209,7 @@ class VideoTransform extends Component<IProps, IState> {
*
* @inheritdoc
*/
override componentWillUnmount() {
componentWillUnmount() {
this._storeTransform(this.props.streamId, this.state.transform);
}
@@ -218,7 +218,7 @@ class VideoTransform extends Component<IProps, IState> {
*
* @inheritdoc
*/
override render() {
render() {
const { _aspectRatio, children, style } = this.props;
const isAspectRatioWide = _aspectRatio === ASPECT_RATIO_WIDE;

View File

@@ -37,7 +37,7 @@ export default class Audio extends AbstractAudio {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<audio
loop = { Boolean(this.props.loop) }
@@ -53,7 +53,7 @@ export default class Audio extends AbstractAudio {
*
* @returns {void}
*/
override stop() {
stop() {
if (this._ref) {
this._ref.pause();
this._ref.currentTime = 0;

View File

@@ -91,7 +91,7 @@ class AudioTrack extends Component<IProps> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
this._attachTrack(this.props.audioTrack);
if (this._ref?.current) {
@@ -120,7 +120,7 @@ class AudioTrack extends Component<IProps> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
this._detachTrack(this.props.audioTrack);
// @ts-ignore
@@ -135,7 +135,7 @@ class AudioTrack extends Component<IProps> {
* @returns {boolean} - False is always returned to blackbox this component
* from React.
*/
override shouldComponentUpdate(nextProps: IProps) {
shouldComponentUpdate(nextProps: IProps) {
const currentJitsiTrack = this.props.audioTrack?.jitsiTrack;
const nextJitsiTrack = nextProps.audioTrack?.jitsiTrack;
@@ -175,7 +175,7 @@ class AudioTrack extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { autoPlay, id } = this.props;
return (

View File

@@ -220,7 +220,7 @@ class Video extends Component<IProps> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
this._mounted = true;
if (this._videoElement) {
@@ -254,7 +254,7 @@ class Video extends Component<IProps> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
this._mounted = false;
this._detachTrack(this.props.videoTrack);
}
@@ -268,7 +268,7 @@ class Video extends Component<IProps> {
* @returns {boolean} - False is always returned to blackbox this component
* from React.
*/
override shouldComponentUpdate(nextProps: IProps) {
shouldComponentUpdate(nextProps: IProps) {
const currentJitsiTrack = this.props.videoTrack?.jitsiTrack;
const nextJitsiTrack = nextProps.videoTrack?.jitsiTrack;
@@ -295,7 +295,7 @@ class Video extends Component<IProps> {
* @override
* @returns {ReactElement}
*/
override render() {
render() {
const {
autoPlay,
className,

View File

@@ -150,7 +150,7 @@ class VideoTrack extends AbstractVideoTrack<IProps> {
* @override
* @returns {ReactElement}
*/
override render() {
render() {
const {
_noAutoPlayVideo,
className,

View File

@@ -168,7 +168,7 @@ class ParticipantView extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const {
_isConnectionInactive,
_isSharedVideoParticipant,

View File

@@ -30,7 +30,6 @@ import { MEDIA_TYPE } from '../media/constants';
import MiddlewareRegistry from '../redux/MiddlewareRegistry';
import StateListenerRegistry from '../redux/StateListenerRegistry';
import { playSound, registerSound, unregisterSound } from '../sounds/actions';
import { isImageDataURL } from '../util/uri';
import {
DOMINANT_SPEAKER_CHANGED,
@@ -690,20 +689,15 @@ function _participantJoinedOrUpdated(store: IStore, next: Function, action: AnyA
// even if disableThirdPartyRequests is set to true in config
if (getState()['features/base/config']?.hosts) {
const { disableThirdPartyRequests } = getState()['features/base/config'];
const participantId = !id && local ? getLocalParticipant(getState())?.id : id;
if (avatarURL || email || id || name) {
if (!disableThirdPartyRequests) {
const updatedParticipant = getParticipantById(getState(), participantId);
if (!disableThirdPartyRequests && (avatarURL || email || id || name)) {
const participantId = !id && local ? getLocalParticipant(getState())?.id : id;
const updatedParticipant = getParticipantById(getState(), participantId);
getFirstLoadableAvatarUrl(updatedParticipant ?? { id: '' }, store)
.then((urlData?: { isUsingCORS: boolean; src: string; }) => {
dispatch(setLoadableAvatarUrl(
participantId, urlData?.src ?? '', Boolean(urlData?.isUsingCORS)));
});
} else if (isImageDataURL(avatarURL)) {
dispatch(setLoadableAvatarUrl(participantId, avatarURL, false));
}
getFirstLoadableAvatarUrl(updatedParticipant ?? { id: '' }, store)
.then((urlData?: { isUsingCORS: boolean; src: string; }) => {
dispatch(setLoadableAvatarUrl(participantId, urlData?.src ?? '', Boolean(urlData?.isUsingCORS)));
});
}
}

View File

@@ -184,7 +184,7 @@ class Popover extends Component<IProps, IState> {
* @inheritdoc
* @returns {void}
*/
override componentDidMount() {
componentDidMount() {
window.addEventListener('touchstart', this._onTouchStart);
if (this.props.trigger === 'click') {
// @ts-ignore
@@ -198,7 +198,7 @@ class Popover extends Component<IProps, IState> {
* @inheritdoc
* @returns {void}
*/
override componentWillUnmount() {
componentWillUnmount() {
window.removeEventListener('touchstart', this._onTouchStart);
if (this.props.trigger === 'click') {
// @ts-ignore
@@ -224,7 +224,7 @@ class Popover extends Component<IProps, IState> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { children,
className,
content,

View File

@@ -86,7 +86,7 @@ export default class AvatarListItem extends Component<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
const {
avatarOnly,
avatarSize = AVATAR_SIZE,

View File

@@ -40,7 +40,7 @@ export default class BaseIndicator extends Component<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
const { icon, iconStyle } = this.props;
return (

View File

@@ -33,7 +33,7 @@ export default class Container extends AbstractContainer<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const {
accessibilityLabel,
accessible,

View File

@@ -29,7 +29,7 @@ export default class ImageImpl extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<Image
source = { this.props.src }

View File

@@ -52,7 +52,7 @@ export default class Link extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<Text
onPress = { this._onPress }

View File

@@ -45,7 +45,7 @@ export default class Linkify extends Component<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
return (
<ReactLinkify
componentDecorator = { this._componentDecorator }>

View File

@@ -31,7 +31,7 @@ export default class LoadingIndicator extends PureComponent<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { color = ColorPalette.white } = this.props;
let { size = 'large' } = this.props;

View File

@@ -12,7 +12,7 @@ export default class Modal extends PureComponent {
*
* @inheritdoc
*/
override render() {
render() {
// eslint-disable-next-line react/prop-types
const { children, ...props } = this.props;

View File

@@ -95,7 +95,7 @@ class NavigateSectionList extends Component<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
const {
renderListEmptyComponent = this._renderListEmptyComponent(),
sections

View File

@@ -21,7 +21,7 @@ class NavigateSectionListEmptyComponent extends Component<WithTranslation> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { t } = this.props;
return (

View File

@@ -108,7 +108,7 @@ export default class NavigateSectionListItem extends Component<IProps> {
*
* @returns {ReactElement}
*/
override render() {
render() {
const { item, onLongPress, onPress, secondaryAction } = this.props;
return (

View File

@@ -27,7 +27,7 @@ export default class NavigateSectionListSectionHeader extends Component<IProps>
*
* @returns {ReactElement}
*/
override render() {
render() {
const { section } = this.props.section;
return (

View File

@@ -26,7 +26,7 @@ export default class Pressable extends Component<IProps> {
* @inheritdoc
* @returns {React$Node}
*/
override render() {
render() {
// onPress
const { children, onPress } = this.props;

View File

@@ -73,7 +73,7 @@ export default class SectionList extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<SafeAreaView
style = { styles.container as ViewStyle } >

View File

@@ -119,7 +119,7 @@ export default class SlidingView extends PureComponent<IProps, IState> {
*
* @inheritdoc
*/
override componentDidMount() {
componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this._onHardwareBackPress);
this._mounted = true;
@@ -131,7 +131,7 @@ export default class SlidingView extends PureComponent<IProps, IState> {
*
* @inheritdoc
*/
override componentDidUpdate(prevProps: IProps) {
componentDidUpdate(prevProps: IProps) {
const { show } = this.props;
if (prevProps.show !== show) {
@@ -144,7 +144,7 @@ export default class SlidingView extends PureComponent<IProps, IState> {
*
* @inheritdoc
*/
override componentWillUnmount() {
componentWillUnmount() {
BackHandler.removeEventListener('hardwareBackPress', this._onHardwareBackPress);
this._mounted = false;
@@ -155,7 +155,7 @@ export default class SlidingView extends PureComponent<IProps, IState> {
*
* @inheritdoc
*/
override render() {
render() {
const { showOverlay } = this.state;
if (!showOverlay) {

View File

@@ -39,7 +39,7 @@ export default class TintedView extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { children, style } = this.props;
// XXX Don't tint the children, tint the background only.

View File

@@ -12,7 +12,7 @@ export default class Container<P extends IProps> extends AbstractContainer<P> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
const { visible = true } = this.props;
return visible ? super._render('div') : null;

View File

@@ -13,7 +13,7 @@ export default class Image extends Component<React.HTMLProps<HTMLImageElement>>
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return React.createElement('img', this.props);
}
}

View File

@@ -20,7 +20,7 @@ export default class Linkify extends Component<IProps> {
*
* @inheritdoc
*/
override render() {
render() {
return (
<ReactLinkify
componentDecorator = { this._componentDecorator }>

View File

@@ -105,7 +105,7 @@ class MeetingsList extends Component<IProps> {
*
* @returns {React.ReactNode}
*/
override render() {
render() {
const { listEmptyComponent, meetings } = this.props;
/**

View File

@@ -15,11 +15,6 @@ interface IProps {
*/
gifEnabled: boolean;
/**
* Message decoration for screen reader.
*/
screenReaderHelpText?: string;
/**
* The body of the message.
*/
@@ -95,19 +90,11 @@ class Message extends Component<IProps> {
*
* @returns {ReactElement}
*/
override render() {
const { screenReaderHelpText } = this.props;
render() {
return (
<p>
{ screenReaderHelpText && (
<span className = 'sr-only'>
{screenReaderHelpText}
</span>
) }
<>
{ this._processMessage() }
</p>
</>
);
}
}

View File

@@ -164,7 +164,7 @@ class MultiSelectAutocomplete extends Component<IProps, IState> {
*
* @returns {ReactElement}
*/
override render() {
render() {
const autoFocus = this.props.shouldFocus || false;
const disabled = this.props.isDisabled || false;
const placeholder = this.props.placeholder || '';

View File

@@ -36,7 +36,7 @@ export default class NavigateSectionListItem<P extends IProps>
*
* @returns {ReactElement}
*/
override render() {
render() {
const { elementAfter, lines, title } = this.props.item;
const { onPress } = this.props;

View File

@@ -24,7 +24,7 @@ export default class NavigateSectionListSectionHeader extends Component<IProps>
*
* @returns {ReactElement}
*/
override render() {
render() {
return (
<Text className = 'navigate-section-section-header'>
{ this.props.section.title }

View File

@@ -51,7 +51,7 @@ export default class SectionList extends Component<IProps> {
*
* @returns {React.ReactNode}
*/
override render() {
render() {
const {
ListEmptyComponent,
renderSectionHeader,

View File

@@ -15,7 +15,7 @@ export default class Text extends Component<React.HTMLProps<HTMLSpanElement>> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
// eslint-disable-next-line react/prop-types
const _style = getFixedPlatformStyle(this.props.style as StyleType);

View File

@@ -97,7 +97,7 @@ class Watermarks extends Component<IProps, State> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
return (
<div>
{

View File

@@ -14,9 +14,9 @@ import { getFeatureFlag } from '../../../flags/functions';
* Implements an {@link AbstractButton} to open the carmode.
*/
class SettingsButton extends AbstractButton<AbstractButtonProps> {
override accessibilityLabel = 'toolbar.accessibilityLabel.Settings';
override icon = IconGear;
override label = 'settings.buttonLabel';
accessibilityLabel = 'toolbar.accessibilityLabel.Settings';
icon = IconGear;
label = 'settings.buttonLabel';
/**
* Handles clicking / pressing the button, and opens the carmode mode.
@@ -24,7 +24,7 @@ class SettingsButton extends AbstractButton<AbstractButtonProps> {
* @private
* @returns {void}
*/
override _handleClick() {
_handleClick() {
return navigate(screen.settings.main);
}
}

View File

@@ -47,7 +47,7 @@ class SoundCollection extends Component<IProps> {
* @inheritdoc
* @returns {ReactElement}
*/
override render() {
render() {
let key = 0;
const sounds = [];

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