mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-05-25 07:57:48 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cf76b20c7 | ||
|
|
44c1633952 |
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -174,12 +174,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) { /* Targets iPads and smaller devices */
|
||||
.item {
|
||||
.delete-meeting {
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2209,6 +2209,6 @@ SPEC CHECKSUMS:
|
||||
SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d
|
||||
Yoga: 1dd9dabb9df8fe08f12cd522eae04a2da0e252eb
|
||||
|
||||
PODFILE CHECKSUM: 4f6abcf3cec0d9e8e1d5f5d81a35d99adde9ae45
|
||||
PODFILE CHECKSUM: 8a3e5d019861b37d4159f2d178cc534be3ac528c
|
||||
|
||||
COCOAPODS: 1.16.2
|
||||
|
||||
@@ -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];
|
||||
// }
|
||||
|
||||
@@ -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) };
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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": "إعدادات متقدمة",
|
||||
|
||||
@@ -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
6
modules/API/API.js
Executable file → Normal 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;
|
||||
|
||||
11
modules/API/external/external_api.js
vendored
11
modules/API/external/external_api.js
vendored
@@ -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
10
package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -48,7 +48,7 @@ export default class HangupButton extends Component<Props> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<ToolbarButton
|
||||
accessibilityLabel = { this.accessibilityLabel }
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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() }
|
||||
|
||||
@@ -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 />
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -132,7 +132,7 @@ class LoginDialog extends Component<IProps, IState> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
_connecting: connecting,
|
||||
t
|
||||
|
||||
@@ -60,7 +60,7 @@ class WaitForOwnerDialog extends Component<IProps> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { _isConfirmHidden } = this.props;
|
||||
|
||||
return (
|
||||
|
||||
@@ -220,7 +220,7 @@ class LoginDialog extends Component<IProps, IState> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
_connecting: connecting,
|
||||
t
|
||||
|
||||
@@ -74,7 +74,7 @@ class WaitForOwnerDialog extends PureComponent<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
t
|
||||
} = this.props;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -51,7 +51,7 @@ export default class StatelessAvatar extends Component<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { initials, size, style, url } = this.props;
|
||||
|
||||
let avatar;
|
||||
|
||||
@@ -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)[
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -182,7 +182,6 @@ export default [
|
||||
'mouseMoveCallbackInterval',
|
||||
'notifications',
|
||||
'notificationTimeouts',
|
||||
'notifyOnConferenceDestruction',
|
||||
'openSharedDocumentOnJoin',
|
||||
'opusMaxAverageBitrate',
|
||||
'p2p.backToP2PDelay',
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ class AlertDialog extends AbstractDialog<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { contentKey, t } = this.props;
|
||||
const content
|
||||
= typeof contentKey === 'string'
|
||||
|
||||
@@ -100,7 +100,7 @@ class BottomSheet extends PureComponent<Props> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
addScrollViewPadding,
|
||||
renderHeader,
|
||||
|
||||
@@ -100,7 +100,7 @@ class ConfirmDialog extends AbstractDialog<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
cancelLabel,
|
||||
children,
|
||||
|
||||
@@ -38,7 +38,7 @@ class DialogContainer extends AbstractDialogContainer {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<Fragment>
|
||||
{this._renderReactions()}
|
||||
|
||||
@@ -91,7 +91,7 @@ class InputDialog extends AbstractDialog<IProps, IState> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
descriptionKey,
|
||||
messageKey,
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -18,7 +18,7 @@ class VideoTrack extends AbstractVideoTrack<IProps> {
|
||||
* @override
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<View style = { styles.video } >
|
||||
{ super.render() }
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -150,7 +150,7 @@ class VideoTrack extends AbstractVideoTrack<IProps> {
|
||||
* @override
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
_noAutoPlayVideo,
|
||||
className,
|
||||
|
||||
@@ -168,7 +168,7 @@ class ParticipantView extends Component<IProps> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
_isConnectionInactive,
|
||||
_isSharedVideoParticipant,
|
||||
|
||||
@@ -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)));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -86,7 +86,7 @@ export default class AvatarListItem extends Component<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
avatarOnly,
|
||||
avatarSize = AVATAR_SIZE,
|
||||
|
||||
@@ -40,7 +40,7 @@ export default class BaseIndicator extends Component<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { icon, iconStyle } = this.props;
|
||||
|
||||
return (
|
||||
|
||||
@@ -33,7 +33,7 @@ export default class Container extends AbstractContainer<IProps> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
accessibilityLabel,
|
||||
accessible,
|
||||
|
||||
@@ -29,7 +29,7 @@ export default class ImageImpl extends Component<IProps> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<Image
|
||||
source = { this.props.src }
|
||||
|
||||
@@ -52,7 +52,7 @@ export default class Link extends Component<IProps> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<Text
|
||||
onPress = { this._onPress }
|
||||
|
||||
@@ -45,7 +45,7 @@ export default class Linkify extends Component<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<ReactLinkify
|
||||
componentDecorator = { this._componentDecorator }>
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ class NavigateSectionList extends Component<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
renderListEmptyComponent = this._renderListEmptyComponent(),
|
||||
sections
|
||||
|
||||
@@ -21,7 +21,7 @@ class NavigateSectionListEmptyComponent extends Component<WithTranslation> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { t } = this.props;
|
||||
|
||||
return (
|
||||
|
||||
@@ -108,7 +108,7 @@ export default class NavigateSectionListItem extends Component<IProps> {
|
||||
*
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { item, onLongPress, onPress, secondaryAction } = this.props;
|
||||
|
||||
return (
|
||||
|
||||
@@ -27,7 +27,7 @@ export default class NavigateSectionListSectionHeader extends Component<IProps>
|
||||
*
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { section } = this.props.section;
|
||||
|
||||
return (
|
||||
|
||||
@@ -26,7 +26,7 @@ export default class Pressable extends Component<IProps> {
|
||||
* @inheritdoc
|
||||
* @returns {React$Node}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
// onPress
|
||||
const { children, onPress } = this.props;
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ export default class SectionList extends Component<IProps> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<SafeAreaView
|
||||
style = { styles.container as ViewStyle } >
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ export default class Linkify extends Component<IProps> {
|
||||
*
|
||||
* @inheritdoc
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<ReactLinkify
|
||||
componentDecorator = { this._componentDecorator }>
|
||||
|
||||
@@ -105,7 +105,7 @@ class MeetingsList extends Component<IProps> {
|
||||
*
|
||||
* @returns {React.ReactNode}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const { listEmptyComponent, meetings } = this.props;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 || '';
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -51,7 +51,7 @@ export default class SectionList extends Component<IProps> {
|
||||
*
|
||||
* @returns {React.ReactNode}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
const {
|
||||
ListEmptyComponent,
|
||||
renderSectionHeader,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ class Watermarks extends Component<IProps, State> {
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
override render() {
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user