mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-05-26 04:07:46 +00:00
Compare commits
59 Commits
6030
...
saghul-pat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
624b650138 | ||
|
|
8bf42e79a0 | ||
|
|
930852cd88 | ||
|
|
fcc8e98aad | ||
|
|
c633929c58 | ||
|
|
6085220bfc | ||
|
|
ed6759c6cf | ||
|
|
0259d1c260 | ||
|
|
537d3ae53a | ||
|
|
bf463e37ca | ||
|
|
c246174555 | ||
|
|
0cf1b7e3d9 | ||
|
|
41d8b9fbeb | ||
|
|
cc5f65f58f | ||
|
|
3097ac8cc4 | ||
|
|
d78b591e68 | ||
|
|
7c523f3250 | ||
|
|
23b91c0336 | ||
|
|
ceb8d3348d | ||
|
|
ae6454c59c | ||
|
|
57672ebea8 | ||
|
|
41c068feaf | ||
|
|
856ef757d4 | ||
|
|
9bcc5896ba | ||
|
|
1fbbe7bc46 | ||
|
|
6342e6b51a | ||
|
|
ec78cf2784 | ||
|
|
bdd8400057 | ||
|
|
23f40db889 | ||
|
|
94ba69dd74 | ||
|
|
a451923ec9 | ||
|
|
c05a983c98 | ||
|
|
6687c3f4ab | ||
|
|
42703fed47 | ||
|
|
a99532b0d8 | ||
|
|
33db511d93 | ||
|
|
eb716af29b | ||
|
|
92121803a1 | ||
|
|
d7c8164b74 | ||
|
|
ed9b85f287 | ||
|
|
14597e835b | ||
|
|
9325de8cbc | ||
|
|
b7c2ccd814 | ||
|
|
0713240c3d | ||
|
|
70090fd716 | ||
|
|
14d200a0cf | ||
|
|
5b07b6dc42 | ||
|
|
2c165d4313 | ||
|
|
4b84f71021 | ||
|
|
d415d02f35 | ||
|
|
c2399deb55 | ||
|
|
3443d256f2 | ||
|
|
db16250e6e | ||
|
|
2039b61a3f | ||
|
|
c94726be81 | ||
|
|
03286eb07e | ||
|
|
84ac6298eb | ||
|
|
1e58a7cbec | ||
|
|
6e0f53293e |
@@ -8,7 +8,7 @@ libs/*
|
||||
resources/*
|
||||
react/features/stream-effects/virtual-background/vendor/*
|
||||
load-test/*
|
||||
react/features/facial-recognition/resources/*
|
||||
react/features/face-landmarks/resources/*
|
||||
|
||||
# ESLint will by default ignore its own configuration file. However, there does
|
||||
# not seem to be a reason why we will want to risk being inconsistent with our
|
||||
@@ -16,4 +16,4 @@ react/features/facial-recognition/resources/*
|
||||
!.eslintrc.js
|
||||
|
||||
# Not worth it.
|
||||
actionTypes.js
|
||||
actionTypes.ts
|
||||
|
||||
@@ -3,8 +3,8 @@ We would love to have your help. Before you start working however, please read
|
||||
and follow this short guide.
|
||||
|
||||
# Reporting Issues
|
||||
Provide as much information as possible. Mention the version of Jitsi Meet,
|
||||
Jicofo and JVB you are using, and explain (as detailed as you can) how the
|
||||
Provide as much information as possible. Mention the version of Jitsi Meet,
|
||||
Jicofo and JVB you are using, and explain (as detailed as you can) how the
|
||||
problem can be reproduced.
|
||||
|
||||
# Code contributions
|
||||
@@ -130,7 +130,7 @@ When adding a new feature, this would be the usual layout.
|
||||
|
||||
```
|
||||
react/features/sample/
|
||||
├── actionTypes.js
|
||||
├── actionTypes.ts
|
||||
├── actions.js
|
||||
├── components
|
||||
│ ├── AnotherComponent.js
|
||||
|
||||
19
Makefile
19
Makefile
@@ -8,7 +8,7 @@ TF_WASM_DIR = node_modules/@tensorflow/tfjs-backend-wasm/dist/
|
||||
RNNOISE_WASM_DIR = node_modules/rnnoise-wasm/dist
|
||||
TFLITE_WASM = react/features/stream-effects/virtual-background/vendor/tflite
|
||||
MEET_MODELS_DIR = react/features/stream-effects/virtual-background/vendor/models
|
||||
FACIAL_MODELS_DIR = react/features/facial-recognition/resources
|
||||
FACE_MODELS_DIR = node_modules/@vladmandic/face-api/model
|
||||
NODE_SASS = ./node_modules/.bin/sass
|
||||
NPM = npm
|
||||
OUTPUT_DIR = .
|
||||
@@ -30,7 +30,7 @@ clean:
|
||||
rm -fr $(BUILD_DIR)
|
||||
|
||||
.NOTPARALLEL:
|
||||
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-facial-expressions
|
||||
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-face-landmarks
|
||||
|
||||
deploy-init:
|
||||
rm -fr $(DEPLOY_DIR)
|
||||
@@ -53,10 +53,8 @@ deploy-appbundle:
|
||||
$(OUTPUT_DIR)/analytics-ga.js \
|
||||
$(BUILD_DIR)/analytics-ga.min.js \
|
||||
$(BUILD_DIR)/analytics-ga.min.js.map \
|
||||
$(BUILD_DIR)/face-centering-worker.min.js \
|
||||
$(BUILD_DIR)/face-centering-worker.min.js.map \
|
||||
$(BUILD_DIR)/facial-expressions-worker.min.js \
|
||||
$(BUILD_DIR)/facial-expressions-worker.min.js.map \
|
||||
$(BUILD_DIR)/face-landmarks-worker.min.js \
|
||||
$(BUILD_DIR)/face-landmarks-worker.min.js.map \
|
||||
$(DEPLOY_DIR)
|
||||
cp \
|
||||
$(BUILD_DIR)/close3.min.js \
|
||||
@@ -103,9 +101,12 @@ deploy-meet-models:
|
||||
$(MEET_MODELS_DIR)/*.tflite \
|
||||
$(DEPLOY_DIR)
|
||||
|
||||
deploy-facial-expressions:
|
||||
deploy-face-landmarks:
|
||||
cp \
|
||||
$(FACIAL_MODELS_DIR)/* \
|
||||
$(FACE_MODELS_DIR)/tiny_face_detector_model-weights_manifest.json \
|
||||
$(FACE_MODELS_DIR)/tiny_face_detector_model.bin \
|
||||
$(FACE_MODELS_DIR)/face_expression_model-weights_manifest.json \
|
||||
$(FACE_MODELS_DIR)/face_expression_model.bin \
|
||||
$(DEPLOY_DIR)
|
||||
|
||||
deploy-css:
|
||||
@@ -117,7 +118,7 @@ deploy-local:
|
||||
([ ! -x deploy-local.sh ] || ./deploy-local.sh)
|
||||
|
||||
.NOTPARALLEL:
|
||||
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-facial-expressions
|
||||
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-libflac deploy-olm deploy-tf-wasm deploy-face-landmarks
|
||||
$(WEBPACK_DEV_SERVER)
|
||||
|
||||
source-package:
|
||||
|
||||
36
android/app/src/main/res/drawable/rn_edit_text_material.xml
Normal file
36
android/app/src/main/res/drawable/rn_edit_text_material.xml
Normal file
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2014 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
|
||||
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
|
||||
android:insetTop="@dimen/abc_edit_text_inset_top_material"
|
||||
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
|
||||
|
||||
<selector>
|
||||
<!--
|
||||
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
|
||||
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
|
||||
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
|
||||
|
||||
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
|
||||
|
||||
For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
|
||||
-->
|
||||
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
|
||||
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
|
||||
</selector>
|
||||
|
||||
</inset>
|
||||
@@ -2,6 +2,7 @@
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
|
||||
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
|
||||
<item name="android:windowDisablePreview">true</item>
|
||||
</style>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
# Specifies the JVM arguments used for the daemon process.
|
||||
# The setting is particularly useful for tweaking memory settings.
|
||||
# Default value: -Xmx10248m -XX:MaxPermSize=256m
|
||||
# Default value: -Xmx1024m -XX:MaxPermSize=256m
|
||||
|
||||
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
|
||||
|
||||
@@ -26,5 +26,5 @@ android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
android.bundle.enableUncompressedNativeLibs=false
|
||||
|
||||
appVersion=22.1.0
|
||||
sdkVersion=5.0.0
|
||||
appVersion=22.2.0
|
||||
sdkVersion=5.1.0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
@@ -51,11 +51,20 @@ public class JitsiMeetOngoingConferenceService extends Service
|
||||
intent.setAction(Action.START.getName());
|
||||
|
||||
ComponentName componentName;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
componentName = context.startForegroundService(intent);
|
||||
} else {
|
||||
componentName = context.startService(intent);
|
||||
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
componentName = context.startForegroundService(intent);
|
||||
} else {
|
||||
componentName = context.startService(intent);
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
// Avoid crashing due to ForegroundServiceStartNotAllowedException (API level 31).
|
||||
// See: https://developer.android.com/guide/components/foreground-services#background-start-restrictions
|
||||
JitsiMeetLogger.w(TAG + " Ongoing conference service not started", e);
|
||||
return;
|
||||
}
|
||||
|
||||
if (componentName == null) {
|
||||
JitsiMeetLogger.w(TAG + " Ongoing conference service not started");
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import {
|
||||
commonUserLeftHandling,
|
||||
conferenceFailed,
|
||||
conferenceJoined,
|
||||
conferenceJoinInProgress,
|
||||
conferenceLeft,
|
||||
conferenceSubjectChanged,
|
||||
conferenceTimestampChanged,
|
||||
@@ -44,6 +45,7 @@ import {
|
||||
conferenceWillJoin,
|
||||
conferenceWillLeave,
|
||||
dataChannelOpened,
|
||||
e2eRttChanged,
|
||||
getConferenceOptions,
|
||||
kickedOut,
|
||||
lockStateChanged,
|
||||
@@ -64,16 +66,17 @@ import {
|
||||
} from './react/features/base/devices';
|
||||
import {
|
||||
browser,
|
||||
isFatalJitsiConnectionError,
|
||||
JitsiConferenceErrors,
|
||||
JitsiConferenceEvents,
|
||||
JitsiConnectionErrors,
|
||||
JitsiConnectionEvents,
|
||||
JitsiE2ePingEvents,
|
||||
JitsiMediaDevicesEvents,
|
||||
JitsiParticipantConnectionStatus,
|
||||
JitsiTrackErrors,
|
||||
JitsiTrackEvents
|
||||
} from './react/features/base/lib-jitsi-meet';
|
||||
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
|
||||
import {
|
||||
getStartWithAudioMuted,
|
||||
getStartWithVideoMuted,
|
||||
@@ -140,8 +143,7 @@ import {
|
||||
initPrejoin,
|
||||
isPrejoinPageVisible,
|
||||
makePrecallTest,
|
||||
setJoiningInProgress,
|
||||
setPrejoinPageVisibility
|
||||
setJoiningInProgress
|
||||
} from './react/features/prejoin';
|
||||
import { disableReceiver, stopReceiver } from './react/features/remote-control';
|
||||
import { setScreenAudioShareState, isScreenAudioShared } from './react/features/screen-share/';
|
||||
@@ -1631,7 +1633,8 @@ export default {
|
||||
// In case there was no local audio when screen sharing was started the fact that we set the audio stream to
|
||||
// null will take care of the desktop audio stream cleanup.
|
||||
} else if (this._desktopAudioStream) {
|
||||
await this.useAudioStream(null);
|
||||
await room.replaceTrack(this._desktopAudioStream, null);
|
||||
this._desktopAudioStream.dispose();
|
||||
this._desktopAudioStream = undefined;
|
||||
}
|
||||
|
||||
@@ -1974,9 +1977,9 @@ export default {
|
||||
} else {
|
||||
// If no local stream is present ( i.e. no input audio devices) we use the screen share audio
|
||||
// stream as we would use a regular stream.
|
||||
logger.debug(`_switchToScreenSharing is using ${this._desktopAudioStream} for useAudioStream`);
|
||||
await this.useAudioStream(this._desktopAudioStream);
|
||||
|
||||
logger.debug(`_switchToScreenSharing is using ${this._desktopAudioStream} for replacing it as`
|
||||
+ ' the only audio track on the conference');
|
||||
await room.replaceTrack(null, this._desktopAudioStream);
|
||||
}
|
||||
APP.store.dispatch(setScreenAudioShareState(true));
|
||||
}
|
||||
@@ -2065,9 +2068,9 @@ export default {
|
||||
room.on(JitsiConferenceEvents.CONFERENCE_JOINED, () => {
|
||||
this._onConferenceJoined();
|
||||
});
|
||||
room.on(JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS, () => {
|
||||
APP.store.dispatch(setPrejoinPageVisibility(false));
|
||||
});
|
||||
room.on(
|
||||
JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS,
|
||||
() => APP.store.dispatch(conferenceJoinInProgress(room)));
|
||||
|
||||
room.on(
|
||||
JitsiConferenceEvents.CONFERENCE_LEFT,
|
||||
@@ -2343,6 +2346,10 @@ export default {
|
||||
APP.store.dispatch(setVideoUnmutePermissions(disableVideoMuteChange));
|
||||
});
|
||||
|
||||
room.on(
|
||||
JitsiE2ePingEvents.E2E_RTT_CHANGED,
|
||||
(...args) => APP.store.dispatch(e2eRttChanged(...args)));
|
||||
|
||||
APP.UI.addListener(UIEvents.AUDIO_MUTED, muted => {
|
||||
this.muteAudio(muted);
|
||||
});
|
||||
@@ -3109,15 +3116,6 @@ export default {
|
||||
room.sendEndpointMessage(to, payload);
|
||||
},
|
||||
|
||||
/**
|
||||
* Sends a facial expression as a string and its duration as a number
|
||||
* @param {object} payload - Object containing the {string} facialExpression
|
||||
* and {number} duration
|
||||
*/
|
||||
sendFacialExpression(payload) {
|
||||
room.sendFacialExpression(payload);
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds new listener.
|
||||
* @param {String} eventName the name of the event
|
||||
|
||||
24
config.js
24
config.js
@@ -79,6 +79,10 @@ var config = {
|
||||
flags: {
|
||||
// Enables source names in the signaling.
|
||||
// sourceNameSignaling: false,
|
||||
|
||||
// Enables sending multiple video streams, i.e., camera and desktop tracks can be shared in the conference
|
||||
// separately as two different streams instead of one composite stream.
|
||||
// sendMultipleVideoStreams: false
|
||||
},
|
||||
|
||||
// Disables moderator indicators.
|
||||
@@ -748,18 +752,18 @@ var config = {
|
||||
// Enables sending participants' emails (if available) to callstats and other analytics
|
||||
// enableEmailInStats: false,
|
||||
|
||||
// Enables detecting faces of participants and get their expression and send it to other participants
|
||||
// enableFacialRecognition: true,
|
||||
|
||||
// Enables displaying facial expressions in speaker stats
|
||||
// enableDisplayFacialExpressions: true,
|
||||
|
||||
// faceCoordinatesSharing: {
|
||||
// faceLandmarks: {
|
||||
// // Enables sharing your face cordinates. Used for centering faces within a video.
|
||||
// enabled: false,
|
||||
// enableFaceCentering: false,
|
||||
|
||||
// // Minimum required face movement percentage threshold for sending new face coordinates data.
|
||||
// threshold: 10,
|
||||
// // Enables detecting face expressions and sharing data with other participants
|
||||
// enableFaceExpressionsDetection: false,
|
||||
|
||||
// // Enables displaying face expressions in speaker stats
|
||||
// enableDisplayFaceExpressions: false,
|
||||
|
||||
// // Minimum required face movement percentage threshold for sending new face centering coordinates data.
|
||||
// faceCenteringThreshold: 10,
|
||||
|
||||
// // Miliseconds for processing a new image capture in order to detect face coordinates if they exist.
|
||||
// captureInterval: 100
|
||||
|
||||
@@ -13,10 +13,10 @@ import {
|
||||
import { openDialog } from './react/features/base/dialog/actions';
|
||||
import { setJWT } from './react/features/base/jwt';
|
||||
import {
|
||||
isFatalJitsiConnectionError,
|
||||
JitsiConnectionErrors,
|
||||
JitsiConnectionEvents
|
||||
} from './react/features/base/lib-jitsi-meet';
|
||||
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
|
||||
import { getCustomerDetails } from './react/features/jaas/actions.any';
|
||||
import { isVpaasMeeting, getJaasJWT } from './react/features/jaas/functions';
|
||||
import { setPrejoinDisplayNameRequired } from './react/features/prejoin/actions';
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
/**
|
||||
* Keep overflow menu within screen vertical bounds and make it scrollable.
|
||||
*/
|
||||
.toolbox-button-wth-dialog > div:nth-child(2) {
|
||||
.toolbox-button-wth-dialog > div:nth-child(2) {
|
||||
background: $menuBG;
|
||||
max-height: calc(100vh - #{$newToolbarSizeWithPadding} - 46px);
|
||||
margin-bottom: 4px;
|
||||
@@ -36,6 +36,15 @@
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove background color and box-shadow for the context menu container.
|
||||
*/
|
||||
.toolbox-button-wth-dialog.context-menu > div:nth-child(2) {
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
overflow-y: initial;
|
||||
}
|
||||
|
||||
.audio-preview > div:nth-child(2),
|
||||
.video-preview > div:nth-child(2),
|
||||
.reactions-menu-popup > div:nth-child(2) {
|
||||
|
||||
@@ -48,7 +48,8 @@
|
||||
/**
|
||||
* The local video identifier.
|
||||
*/
|
||||
&#filmstripLocalVideo {
|
||||
&#filmstripLocalVideo,
|
||||
&#filmstripLocalScreenShare {
|
||||
align-self: flex-end;
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
* Various overrides outside of the filmstrip to style the app to support a
|
||||
* tiled thumbnail experience.
|
||||
*/
|
||||
.tile-view, .stage-filmstrip {
|
||||
.tile-view,
|
||||
.stage-filmstrip {
|
||||
/**
|
||||
* Let the avatar grow with the tile.
|
||||
*/
|
||||
|
||||
@@ -87,9 +87,27 @@
|
||||
.videocontainer {
|
||||
height: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#filmstripLocalScreenShare {
|
||||
align-self: initial;
|
||||
margin-bottom: 5px;
|
||||
display: flex;
|
||||
flex-direction: column-reverse;
|
||||
height: auto;
|
||||
justify-content: flex-start;
|
||||
width: 100%;
|
||||
|
||||
#filmstripLocalScreenShareThumbnail {
|
||||
width: calc(100% - 15px);
|
||||
|
||||
.videocontainer {
|
||||
height: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -97,6 +115,7 @@
|
||||
* filmstrip from overlapping the left edge of the screen.
|
||||
*/
|
||||
#filmstripLocalVideo,
|
||||
#filmstripLocalScreenShare,
|
||||
.remote-videos {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ end
|
||||
|
||||
post_install do |installer|
|
||||
react_native_post_install(installer)
|
||||
__apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||
installer.pods_project.targets.each do |target|
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['ENABLE_BITCODE'] = 'YES'
|
||||
@@ -42,7 +43,4 @@ post_install do |installer|
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
|
||||
end
|
||||
end
|
||||
# https://github.com/facebook/react-native/blob/d7f748a944a9a9324e485ccbe214098e6c8645fc/scripts/react_native_pods.rb#L630
|
||||
time_header = "#{Pod::Config.instance.installation_root.to_s}/Pods/RCT-Folly/folly/portability/Time.h"
|
||||
`sed -i -e $'s/ && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)//' #{time_header}`
|
||||
end
|
||||
|
||||
430
ios/Podfile.lock
430
ios/Podfile.lock
@@ -13,14 +13,14 @@ PODS:
|
||||
- CocoaLumberjack/Core (= 3.7.2)
|
||||
- CocoaLumberjack/Core (3.7.2)
|
||||
- DoubleConversion (1.1.6)
|
||||
- FBLazyVector (0.66.4)
|
||||
- FBReactNativeSpec (0.66.4):
|
||||
- FBLazyVector (0.67.4)
|
||||
- FBReactNativeSpec (0.67.4):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.66.4)
|
||||
- RCTTypeSafety (= 0.66.4)
|
||||
- React-Core (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- RCTRequired (= 0.67.4)
|
||||
- RCTTypeSafety (= 0.67.4)
|
||||
- React-Core (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- Firebase/Analytics (6.33.0):
|
||||
- Firebase/Core
|
||||
- Firebase/Core (6.33.0):
|
||||
@@ -134,192 +134,192 @@ PODS:
|
||||
- DoubleConversion
|
||||
- fmt (~> 6.2.1)
|
||||
- glog
|
||||
- RCTRequired (0.66.4)
|
||||
- RCTTypeSafety (0.66.4):
|
||||
- FBLazyVector (= 0.66.4)
|
||||
- RCTRequired (0.67.4)
|
||||
- RCTTypeSafety (0.67.4):
|
||||
- FBLazyVector (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.66.4)
|
||||
- React-Core (= 0.66.4)
|
||||
- React (0.66.4):
|
||||
- React-Core (= 0.66.4)
|
||||
- React-Core/DevSupport (= 0.66.4)
|
||||
- React-Core/RCTWebSocket (= 0.66.4)
|
||||
- React-RCTActionSheet (= 0.66.4)
|
||||
- React-RCTAnimation (= 0.66.4)
|
||||
- React-RCTBlob (= 0.66.4)
|
||||
- React-RCTImage (= 0.66.4)
|
||||
- React-RCTLinking (= 0.66.4)
|
||||
- React-RCTNetwork (= 0.66.4)
|
||||
- React-RCTSettings (= 0.66.4)
|
||||
- React-RCTText (= 0.66.4)
|
||||
- React-RCTVibration (= 0.66.4)
|
||||
- React-callinvoker (0.66.4)
|
||||
- React-Core (0.66.4):
|
||||
- RCTRequired (= 0.67.4)
|
||||
- React-Core (= 0.67.4)
|
||||
- React (0.67.4):
|
||||
- React-Core (= 0.67.4)
|
||||
- React-Core/DevSupport (= 0.67.4)
|
||||
- React-Core/RCTWebSocket (= 0.67.4)
|
||||
- React-RCTActionSheet (= 0.67.4)
|
||||
- React-RCTAnimation (= 0.67.4)
|
||||
- React-RCTBlob (= 0.67.4)
|
||||
- React-RCTImage (= 0.67.4)
|
||||
- React-RCTLinking (= 0.67.4)
|
||||
- React-RCTNetwork (= 0.67.4)
|
||||
- React-RCTSettings (= 0.67.4)
|
||||
- React-RCTText (= 0.67.4)
|
||||
- React-RCTVibration (= 0.67.4)
|
||||
- React-callinvoker (0.67.4)
|
||||
- React-Core (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.66.4)
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-Core/Default (= 0.67.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/CoreModulesHeaders (0.66.4):
|
||||
- React-Core/CoreModulesHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/Default (0.66.4):
|
||||
- React-Core/Default (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/DevSupport (0.66.4):
|
||||
- React-Core/DevSupport (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.66.4)
|
||||
- React-Core/RCTWebSocket (= 0.66.4)
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-jsinspector (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-Core/Default (= 0.67.4)
|
||||
- React-Core/RCTWebSocket (= 0.67.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-jsinspector (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTActionSheetHeaders (0.66.4):
|
||||
- React-Core/RCTActionSheetHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTAnimationHeaders (0.66.4):
|
||||
- React-Core/RCTAnimationHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTBlobHeaders (0.66.4):
|
||||
- React-Core/RCTBlobHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTImageHeaders (0.66.4):
|
||||
- React-Core/RCTImageHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTLinkingHeaders (0.66.4):
|
||||
- React-Core/RCTLinkingHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTNetworkHeaders (0.66.4):
|
||||
- React-Core/RCTNetworkHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTSettingsHeaders (0.66.4):
|
||||
- React-Core/RCTSettingsHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTTextHeaders (0.66.4):
|
||||
- React-Core/RCTTextHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTVibrationHeaders (0.66.4):
|
||||
- React-Core/RCTVibrationHeaders (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-Core/RCTWebSocket (0.66.4):
|
||||
- React-Core/RCTWebSocket (0.67.4):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.66.4)
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsiexecutor (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-Core/Default (= 0.67.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsiexecutor (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- Yoga
|
||||
- React-CoreModules (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- React-CoreModules (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.66.4)
|
||||
- React-Core/CoreModulesHeaders (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-RCTImage (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-cxxreact (0.66.4):
|
||||
- RCTTypeSafety (= 0.67.4)
|
||||
- React-Core/CoreModulesHeaders (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-RCTImage (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-cxxreact (0.67.4):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-jsinspector (= 0.66.4)
|
||||
- React-logger (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-runtimeexecutor (= 0.66.4)
|
||||
- React-jsi (0.66.4):
|
||||
- React-callinvoker (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-jsinspector (= 0.67.4)
|
||||
- React-logger (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- React-runtimeexecutor (= 0.67.4)
|
||||
- React-jsi (0.67.4):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsi/Default (= 0.66.4)
|
||||
- React-jsi/Default (0.66.4):
|
||||
- React-jsi/Default (= 0.67.4)
|
||||
- React-jsi/Default (0.67.4):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsiexecutor (0.66.4):
|
||||
- React-jsiexecutor (0.67.4):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-jsinspector (0.66.4)
|
||||
- React-logger (0.66.4):
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- React-jsinspector (0.67.4)
|
||||
- React-logger (0.67.4):
|
||||
- glog
|
||||
- react-native-background-timer (2.4.1):
|
||||
- React-Core
|
||||
@@ -344,75 +344,75 @@ PODS:
|
||||
- react-native-video/Video (= 5.2.0)
|
||||
- react-native-video/Video (5.2.0):
|
||||
- React-Core
|
||||
- react-native-webrtc (1.94.2):
|
||||
- react-native-webrtc (1.100.0):
|
||||
- React-Core
|
||||
- react-native-webview (11.15.1):
|
||||
- React-Core
|
||||
- React-perflogger (0.66.4)
|
||||
- React-RCTActionSheet (0.66.4):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.66.4)
|
||||
- React-RCTAnimation (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- React-perflogger (0.67.4)
|
||||
- React-RCTActionSheet (0.67.4):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.67.4)
|
||||
- React-RCTAnimation (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.66.4)
|
||||
- React-Core/RCTAnimationHeaders (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-RCTBlob (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- RCTTypeSafety (= 0.67.4)
|
||||
- React-Core/RCTAnimationHeaders (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-RCTBlob (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/RCTBlobHeaders (= 0.66.4)
|
||||
- React-Core/RCTWebSocket (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-RCTNetwork (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-RCTImage (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- React-Core/RCTBlobHeaders (= 0.67.4)
|
||||
- React-Core/RCTWebSocket (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-RCTNetwork (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-RCTImage (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.66.4)
|
||||
- React-Core/RCTImageHeaders (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-RCTNetwork (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-RCTLinking (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- React-Core/RCTLinkingHeaders (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-RCTNetwork (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- RCTTypeSafety (= 0.67.4)
|
||||
- React-Core/RCTImageHeaders (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-RCTNetwork (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-RCTLinking (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- React-Core/RCTLinkingHeaders (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-RCTNetwork (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.66.4)
|
||||
- React-Core/RCTNetworkHeaders (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-RCTSettings (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- RCTTypeSafety (= 0.67.4)
|
||||
- React-Core/RCTNetworkHeaders (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-RCTSettings (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.66.4)
|
||||
- React-Core/RCTSettingsHeaders (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-RCTText (0.66.4):
|
||||
- React-Core/RCTTextHeaders (= 0.66.4)
|
||||
- React-RCTVibration (0.66.4):
|
||||
- FBReactNativeSpec (= 0.66.4)
|
||||
- RCTTypeSafety (= 0.67.4)
|
||||
- React-Core/RCTSettingsHeaders (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-RCTText (0.67.4):
|
||||
- React-Core/RCTTextHeaders (= 0.67.4)
|
||||
- React-RCTVibration (0.67.4):
|
||||
- FBReactNativeSpec (= 0.67.4)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/RCTVibrationHeaders (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (= 0.66.4)
|
||||
- React-runtimeexecutor (0.66.4):
|
||||
- React-jsi (= 0.66.4)
|
||||
- ReactCommon/turbomodule/core (0.66.4):
|
||||
- React-Core/RCTVibrationHeaders (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (= 0.67.4)
|
||||
- React-runtimeexecutor (0.67.4):
|
||||
- React-jsi (= 0.67.4)
|
||||
- ReactCommon/turbomodule/core (0.67.4):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.66.4)
|
||||
- React-Core (= 0.66.4)
|
||||
- React-cxxreact (= 0.66.4)
|
||||
- React-jsi (= 0.66.4)
|
||||
- React-logger (= 0.66.4)
|
||||
- React-perflogger (= 0.66.4)
|
||||
- React-callinvoker (= 0.67.4)
|
||||
- React-Core (= 0.67.4)
|
||||
- React-cxxreact (= 0.67.4)
|
||||
- React-jsi (= 0.67.4)
|
||||
- React-logger (= 0.67.4)
|
||||
- React-perflogger (= 0.67.4)
|
||||
- RNCalendarEvents (2.2.0):
|
||||
- React
|
||||
- RNCAsyncStorage (1.15.14):
|
||||
@@ -421,7 +421,7 @@ PODS:
|
||||
- React-Core
|
||||
- RNCMaskedView (0.2.6):
|
||||
- React-Core
|
||||
- RNDefaultPreference (1.4.3):
|
||||
- RNDefaultPreference (1.4.4):
|
||||
- React-Core
|
||||
- RNDeviceInfo (8.4.8):
|
||||
- React-Core
|
||||
@@ -430,7 +430,7 @@ PODS:
|
||||
- RNGoogleSignin (7.0.4):
|
||||
- GoogleSignIn (~> 6.0.0)
|
||||
- React-Core
|
||||
- RNReanimated (1.13.3):
|
||||
- RNReanimated (1.13.4):
|
||||
- React-Core
|
||||
- RNScreens (3.10.1):
|
||||
- React-Core
|
||||
@@ -660,8 +660,8 @@ SPEC CHECKSUMS:
|
||||
boost: a7c83b31436843459a1961bfd74b96033dc77234
|
||||
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
|
||||
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
|
||||
FBLazyVector: e5569e42a1c79ca00521846c223173a57aca1fe1
|
||||
FBReactNativeSpec: fe08c1cd7e2e205718d77ad14b34957cce949b58
|
||||
FBLazyVector: f7b0632c6437e312acf6349288d9aa4cb6d59030
|
||||
FBReactNativeSpec: 0f4e1f4cfeace095694436e7c7fcc5bf4b03a0ff
|
||||
Firebase: 8db6f2d1b2c5e2984efba4949a145875a8f65fe5
|
||||
FirebaseAnalytics: 5dd088bd2e67bb9d13dbf792d1164ceaf3052193
|
||||
FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd
|
||||
@@ -672,7 +672,7 @@ SPEC CHECKSUMS:
|
||||
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
|
||||
Giphy: b6d5087521d251bb8c99cdc0eb07bbdf86d142d5
|
||||
giphy-react-native-sdk: 7abccf2b52123a0f30ce99da895ab6288023680c
|
||||
glog: 5337263514dd6f09803962437687240c5dc39aa4
|
||||
glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85
|
||||
GoogleAppMeasurement: 966e88df9d19c15715137bb2ddaf52373f111436
|
||||
GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833
|
||||
GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a
|
||||
@@ -683,18 +683,18 @@ SPEC CHECKSUMS:
|
||||
nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc
|
||||
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
|
||||
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
|
||||
RCT-Folly: a21c126816d8025b547704b777a2ba552f3d9fa9
|
||||
RCTRequired: 4bf86c70714490bca4bf2696148638284622644b
|
||||
RCTTypeSafety: c475a7059eb77935fa53d2c17db299893f057d5d
|
||||
React: f64af14e3f2c50f6f2c91a5fd250e4ff1b3c3459
|
||||
React-callinvoker: b74e4ae80287780dcdf0cab262bcb581eeef56e7
|
||||
React-Core: 3eb7432bad96ff1d25aebc1defbae013fee2fd0e
|
||||
React-CoreModules: ad9e1fd5650e16666c57a08328df86fd7e480cb9
|
||||
React-cxxreact: 02633ff398cf7e91a2c1e12590d323c4a4b8668a
|
||||
React-jsi: 805c41a927d6499fb811772acb971467d9204633
|
||||
React-jsiexecutor: 94ce921e1d8ce7023366873ec371f3441383b396
|
||||
React-jsinspector: d0374f7509d407d2264168b6d0fad0b54e300b85
|
||||
React-logger: 933f80c97c633ee8965d609876848148e3fef438
|
||||
RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685
|
||||
RCTRequired: 0aa6c1c27e1d65920df35ceea5341a5fe76bdb79
|
||||
RCTTypeSafety: d76a59d00632891e11ed7522dba3fd1a995e573a
|
||||
React: ab8c09da2e7704f4b3ebad4baa6cfdfcc852dcb5
|
||||
React-callinvoker: 216fb96b482da516b8aba4142b145938f6ea92f0
|
||||
React-Core: af99b93aff83599485e0e0879879aafa35ceae32
|
||||
React-CoreModules: 137a054ce8c547e81dc3502933b1bc0fd08df05d
|
||||
React-cxxreact: ec5ee6b08664f5b8ac71d8ad912f54d540c4f817
|
||||
React-jsi: 3e084c80fd364cee64668d5df46d40c39f7973e1
|
||||
React-jsiexecutor: cbdf37cebdc4f5d8b3d0bf5ccaa6147fd9de9f3d
|
||||
React-jsinspector: f4775ea9118cbe1f72b834f0f842baa7a99508d8
|
||||
React-logger: a1f028f6d8639a3f364ef80419e5e862e1115250
|
||||
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
|
||||
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
|
||||
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
|
||||
@@ -705,35 +705,35 @@ SPEC CHECKSUMS:
|
||||
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
|
||||
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
|
||||
react-native-video: a4c2635d0802f983594b7057e1bce8f442f0ad28
|
||||
react-native-webrtc: 1856ac061df94b1bd6037f1f3b56d1b8bc2b50e7
|
||||
react-native-webrtc: b8f2769386d51a6a8c89778478618fe311226bc3
|
||||
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
|
||||
React-perflogger: 93075d8931c32cd1fce8a98c15d2d5ccc4d891bd
|
||||
React-RCTActionSheet: 7d3041e6761b4f3044a37079ddcb156575fb6d89
|
||||
React-RCTAnimation: 743e88b55ac62511ae5c2e22803d4f503f2a3a13
|
||||
React-RCTBlob: bee3a2f98fa7fc25c957c8643494244f74bea0a0
|
||||
React-RCTImage: 19fc9e29b06cc38611c553494f8d3040bf78c24e
|
||||
React-RCTLinking: dc799503979c8c711126d66328e7ce8f25c2848f
|
||||
React-RCTNetwork: 417e4e34cf3c19eaa5fd4e9eb20180d662a799ce
|
||||
React-RCTSettings: 4df89417265af26501a7e0e9192a34d3d9848dff
|
||||
React-RCTText: f8a21c3499ab322326290fa9b701ae29aa093aa5
|
||||
React-RCTVibration: e3ffca672dd3772536cb844274094b0e2c31b187
|
||||
React-runtimeexecutor: dec32ee6f2e2a26e13e58152271535fadff5455a
|
||||
ReactCommon: 57b69f6383eafcbd7da625bfa6003810332313c4
|
||||
React-perflogger: 0afaf2f01a47fd0fc368a93bfbb5bd3b26db6e7f
|
||||
React-RCTActionSheet: 59f35c4029e0b532fc42114241a06e170b7431a2
|
||||
React-RCTAnimation: aae4f4bed122e78bdab72f7118d291d70a932ce2
|
||||
React-RCTBlob: f6fb23394b4f28cd86fa7e9f5f6ae45c23669fda
|
||||
React-RCTImage: 638815cf96124386dd296067246d91441932ae3f
|
||||
React-RCTLinking: 254dd06283dd6fdb784285f95e7cec8053c3270f
|
||||
React-RCTNetwork: 8a4c2d4f357268e520b060572d02bc69a9b991fb
|
||||
React-RCTSettings: 35d44cbb9972ab933bd0a59ea3e6646dcb030ba3
|
||||
React-RCTText: cc5315df8458cfa7b537e621271ef43273955a97
|
||||
React-RCTVibration: 3b52a7dced19cdb025b4f88ab26ceb2d85f30ba2
|
||||
React-runtimeexecutor: a9d3c82ddf7ffdad9fbe6a81c6d6f8c06385464d
|
||||
ReactCommon: 07d0c460b9ba9af3eaf1b8f5abe7daaad28c9c4e
|
||||
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
|
||||
RNCAsyncStorage: ea6b5c280997b2b32a587793163b1f10e580c4f7
|
||||
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
|
||||
RNCMaskedView: c298b644a10c0c142055b3ae24d83879ecb13ccd
|
||||
RNDefaultPreference: 326860d42a681bfd7338c8f6d061cf58745bd860
|
||||
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
|
||||
RNDeviceInfo: 0400a6d0c94186d1120c3cbd97b23abc022187a9
|
||||
RNGestureHandler: e5c7cab5f214503dcefd6b2b0cefb050e1f51c4a
|
||||
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
|
||||
RNReanimated: 514a11da3a2bcc6c3dfd9de32b38e2b9bf101926
|
||||
RNReanimated: c1b56d030d1616239861534d9adb531f8cffab68
|
||||
RNScreens: 522705f2e5c9d27efb17f24aceb2bf8335bc7b8e
|
||||
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
|
||||
RNSVG: ce9d996113475209013317e48b05c21ee988d42e
|
||||
RNWatch: 99637948ec9b5c9ec5a41920642594ad5ba07e80
|
||||
Yoga: e7dc4e71caba6472ff48ad7d234389b91dadc280
|
||||
Yoga: d6b6a80659aa3e91aaba01d0012e7edcbedcbecd
|
||||
|
||||
PODFILE CHECKSUM: 7fafb3480e45473da539aa09d06374868b021f90
|
||||
PODFILE CHECKSUM: 2167362b8c8cacb433b763a9ae6c3f4b590190c7
|
||||
|
||||
COCOAPODS: 1.11.2
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>22.1.0</string>
|
||||
<string>22.2.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>NSExtension</key>
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
*/
|
||||
|
||||
import ReplayKit
|
||||
import JitsiMeetSDK
|
||||
|
||||
private enum Constants {
|
||||
// the App Group ID value that the app and the broadcast extension targets are setup with. It differs for each app.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>22.1.0</string>
|
||||
<string>22.2.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>22.1.0</string>
|
||||
<string>22.2.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>22.1.0</string>
|
||||
<string>22.2.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CLKComplicationPrincipalClass</key>
|
||||
|
||||
@@ -303,7 +303,7 @@
|
||||
buildConfigurationList = 0BD906ED1EC0C00300C8C18E /* Build configuration list for PBXNativeTarget "JitsiMeetSDK" */;
|
||||
buildPhases = (
|
||||
26796D8589142D80C8AFDA51 /* [CP] Check Pods Manifest.lock */,
|
||||
0BD906E21EC0C00300C8C18E /* Headers */,
|
||||
0BD906E21EC0C00300C8C18E /* Headers */,
|
||||
0BD906E01EC0C00300C8C18E /* Sources */,
|
||||
0BD906E11EC0C00300C8C18E /* Frameworks */,
|
||||
0BD906E31EC0C00300C8C18E /* Resources */,
|
||||
|
||||
@@ -35,9 +35,10 @@ typedef enum {
|
||||
static NSString * const kDevicesChanged = @"org.jitsi.meet:features/audio-mode#devices-update";
|
||||
|
||||
// Device types (must match JS and Java)
|
||||
static NSString * const kDeviceTypeHeadphones = @"HEADPHONES";
|
||||
static NSString * const kDeviceTypeBluetooth = @"BLUETOOTH";
|
||||
static NSString * const kDeviceTypeCar = @"CAR";
|
||||
static NSString * const kDeviceTypeEarpiece = @"EARPIECE";
|
||||
static NSString * const kDeviceTypeHeadphones = @"HEADPHONES";
|
||||
static NSString * const kDeviceTypeSpeaker = @"SPEAKER";
|
||||
static NSString * const kDeviceTypeUnknown = @"UNKNOWN";
|
||||
|
||||
@@ -190,7 +191,7 @@ RCT_EXPORT_METHOD(setAudioDevice:(NSString *)device
|
||||
|
||||
// The speaker is special, so test for it first.
|
||||
if ([device isEqualToString:kDeviceTypeSpeaker]) {
|
||||
forceSpeaker = NO;
|
||||
forceSpeaker = YES;
|
||||
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
|
||||
} else {
|
||||
// Here we use AVAudioSession because RTCAudioSession doesn't expose availableInputs.
|
||||
@@ -258,10 +259,16 @@ RCT_EXPORT_METHOD(updateDeviceList) {
|
||||
self->forceSpeaker = NO;
|
||||
self->forceEarpiece = NO;
|
||||
break;
|
||||
case AVAudioSessionRouteChangeReasonCategoryChange:
|
||||
case AVAudioSessionRouteChangeReasonCategoryChange: {
|
||||
// The category has changed. Check if it's the one we want and adjust as
|
||||
// needed.
|
||||
RTCAudioSessionConfiguration *currentConfig = [self configForMode:self->activeMode];
|
||||
if ([session.category isEqualToString:currentConfig.category]) {
|
||||
// We are in the desired category, nothing to do here.
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return;
|
||||
}
|
||||
@@ -274,7 +281,6 @@ RCT_EXPORT_METHOD(updateDeviceList) {
|
||||
RTCAudioSessionConfiguration *config = [self configForMode:self->activeMode];
|
||||
[self setConfig:config error:nil];
|
||||
if (self->forceSpeaker && !self->isSpeakerOn) {
|
||||
RTCAudioSession *session = JitsiAudioSession.rtcAudioSession;
|
||||
[session lockForConfiguration];
|
||||
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
|
||||
[session unlockForConfiguration];
|
||||
@@ -320,6 +326,8 @@ RCT_EXPORT_METHOD(updateDeviceList) {
|
||||
|| [portType isEqualToString:AVAudioSessionPortBluetoothLE]
|
||||
|| [portType isEqualToString:AVAudioSessionPortBluetoothA2DP]) {
|
||||
return kDeviceTypeBluetooth;
|
||||
} else if ([portType isEqualToString:AVAudioSessionPortCarAudio]) {
|
||||
return kDeviceTypeCar;
|
||||
} else {
|
||||
return kDeviceTypeUnknown;
|
||||
}
|
||||
@@ -355,7 +363,7 @@ RCT_EXPORT_METHOD(updateDeviceList) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (AVAudioSessionPortDescription *portDesc in session.availableInputs) {
|
||||
// Skip "Phone" if headphones are present.
|
||||
if (headphonesAvailable && [portDesc.portType isEqualToString:AVAudioSessionPortBuiltInMic]) {
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>5.0.0</string>
|
||||
<string>5.1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
|
||||
@@ -39,9 +39,6 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "معدل تبادل البيانات منخفض"
|
||||
},
|
||||
"blankPage": {
|
||||
"meetingEnded": "انتهى المُلتقى."
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "أضف غرفة جانبية",
|
||||
@@ -559,6 +556,7 @@
|
||||
"errorMissingPassword": "الرجاء إدخال كلمة مرور المُلتقى",
|
||||
"invalidPassword": "كلمة مرور غير صحيحة",
|
||||
"joinRejectedMessage": "رفض رئيس الجلسة منحك الإذن بالدخول إلى المُلتقى",
|
||||
"joinRejectedTitle": "تم رفض طلب الانضمام.",
|
||||
"joinTitle": "انضم للمُلتقى",
|
||||
"joinWithPasswordMessage": "الرجاء الانتظار أثناء محاولة الدخول دون كلمة مرور...",
|
||||
"joiningMessage": "ستتمكن من الانضمام للمُلتقى بعد الموافقة على طلبك",
|
||||
@@ -631,6 +629,7 @@
|
||||
"displayNotifications": "عرض الإخطارات لـ",
|
||||
"focus": "التركيز على المؤتمر",
|
||||
"focusFail": "إنَّ {{component}} غير متاح. ستعاد المحاولة مرة أخرى خلال {{ms}} ثانية.",
|
||||
"gifsMenu": "GIPHY",
|
||||
"groupTitle": "إشعارات",
|
||||
"hostAskedUnmute": "The moderator would like you to speak",
|
||||
"invitedOneMember": "دُعِي {{name}}",
|
||||
@@ -724,6 +723,7 @@
|
||||
},
|
||||
"passwordDigitsOnly": "حتى {{number}} عدد",
|
||||
"passwordSetRemotely": "ضبطها مشارك آخر",
|
||||
"pinnedParticipant": "تم تثبيت المشارك",
|
||||
"polls": {
|
||||
"answer": {
|
||||
"skip": "تخطى",
|
||||
@@ -865,6 +865,7 @@
|
||||
"expandedPending": "بدء التسجيل...",
|
||||
"failedToStart": "فشل بدء التسجيل",
|
||||
"fileSharingdescription": "شارك التسجيل مع المشاركين للمُلتقى",
|
||||
"highlight": "تسليط الضوء",
|
||||
"highlightMoment": "لحظة تسليط الضوء",
|
||||
"highlightMomentDisabled": "يمكنك تمييز اللحظات التي يبدأ فيها التسجيل",
|
||||
"highlightMomentSuccess": "تم تمييز اللحظة",
|
||||
@@ -1214,10 +1215,12 @@
|
||||
"moderator": "رئيس الجلسة",
|
||||
"mute": "المشارك مكتوم الصوت",
|
||||
"muted": "مكتوم",
|
||||
"pinToStage": "تثبيت في المرحلة",
|
||||
"remoteControl": "بدء / إيقاف التحكم البعيد",
|
||||
"screenSharing": "المشارك يشارك شاشته",
|
||||
"show": "أظهر على المنصة",
|
||||
"showSelfView": "إظهار الواجهة الذاتية",
|
||||
"unpinFromStage": "فك",
|
||||
"videoMuted": "الكاميرا معطلة",
|
||||
"videomute": "أوقف المشارك الكاميرا"
|
||||
},
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
"car": "Auto",
|
||||
"headphones": "Kopfhörer",
|
||||
"none": "Keine Audiogeräte verfügbar",
|
||||
"phone": "Hörer",
|
||||
@@ -216,6 +217,8 @@
|
||||
"liveStreaming": "Livestream"
|
||||
},
|
||||
"add": "Hinzufügen",
|
||||
"addMeetingNote": "Notiz zu dieser Konferenz hinzufügen",
|
||||
"addOptionalNote": "Notiz hinzufügen (optional):",
|
||||
"allow": "Erlauben",
|
||||
"alreadySharedVideoMsg": "Eine andere Person gibt bereits ein Video weiter. Bei dieser Konferenz ist jeweils nur ein geteiltes Video möglich.",
|
||||
"alreadySharedVideoTitle": "Nur ein geteiltes Video gleichzeitig",
|
||||
@@ -267,6 +270,8 @@
|
||||
"kickParticipantDialog": "Wollen Sie diese Person wirklich entfernen?",
|
||||
"kickParticipantTitle": "Person entfernen?",
|
||||
"kickTitle": "Autsch! {{participantDisplayName}} hat Sie aus dem Meeting geworfen",
|
||||
"linkMeeting": "Konferenz verlinken",
|
||||
"linkMeetingTitle": "Konferenz mit Salesforce verlinken",
|
||||
"liveStreaming": "Livestreaming",
|
||||
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Während einer Aufnahme nicht möglich",
|
||||
"liveStreamingDisabledTooltip": "Starten des Livestreams deaktiviert.",
|
||||
@@ -303,11 +308,11 @@
|
||||
"muteEveryonesVideoTitle": "Die Kamera von allen anderen ausschalten?",
|
||||
"muteParticipantBody": "Sie können die Stummschaltung anderer Personen nicht aufheben, aber eine Person kann ihre eigene Stummschaltung jederzeit beenden.",
|
||||
"muteParticipantButton": "Stummschalten",
|
||||
"muteParticipantDialog": "Wollen Sie diese Person wirklich stummschalten? Sie können die Stummschaltung nicht wieder aufheben, die Person kann dies aber jederzeit selbst tun.",
|
||||
"muteParticipantTitle": "Person stummschalten?",
|
||||
"muteParticipantsVideoBody": "Sie können die Kamera nicht wieder aktivieren, die Teilnehmer können dies aber jederzeit wieder ändern.",
|
||||
"muteParticipantsVideoBodyModerationOn": "Sie können die Kamera nicht wieder aktivieren und die Person selbst auch nicht.",
|
||||
"muteParticipantsVideoButton": "Kamera ausschalten",
|
||||
"muteParticipantsVideoDialog": "Wollen Sie die Kamera dieser Person wirklich deaktivieren? Sie können die Kamera nicht wieder aktivieren, die Person kann dies aber jederzeit selbst tun.",
|
||||
"muteParticipantsVideoDialogModerationOn": "Wollen Sie die Kamera dieser Person wirklich deaktivieren? Sie können die Kamea nicht wieder aktivieren und die Person selbst auch nicht.",
|
||||
"muteParticipantsVideoTitle": "Die Kamera von dieser Person ausschalten?",
|
||||
"noDropboxToken": "Kein gültiges Dropbox-Token",
|
||||
"password": "Passwort",
|
||||
@@ -321,6 +326,7 @@
|
||||
"popupError": "Ihr Browser blockiert Pop-ups von dieser Website. Bitte aktivieren Sie Pop-ups in den Sicherheitseinstellungen des Browsers und versuchen Sie es erneut.",
|
||||
"popupErrorTitle": "Pop-up blockiert",
|
||||
"readMore": "mehr",
|
||||
"recentlyUsedObjects": "Ihre zuletzt verwendeten Objekte",
|
||||
"recording": "Aufnahme",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Während eines Livestreams nicht möglich",
|
||||
"recordingDisabledTooltip": "Start der Aufzeichnung deaktiviert.",
|
||||
@@ -343,6 +349,12 @@
|
||||
"screenSharingFailed": "Ups! Beim Teilen des Bildschirms ist etwas schiefgegangen!",
|
||||
"screenSharingFailedTitle": "Bildschirmfreigabe fehlgeschlagen!",
|
||||
"screenSharingPermissionDeniedError": "Ups! Etwas stimmt nicht mit Ihren Berechtigungen zur Bildschirmfreigabe. Bitte neu laden und erneut versuchen.",
|
||||
"searchInSalesforce": "In Salesforce suchen",
|
||||
"searchResults": "Suchergebnisse({{count}})",
|
||||
"searchResultsDetailsError": "Beim Abrufen der Daten des Besitzers ist ein Fehler aufgetreten.",
|
||||
"searchResultsError": "Beim Abrufen der Daten ist ein Fehler aufgetreten.",
|
||||
"searchResultsNotFound": "Keine Suchergebnisse.",
|
||||
"searchResultsTryAgain": "Versuchen Sie es mit anderen Stichwörtern.",
|
||||
"sendPrivateMessage": "Sie haben kürzlich eine private Nachricht erhalten. Hatten Sie die Absicht, darauf privat zu antworten, oder wollen Sie Ihre Nachricht an die Gruppe senden?",
|
||||
"sendPrivateMessageCancel": "An die Gruppe senden",
|
||||
"sendPrivateMessageOk": "Privat antworten",
|
||||
@@ -410,6 +422,10 @@
|
||||
"veryBad": "Sehr schlecht",
|
||||
"veryGood": "Sehr gut"
|
||||
},
|
||||
"giphy": {
|
||||
"noResults": "Keine Ergebnisse :(",
|
||||
"search": "GIPHY durchsuchen"
|
||||
},
|
||||
"helpView": {
|
||||
"header": "Hilfecenter"
|
||||
},
|
||||
@@ -476,6 +492,7 @@
|
||||
"focusLocal": "Lokales Video fokussieren",
|
||||
"focusRemote": "Auf das Video einer anderen Person fokussieren",
|
||||
"fullScreen": "Vollbildmodus aktivieren oder deaktivieren",
|
||||
"giphyMenu": "GIPHY ein- oder ausblenden",
|
||||
"keyboardShortcuts": "Tastenkürzel",
|
||||
"localRecording": "Lokale Aufzeichnungssteuerelemente ein- oder ausblenden",
|
||||
"mute": "Stummschaltung aktivieren oder deaktivieren",
|
||||
@@ -543,6 +560,7 @@
|
||||
"errorMissingPassword": "Bitte das Konferenzpasswort eingeben",
|
||||
"invalidPassword": "Ungültiges Passwort",
|
||||
"joinRejectedMessage": "Ihre Beitrittsanfrage wurde von der Moderation abgelehnt.",
|
||||
"joinRejectedTitle": "Beitrittsanfrage abgelehnt.",
|
||||
"joinTitle": "Konferenz beitreten",
|
||||
"joinWithPasswordMessage": "Beitrittsversuch mit Passwort, bitte warten …",
|
||||
"joiningMessage": "Sie treten der Konferenz bei, sobald jemand Ihre Anfrage annimmt.",
|
||||
@@ -615,6 +633,7 @@
|
||||
"displayNotifications": "Benachrichtigungen anzeigen für",
|
||||
"focus": "Konferenzleitung",
|
||||
"focusFail": "{{component}} ist im Moment nicht verfügbar – wiederholen in {{ms}} Sekunden",
|
||||
"gifsMenu": "GIPHY",
|
||||
"groupTitle": "Benachrichtigungen",
|
||||
"hostAskedUnmute": "Die Moderation bittet Sie, das Mikrofon zu aktivieren",
|
||||
"invitedOneMember": "{{name}} wurde eingeladen",
|
||||
@@ -624,6 +643,12 @@
|
||||
"leftOneMember": "{{name}} hat die Konferenz verlassen",
|
||||
"leftThreePlusMembers": "{{name}} und Weitere haben die Konferenz verlassen",
|
||||
"leftTwoMembers": "{{first}} und {{second}} haben die Konferenz verlassen",
|
||||
"linkToSalesforce": "Mit Salesforce verlinken",
|
||||
"linkToSalesforceDescription": "Sie können die Zusammenfassung der Konferenz mit einem Objekt bei Salesforce verlinken.",
|
||||
"linkToSalesforceError": "Konferenz konnte nicht mit Salesforce verlinkt werden",
|
||||
"linkToSalesforceKey": "Konferenz verlinken",
|
||||
"linkToSalesforceProgress": "Konferenz wird mit Salesforce verlinkt...",
|
||||
"linkToSalesforceSuccess": "Die Konferenz wurde mit Salesforce verlinkt",
|
||||
"me": "Ich",
|
||||
"moderationInEffectCSDescription": "Bitte melden um ein Video zu teilen",
|
||||
"moderationInEffectCSTitle": "Die Videofreigabe ist von der Moderation gesperrt",
|
||||
@@ -702,6 +727,7 @@
|
||||
},
|
||||
"passwordDigitsOnly": "Bis zu {{number}} Ziffern",
|
||||
"passwordSetRemotely": "von einer anderen Person gesetzt",
|
||||
"pinnedParticipant": "Die Person ist angeheftet",
|
||||
"polls": {
|
||||
"answer": {
|
||||
"skip": "Überspringen",
|
||||
@@ -817,6 +843,18 @@
|
||||
},
|
||||
"raisedHand": "Ich möchte sprechen",
|
||||
"raisedHandsLabel": "Anzahl gehobener Hände",
|
||||
"record": {
|
||||
"already": {
|
||||
"linked": "Diese Konferenz ist bereits mit einem Objekt bei Salesforce verlinkt."
|
||||
},
|
||||
"type": {
|
||||
"account": "Account",
|
||||
"contact": "Contact",
|
||||
"lead": "Lead",
|
||||
"opportunity": "Opportunity",
|
||||
"owner": "Owner"
|
||||
}
|
||||
},
|
||||
"recording": {
|
||||
"authDropboxText": "In Dropbox hochladen",
|
||||
"availableSpace": "Verfügbarer Speicherplatz: {{spaceLeft}} MB (ca. {{duration}} Minuten Aufzeichnung)",
|
||||
@@ -831,6 +869,11 @@
|
||||
"expandedPending": "Aufzeichnung wird gestartet…",
|
||||
"failedToStart": "Die Aufnahme konnte nicht gestartet werden",
|
||||
"fileSharingdescription": "Aufzeichnung mit den Personen der Konferenz teilen",
|
||||
"highlight": "Highlight",
|
||||
"highlightMoment": "Moment als Highlight festhalten",
|
||||
"highlightMomentDisabled": "Sie können Momente als Highlights festhalten, sobald die Aufnahme startet",
|
||||
"highlightMomentSuccess": "Highlight festgehalten",
|
||||
"highlightMomentSucessDescription": "Ihr festgehaltener Moment wird zur Zusammenfassung des Meeting hinzugefügt.",
|
||||
"inProgress": "Aufzeichnung gestartet",
|
||||
"limitNotificationDescriptionNative": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <3>{{app}}</3>.",
|
||||
"limitNotificationDescriptionWeb": "Wegen hoher Nachfrage ist Ihre Aufnahme auf {{limit}} Min. begrenzt. Für unlimitierte Aufnahmen nutzen Sie bitte <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
|
||||
@@ -845,6 +888,7 @@
|
||||
"rec": "AUFZ",
|
||||
"serviceDescription": "Ihre Aufzeichnung wird vom Aufzeichnungsdienst gespeichert",
|
||||
"serviceDescriptionCloud": "Cloud-Aufzeichnung",
|
||||
"serviceDescriptionCloudInfo": "Aufzeichnungen werden 24 Stunden nach Aufzeichnungsende automatisch gelöscht.",
|
||||
"serviceName": "Aufnahmedienst",
|
||||
"sessionAlreadyActive": "Diese Konferenz wird bereits aufgezeichnet.",
|
||||
"signIn": "Anmelden",
|
||||
@@ -879,6 +923,7 @@
|
||||
"incomingMessage": "Eingehende Nachricht",
|
||||
"language": "Sprache",
|
||||
"loggedIn": "Als {{name}} angemeldet",
|
||||
"maxStageParticipants": "Maximale Anzahl an Personen, die zur Hauptansicht angeheftet werden können",
|
||||
"microphones": "Mikrofon",
|
||||
"moderator": "Moderation",
|
||||
"more": "Mehr",
|
||||
@@ -977,6 +1022,7 @@
|
||||
"expand": "Ausklappen",
|
||||
"feedback": "Feedback hinterlassen",
|
||||
"fullScreen": "Vollbildmodus ein-/ausschalten",
|
||||
"giphy": "GIPHY ein-/ausschalten",
|
||||
"grantModerator": "Moderationsrechte vergeben",
|
||||
"hangup": "Konferenz verlassen",
|
||||
"help": "Hilfe",
|
||||
@@ -984,6 +1030,7 @@
|
||||
"kick": "Person entfernen",
|
||||
"laugh": "Lachen",
|
||||
"like": "Daumen nach oben",
|
||||
"linkToSalesforce": "Mit Salesforce verlinken",
|
||||
"lobbyButton": "Lobbymodus ein-/ausschalten",
|
||||
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
|
||||
"lockRoom": "Konferenzpasswort ein-/ausschalten",
|
||||
@@ -993,8 +1040,8 @@
|
||||
"mute": "Mikrofon aktivieren / deaktivieren",
|
||||
"muteEveryone": "Alle stummschalten",
|
||||
"muteEveryoneElse": "Alle anderen stummschalten",
|
||||
"muteEveryoneElsesVideo": "Alle anderen Kameras ausschalten",
|
||||
"muteEveryonesVideo": "Alle Kameras ausschalten",
|
||||
"muteEveryoneElsesVideoStream": "Alle anderen Kameras ausschalten",
|
||||
"muteEveryonesVideoStream": "Alle Kameras ausschalten",
|
||||
"participants": "Anwesende",
|
||||
"pip": "Bild-in-Bild-Modus ein-/ausschalten",
|
||||
"privateMessage": "Private Nachricht senden",
|
||||
@@ -1045,6 +1092,7 @@
|
||||
"exitFullScreen": "Vollbildmodus verlassen",
|
||||
"exitTileView": "Kachelansicht ausschalten",
|
||||
"feedback": "Feedback hinterlassen",
|
||||
"giphy": "GIPHY ein-/ausschalten",
|
||||
"hangup": "Konferenz verlassen",
|
||||
"help": "Hilfe",
|
||||
"invite": "Personen einladen",
|
||||
@@ -1052,6 +1100,7 @@
|
||||
"laugh": "Lachen",
|
||||
"leaveBreakoutRoom": "Breakout-Raum verlassen",
|
||||
"like": "Daumen hoch",
|
||||
"linkToSalesforce": "Mit Salesforce verknüpfen",
|
||||
"lobbyButtonDisable": "Lobbymodus deaktivieren",
|
||||
"lobbyButtonEnable": "Lobbymodus aktivieren",
|
||||
"login": "Anmelden",
|
||||
@@ -1171,10 +1220,12 @@
|
||||
"moderator": "Moderation",
|
||||
"mute": "Person ist stumm geschaltet",
|
||||
"muted": "Stummgeschaltet",
|
||||
"pinToStage": "Anheften",
|
||||
"remoteControl": "Fernsteuerung",
|
||||
"screenSharing": "Person teilt den Bildschirm",
|
||||
"show": "Im Vordergrund anzeigen",
|
||||
"showSelfView": "Eigene Ansicht anzeigen",
|
||||
"unpinFromStage": "Lösen",
|
||||
"videoMuted": "Kamera ausgeschaltet",
|
||||
"videomute": "Person hat die Kamera angehalten"
|
||||
},
|
||||
|
||||
@@ -629,6 +629,7 @@
|
||||
"displayNotifications": "Afficher les notifications pour",
|
||||
"focus": "Focus de conférence",
|
||||
"focusFail": "{{component}} n'est pas disponible - réessayez dans {{ms}} sec",
|
||||
"gifsMenu": "GIPHY",
|
||||
"groupTitle": "Notifications",
|
||||
"hostAskedUnmute": "Le modérateur souhaite vous donner la parole",
|
||||
"invitedOneMember": "{{name}} a été invité(e)",
|
||||
@@ -722,6 +723,7 @@
|
||||
},
|
||||
"passwordDigitsOnly": "Jusqu'à {{number}} chiffres",
|
||||
"passwordSetRemotely": "défini par un autre participant",
|
||||
"pinnedParticipant": "Participant toujours affiché",
|
||||
"polls": {
|
||||
"answer": {
|
||||
"skip": "Passer",
|
||||
@@ -1211,12 +1213,14 @@
|
||||
"hideSelfView": "Cacher l'affichage de votre propre vidéo",
|
||||
"kick": "Exclure",
|
||||
"moderator": "Modérateur",
|
||||
"mute": "Un participant a coupé son micro",
|
||||
"mute": "Le participant a coupé son micro",
|
||||
"muted": "Muet",
|
||||
"pinToStage": "Garder affiché",
|
||||
"remoteControl": "Démarrer / Arrêter le contrôle à distance",
|
||||
"screenSharing": "Cette personne partage son écran",
|
||||
"show": "Afficher en premier plan",
|
||||
"showSelfView": "Montrer votre propre vidéo",
|
||||
"unpinFromStage": "Ne plus garder affiché",
|
||||
"videoMuted": "Caméra coupée",
|
||||
"videomute": "Le participant a arrêté la caméra"
|
||||
},
|
||||
|
||||
@@ -841,7 +841,7 @@
|
||||
"raisedHandsLabel": "Número de mãos levantadas",
|
||||
"record": {
|
||||
"already": {
|
||||
"linked": "O registo já está ligado a esta sessão."
|
||||
"linked": "A reunião já está ligada a este objecto da Força de vendas."
|
||||
},
|
||||
"type": {
|
||||
"account": "Conta",
|
||||
@@ -1215,12 +1215,12 @@
|
||||
"moderator": "Moderador",
|
||||
"mute": "Participante está sem som",
|
||||
"muted": "Sem som",
|
||||
"pinToStage": "Fixar no palco",
|
||||
"pinToStage": "Fixar no ecrã",
|
||||
"remoteControl": "Iniciar / Parar controlo remoto",
|
||||
"screenSharing": "Participante está a partilhar o seu ecrã",
|
||||
"show": "Mostrar no palco",
|
||||
"showSelfView": "Mostrar autovisualização",
|
||||
"unpinFromStage": "Desafixar",
|
||||
"unpinFromStage": "Soltar",
|
||||
"videoMuted": "Câmara desativada",
|
||||
"videomute": "Participante parou a câmara"
|
||||
},
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"addPeople": {
|
||||
"add": "Пригласить",
|
||||
"addContacts": "Пригласите других людей",
|
||||
"contacts": "контакты",
|
||||
"copyInvite": "Скопировать приглашение на встречу",
|
||||
"copyLink": "Скопировать ссылку на встречу",
|
||||
"copyStream": "Скопировать ссылку на прямую трансляцию",
|
||||
@@ -16,18 +17,14 @@
|
||||
"inviteMoreMailSubject": "Присоединиться к встрече {{appName}} ",
|
||||
"inviteMorePrompt": "Пригласить других людей",
|
||||
"linkCopied": "Ссылка скопирована в буфер обмена",
|
||||
"loading": "Поиск людей и номеров телефонов",
|
||||
"loadingNumber": "Проверка номера телефона",
|
||||
"loadingPeople": "Поиск людей для приглашения",
|
||||
"noResults": "Поиск не дал результата",
|
||||
"noValidNumbers": "Пожалуйста, введите номер телефона",
|
||||
"outlookEmail": "Электронная почта Outlook",
|
||||
"searchNumbers": "Добавить номера телефонов",
|
||||
"searchPeople": "Поиск людей",
|
||||
"searchPeopleAndNumbers": "Поиск людей или добавление их телефонов",
|
||||
"phoneNumbers": "телефонные номера",
|
||||
"searching": "Поиск...",
|
||||
"shareInvite": "Поделиться приглашением на встречу",
|
||||
"shareLink": "Поделиться ссылкой на встречу чтобы пригласить других",
|
||||
"shareStream": "Поделиться ссылкой на прямую трансляцию",
|
||||
"sipAddresses": "sip-адреса",
|
||||
"telephone": "Номер: {{number}}",
|
||||
"title": "Пригласить людей на эту встречу",
|
||||
"yahooEmail": "Электронная почта Yahoo"
|
||||
@@ -42,6 +39,25 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Только звук"
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "Добавить комнату отдыха",
|
||||
"autoAssign": "Auto assign to breakout roomsAuto assign to breakout rooms",
|
||||
"close": "Закрыть",
|
||||
"join": "Присоединиться",
|
||||
"leaveBreakoutRoom": "Покинуть комнату отдыха",
|
||||
"more": "Больше",
|
||||
"remove": "Удалить",
|
||||
"sendToBreakoutRoom": "Отправить участника к:"
|
||||
},
|
||||
"defaultName": "Комната отдыха #{{index}}",
|
||||
"mainRoom": "Главная комната",
|
||||
"notifications": {
|
||||
"joined": "Подключение к \"{{name}}\" комнате отдыха",
|
||||
"joinedMainRoom": "Соединение с главной комнатой",
|
||||
"joinedTitle": "Комнаты отдыха"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "Добавить ссылку конференции",
|
||||
"confirmAddLink": "Вы хотите добавить ссылку Jitsi к этому календарному событию?",
|
||||
@@ -61,8 +77,13 @@
|
||||
"today": "Сегодня"
|
||||
},
|
||||
"chat": {
|
||||
"enter": "Войди в комнату",
|
||||
"error": "Ошибка: Ваше сообщение не было отправлено. Причина: {{error}}",
|
||||
"fieldPlaceHolder": "Введите здесь ваше сообщение",
|
||||
"lobbyChatMessageTo": "Сообщение пользователю {{recipient}}",
|
||||
"message": "Сообщение",
|
||||
"messageAccessibleTitle": "{{user}} говорит:",
|
||||
"messageAccessibleTitleMe": "я говорю:",
|
||||
"messageTo": "Личное сообщение пользователю {{recipient}}",
|
||||
"messagebox": "Введите сообщение",
|
||||
"nickname": {
|
||||
@@ -72,12 +93,18 @@
|
||||
},
|
||||
"noMessagesMessage": "В конференции пока нет никаких сообщений. Начните разговор!",
|
||||
"privateNotice": "Личное сообщение пользователю {{recipient}}",
|
||||
"smileysPanel": "Emoji панель",
|
||||
"tabs": {
|
||||
"chat": "Чат",
|
||||
"polls": "Опросы"
|
||||
},
|
||||
"title": "Чат",
|
||||
"titleWithPolls": "Чат",
|
||||
"you": "вы"
|
||||
},
|
||||
"chromeExtensionBanner": {
|
||||
"buttonText": "Установить расширение Chrome",
|
||||
"close": "Закрыть",
|
||||
"dontShowAgain": "Не показывай мне это снова",
|
||||
"installExtensionText": "Установите расширение для интеграции с Google Календарь и Office 365"
|
||||
},
|
||||
@@ -97,8 +124,7 @@
|
||||
"FETCH_SESSION_ID": "Получение идентификатора сеанса…",
|
||||
"GET_SESSION_ID_ERROR": "Ошибка получения идентификатора сеанса: {{code}}",
|
||||
"GOT_SESSION_ID": "Получение идентификатора сеанса… Готово",
|
||||
"LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности",
|
||||
"RECONNECTING": "Проблема с сетью. Переподключение..."
|
||||
"LOW_BANDWIDTH": "Видео для {{displayName}} приостановлено из-за низкой пропускной способности"
|
||||
},
|
||||
"connectionindicator": {
|
||||
"address": "Адрес:",
|
||||
@@ -111,12 +137,10 @@
|
||||
"e2e_rtt": "E2E RTT:",
|
||||
"framerate": "Частота кадров:",
|
||||
"less": "Краткая информация",
|
||||
"localaddress_0": "Локальный адрес:",
|
||||
"localaddress_1": "Локальных адреса:",
|
||||
"localaddress_2": "Локальных адресов:",
|
||||
"localport_0": "Локальный порт:",
|
||||
"localport_1": "Локальных порта:",
|
||||
"localport_2": "Локальных портов:",
|
||||
"localaddress": "Локальный адрес:",
|
||||
"localaddress_plural": "Локальные адреса:",
|
||||
"localport": "Локальный порт:",
|
||||
"localport_plural": "Локальные порты:",
|
||||
"maxEnabledResolution": "Максимальное разрешение",
|
||||
"more": "Подробная информация",
|
||||
"packetloss": "Потери пакетов:",
|
||||
@@ -128,18 +152,15 @@
|
||||
"nonoptimal": "не оптимально",
|
||||
"poor": "плохо"
|
||||
},
|
||||
"remoteaddress_0": "Удаленный адрес:",
|
||||
"remoteaddress_1": "Удаленных адреса:",
|
||||
"remoteaddress_2": "Удаленных адресов:",
|
||||
"remoteport_0": "Удаленный порт:",
|
||||
"remoteport_1": "Удаленных порта:",
|
||||
"remoteport_2": "Удаленных портов:",
|
||||
"remoteaddress": "Удаленный адрес:",
|
||||
"remoteaddress_plural": "Удаленные адреса:",
|
||||
"remoteport": "Удаленный порт:",
|
||||
"remoteport_plural": "Удаленные порты:",
|
||||
"resolution": "Разрешение:",
|
||||
"savelogs": "Сохранить логи",
|
||||
"status": "Связь:",
|
||||
"transport_0": "Метод отправки:",
|
||||
"transport_1": "Метода отправки:",
|
||||
"transport_2": "Методов отправки:",
|
||||
"transport": "Транспорт:",
|
||||
"transport_plural": "Транспорты:",
|
||||
"video_ssrc": "Видео SSRC:"
|
||||
},
|
||||
"dateUtils": {
|
||||
@@ -156,9 +177,9 @@
|
||||
"ifHaveApp": "Если у Вас уже есть приложение:",
|
||||
"joinInApp": "Присоединиться к этой встрече с помощью приложения",
|
||||
"launchWebButton": "Запустить в браузере",
|
||||
"openApp": "Перейти к приложению",
|
||||
"title": "Запуск вашей встречи в {{app}}...",
|
||||
"tryAgainButton": "Повторите в настольном приложении"
|
||||
"tryAgainButton": "Повторите в настольном приложении",
|
||||
"unsupportedBrowser": "Вы используете браузер, который мы не поддерживаем."
|
||||
},
|
||||
"defaultLink": "напр. {{url}}",
|
||||
"defaultNickname": "напр. Яна Цветкова",
|
||||
@@ -186,21 +207,25 @@
|
||||
"Share": "Поделиться",
|
||||
"Submit": "ОК",
|
||||
"WaitForHostMsg": "Конференция еще не началась. Если вы организатор, пожалуйста, авторизируйтесь. В противном случае дождитесь организатора.",
|
||||
"WaitingForHost": "Ждем организатора...",
|
||||
"WaitingForHostTitle": "Ждем организатора...",
|
||||
"Yes": "Да",
|
||||
"accessibilityLabel": {
|
||||
"liveStreaming": "Трансляция"
|
||||
},
|
||||
"add": "Добавить",
|
||||
"addMeetingNote": "Добавить записку об этом митиге",
|
||||
"addOptionalNote": "Добавить записку (необязательно):",
|
||||
"allow": "Разрешить",
|
||||
"alreadySharedVideoMsg": "Другой участник уже поделился ссылкой на видео. Данная конференция позволяет одновременно делиться только одним видео.",
|
||||
"alreadySharedVideoTitle": "Допускается показ только одного видео",
|
||||
"applicationWindow": "Окно приложения",
|
||||
"authenticationRequired": "Требуется авторизация",
|
||||
"cameraConstraintFailedError": "Камера не отвечает определенным требованиям.",
|
||||
"cameraNotFoundError": "Камера не обнаружена.",
|
||||
"cameraNotSendingData": "Ошибка доступа к камере. Пожалуйста, проверьте, не использует ли камеру какая-нибудь другая программа. Вы можете также выбрать другое устройство из меню настроек или попробовать перезапустить приложение.",
|
||||
"cameraNotSendingDataTitle": "Нет доступа к камере",
|
||||
"cameraPermissionDeniedError": "Нет доступа к камере. Вы можете участвовать во встрече, но другие не будут вас видеть. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
|
||||
"cameraTimeoutError": "Не удалось запустить источник видео. Произошел тайм-аут!Не удалось запустить источник видео. Произошел тайм-аут!",
|
||||
"cameraUnknownError": "Неизвестная ошибка использования камеры.",
|
||||
"cameraUnsupportedResolutionError": "Ваша камера не поддерживает необходимое разрешение видео.",
|
||||
"close": "Закрыть",
|
||||
@@ -221,23 +246,19 @@
|
||||
"displayNameRequired": "Привет! Как тебя зовут?",
|
||||
"done": "Готово",
|
||||
"e2eeDescription": "Сквозное шифрование в настоящее время является ЭКСПЕРИМЕНТАЛЬНЫМ. Имейте в виду, что включение сквозного шифрования эффективно отключит сервисы, предоставляемые на стороне сервера, такие как: запись, потоковое вещание и участие по телефону. Также имейте в виду, что собрание будет работать только для людей, присоединяющихся из браузеров с поддержкой вставляемых потоков.",
|
||||
"e2eeDisabledDueToMaxModeDescription": "Невозможно включить сквозное шифрование из-за большого количества участников конференции.",
|
||||
"e2eeLabel": "E2EE ключ",
|
||||
"e2eeNoKey": "Отсутствует",
|
||||
"e2eeSet": "Установить",
|
||||
"e2eeToggleSet": "Установить ключ",
|
||||
"e2eeWarning": "ПРЕДУПРЕЖДЕНИЕ. Похоже, что не все участники этой встречи поддерживают сквозное шифрование. Если вы включите его, они не смогут вас ни видеть, ни слышать.",
|
||||
"e2eeWillDisableDueToMaxModeDescription": "ВНИМАНИЕ: Сквозное шифрование будет автоматически отключено, если к конференции присоединится больше участников.",
|
||||
"embedMeeting": "Встроить встречу",
|
||||
"enterDisplayName": "Пожалуйста, введите свое имя",
|
||||
"error": "Ошибка",
|
||||
"externalInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
|
||||
"externalInstallationTitle": "Требуется расширение",
|
||||
"goToStore": "Перейти к интернет-магазину",
|
||||
"gracefulShutdown": "Технические работы. Пожалуйста, попробуйте позже.",
|
||||
"grantModeratorDialog": "Вы уверены, что хотите сделать этого участника модератором?",
|
||||
"grantModeratorTitle": "Сделать модератором",
|
||||
"hideShareAudioHelper": "Больше не показывать это диалоговое окно",
|
||||
"incorrectPassword": "Ошибка имени пользователя или пароля",
|
||||
"incorrectRoomLockPassword": "Неверный пароль",
|
||||
"inlineInstallExtension": "Установить",
|
||||
"inlineInstallationMsg": "Вам необходимо установить наше дополнение для совместного использования рабочего стола.",
|
||||
"internalError": "Что-то пошло не так. Ошибка: {{error}}",
|
||||
"internalErrorTitle": "Внутренняя ошибка",
|
||||
"kickMessage": "Вы можете связаться с {{participantDisplayName}} для получения более подробной информации.",
|
||||
@@ -245,13 +266,16 @@
|
||||
"kickParticipantDialog": "Вы уверены, что хотите отключить этого участника?",
|
||||
"kickParticipantTitle": "Отключить этого участника?",
|
||||
"kickTitle": "{{participantDisplayName}} отключил вас от конференции.",
|
||||
"linkMeeting": "Связать встречу",
|
||||
"linkMeetingTitle": "Связать встречу с Salesforce",
|
||||
"liveStreaming": "Трансляция",
|
||||
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "Невозможно пока активна запись",
|
||||
"liveStreamingDisabledForGuestTooltip": "Гости не могут начать трансляцию",
|
||||
"liveStreamingDisabledTooltip": "Возможность трансляции отключена",
|
||||
"localUserControls": "Локальные пользовательские элементы управления",
|
||||
"lockMessage": "Не удалось запереть конференцию",
|
||||
"lockRoom": "Добавить конференцию $t(lockRoomPasswordUppercase)",
|
||||
"lockTitle": "Блокировка не удалась",
|
||||
"login": "Войти",
|
||||
"logoutQuestion": "Уверены, что хотите выйти и остановить встречу?",
|
||||
"logoutTitle": "Завершить сеанс",
|
||||
"maxUsersLimitReached": "Достигнут лимит на максимальное количество участников. Конференция переполнена. Пожалуйста, свяжитесь с организатором конференции или повторите попытку позже!",
|
||||
@@ -261,27 +285,46 @@
|
||||
"micNotSendingData": "Перейдите в настройки компьютера, чтобы включить микрофон и настроить уровень чувствительности.",
|
||||
"micNotSendingDataTitle": "Ваш микрофон отключен системными настройками",
|
||||
"micPermissionDeniedError": "Нет доступа к микрофону. Вы можете участвовать во встрече, но другие не будут вас слышать. Используйте значок камеры в адресной строке браузера, чтобы устранить проблему.",
|
||||
"micTimeoutError": "Не удалось запустить источник звука. Произошел тайм-аут!",
|
||||
"micUnknownError": "Неизвестная ошибка использования микрофона.",
|
||||
"moderationAudioLabel": "Разрешить участникам самостоятельно включать звук",
|
||||
"moderationVideoLabel": "Разрешить участникам запускать свое видео",
|
||||
"muteEveryoneDialog": "Вы уверены, что хотите отключить микрофоны у всех? Вы не сможете включить их, но они могут включить себя в любой момент.",
|
||||
"muteEveryoneDialogModerationOn": "Участники могут отправить запрос на выступление в любое время.",
|
||||
"muteEveryoneElseDialog": "После отключения микрофонов у участников вы не сможете включить их, но они могут включить себя в любой момент.",
|
||||
"muteEveryoneElseTitle": "Заглушить всех, за исключением {{whom}}?",
|
||||
"muteEveryoneElsesVideoDialog": "Как только камера будет отключена, вы не сможете снова включить ее, но они могут включить ее снова в любое время.",
|
||||
"muteEveryoneElsesVideoTitle": "Остановить видео для всех, кроме {{кого}}?",
|
||||
"muteEveryoneSelf": "себя",
|
||||
"muteEveryoneStartMuted": "Теперь у всех микрофоны выключены",
|
||||
"muteEveryoneTitle": "Заглушить всех?",
|
||||
"muteEveryonesVideoDialog": "Участники могут включить свое видео в любое время.",
|
||||
"muteEveryonesVideoDialogModerationOn": "Участники могут отправить запрос на включение своего видео в любое время.",
|
||||
"muteEveryonesVideoDialogOk": "Отключить",
|
||||
"muteEveryonesVideoTitle": "Остановить всеобщее видео?",
|
||||
"muteParticipantBody": "Вы не можете включить им микрофон, но они могут сделать это сами в любое время.",
|
||||
"muteParticipantButton": "Заглушить",
|
||||
"muteParticipantDialog": "Вы уверены, что хотите отключить микрофон у данного пользователя? Вы не сможете отменить это действие, однако он сможет сам снова включить микрофон в любое время.",
|
||||
"muteParticipantTitle": "Заглушить этого участника?",
|
||||
"muteParticipantsVideoBody": "Вы не сможете снова включить камеру, но они могут включить ее снова в любое время.",
|
||||
"muteParticipantsVideoBodyModerationOn": "Вы не сможете снова включить камеру, и они тоже.",
|
||||
"muteParticipantsVideoButton": "Остановить видео",
|
||||
"muteParticipantsVideoDialog": "Вы уверены, что хотите выключить камеру этого участника? Вы не сможете снова включить камеру, но они могут включить ее снова в любое время.",
|
||||
"muteParticipantsVideoDialogModerationOn": "Вы уверены, что хотите выключить камеру этого участника? Вы не сможете снова включить камеру, и они тоже.",
|
||||
"muteParticipantsVideoTitle": "Отключить камеру этого участника?",
|
||||
"noDropboxToken": "Нет действительного токена Dropbox",
|
||||
"password": "Пароль",
|
||||
"passwordLabel": "Встреча была защищена участником. Пожалуйста, введите $t(lockRoomPasswordUppercase) чтобы присоединиться.",
|
||||
"passwordNotSupported": "Установка $t(lockRoomPassword) для конференции не поддерживается.",
|
||||
"passwordNotSupportedTitle": "$t(lockRoomPasswordUppercase) не поддерживается",
|
||||
"passwordRequired": "Требуется $t(lockRoomPasswordUppercase)",
|
||||
"permissionCameraRequiredError": "Для участия в конференциях с видео требуется разрешение камеры. Пожалуйста, предоставьте его в настройках",
|
||||
"permissionErrorTitle": "Требуется разрешение",
|
||||
"permissionMicRequiredError": "Для участия в конференциях со звуком требуется разрешение на использование микрофона. Пожалуйста, предоставьте его в настройках",
|
||||
"popupError": "Ваш браузер блокирует всплывающие окна этого сайта. Пожалуйста, разрешите всплывающие окна в настройках безопасности браузера и попробуйте снова.",
|
||||
"popupErrorTitle": "Заблокировано всплывающее окно",
|
||||
"readMore": "больше",
|
||||
"recentlyUsedObjects": "Ваши недавно использованные объекты",
|
||||
"recording": "Запись",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "Невозможно пока активно потоковое вещание",
|
||||
"recordingDisabledForGuestTooltip": "Гости не могут записывать",
|
||||
"recordingDisabledTooltip": "Невозможно начать запись",
|
||||
"rejoinNow": "Подключиться снова",
|
||||
"remoteControlAllowedMessage": "{{user}} принял ваш запрос на удаленное управление!",
|
||||
@@ -291,6 +334,7 @@
|
||||
"remoteControlShareScreenWarning": "Если нажмете \"Разрешить\", то поделитесь своим экраном!",
|
||||
"remoteControlStopMessage": "Сессия удаленного управления завершена!",
|
||||
"remoteControlTitle": "Удаленное управление рабочим столом",
|
||||
"remoteUserControls": "Удаленное управление пользователями {{username}}",
|
||||
"removePassword": "Убрать $t(lockRoomPassword)",
|
||||
"removeSharedVideoMsg": "Уверены, что хотите убрать видео, которым поделились?",
|
||||
"removeSharedVideoTitle": "Убрать видео",
|
||||
@@ -300,22 +344,38 @@
|
||||
"screenSharingAudio": "Поделиться аудио",
|
||||
"screenSharingFailed": "Ой! Кажется что-то пошло не так, мы не можем начать показ экрана!",
|
||||
"screenSharingFailedTitle": "Сбой показа экрана!",
|
||||
"screenSharingFailedToInstall": "Ошибка установки расширения для показа экрана.",
|
||||
"screenSharingFailedToInstallTitle": "Расширение для показа экрана не установлено",
|
||||
"screenSharingFirefoxPermissionDeniedError": "Что-то пошло не так, когда мы пытались поделиться вашим экраном. Пожалуйста, убедитесь, что вы дали нам разрешение на это. ",
|
||||
"screenSharingFirefoxPermissionDeniedTitle": "Ошибка показа экрана!",
|
||||
"screenSharingPermissionDeniedError": "Ошибка доступа к вашему расширению для показа экрана. Пожалуйста, перезапустите браузер и попробуйте снова.",
|
||||
"searchInSalesforce": "Искать в Salesforce",
|
||||
"searchResults": "Результаты поиска({{count}})",
|
||||
"searchResultsDetailsError": "Что-то пошло не так при получении данных владельца.",
|
||||
"searchResultsError": "Что-то пошло не так при получении данных.",
|
||||
"searchResultsNotFound": "Ничего не найдено.",
|
||||
"searchResultsTryAgain": "Попробуйте использовать другие ключевые слова.",
|
||||
"sendPrivateMessage": "Вы недавно получили личное сообщение. Вы хотели ответить на него, или отправить свое сообщение группе?",
|
||||
"sendPrivateMessageCancel": "Отправить в общий чат",
|
||||
"sendPrivateMessageOk": "Отправить приватное сообщение",
|
||||
"sendPrivateMessageTitle": "Отправить личное сообщение?",
|
||||
"serviceUnavailable": "Служба недоступна",
|
||||
"sessTerminated": "Связь прервана",
|
||||
"sessionRestarted": "Вызов перезапущен из-за проблемы с подключением.",
|
||||
"shareAudio": "Продолжить",
|
||||
"shareAudioTitle": "Как поделиться аудио",
|
||||
"shareAudioWarningD1": "вам нужно остановить совместное использование экрана, прежде чем делиться своим аудио.",
|
||||
"shareAudioWarningD2": "вам нужно перезапустить совместное использование экрана и установить флажок «поделиться аудио».",
|
||||
"shareAudioWarningH1": "Если вы хотите поделиться только аудио:",
|
||||
"shareAudioWarningTitle": "Вам нужно остановить совместное использование экрана, прежде чем делиться звуком",
|
||||
"shareMediaWarningGenericH2": "Если вы хотите поделиться своим экраном и звуком",
|
||||
"shareScreenWarningD1": "вам нужно остановить совместное использование звука, прежде чем делиться своим экраном.",
|
||||
"shareScreenWarningD2": "вам нужно остановить совместное использование аудио, начать совместное использование экрана и установить флажок «поделиться аудио».",
|
||||
"shareScreenWarningH1": "Если вы хотите поделиться только своим экраном:",
|
||||
"shareScreenWarningTitle": "Вам нужно остановить совместное использование звука, прежде чем делиться своим экраном.",
|
||||
"shareVideoLinkError": "Пожалуйста, укажите корректную ссылку.",
|
||||
"shareVideoTitle": "Поделиться видео",
|
||||
"shareYourScreen": "Показать экран",
|
||||
"shareYourScreenDisabled": "Демонстрация экрана отключена",
|
||||
"shareYourScreenDisabledForGuest": "Гости не могут демонстрировать экран",
|
||||
"sharedVideoDialogError": "Ошибка: Невалидный URL",
|
||||
"sharedVideoLinkPlaceholder": "Ссылка на YouTube или прямая ссылка на видео",
|
||||
"start": "Начать",
|
||||
"startLiveStreaming": "Начать трансляцию",
|
||||
"startRecording": "Начать запись",
|
||||
"startRemoteControlErrorMessage": "Ошибка начала сессии удаленного управления!",
|
||||
@@ -330,7 +390,13 @@
|
||||
"tokenAuthFailedTitle": "Ошибка аутентификации",
|
||||
"transcribing": "Расшифровка",
|
||||
"unlockRoom": "Убрать $t(lockRoomPassword)",
|
||||
"user": "Пользователь",
|
||||
"userIdentifier": "Идентификатор пользователя",
|
||||
"userPassword": "пароль пользователя",
|
||||
"videoLink": "Ссылка на видео",
|
||||
"viewUpgradeOptions": "Посмотреть варианты обновления",
|
||||
"viewUpgradeOptionsContent": "Чтобы получить неограниченный доступ к премиум-функциям, таким как запись, транскрипция, RTMP Streaming и т. д., вам необходимо обновить свой план.",
|
||||
"viewUpgradeOptionsTitle": "Вы обнаружили премиальную функцию!",
|
||||
"yourEntireScreen": "Весь экран"
|
||||
},
|
||||
"documentSharing": {
|
||||
@@ -348,9 +414,14 @@
|
||||
"detailsLabel": "Расскажите подробнее.",
|
||||
"good": "Хорошо",
|
||||
"rateExperience": "Оценка качества связи",
|
||||
"star": "Звезда",
|
||||
"veryBad": "Очень плохо",
|
||||
"veryGood": "Очень хорошо"
|
||||
},
|
||||
"giphy": {
|
||||
"noResults": "Результатов поиска не найдено :(",
|
||||
"search": "Поиск GIPHY"
|
||||
},
|
||||
"helpView": {
|
||||
"header": "Справка"
|
||||
},
|
||||
@@ -366,6 +437,7 @@
|
||||
"addPassword": "Установить $t(lockRoomPassword)",
|
||||
"cancelPassword": "Отменить $t(lockRoomPassword)",
|
||||
"conferenceURL": "Ссылка:",
|
||||
"copyNumber": "Копировать номер",
|
||||
"country": "Страна",
|
||||
"dialANumber": "Чтобы присоединиться к конференции, наберите один из этих номеров и введите пин-код",
|
||||
"dialInConferenceID": "ПИН:",
|
||||
@@ -377,6 +449,11 @@
|
||||
"inviteLiveStream": "Трансляция этой встречи: {{url}}",
|
||||
"invitePhone": "Для того, чтобы присоединиться по телефону, нажмите {{number}},,{{conferenceID}}#\n",
|
||||
"invitePhoneAlternatives": "Ищите другой номер для набора?\nПосмотреть номера для набора для конференции: {{url}}\n\n\nЕсли также выполняется набор номера через телефон в комнате, подключитесь в режиме слушателя: {{silentUrl}}",
|
||||
"inviteSipEndpoint": "Чтобы присоединиться с помощью SIP-адреса, введите следующее: {{sipUri}}",
|
||||
"inviteTextiOSInviteUrl": "Нажмите на следующую ссылку, чтобы присоединиться: {{inviteUrl}}.",
|
||||
"inviteTextiOSJoinSilent": "Если вы звоните через телефон в комнате, используйте эту ссылку, чтобы присоединиться без подключения к аудио: {{silentUrl}}.",
|
||||
"inviteTextiOSPersonal": "{{name}} приглашает вас на встречу.",
|
||||
"inviteTextiOSPhone": "Чтобы присоединиться по телефону, используйте этот номер: {{number}},,{{conferenceID}}#. Если вы ищете другой номер, это полный список: {{didUrl}}.",
|
||||
"inviteURLFirstPartGeneral": "Вас приглашают присоединиться к конференции.",
|
||||
"inviteURLFirstPartPersonal": "{{name}} приглашает Вас присоединиться к конференции. \n",
|
||||
"inviteURLSecondPart": "\nПрисоединиться к конференции:\n{{url}}\n",
|
||||
@@ -388,6 +465,7 @@
|
||||
"noRoom": "Для набора номера не было указано ни одной комнаты.",
|
||||
"numbers": "Номера для набора",
|
||||
"password": "$t(lockRoomPasswordUppercase):",
|
||||
"sip": "SIP адрес",
|
||||
"title": "Поделиться",
|
||||
"tooltip": "Поделитесь ссылкой и номером для подключения к этой конференции"
|
||||
},
|
||||
@@ -405,10 +483,12 @@
|
||||
"searchPlaceholder": "Участник или номер телефона",
|
||||
"send": "Отправить"
|
||||
},
|
||||
"jitsiHome": "{{logo}} Логотип, ссылки на главную страницу",
|
||||
"keyboardShortcuts": {
|
||||
"focusLocal": "Фокус на ваше видео",
|
||||
"focusRemote": "Фокус на видео другого участника",
|
||||
"fullScreen": "Вкл/выкл полноэкранный режим",
|
||||
"giphyMenu": "Показать GIPHY меню",
|
||||
"keyboardShortcuts": "Комбинации клавиш",
|
||||
"localRecording": "Отобразить или скрыть элементы управления локальной записи",
|
||||
"mute": "Микрофон (вкл./выкл.)",
|
||||
@@ -417,10 +497,10 @@
|
||||
"showSpeakerStats": "Показать статистику выступающего",
|
||||
"toggleChat": "Чат (открыть/закрыть)",
|
||||
"toggleFilmstrip": "Показать/Скрыть краткое описание",
|
||||
"toggleParticipantsPane": "Показать или скрыть панель участников",
|
||||
"toggleScreensharing": "Переключиться между камерой и показом экрана",
|
||||
"toggleShortcuts": "Скрыть/Показать клавиша быстрого доступа",
|
||||
"videoMute": "Камера (вкл./выкл.)",
|
||||
"videoQuality": "Качество связи"
|
||||
"videoMute": "Камера (вкл./выкл.)"
|
||||
},
|
||||
"liveStreaming": {
|
||||
"busy": "Освобождаем новые ресурсы для трансляции. Пожалуйста, попробуйте снова через несколько минут.",
|
||||
@@ -438,6 +518,7 @@
|
||||
"failedToStart": "Ошибка трансляции видео",
|
||||
"getStreamKeyManually": "Прямые трансляций не найдены. Попробуйте получить ключ прямой трансляции от YouTube.",
|
||||
"googlePrivacyPolicy": "Политика конфиденциальности Google",
|
||||
"inProgress": "Идет запись или прямая трансляция",
|
||||
"invalidStreamKey": "Похоже ключ прямой трансляции неверен.",
|
||||
"limitNotificationDescriptionNative": "Ваша трансляция будет ограничена {{limit}} мин. Для неограниченного просмотра попробуйте {{app}}.",
|
||||
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша потоковая передача будет ограничена {{limit}} мин. Для неограниченной потоковой передачи попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'> {{app}} </a>.",
|
||||
@@ -447,6 +528,7 @@
|
||||
"onBy": "{{name}} начал прямую трансляцию",
|
||||
"pending": "Начинаем трансляцию...",
|
||||
"serviceName": "Служба трансляции",
|
||||
"sessionAlreadyActive": "Этот сеанс уже записывается или транслируется в прямом эфире.",
|
||||
"signIn": "Войти через Google",
|
||||
"signInCTA": "Войдите или введите свой ключ трансляции YouTube.",
|
||||
"signOut": "Выход",
|
||||
@@ -457,7 +539,12 @@
|
||||
"youtubeTerms": "Условия использования YouTube"
|
||||
},
|
||||
"lobby": {
|
||||
"admit": "Признать",
|
||||
"admitAll": "Признать все",
|
||||
"allow": "Разрешить",
|
||||
"backToKnockModeButton": "Попросить присоединиться",
|
||||
"chat": "Чат",
|
||||
"dialogTitle": "Режим лобби",
|
||||
"disableDialogContent": "В настоящее время включен режим лобби. Эта функция гарантирует, что нежелательные участники не смогут присоединиться к вашей встрече. Вы хотите его отключить?",
|
||||
"disableDialogSubmit": "Отключить",
|
||||
"emailField": "Введите ваш адрес электронной почты",
|
||||
@@ -466,8 +553,10 @@
|
||||
"enableDialogText": "Режим лобби позволяет защитить вашу встречу, позволяя людям входить только после официального одобрения модератором.",
|
||||
"enterPasswordButton": "Введите пароль встречи",
|
||||
"enterPasswordTitle": "Введите пароль чтобы присоединиться к встрече",
|
||||
"errorMissingPassword": "Пожалуйста, введите пароль встречи",
|
||||
"invalidPassword": "Неверный пароль",
|
||||
"joinRejectedMessage": "Ваш запрос на присоединение был отклонен модератором.",
|
||||
"joinRejectedTitle": "Заявка на присоедиение отклонена.",
|
||||
"joinTitle": "Присоединиться к встрече",
|
||||
"joinWithPasswordMessage": "Пытаюсь присоединиться с паролем, подождите...",
|
||||
"joiningMessage": "Вы присоединитесь к встрече, как только кто-то примет ваш запрос",
|
||||
@@ -476,6 +565,8 @@
|
||||
"knockButton": "Попросить присоединиться",
|
||||
"knockTitle": "Кто-то хочет присоединиться к встрече",
|
||||
"knockingParticipantList": "Список ожидающих участников",
|
||||
"lobbyChatStartedNotification": "{{moderator}} начал лобби чат с {{attendee}}",
|
||||
"lobbyChatStartedTitle": "{{moderator}} начал лобби чат с вами.",
|
||||
"nameField": "Введите ваше имя",
|
||||
"notificationLobbyAccessDenied": "{{originParticipantName}} запретил присоединиться {{targetParticipantName}}",
|
||||
"notificationLobbyAccessGranted": "{{originParticipantName}} разрешил присоединиться {{targetParticipantName}} ",
|
||||
@@ -521,26 +612,51 @@
|
||||
"lockRoomPasswordUppercase": "Пароль",
|
||||
"lonelyMeetingExperience": {
|
||||
"button": "Пригласить",
|
||||
"getHelp": "Получить помощь",
|
||||
"title": "Защищенная, полнофункциональная и совершенно бесплатная система видеоконференций",
|
||||
"youAreAlone": "Вы один в видеоконференции"
|
||||
},
|
||||
"me": "я",
|
||||
"notify": {
|
||||
"OldElectronAPPTitle": "Уязвимость в системе безопасности!",
|
||||
"allowAction": "Разрешить",
|
||||
"allowedUnmute": "Вы можете включить микрофон, включить камеру или поделиться своим экраном.",
|
||||
"audioUnmuteBlockedDescription": "Операция включения микрофона была временно заблокирована из-за системных ограничений.",
|
||||
"audioUnmuteBlockedTitle": "Включение микрофона заблокировано!",
|
||||
"chatMessages": "Сообщения чата",
|
||||
"connectedOneMember": "{{name}} присоединился к конференции",
|
||||
"connectedThreePlusMembers": "{{name}} и {{count}} других пользователей присоединились к конференции",
|
||||
"connectedTwoMembers": "{{first}} и {{second}} присоединились к конференции",
|
||||
"disconnected": "соединение разорвано",
|
||||
"displayNotifications": "Отображение уведомлений для",
|
||||
"focus": "Фокус встречи",
|
||||
"focusFail": "{{component}} недоступен, повторите через {{ms}} с",
|
||||
"grantedTo": "{{to}} получил права модератора!",
|
||||
"gifsMenu": "GIPHY",
|
||||
"groupTitle": "Уведомления",
|
||||
"hostAskedUnmute": "Модератор хочет, чтобы вы высказалисьМодератор хочет, чтобы вы высказались",
|
||||
"invitedOneMember": "{{name}} был приглашен",
|
||||
"invitedThreePlusMembers": "Приглашены {{name}} и {{count}} других пользователей(ля)",
|
||||
"invitedTwoMembers": "{{first}} и {{second}} присоединились к конференции",
|
||||
"kickParticipant": "{{kicker}} отключил {{kicked}}",
|
||||
"leftOneMember": "{{name}} покинул собрание",
|
||||
"leftThreePlusMembers": "{{name}} и многие другие покинули встречу",
|
||||
"leftTwoMembers": "{{first}} и {{second}} покинули встречу",
|
||||
"linkToSalesforce": "Ссылка на Salesforce",
|
||||
"linkToSalesforceDescription": "Вы можете отправить ссылку на сводку митинга Salesforce объекту.",
|
||||
"linkToSalesforceError": "Ошибка отправки ссылки на митинг для Salesforce",
|
||||
"linkToSalesforceKey": "Отправить сслку а эот митинг",
|
||||
"linkToSalesforceProgress": "Отправка ссылки на митинг для Salesforce...",
|
||||
"linkToSalesforceSuccess": "Ссылка на этот митинг была отправлена Salesforce",
|
||||
"me": "Я",
|
||||
"moderationInEffectCSDescription": "Пожалуйста, поднимите руку, если вы хотите поделиться своим экраном.",
|
||||
"moderationInEffectCSTitle": "Демонстрация экрана заблокирована модератором",
|
||||
"moderationInEffectDescription": "Пожалуйста, поднимите руку, если хотите высказаться.",
|
||||
"moderationInEffectTitle": "Ваш микрофон отключен модератором",
|
||||
"moderationInEffectVideoDescription": "Пожалуйста, поднимите руку, если хотите включить камеру.",
|
||||
"moderationInEffectVideoTitle": "Ваша камера заблокирована модератором",
|
||||
"moderationRequestFromModerator": "Хозяин хочет, чтобы вы включили звук",
|
||||
"moderationRequestFromParticipant": "Хочет говорить",
|
||||
"moderationStartedTitle": "Началась модерация",
|
||||
"moderationStoppedTitle": "Модерация остановлена",
|
||||
"moderationToggleDescription": "от {{participantDisplayName}}",
|
||||
"moderator": "Получены права модератора!",
|
||||
"muted": "Вы начали разговор без звука.",
|
||||
"mutedRemotelyDescription": "Вы всегда можете включить микрофон, когда будете готовы говорить. Отключите его, когда закончите, чтобы не транслировать шумы в конференцию.",
|
||||
@@ -552,15 +668,30 @@
|
||||
"oldElectronClientDescription1": "Похоже, вы используете старую версию клиента Jitsi Meet, которая имеет известные уязвимости в системе безопасности. Убедитесь, что вы обновили до нашей ",
|
||||
"oldElectronClientDescription2": "последней версии",
|
||||
"oldElectronClientDescription3": " сейчас!",
|
||||
"participantWantsToJoin": "Хочет присоединиться к митингу",
|
||||
"participantsWantToJoin": "Хотят присоединиться к митингу",
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) удален другим участником.",
|
||||
"passwordSetRemotely": "Другой участник установил $t(lockRoomPasswordUppercase)",
|
||||
"raiseHandAction": "Поднять руку",
|
||||
"raisedHand": "{{name}} хотел бы выступить.",
|
||||
"raisedHands": "{{Имя участника}} и еще {{подняли руки}} человек",
|
||||
"reactionSounds": "Отключить звуки",
|
||||
"reactionSoundsForAll": "Отключить звуки для всех",
|
||||
"screenShareNoAudio": "Флажок «Поделиться аудио» не был отмечен на экране выбора окна.",
|
||||
"screenShareNoAudioTitle": "Не удалось поделиться системным звуком!",
|
||||
"selfViewTitle": "Вы всегда можете скрыть собственное изображение в настройках.",
|
||||
"somebody": "Кто-то",
|
||||
"startSilentDescription": "Перезайдите в конференцию, чтобы включить звук",
|
||||
"startSilentTitle": "У вас отсутствует звук!",
|
||||
"suboptimalBrowserWarning": "К сожалению, ваш браузер не полностью поддерживает данную систему вэбконференций. Мы работаем над проблемой, однако, пока рекомендуем вам воспользоваться <a href='{{recommendedBrowserPageLink}}' target='_blank'> следующими браузерами</a>.",
|
||||
"suboptimalExperienceTitle": "Предупреждение браузера",
|
||||
"unmute": "Включить микрофон"
|
||||
"unmute": "Включить микрофон",
|
||||
"videoMutedRemotelyDescription": "Вы всегда можете включить его снова.",
|
||||
"videoMutedRemotelyTitle": "Ваше видео было отключено {{participantDisplayName}}",
|
||||
"videoUnmuteBlockedDescription": "Включение звука камеры и совместное использование рабочего стола временно заблокированы из-за системных ограничений.",
|
||||
"videoUnmuteBlockedTitle": "Включение камеры и общий доступ к рабочему столу заблокированы!",
|
||||
"viewLobby": "Смотреть лобби",
|
||||
"waitingParticipants": "{{waitingParticipants}} люди"
|
||||
},
|
||||
"participantsPane": {
|
||||
"actions": {
|
||||
@@ -570,6 +701,9 @@
|
||||
"audioModeration": "Разрешить выключить микрофон",
|
||||
"blockEveryoneMicCamera": "Заблокировать у всех микрофон и камеру",
|
||||
"invite": "Пригласить",
|
||||
"moreModerationActions": "Дополнительные параметры модерации",
|
||||
"moreModerationControls": "Дополнительные элементы управления модерацией",
|
||||
"moreParticipantOptions": "Дополнительные параметры участников",
|
||||
"mute": "Выключить звук",
|
||||
"muteAll": "Выключить звук у всех",
|
||||
"muteEveryoneElse": "Выключить микрофон у остальных",
|
||||
@@ -584,13 +718,45 @@
|
||||
"lobby": "Лобби ({{count}})",
|
||||
"participantsList": "Список участников ({{count}})",
|
||||
"waitingLobby": "Ожидают в лобби ({{count}})"
|
||||
}
|
||||
},
|
||||
"search": "Поиск участников"
|
||||
},
|
||||
"passwordDigitsOnly": "До {{number}} цифр",
|
||||
"passwordSetRemotely": "установлен другим участником",
|
||||
"pinnedParticipant": "Участник запинен",
|
||||
"polls": {
|
||||
"answer": {
|
||||
"skip": "Пропустить",
|
||||
"submit": "Подтвердить"
|
||||
},
|
||||
"by": "По {{ name }}",
|
||||
"create": {
|
||||
"addOption": "Добавить вариант",
|
||||
"answerPlaceholder": "Вариант {{index}}",
|
||||
"cancel": "Отмена",
|
||||
"create": "Создать опрос",
|
||||
"pollOption": "Вариант опроса {{index}}",
|
||||
"pollQuestion": "Вопрос опроса",
|
||||
"questionPlaceholder": "Задайте вопрос",
|
||||
"removeOption": "Удалить вариант",
|
||||
"send": "Отправлять"
|
||||
},
|
||||
"notification": {
|
||||
"description": "Откройте вкладку опросов, чтобы проголосовать",
|
||||
"title": "К этой встрече добавлен новый опрос"
|
||||
},
|
||||
"results": {
|
||||
"changeVote": "Изменить голос",
|
||||
"empty": "На собрании еще нет опросов. Начать опрос здесь!",
|
||||
"hideDetailedResults": "Скрыть детали",
|
||||
"showDetailedResults": "Показать детали",
|
||||
"vote": "Голосование"
|
||||
}
|
||||
},
|
||||
"poweredby": "работает на",
|
||||
"prejoin": {
|
||||
"audioAndVideoError": "Ошибка звука и видео:",
|
||||
"audioDeviceProblem": "Проблема с вашим аудиоустройством",
|
||||
"audioOnlyError": "Ошибка звука:",
|
||||
"audioTrackError": "Не удалось создать аудио дорожку.",
|
||||
"callMe": "Позвоните мне",
|
||||
@@ -598,6 +764,25 @@
|
||||
"calling": "Вызываем",
|
||||
"configuringDevices": "Настраиваются устройства...",
|
||||
"connectedWithAudioQ": "Вы подключили звук?",
|
||||
"connection": {
|
||||
"good": "Ваше интернет-соединение выглядит хорошо!",
|
||||
"nonOptimal": "Ваше интернет-соединение не оптимально",
|
||||
"poor": "У вас плохое интернет-соединение"
|
||||
},
|
||||
"connectionDetails": {
|
||||
"audioClipping": "Мы ожидаем, что ваш звук будет обрезан.",
|
||||
"audioHighQuality": "Мы ожидаем, что ваш звук будет отличного качества.",
|
||||
"audioLowNoVideo": "Мы ожидаем, что у вас будет низкое качество звука и отсутствие видео.",
|
||||
"goodQuality": "Потрясающий! Качество вашего мультимедиа будет отличным.",
|
||||
"noMediaConnectivity": "Мы не смогли найти способ установить медиа-соединение для этого теста. Обычно это вызвано брандмауэром или NAT.",
|
||||
"noVideo": "Мы ожидаем, что ваше видео будет ужасным.",
|
||||
"undetectable": "Если вы все еще не можете совершать звонки в браузере, мы рекомендуем вам убедиться, что ваши динамики, микрофон и камера правильно настроены, что вы предоставили своему браузеру права на использование микрофона и камеры и что версия вашего браузера является актуальной. Если у вас все еще возникают проблемы с вызовом, вам следует обратиться к разработчику веб-приложения.",
|
||||
"veryPoorConnection": "Мы ожидаем, что качество вашего звонка будет действительно ужасным.",
|
||||
"videoFreezing": "Мы ожидаем, что ваше видео зависнет, станет черным и пиксельным.",
|
||||
"videoHighQuality": "Мы ожидаем, что ваше видео будет хорошего качества.",
|
||||
"videoLowQuality": "Мы ожидаем, что ваше видео будет иметь низкое качество с точки зрения частоты кадров и разрешения.",
|
||||
"videoTearing": "Мы ожидаем, что ваше видео будет пиксельным или содержать визуальные артефакты."
|
||||
},
|
||||
"copyAndShare": "Скопировать и поделиться ссылкой на встречу",
|
||||
"dialInMeeting": "Дозвониться до встречи",
|
||||
"dialInPin": "Дозвониться до встречи и ввести ПИН код:",
|
||||
@@ -607,6 +792,8 @@
|
||||
"errorDialOutDisconnected": "Не удалось дозвониться. Отключено",
|
||||
"errorDialOutFailed": "Не удалось дозвониться. Сбой вызова",
|
||||
"errorDialOutStatus": "Ошибка получения статуса вызова",
|
||||
"errorMissingName": "Пожалуйста, введите свое имя, чтобы присоединиться к встрече",
|
||||
"errorNoPermissions": "Вам необходимо включить доступ к микрофону и камере",
|
||||
"errorStatusCode": "Ошибка вызова, код статуса: {{status}}",
|
||||
"errorValidation": "Проверка номера не удалась",
|
||||
"iWantToDialIn": "Я хочу дозвониться",
|
||||
@@ -614,6 +801,7 @@
|
||||
"joinAudioByPhone": "Подключиться с телефонной связью",
|
||||
"joinMeeting": "Присоединиться ко встрече",
|
||||
"joinWithoutAudio": "Присоединиться без звука",
|
||||
"keyboardShortcuts": "Включить сочетания клавиш",
|
||||
"linkCopied": "Ссылка скопирована в буфер обмена",
|
||||
"lookGood": "Кажется ваш микрофон работает правильно",
|
||||
"or": "или",
|
||||
@@ -639,27 +827,53 @@
|
||||
"rejected": "Отклонен",
|
||||
"ringing": "Звоню. . ."
|
||||
},
|
||||
"privacyView": {
|
||||
"header": "Конфиденциальность"
|
||||
},
|
||||
"profile": {
|
||||
"avatar": "аватар",
|
||||
"setDisplayNameLabel": "Отображаемое имя",
|
||||
"setEmailInput": "Введите email",
|
||||
"setEmailLabel": "Email для Gravatar",
|
||||
"title": "Профиль"
|
||||
},
|
||||
"raisedHand": "Хочет говорить",
|
||||
"raisedHandsLabel": "Количество поднятых рук",
|
||||
"record": {
|
||||
"already": {
|
||||
"linked": "Ссылка на митинг уже оправлена Salesforce объекту."
|
||||
},
|
||||
"type": {
|
||||
"account": "Аккаунт",
|
||||
"contact": "Сонтакт",
|
||||
"lead": "Вести",
|
||||
"opportunity": "Возможность",
|
||||
"owner": "Владелец"
|
||||
}
|
||||
},
|
||||
"recording": {
|
||||
"authDropboxText": "Загрузить в Dropbox",
|
||||
"availableSpace": "Доступно места: {{spaceLeft}} MB (примерно {{duration}} минут записи)",
|
||||
"beta": "БЕТА",
|
||||
"busy": "Мы стараемся обеспечить больше ресурсов для записи. Пожалуйста, попробуйте через несколько минут.",
|
||||
"busyTitle": "Все записывающие устройства заняты",
|
||||
"copyLink": "Копировать ссылку",
|
||||
"error": "Ошибка записи. Пожалуйста, попробуйте позже.",
|
||||
"errorFetchingLink": "Ошибка получения ссылки на запись.",
|
||||
"expandedOff": "Запись остановлена",
|
||||
"expandedOn": "Данная конференция записывается.",
|
||||
"expandedPending": "Начинаем запись конференции...",
|
||||
"failedToStart": "Ошибка начала записи",
|
||||
"fileSharingdescription": "Поделиться записью с участниками конференции",
|
||||
"highlight": "Основное",
|
||||
"highlightMoment": "Основной момент",
|
||||
"highlightMomentDisabled": "Вы можее обозначить важные моменты когда начнётся запись",
|
||||
"highlightMomentSuccess": "Моменты выделены",
|
||||
"highlightMomentSucessDescription": "Ваши выделенные моменты будут добавлены в итоги митинга.",
|
||||
"inProgress": "Идет запись или прямая трансляция",
|
||||
"limitNotificationDescriptionNative": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <3> {{app}} </3>.",
|
||||
"limitNotificationDescriptionWeb": "Из-за высокой нагрузки ваша запись будет ограничена {{limit}} мин. Для неограниченного количества записей попробуйте <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
|
||||
"linkGenerated": "Мы создали ссылку на вашу запись.",
|
||||
"live": "В ЭФИРЕ",
|
||||
"loggedIn": "Вошел как {{userName}}",
|
||||
"off": "Запись остановлена",
|
||||
@@ -669,11 +883,15 @@
|
||||
"pending": "Подготовка записи конференции. . .",
|
||||
"rec": "ИДЕТ ЗАПИСЬ",
|
||||
"serviceDescription": "Ваша запись будет сохранена соответствующей службой",
|
||||
"serviceDescriptionCloud": "Облачная запись",
|
||||
"serviceDescriptionCloudInfo": "Сохранённые записи автоматически удаляются спуся 24 часа со старта.",
|
||||
"serviceName": "Служба записи",
|
||||
"sessionAlreadyActive": "Этот сеанс уже записывается или транслируется в прямом эфире.",
|
||||
"signIn": "Вход",
|
||||
"signOut": "Выход",
|
||||
"unavailable": "Служба {{serviceName}} сейчас недоступна. Мы работаем над исправлением этой ошибки. Пожалуйста, попробуйте позже.",
|
||||
"unavailableTitle": "Запись невозможна"
|
||||
"unavailableTitle": "Запись невозможна",
|
||||
"uploadToCloud": "Загрузить в облако"
|
||||
},
|
||||
"sectionList": {
|
||||
"pullToRefresh": "Потяните для обновления"
|
||||
@@ -681,8 +899,8 @@
|
||||
"security": {
|
||||
"about": "Вы можете добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
|
||||
"aboutReadOnly": "Участники-модераторы могут добавить к собранию $t(lockRoomPassword). Участникам необходимо будет предоставить $t(lockRoomPassword), прежде чем им будет разрешено присоединиться к собранию.",
|
||||
"insecureRoomNameWarning": "Имя комнаты небезопасно. Нежелательные участники могут присоединиться к вашей конференции. Подумайте о том, чтобы защитить вашу встречу используя настройки безопасности.",
|
||||
"securityOptions": "Настройки безопасности"
|
||||
"header": "",
|
||||
"insecureRoomNameWarning": "Имя комнаты небезопасно. Нежелательные участники могут присоединиться к вашей конференции. Подумайте о том, чтобы защитить вашу встречу используя настройки безопасности."
|
||||
},
|
||||
"settings": {
|
||||
"calendar": {
|
||||
@@ -692,8 +910,13 @@
|
||||
"signedIn": "Доступ к событиям календаря включен для email - адреса {{email}}. Нажмите кнопку Отключить для отключения доступа к событиям календаря.",
|
||||
"title": "Календарь"
|
||||
},
|
||||
"desktopShareFramerate": "Частота кадров при совместном использовании рабочего стола",
|
||||
"desktopShareHighFpsWarning": "Более высокая частота кадров для общего доступа к рабочему столу может повлиять на пропускную способность. Вам необходимо перезапустить демонстрацию экрана, чтобы новые настройки вступили в силу.",
|
||||
"desktopShareWarning": "Вам необходимо перезапустить демонстрацию экрана, чтобы новые настройки вступили в силу.",
|
||||
"devices": "Устройства",
|
||||
"followMe": "Все следуют за мной",
|
||||
"framesPerSecond": "кадров в секунду",
|
||||
"incomingMessage": "Входящее сообщение",
|
||||
"language": "Язык",
|
||||
"loggedIn": "Вошел как {{name}}",
|
||||
"microphones": "Микрофоны",
|
||||
@@ -701,16 +924,26 @@
|
||||
"more": "Больше опций",
|
||||
"name": "Имя",
|
||||
"noDevice": "нет",
|
||||
"participantJoined": "Участник присоединился",
|
||||
"participantLeft": "Участник вышел",
|
||||
"playSounds": "Включить звук",
|
||||
"reactions": "Реакции на встречи",
|
||||
"sameAsSystem": "То же, что и система ({{label}})",
|
||||
"selectAudioOutput": "Звуковой выход",
|
||||
"selectCamera": "Камера",
|
||||
"selectMic": "Микрофон",
|
||||
"selfView": "Самостоятельный просмотр",
|
||||
"sounds": "Звуки",
|
||||
"speakers": "Динамики",
|
||||
"startAudioMuted": "Все начинают с выключенным звуком",
|
||||
"startReactionsMuted": "Отключение звука реакции для всех",
|
||||
"startVideoMuted": "Все начинают в скрытом режиме",
|
||||
"talkWhileMuted": "Говорите без звука",
|
||||
"title": "Настройки"
|
||||
},
|
||||
"settingsView": {
|
||||
"advanced": "Дополнительные",
|
||||
"alertCancel": "Отмена",
|
||||
"alertOk": "OK",
|
||||
"alertTitle": "Внимание",
|
||||
"alertURLText": "Ошибка адреса сервера",
|
||||
@@ -736,14 +969,24 @@
|
||||
},
|
||||
"speaker": "Спикер",
|
||||
"speakerStats": {
|
||||
"angry": "Злой",
|
||||
"disgusted": "Отвращение",
|
||||
"displayEmotions": "Показать эмоции",
|
||||
"fearful": "Страшный",
|
||||
"happy": "Счастье",
|
||||
"hours": "{{count}}ч",
|
||||
"minutes": "{{count}}м",
|
||||
"name": "Имя",
|
||||
"neutral": "Нейтральный",
|
||||
"sad": "Грусный",
|
||||
"search": "Поиск",
|
||||
"seconds": "{{count}}с",
|
||||
"speakerStats": "Статистика выступлений",
|
||||
"speakerTime": "Время выступлений"
|
||||
"speakerTime": "Время выступлений",
|
||||
"surprised": "Удивлен"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"genericTitle": "На совещании необходимо использовать микрофон и камеру.",
|
||||
"policyText": " ",
|
||||
"title": "{{app}} требуется доступ к микрофону и камере."
|
||||
},
|
||||
@@ -752,26 +995,37 @@
|
||||
"text": "Для восстановления связи нажмите кнопку <i>Подключиться снова</i>.",
|
||||
"title": "Видеосвязь прервана. Причина: этот компьютер перешел в режим сна."
|
||||
},
|
||||
"termsView": {
|
||||
"header": "Условия"
|
||||
},
|
||||
"toolbar": {
|
||||
"Settings": "Настройки",
|
||||
"accessibilityLabel": {
|
||||
"Settings": "Вкл/Выкл меню настроек",
|
||||
"audioOnly": "Вкл/Выкл только звук",
|
||||
"audioRoute": "Выбрать аудиоустройство",
|
||||
"boo": "Бу",
|
||||
"breakoutRoom": "Присоединиться/выйти из комнаты обсуждения",
|
||||
"callQuality": "Качество связи",
|
||||
"cc": "Вкл/Выкл субтитры",
|
||||
"chat": "Показать/скрыть окно чата",
|
||||
"clap": "Хлопок",
|
||||
"collapse": "Крах",
|
||||
"document": "Закрыть общий документ",
|
||||
"download": "Скачать приложение",
|
||||
"e2ee": "Сквозное шифрование",
|
||||
"embedMeeting": "Встроить встречу",
|
||||
"expand": "Расширять",
|
||||
"feedback": "Оставить отзыв",
|
||||
"fullScreen": "Полноэкранный/оконный режим",
|
||||
"giphy": "Показать GIPHY меню",
|
||||
"grantModerator": "Сделать модератором",
|
||||
"hangup": "Завершить звонок",
|
||||
"help": "Справка",
|
||||
"invite": "Пригласить",
|
||||
"kick": "Отключить участника",
|
||||
"laugh": "Смех",
|
||||
"like": "Пальцы вверх",
|
||||
"linkToSalesforce": "Ссылка на Salesforce",
|
||||
"lobbyButton": "Вкл/Выкл режим лобби",
|
||||
"localRecording": "Вкл/Выкл кнопки записи",
|
||||
"lockRoom": "Установить пароль",
|
||||
@@ -780,20 +1034,30 @@
|
||||
"moreOptions": "Меню доп. настроек",
|
||||
"mute": "Вкл/Выкл звук",
|
||||
"muteEveryone": "Выкл. микрофон у всех",
|
||||
"muteEveryoneElse": "Заглушить всех остальных",
|
||||
"muteEveryoneElsesVideoStream": "Остановить чужое видео",
|
||||
"muteEveryonesVideoStream": "Остановить видео для всех",
|
||||
"participants": "Участники",
|
||||
"pip": "Вкл/Выкл режим Картинка-в-картинке",
|
||||
"privateMessage": "Отправить личное сообщение",
|
||||
"profile": "Редактировать профиль",
|
||||
"raiseHand": "Поднять руку",
|
||||
"reactionsMenu": "Открыть/закрыть меню реакций",
|
||||
"recording": "Вкл/Выкл запись",
|
||||
"remoteMute": "Отключить участнику микрофон",
|
||||
"remoteVideoMute": "Отключить камеру участника",
|
||||
"security": "Настройки безопасности",
|
||||
"selectBackground": "Выберите фон",
|
||||
"selfView": "Самостоятельный просмотр",
|
||||
"shareRoom": "Отправить приглашение",
|
||||
"shareYourScreen": "Вкл/Выкл демонстрацию экрана",
|
||||
"shareaudio": "Поделиться аудио",
|
||||
"sharedvideo": "Вкл/Выкл Youtube - трансляцию",
|
||||
"shortcuts": "Вкл/Выкл значки",
|
||||
"show": "Показать крупным планом",
|
||||
"silence": "Тишина",
|
||||
"speakerStats": "Вкл/Выкл статистику",
|
||||
"surprised": "Удивлен",
|
||||
"tileView": "Вкл/Выкл плитку",
|
||||
"toggleCamera": "Переключить камеру",
|
||||
"toggleFilmstrip": "Включить диафильм",
|
||||
@@ -812,6 +1076,7 @@
|
||||
"clap": "Аплодисменты",
|
||||
"closeChat": "Закрыть чат",
|
||||
"closeReactionsMenu": "Закрыть меню реакций",
|
||||
"disableReactionSounds": "",
|
||||
"documentClose": "Закрыть общий документ",
|
||||
"documentOpen": "Открыть общий документ",
|
||||
"download": "Скачать приложение",
|
||||
@@ -822,11 +1087,15 @@
|
||||
"exitFullScreen": "Полный экран",
|
||||
"exitTileView": "Крупный план",
|
||||
"feedback": "Оставить отзыв",
|
||||
"giphy": "Показать GIPHY меню",
|
||||
"hangup": "Выход",
|
||||
"help": "Справка",
|
||||
"invite": "Пригласить",
|
||||
"joinBreakoutRoom": "Присоединяйтесь к комнате обсуждения",
|
||||
"laugh": "Смеяться",
|
||||
"leaveBreakoutRoom": "Выйти из комнаты отдыха",
|
||||
"like": "Мне нравится",
|
||||
"linkToSalesforce": "Ссылка на Salesforce",
|
||||
"lobbyButtonDisable": "Отключить режим лобби",
|
||||
"lobbyButtonEnable": "Включить режим лобби",
|
||||
"login": "Войти",
|
||||
@@ -852,6 +1121,12 @@
|
||||
"profile": "Редактировать профиль",
|
||||
"raiseHand": "Хочу говорить",
|
||||
"raiseYourHand": "Поднять руку",
|
||||
"reactionBoo": "Отправить бу реакцию",
|
||||
"reactionClap": "Отправить реакцию аплодисментов",
|
||||
"reactionLaugh": "Отправить реакцию смеха",
|
||||
"reactionLike": "Отправить реакцию \"палец вверх\"",
|
||||
"reactionSilence": "Отправить реакцию тишины",
|
||||
"reactionSurprised": "Отправить удивленную реакцию",
|
||||
"security": "Настройки безопасности",
|
||||
"selectBackground": "Выбрать фоновое изображение",
|
||||
"shareRoom": "Отправить приглашение",
|
||||
@@ -862,11 +1137,10 @@
|
||||
"speakerStats": "Статистика",
|
||||
"startScreenSharing": "Начать трансляцию с экрана",
|
||||
"startSubtitles": "Включить субтитры",
|
||||
"startvideoblur": "Размыть фон на видео",
|
||||
"stopAudioSharing": "Остановить обмен аудио",
|
||||
"stopScreenSharing": "Остановить трансляцию с экрана",
|
||||
"stopSharedVideo": "Остановить видео на YouTube",
|
||||
"stopSubtitles": "Отключить субтитры",
|
||||
"stopvideoblur": "Отключить размытие фона",
|
||||
"surprised": "Удивиться",
|
||||
"talkWhileMutedPopup": "Пытаетесь говорить? У вас отключен звук.",
|
||||
"tileViewToggle": "Вкл/выкл плитку",
|
||||
@@ -883,7 +1157,8 @@
|
||||
"off": "Расшифровка остановлена",
|
||||
"pending": "Подготовка расшифровки конференции...",
|
||||
"start": "Вкл/Выкл показ субтитров",
|
||||
"stop": "Вкл/Выкл показ субтитров"
|
||||
"stop": "Вкл/Выкл показ субтитров",
|
||||
"tr": "TR"
|
||||
},
|
||||
"userMedia": {
|
||||
"androidGrantPermissions": "Выберите <b><i>Разрешить</i></b>, когда браузер спросит о разрешениях.",
|
||||
@@ -908,19 +1183,21 @@
|
||||
"pending": "{{displayName}} был приглашен"
|
||||
},
|
||||
"videoStatus": {
|
||||
"adjustFor": "Отрегулируйте для:",
|
||||
"audioOnly": "Только звук",
|
||||
"audioOnlyExpanded": "Активен режим экономии пропускной способности. В этом режиме доступны только звук и трансляция с экрана",
|
||||
"bestPerformance": "Лучшее представление",
|
||||
"callQuality": "Качество видео",
|
||||
"hd": "HD",
|
||||
"hdTooltip": "Видео высокого качества",
|
||||
"highDefinition": "Высокое качество",
|
||||
"highestQuality": "Высшее качество",
|
||||
"labelTooiltipNoVideo": "Нет видео",
|
||||
"labelTooltipAudioOnly": "Включен режим экономии пропускной способности",
|
||||
"ld": "LD",
|
||||
"ldTooltip": "Видео низкого качества",
|
||||
"lowDefinition": "Низкое качество",
|
||||
"onlyAudioAvailable": "Только звук",
|
||||
"onlyAudioSupported": "В этом браузере разрешен только звук.",
|
||||
"performanceSettings": "Параметры производительности",
|
||||
"sd": "SD",
|
||||
"sdTooltip": "Видео стандартного качества",
|
||||
"standardDefinition": "Стандартное качество (SD)"
|
||||
@@ -933,20 +1210,51 @@
|
||||
"domuteVideoOfOthers": "Выключить видео остальным",
|
||||
"flip": "Отразить",
|
||||
"grantModerator": "Сделать модератором",
|
||||
"hideSelfView": "Скрыть собственное представление",
|
||||
"kick": "Отключить",
|
||||
"moderator": "Модератор",
|
||||
"mute": "Без звука",
|
||||
"muted": "Звук выключен",
|
||||
"pinToStage": "Прикрепить к сцене",
|
||||
"remoteControl": "Начать / Остановить дистанционный контроль",
|
||||
"screenSharing": "Участник показывает свой экран",
|
||||
"show": "Показать крупным планом",
|
||||
"showSelfView": "Показать своё представление",
|
||||
"unpinFromStage": "Отпинить",
|
||||
"videoMuted": "Камера выключена",
|
||||
"videomute": "Участник выключил камеру"
|
||||
},
|
||||
"virtualBackground": {
|
||||
"addBackground": "Добавить фон",
|
||||
"apply": "Применять",
|
||||
"backgroundEffectError": "Не удалось применить фоновый эффект.",
|
||||
"blur": "Размытие",
|
||||
"deleteImage": "Удалить изображение",
|
||||
"desktopShare": "Общий доступ к рабочему столу",
|
||||
"desktopShareError": "Не удалось создать общий доступ к рабочему столу",
|
||||
"image1": "пляж",
|
||||
"image2": "Белая нейтральная стена",
|
||||
"image3": "Белая пустая комната",
|
||||
"image4": "Черный торшер",
|
||||
"image5": "Гора",
|
||||
"image6": "Лес",
|
||||
"image7": "Восход",
|
||||
"none": "Нет",
|
||||
"pleaseWait": "Пожалуйста подождите...",
|
||||
"removeBackground": "Убрать фон",
|
||||
"slightBlur": "Легкое размытие",
|
||||
"title": "Виртуальные фоны",
|
||||
"uploadedImage": "Загруженное изображение {{index}}",
|
||||
"webAssemblyWarning": "WebAssembly не поддерживается",
|
||||
"webAssemblyWarningDescription": "WebAssembly отключен или не поддерживается этим браузером"
|
||||
},
|
||||
"volumeSlider": "Ползунок громкости",
|
||||
"welcomepage": {
|
||||
"accessibilityLabel": {
|
||||
"join": "Нажмите чтобы присоединиться",
|
||||
"roomname": "Укажите название комнаты"
|
||||
},
|
||||
"addMeetingName": "Добавить название встречи",
|
||||
"appDescription": "Попробуйте видеочат со всей командой. Приглашайте знакомых! {{app}} — полностью зашифрованное решение для видеоконференций с открытым исходным кодом. Пользуйтесь каждый день, бесплатно и без регистрации.",
|
||||
"audioVideoSwitch": {
|
||||
"audio": "Звук",
|
||||
@@ -962,7 +1270,19 @@
|
||||
"headerSubtitle": "Защищенная высококачественная видеосвязь",
|
||||
"headerTitle": "Сервер видеоконференцсвязи Jitsi Meet",
|
||||
"info": "Инфо",
|
||||
"jitsiOnMobile": "Jitsy для мобильных устройств — загрузите наши приложения и начните встречу из любого места",
|
||||
"join": "СОЗДАТЬ / ПРИСОЕДИНИТЬСЯ",
|
||||
"logo": {
|
||||
"calendar": "Calendar логотип",
|
||||
"desktopPreviewThumbnail": "Миниатюра предварительного просмотра на рабочем столе",
|
||||
"googleLogo": "Google логотип",
|
||||
"logoDeepLinking": "Логотип Navek",
|
||||
"microsoftLogo": "Логотип Майкрософт",
|
||||
"policyLogo": "Логотип политики"
|
||||
},
|
||||
"mobileDownLoadLinkAndroid": "Скачать мобильное приложение для Android",
|
||||
"mobileDownLoadLinkFDroid": "Скачать мобильное приложение для F-Droid",
|
||||
"mobileDownLoadLinkIos": "Скачать мобильное приложение для iOS",
|
||||
"moderatedMessage": "Или заранее <a href=\"{{url}}\" rel=\"noopener noreferrer\" target=\"_blank\">зарезервируйте URL-адрес встречи</a>, где вы будете единственным модератором.",
|
||||
"privacy": "Приватность",
|
||||
"recentList": "Недавние",
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
"car": "Car Audio",
|
||||
"headphones": "Headphones",
|
||||
"none": "No audio devices available",
|
||||
"phone": "Phone",
|
||||
@@ -919,6 +920,7 @@
|
||||
"incomingMessage": "Incoming message",
|
||||
"language": "Language",
|
||||
"loggedIn": "Logged in as {{name}}",
|
||||
"maxStageParticipants": "Maximum number of participants who can be pinned to the main stage",
|
||||
"microphones": "Microphones",
|
||||
"moderator": "Moderator",
|
||||
"more": "More",
|
||||
|
||||
@@ -1141,6 +1141,21 @@ class API {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify external application (if API is enabled) that some face landmark data is available.
|
||||
*
|
||||
* @param {Object | undefined} faceBox - Detected face(s) bounding box (left, right, width).
|
||||
* @param {string} faceExpression - Detected face expression.
|
||||
* @returns {void}
|
||||
*/
|
||||
notifyFaceLandmarkDetected(faceBox: Object, faceExpression: string) {
|
||||
this._sendEvent({
|
||||
name: 'face-landmark-detected',
|
||||
faceBox,
|
||||
faceExpression
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify external application (if API is enabled) that the list of sharing participants changed.
|
||||
*
|
||||
|
||||
1
modules/API/external/external_api.js
vendored
1
modules/API/external/external_api.js
vendored
@@ -102,6 +102,7 @@ const events = {
|
||||
'email-change': 'emailChange',
|
||||
'error-occurred': 'errorOccurred',
|
||||
'endpoint-text-message-received': 'endpointTextMessageReceived',
|
||||
'face-landmark-detected': 'faceLandmarkDetected',
|
||||
'feedback-submitted': 'feedbackSubmitted',
|
||||
'feedback-prompt-displayed': 'feedbackPromptDisplayed',
|
||||
'filmstrip-display-changed': 'filmstripDisplayChanged',
|
||||
|
||||
@@ -6,7 +6,10 @@ import { openConnection } from '../../../connection';
|
||||
import {
|
||||
openAuthDialog,
|
||||
openLoginDialog } from '../../../react/features/authentication/actions.web';
|
||||
import { WaitForOwnerDialog } from '../../../react/features/authentication/components';
|
||||
import {
|
||||
LoginDialog,
|
||||
WaitForOwnerDialog
|
||||
} from '../../../react/features/authentication/components';
|
||||
import {
|
||||
isTokenAuthEnabled,
|
||||
getTokenAuthUrl
|
||||
@@ -16,7 +19,7 @@ import { isDialogOpen } from '../../../react/features/base/dialog';
|
||||
import { setJWT } from '../../../react/features/base/jwt';
|
||||
import UIUtil from '../util/UIUtil';
|
||||
|
||||
import LoginDialog from './LoginDialog';
|
||||
import ExternalLoginDialog from './LoginDialog';
|
||||
|
||||
|
||||
let externalAuthWindow;
|
||||
@@ -51,7 +54,7 @@ function doExternalAuth(room, lockPassword) {
|
||||
getUrl = room.getExternalAuthUrl(true);
|
||||
}
|
||||
getUrl.then(url => {
|
||||
externalAuthWindow = LoginDialog.showExternalAuthDialog(
|
||||
externalAuthWindow = ExternalLoginDialog.showExternalAuthDialog(
|
||||
url,
|
||||
() => {
|
||||
externalAuthWindow = null;
|
||||
@@ -187,7 +190,7 @@ function authenticate(room: Object, lockPassword: string) {
|
||||
* @param {string} [lockPassword] password to use if the conference is locked
|
||||
*/
|
||||
function requireAuth(room: Object, lockPassword: string) {
|
||||
if (!isDialogOpen(APP.store, WaitForOwnerDialog)) {
|
||||
if (isDialogOpen(APP.store, WaitForOwnerDialog) || isDialogOpen(APP.store, LoginDialog)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,12 +11,14 @@ import { Avatar } from '../../../react/features/base/avatar';
|
||||
import theme from '../../../react/features/base/components/themes/participantsPaneTheme.json';
|
||||
import { getSourceNameSignalingFeatureFlag } from '../../../react/features/base/config';
|
||||
import { i18next } from '../../../react/features/base/i18n';
|
||||
import { MEDIA_TYPE, VIDEO_TYPE } from '../../../react/features/base/media';
|
||||
import { VIDEO_TYPE } from '../../../react/features/base/media';
|
||||
import {
|
||||
getParticipantById,
|
||||
getParticipantDisplayName
|
||||
} from '../../../react/features/base/participants';
|
||||
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
|
||||
import {
|
||||
getVideoTrackByParticipant
|
||||
} from '../../../react/features/base/tracks';
|
||||
import { CHAT_SIZE } from '../../../react/features/chat';
|
||||
import {
|
||||
isParticipantConnectionStatusActive,
|
||||
@@ -237,11 +239,14 @@ export default class LargeVideoManager {
|
||||
let isVideoRenderable;
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
|
||||
const tracks = state['features/base/tracks'];
|
||||
const videoTrack = getVideoTrackByParticipant(tracks, participant);
|
||||
|
||||
isVideoRenderable = !isVideoMuted
|
||||
&& (APP.conference.isLocalId(id) || isTrackStreamingStatusActive(videoTrack));
|
||||
isVideoRenderable = !isVideoMuted && (
|
||||
APP.conference.isLocalId(id)
|
||||
|| participant?.isLocalScreenShare
|
||||
|| isTrackStreamingStatusActive(videoTrack)
|
||||
);
|
||||
} else {
|
||||
isVideoRenderable = !isVideoMuted
|
||||
&& (APP.conference.isLocalId(id) || isParticipantConnectionStatusActive(participant));
|
||||
@@ -268,8 +273,10 @@ export default class LargeVideoManager {
|
||||
|
||||
&& participant && !participant.local && !participant.isFakeParticipant) {
|
||||
// remote participant only
|
||||
const track = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
|
||||
|
||||
const tracks = state['features/base/tracks'];
|
||||
const track = getVideoTrackByParticipant(tracks, participant);
|
||||
|
||||
const isScreenSharing = track?.videoType === 'desktop';
|
||||
|
||||
if (isScreenSharing) {
|
||||
@@ -300,8 +307,8 @@ export default class LargeVideoManager {
|
||||
let messageKey;
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
|
||||
const tracks = state['features/base/tracks'];
|
||||
const videoTrack = getVideoTrackByParticipant(tracks, participant);
|
||||
|
||||
messageKey = isTrackStreamingStatusInactive(videoTrack) ? 'connection.LOW_BANDWIDTH' : null;
|
||||
} else {
|
||||
@@ -541,8 +548,8 @@ export default class LargeVideoManager {
|
||||
const state = APP.store.getState();
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, this.id);
|
||||
const tracks = state['features/base/tracks'];
|
||||
const videoTrack = getVideoTrackByParticipant(tracks, participant);
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
show = !APP.conference.isLocalId(this.id)
|
||||
|
||||
@@ -2,12 +2,16 @@
|
||||
|
||||
import Logger from '@jitsi/logger';
|
||||
|
||||
import { getSourceNameSignalingFeatureFlag } from '../../../react/features/base/config';
|
||||
import { MEDIA_TYPE, VIDEO_TYPE } from '../../../react/features/base/media';
|
||||
import {
|
||||
getPinnedParticipant,
|
||||
getParticipantById
|
||||
} from '../../../react/features/base/participants';
|
||||
import { getTrackByMediaTypeAndParticipant } from '../../../react/features/base/tracks';
|
||||
import {
|
||||
getTrackByMediaTypeAndParticipant,
|
||||
getFakeScreenshareParticipantTrack
|
||||
} from '../../../react/features/base/tracks';
|
||||
|
||||
import LargeVideoManager from './LargeVideoManager';
|
||||
import { VIDEO_CONTAINER_TYPE } from './VideoContainer';
|
||||
@@ -91,6 +95,10 @@ const VideoLayout = {
|
||||
return VIDEO_TYPE.CAMERA;
|
||||
}
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state) && participant?.isFakeScreenShareParticipant) {
|
||||
return VIDEO_TYPE.DESKTOP;
|
||||
}
|
||||
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
|
||||
|
||||
return videoTrack?.videoType;
|
||||
@@ -177,7 +185,17 @@ const VideoLayout = {
|
||||
const currentContainerType = largeVideo.getCurrentContainerType();
|
||||
const isOnLarge = this.isCurrentlyOnLarge(id);
|
||||
const state = APP.store.getState();
|
||||
const videoTrack = getTrackByMediaTypeAndParticipant(state['features/base/tracks'], MEDIA_TYPE.VIDEO, id);
|
||||
const participant = getParticipantById(state, id);
|
||||
const tracks = state['features/base/tracks'];
|
||||
|
||||
let videoTrack;
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state) && participant?.isFakeScreenShareParticipant) {
|
||||
videoTrack = getFakeScreenshareParticipantTrack(tracks, id);
|
||||
} else {
|
||||
videoTrack = getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.VIDEO, id);
|
||||
}
|
||||
|
||||
const videoStream = videoTrack?.jitsiTrack;
|
||||
|
||||
if (isOnLarge && !forceUpdate
|
||||
|
||||
369
package-lock.json
generated
369
package-lock.json
generated
@@ -51,9 +51,7 @@
|
||||
"@react-navigation/native": "6.0.6",
|
||||
"@react-navigation/stack": "6.0.11",
|
||||
"@svgr/webpack": "4.3.2",
|
||||
"@tensorflow-models/blazeface": "0.0.7",
|
||||
"@tensorflow/tfjs-backend-wasm": "3.13.0",
|
||||
"@tensorflow/tfjs-converter": "3.13.0",
|
||||
"@tensorflow/tfjs-core": "3.13.0",
|
||||
"@vladmandic/face-api": "1.6.4",
|
||||
"@xmldom/xmldom": "0.7.5",
|
||||
@@ -74,10 +72,10 @@
|
||||
"jquery-i18next": "1.2.1",
|
||||
"js-md5": "0.6.1",
|
||||
"jwt-decode": "2.2.0",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1409.0.0+88378583/lib-jitsi-meet.tgz",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1415.0.0+fa916d41/lib-jitsi-meet.tgz",
|
||||
"libflacjs": "https://git@github.com/mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
||||
"lodash": "4.17.21",
|
||||
"moment": "2.29.1",
|
||||
"moment": "2.29.2",
|
||||
"moment-duration-format": "2.2.2",
|
||||
"optional-require": "1.0.3",
|
||||
"promise.allsettled": "1.0.4",
|
||||
@@ -88,12 +86,12 @@
|
||||
"react-focus-lock": "2.5.1",
|
||||
"react-i18next": "10.11.4",
|
||||
"react-linkify": "1.0.0-alpha",
|
||||
"react-native": "0.66.4",
|
||||
"react-native": "0.67.4",
|
||||
"react-native-background-timer": "2.4.1",
|
||||
"react-native-calendar-events": "2.2.0",
|
||||
"react-native-callstats": "3.73.7",
|
||||
"react-native-collapsible": "1.6.0",
|
||||
"react-native-default-preference": "https://git@github.com/kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
|
||||
"react-native-default-preference": "1.4.4",
|
||||
"react-native-device-info": "8.4.8",
|
||||
"react-native-dialog": "9.2.1",
|
||||
"react-native-gesture-handler": "2.1.0",
|
||||
@@ -103,7 +101,7 @@
|
||||
"react-native-pager-view": "5.4.9",
|
||||
"react-native-paper": "4.11.1",
|
||||
"react-native-performance": "2.1.0",
|
||||
"react-native-reanimated": "1.13.3",
|
||||
"react-native-reanimated": "1.13.4",
|
||||
"react-native-safe-area-context": "3.3.2",
|
||||
"react-native-screens": "3.10.1",
|
||||
"react-native-sound": "0.11.1",
|
||||
@@ -114,7 +112,7 @@
|
||||
"react-native-url-polyfill": "1.3.0",
|
||||
"react-native-video": "https://git@github.com/jitsi/react-native-video#4f6dad990d17ce42894df993780b5386a9c11b85",
|
||||
"react-native-watch-connectivity": "1.0.4",
|
||||
"react-native-webrtc": "1.94.2",
|
||||
"react-native-webrtc": "1.100.0",
|
||||
"react-native-webview": "11.15.1",
|
||||
"react-native-youtube-iframe": "2.2.1",
|
||||
"react-redux": "7.1.0",
|
||||
@@ -163,6 +161,7 @@
|
||||
"string-replace-loader": "3.0.3",
|
||||
"style-loader": "0.19.0",
|
||||
"traverse": "0.6.6",
|
||||
"ts-loader": "9.2.6",
|
||||
"typescript": "4.3.5",
|
||||
"unorm": "1.6.0",
|
||||
"webpack": "5.57.1",
|
||||
@@ -4658,9 +4657,9 @@
|
||||
"integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ=="
|
||||
},
|
||||
"node_modules/@react-native/normalize-color": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz",
|
||||
"integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg=="
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.0.0.tgz",
|
||||
"integrity": "sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw=="
|
||||
},
|
||||
"node_modules/@react-native/polyfills": {
|
||||
"version": "2.0.0",
|
||||
@@ -4959,15 +4958,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/@tensorflow-models/blazeface": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow-models/blazeface/-/blazeface-0.0.7.tgz",
|
||||
"integrity": "sha512-+hInPkvHJoubfiXlmNuF3SCucZvU6W1PMC25IV99NSAftJUpKvLokfF93iX8UkOFQCXkPFbnLKacGfGlbjgvMw==",
|
||||
"peerDependencies": {
|
||||
"@tensorflow/tfjs-converter": "^3.1.0",
|
||||
"@tensorflow/tfjs-core": "^3.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tensorflow/tfjs-backend-cpu": {
|
||||
"version": "3.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.13.0.tgz",
|
||||
@@ -4995,14 +4985,6 @@
|
||||
"@tensorflow/tfjs-core": "3.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tensorflow/tfjs-converter": {
|
||||
"version": "3.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-3.13.0.tgz",
|
||||
"integrity": "sha512-H2VpDTv9Ve0HBt7ttzz46DmnsPaiT0B+yJjVH3NebGZbgY9C8boBgJIsdyqfiqEWBS3WxF8h4rh58Hv5XXMgaQ==",
|
||||
"peerDependencies": {
|
||||
"@tensorflow/tfjs-core": "3.13.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tensorflow/tfjs-core": {
|
||||
"version": "3.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-3.13.0.tgz",
|
||||
@@ -6458,9 +6440,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/bplist-parser": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.0.tgz",
|
||||
"integrity": "sha512-zgmaRvT6AN1JpPPV+S0a1/FAtoxSreYDccZGIqEMSvZl9DMe70mJ7MFzpxa1X+gHVdkToE2haRUHHMiW1OdejA==",
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
|
||||
"integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
|
||||
"dependencies": {
|
||||
"big-integer": "1.6.x"
|
||||
},
|
||||
@@ -11814,8 +11796,8 @@
|
||||
},
|
||||
"node_modules/lib-jitsi-meet": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1409.0.0+88378583/lib-jitsi-meet.tgz",
|
||||
"integrity": "sha512-c6WfdRVZl1cLl+oCKggMXk7yoYVTnvMU6kL8q9g3TtiNCocpBlh6HPLz9/A2DzLzCcyNio5KeNucyX7Ir3EXbA==",
|
||||
"resolved": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1415.0.0+fa916d41/lib-jitsi-meet.tgz",
|
||||
"integrity": "sha512-xCDIkUykAYPLocmnOItFC1PYNYVMTp57XwJ1PXvOwHV4lZO9RBG36ln5QBUonD2P0X6di2UGiRzOi9l4FaHoLQ==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@jitsi/js-utils": "2.0.0",
|
||||
@@ -12799,9 +12781,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/moment": {
|
||||
"version": "2.29.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
||||
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
|
||||
"version": "2.29.2",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
|
||||
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
@@ -14875,9 +14857,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-devtools-core": {
|
||||
"version": "4.23.0",
|
||||
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.23.0.tgz",
|
||||
"integrity": "sha512-KkzneT1LczFtebbTJlvRphIRvzuHLhI9ghfrseVv9ktBs+l2cXy8Svw5U16lzQnwU9okVEcURmGPgH79WWrlaw==",
|
||||
"version": "4.19.1",
|
||||
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.19.1.tgz",
|
||||
"integrity": "sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw==",
|
||||
"dependencies": {
|
||||
"shell-quote": "^1.6.1",
|
||||
"ws": "^7"
|
||||
@@ -14997,16 +14979,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-native": {
|
||||
"version": "0.66.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.66.4.tgz",
|
||||
"integrity": "sha512-9vx5dlSfQlKbbDtr8+xMon6qsmSu7jvjdXWZpEKh3XVKpUidbbODv7048gwVKX8YAel1egeR7hN8vzSeI6ssTw==",
|
||||
"version": "0.67.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.4.tgz",
|
||||
"integrity": "sha512-NA9d9lNJu9TViEJu2uZxWXUP+QNUilGGA5tdMbVFedNroOH1lnQ3n/FAVoGK1gqGarCgNTtheBxUpEa979Cu8w==",
|
||||
"dependencies": {
|
||||
"@jest/create-cache-key-function": "^27.0.1",
|
||||
"@react-native-community/cli": "^6.0.0",
|
||||
"@react-native-community/cli-platform-android": "^6.0.0",
|
||||
"@react-native-community/cli-platform-ios": "^6.0.0",
|
||||
"@react-native/assets": "1.0.0",
|
||||
"@react-native/normalize-color": "1.0.0",
|
||||
"@react-native/normalize-color": "2.0.0",
|
||||
"@react-native/polyfills": "2.0.0",
|
||||
"abort-controller": "^3.0.0",
|
||||
"anser": "^1.4.9",
|
||||
@@ -15015,7 +14997,6 @@
|
||||
"hermes-engine": "~0.9.0",
|
||||
"invariant": "^2.2.4",
|
||||
"jsc-android": "^250230.2.1",
|
||||
"metro-babel-register": "0.66.2",
|
||||
"metro-react-native-babel-transformer": "0.66.2",
|
||||
"metro-runtime": "0.66.2",
|
||||
"metro-source-map": "0.66.2",
|
||||
@@ -15023,8 +15004,8 @@
|
||||
"pretty-format": "^26.5.2",
|
||||
"promise": "^8.0.3",
|
||||
"prop-types": "^15.7.2",
|
||||
"react-devtools-core": "^4.13.0",
|
||||
"react-native-codegen": "^0.0.7",
|
||||
"react-devtools-core": "4.19.1",
|
||||
"react-native-codegen": "^0.0.8",
|
||||
"react-refresh": "^0.4.0",
|
||||
"regenerator-runtime": "^0.13.2",
|
||||
"scheduler": "^0.20.2",
|
||||
@@ -15069,9 +15050,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-native-codegen": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.7.tgz",
|
||||
"integrity": "sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng==",
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.8.tgz",
|
||||
"integrity": "sha512-k/944+0XD+8l7zDaiKfYabyEKmAmyZgS1mj+4LcSRPyHnrjgCHKrh/Y6jM6kucQ6xU1+1uyMmF/dSkikxK8i+Q==",
|
||||
"dependencies": {
|
||||
"flow-parser": "^0.121.0",
|
||||
"jscodeshift": "^0.11.0",
|
||||
@@ -15088,10 +15069,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-native-default-preference": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "git+https://git@github.com/kevinresol/react-native-default-preference.git#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
|
||||
"integrity": "sha512-vmUyt63mLc+xebOOWrZxTF7o7AdWQqzy6lUn7pgjnyUd93//AOpQ6iXGijL9KpNiOv8mDKWAPZKhLY1XVuzZwA==",
|
||||
"license": "MIT",
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native-default-preference/-/react-native-default-preference-1.4.4.tgz",
|
||||
"integrity": "sha512-h0vtgiSKws3UmMRJykXAVM4ne1SgfoocUcoBD19ewRpQd6wqurE0HJRQGrSxcHK5LdKE7QPSIB1VX3YGIVS8Jg==",
|
||||
"peerDependencies": {
|
||||
"react-native": ">=0.47.0"
|
||||
}
|
||||
@@ -15189,9 +15169,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-native-reanimated": {
|
||||
"version": "1.13.3",
|
||||
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.3.tgz",
|
||||
"integrity": "sha512-i714H24dv6ncpFO7/SZ0PfAMbvjgVbF8Ow2NPtowoZAz8osS54DmTMrkgJ9Za+uEku/s0AEaxqiXG2Xgntvv2g==",
|
||||
"version": "1.13.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.4.tgz",
|
||||
"integrity": "sha512-sFbZFh0WanKTa0Fz7GXCZUjWpk/u04ytprcIs4Kb+ijfQHChXva3m3yQZfvbrhRbABJNHrdeuyDgJxDM2mcBgw==",
|
||||
"dependencies": {
|
||||
"fbjs": "^1.0.0"
|
||||
},
|
||||
@@ -15721,9 +15701,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-native-webrtc": {
|
||||
"version": "1.94.2",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.2.tgz",
|
||||
"integrity": "sha512-8wf7CDLYmrxxvta3XxZbmtNrxUblE70fDpoxjYKWfEa48Y4FnFw7MF61g8qYo+V0adoOUNc3j4fIgVnAMghJ9Q==",
|
||||
"version": "1.100.0",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.100.0.tgz",
|
||||
"integrity": "sha512-sBLl8Ihj3xfYn0NZJdDxelB/dZ422FWg/kcLdSw6Wk4eM3MeNW3iFwVsqg2dLzeDnuoQ06i7hOdtP7pGAiKsug==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"base64-js": "1.5.1",
|
||||
@@ -17019,13 +16999,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/simple-plist": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.0.tgz",
|
||||
"integrity": "sha512-uYWpeGFtZtVt2NhG4AHgpwx323zxD85x42heMJBan1qAiqqozIlaGrwrEt6kRjXWRWIXsuV1VLCvVmZan2B5dg==",
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
|
||||
"integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
|
||||
"dependencies": {
|
||||
"bplist-creator": "0.1.0",
|
||||
"bplist-parser": "0.3.0",
|
||||
"plist": "^3.0.4"
|
||||
"bplist-parser": "0.3.1",
|
||||
"plist": "^3.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/simple-swizzle": {
|
||||
@@ -18352,6 +18332,110 @@
|
||||
"resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
|
||||
"integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
|
||||
},
|
||||
"node_modules/ts-loader": {
|
||||
"version": "9.2.6",
|
||||
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz",
|
||||
"integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"chalk": "^4.1.0",
|
||||
"enhanced-resolve": "^5.0.0",
|
||||
"micromatch": "^4.0.0",
|
||||
"semver": "^7.3.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "*",
|
||||
"webpack": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-loader/node_modules/ansi-styles": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"color-convert": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-loader/node_modules/chalk": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"ansi-styles": "^4.1.0",
|
||||
"supports-color": "^7.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-loader/node_modules/color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"color-name": "~1.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-loader/node_modules/color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/ts-loader/node_modules/has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-loader/node_modules/semver": {
|
||||
"version": "7.3.5",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
|
||||
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"lru-cache": "^6.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/ts-loader/node_modules/supports-color": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"has-flag": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig-paths": {
|
||||
"version": "3.12.0",
|
||||
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
|
||||
@@ -23217,9 +23301,9 @@
|
||||
"integrity": "sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ=="
|
||||
},
|
||||
"@react-native/normalize-color": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-1.0.0.tgz",
|
||||
"integrity": "sha512-xUNRvNmCl3UGCPbbHvfyFMnpvLPoOjDCcp5bT9m2k+TF/ZBklEQwhPZlkrxRx2NhgFh1X3a5uL7mJ7ZR+8G7Qg=="
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.0.0.tgz",
|
||||
"integrity": "sha512-Wip/xsc5lw8vsBlmY2MO/gFLp3MvuZ2baBZjDeTjjndMgM0h5sxz7AZR62RDPGgstp8Np7JzjvVqVT7tpFZqsw=="
|
||||
},
|
||||
"@react-native/polyfills": {
|
||||
"version": "2.0.0",
|
||||
@@ -23434,11 +23518,6 @@
|
||||
"loader-utils": "^1.2.3"
|
||||
}
|
||||
},
|
||||
"@tensorflow-models/blazeface": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow-models/blazeface/-/blazeface-0.0.7.tgz",
|
||||
"integrity": "sha512-+hInPkvHJoubfiXlmNuF3SCucZvU6W1PMC25IV99NSAftJUpKvLokfF93iX8UkOFQCXkPFbnLKacGfGlbjgvMw=="
|
||||
},
|
||||
"@tensorflow/tfjs-backend-cpu": {
|
||||
"version": "3.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.13.0.tgz",
|
||||
@@ -23457,11 +23536,6 @@
|
||||
"@types/emscripten": "~0.0.34"
|
||||
}
|
||||
},
|
||||
"@tensorflow/tfjs-converter": {
|
||||
"version": "3.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-3.13.0.tgz",
|
||||
"integrity": "sha512-H2VpDTv9Ve0HBt7ttzz46DmnsPaiT0B+yJjVH3NebGZbgY9C8boBgJIsdyqfiqEWBS3WxF8h4rh58Hv5XXMgaQ=="
|
||||
},
|
||||
"@tensorflow/tfjs-core": {
|
||||
"version": "3.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-3.13.0.tgz",
|
||||
@@ -24702,9 +24776,9 @@
|
||||
}
|
||||
},
|
||||
"bplist-parser": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.0.tgz",
|
||||
"integrity": "sha512-zgmaRvT6AN1JpPPV+S0a1/FAtoxSreYDccZGIqEMSvZl9DMe70mJ7MFzpxa1X+gHVdkToE2haRUHHMiW1OdejA==",
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
|
||||
"integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
|
||||
"requires": {
|
||||
"big-integer": "1.6.x"
|
||||
}
|
||||
@@ -28825,8 +28899,8 @@
|
||||
}
|
||||
},
|
||||
"lib-jitsi-meet": {
|
||||
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1409.0.0+88378583/lib-jitsi-meet.tgz",
|
||||
"integrity": "sha512-c6WfdRVZl1cLl+oCKggMXk7yoYVTnvMU6kL8q9g3TtiNCocpBlh6HPLz9/A2DzLzCcyNio5KeNucyX7Ir3EXbA==",
|
||||
"version": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1415.0.0+fa916d41/lib-jitsi-meet.tgz",
|
||||
"integrity": "sha512-xCDIkUykAYPLocmnOItFC1PYNYVMTp57XwJ1PXvOwHV4lZO9RBG36ln5QBUonD2P0X6di2UGiRzOi9l4FaHoLQ==",
|
||||
"requires": {
|
||||
"@jitsi/js-utils": "2.0.0",
|
||||
"@jitsi/logger": "2.0.0",
|
||||
@@ -29653,9 +29727,9 @@
|
||||
}
|
||||
},
|
||||
"moment": {
|
||||
"version": "2.29.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
||||
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
|
||||
"version": "2.29.2",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
|
||||
"integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
|
||||
},
|
||||
"moment-duration-format": {
|
||||
"version": "2.2.2",
|
||||
@@ -31270,9 +31344,9 @@
|
||||
}
|
||||
},
|
||||
"react-devtools-core": {
|
||||
"version": "4.23.0",
|
||||
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.23.0.tgz",
|
||||
"integrity": "sha512-KkzneT1LczFtebbTJlvRphIRvzuHLhI9ghfrseVv9ktBs+l2cXy8Svw5U16lzQnwU9okVEcURmGPgH79WWrlaw==",
|
||||
"version": "4.19.1",
|
||||
"resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.19.1.tgz",
|
||||
"integrity": "sha512-2wJiGffPWK0KggBjVwnTaAk+Z3MSxKInHmdzPTrBh1mAarexsa93Kw+WMX88+XjN+TtYgAiLe9xeTqcO5FfJTw==",
|
||||
"requires": {
|
||||
"shell-quote": "^1.6.1",
|
||||
"ws": "^7"
|
||||
@@ -31359,16 +31433,16 @@
|
||||
}
|
||||
},
|
||||
"react-native": {
|
||||
"version": "0.66.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.66.4.tgz",
|
||||
"integrity": "sha512-9vx5dlSfQlKbbDtr8+xMon6qsmSu7jvjdXWZpEKh3XVKpUidbbODv7048gwVKX8YAel1egeR7hN8vzSeI6ssTw==",
|
||||
"version": "0.67.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.67.4.tgz",
|
||||
"integrity": "sha512-NA9d9lNJu9TViEJu2uZxWXUP+QNUilGGA5tdMbVFedNroOH1lnQ3n/FAVoGK1gqGarCgNTtheBxUpEa979Cu8w==",
|
||||
"requires": {
|
||||
"@jest/create-cache-key-function": "^27.0.1",
|
||||
"@react-native-community/cli": "^6.0.0",
|
||||
"@react-native-community/cli-platform-android": "^6.0.0",
|
||||
"@react-native-community/cli-platform-ios": "^6.0.0",
|
||||
"@react-native/assets": "1.0.0",
|
||||
"@react-native/normalize-color": "1.0.0",
|
||||
"@react-native/normalize-color": "2.0.0",
|
||||
"@react-native/polyfills": "2.0.0",
|
||||
"abort-controller": "^3.0.0",
|
||||
"anser": "^1.4.9",
|
||||
@@ -31377,7 +31451,6 @@
|
||||
"hermes-engine": "~0.9.0",
|
||||
"invariant": "^2.2.4",
|
||||
"jsc-android": "^250230.2.1",
|
||||
"metro-babel-register": "0.66.2",
|
||||
"metro-react-native-babel-transformer": "0.66.2",
|
||||
"metro-runtime": "0.66.2",
|
||||
"metro-source-map": "0.66.2",
|
||||
@@ -31385,8 +31458,8 @@
|
||||
"pretty-format": "^26.5.2",
|
||||
"promise": "^8.0.3",
|
||||
"prop-types": "^15.7.2",
|
||||
"react-devtools-core": "^4.13.0",
|
||||
"react-native-codegen": "^0.0.7",
|
||||
"react-devtools-core": "4.19.1",
|
||||
"react-native-codegen": "^0.0.8",
|
||||
"react-refresh": "^0.4.0",
|
||||
"regenerator-runtime": "^0.13.2",
|
||||
"scheduler": "^0.20.2",
|
||||
@@ -31416,9 +31489,9 @@
|
||||
}
|
||||
},
|
||||
"react-native-codegen": {
|
||||
"version": "0.0.7",
|
||||
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.7.tgz",
|
||||
"integrity": "sha512-dwNgR8zJ3ALr480QnAmpTiqvFo+rDtq6V5oCggKhYFlRjzOmVSFn3YD41u8ltvKS5G2nQ8gCs2vReFFnRGLYng==",
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.8.tgz",
|
||||
"integrity": "sha512-k/944+0XD+8l7zDaiKfYabyEKmAmyZgS1mj+4LcSRPyHnrjgCHKrh/Y6jM6kucQ6xU1+1uyMmF/dSkikxK8i+Q==",
|
||||
"requires": {
|
||||
"flow-parser": "^0.121.0",
|
||||
"jscodeshift": "^0.11.0",
|
||||
@@ -31431,9 +31504,9 @@
|
||||
"integrity": "sha512-beZjdgbT9Y/Pg591Xy5XkKG20HffJiVad4n9bfcUF/f783A+tvOVXnqvbS58Lkaym93mi4jcDPMuW9Vc1t6rqg=="
|
||||
},
|
||||
"react-native-default-preference": {
|
||||
"version": "git+https://git@github.com/kevinresol/react-native-default-preference.git#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
|
||||
"integrity": "sha512-vmUyt63mLc+xebOOWrZxTF7o7AdWQqzy6lUn7pgjnyUd93//AOpQ6iXGijL9KpNiOv8mDKWAPZKhLY1XVuzZwA==",
|
||||
"from": "react-native-default-preference@https://git@github.com/kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c"
|
||||
"version": "1.4.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native-default-preference/-/react-native-default-preference-1.4.4.tgz",
|
||||
"integrity": "sha512-h0vtgiSKws3UmMRJykXAVM4ne1SgfoocUcoBD19ewRpQd6wqurE0HJRQGrSxcHK5LdKE7QPSIB1VX3YGIVS8Jg=="
|
||||
},
|
||||
"react-native-device-info": {
|
||||
"version": "8.4.8",
|
||||
@@ -31501,9 +31574,9 @@
|
||||
"integrity": "sha512-Q3dFPN7whBCY7X8nvQe7TBw4F5g1PyB78KwyKDXpJENcDrBodlFtj9/c5T2ZkRwAPb+bxr39b+lq9FyT6WQWtg=="
|
||||
},
|
||||
"react-native-reanimated": {
|
||||
"version": "1.13.3",
|
||||
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.3.tgz",
|
||||
"integrity": "sha512-i714H24dv6ncpFO7/SZ0PfAMbvjgVbF8Ow2NPtowoZAz8osS54DmTMrkgJ9Za+uEku/s0AEaxqiXG2Xgntvv2g==",
|
||||
"version": "1.13.4",
|
||||
"resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.13.4.tgz",
|
||||
"integrity": "sha512-sFbZFh0WanKTa0Fz7GXCZUjWpk/u04ytprcIs4Kb+ijfQHChXva3m3yQZfvbrhRbABJNHrdeuyDgJxDM2mcBgw==",
|
||||
"requires": {
|
||||
"fbjs": "^1.0.0"
|
||||
}
|
||||
@@ -31808,9 +31881,9 @@
|
||||
}
|
||||
},
|
||||
"react-native-webrtc": {
|
||||
"version": "1.94.2",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.94.2.tgz",
|
||||
"integrity": "sha512-8wf7CDLYmrxxvta3XxZbmtNrxUblE70fDpoxjYKWfEa48Y4FnFw7MF61g8qYo+V0adoOUNc3j4fIgVnAMghJ9Q==",
|
||||
"version": "1.100.0",
|
||||
"resolved": "https://registry.npmjs.org/react-native-webrtc/-/react-native-webrtc-1.100.0.tgz",
|
||||
"integrity": "sha512-sBLl8Ihj3xfYn0NZJdDxelB/dZ422FWg/kcLdSw6Wk4eM3MeNW3iFwVsqg2dLzeDnuoQ06i7hOdtP7pGAiKsug==",
|
||||
"requires": {
|
||||
"base64-js": "1.5.1",
|
||||
"event-target-shim": "6.0.2",
|
||||
@@ -32802,13 +32875,13 @@
|
||||
}
|
||||
},
|
||||
"simple-plist": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.0.tgz",
|
||||
"integrity": "sha512-uYWpeGFtZtVt2NhG4AHgpwx323zxD85x42heMJBan1qAiqqozIlaGrwrEt6kRjXWRWIXsuV1VLCvVmZan2B5dg==",
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz",
|
||||
"integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==",
|
||||
"requires": {
|
||||
"bplist-creator": "0.1.0",
|
||||
"bplist-parser": "0.3.0",
|
||||
"plist": "^3.0.4"
|
||||
"bplist-parser": "0.3.1",
|
||||
"plist": "^3.0.5"
|
||||
}
|
||||
},
|
||||
"simple-swizzle": {
|
||||
@@ -33871,6 +33944,78 @@
|
||||
"resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
|
||||
"integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
|
||||
},
|
||||
"ts-loader": {
|
||||
"version": "9.2.6",
|
||||
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz",
|
||||
"integrity": "sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chalk": "^4.1.0",
|
||||
"enhanced-resolve": "^5.0.0",
|
||||
"micromatch": "^4.0.0",
|
||||
"semver": "^7.3.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-styles": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-convert": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"chalk": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-styles": "^4.1.0",
|
||||
"supports-color": "^7.1.0"
|
||||
}
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-name": "~1.1.4"
|
||||
}
|
||||
},
|
||||
"color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true
|
||||
},
|
||||
"semver": {
|
||||
"version": "7.3.5",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
|
||||
"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lru-cache": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "^4.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tsconfig-paths": {
|
||||
"version": "3.12.0",
|
||||
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
|
||||
|
||||
15
package.json
15
package.json
@@ -56,9 +56,7 @@
|
||||
"@react-navigation/native": "6.0.6",
|
||||
"@react-navigation/stack": "6.0.11",
|
||||
"@svgr/webpack": "4.3.2",
|
||||
"@tensorflow-models/blazeface": "0.0.7",
|
||||
"@tensorflow/tfjs-backend-wasm": "3.13.0",
|
||||
"@tensorflow/tfjs-converter": "3.13.0",
|
||||
"@tensorflow/tfjs-core": "3.13.0",
|
||||
"@vladmandic/face-api": "1.6.4",
|
||||
"@xmldom/xmldom": "0.7.5",
|
||||
@@ -79,10 +77,10 @@
|
||||
"jquery-i18next": "1.2.1",
|
||||
"js-md5": "0.6.1",
|
||||
"jwt-decode": "2.2.0",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1409.0.0+88378583/lib-jitsi-meet.tgz",
|
||||
"lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v1415.0.0+fa916d41/lib-jitsi-meet.tgz",
|
||||
"libflacjs": "https://git@github.com/mmig/libflac.js#93d37e7f811f01cf7d8b6a603e38bd3c3810907d",
|
||||
"lodash": "4.17.21",
|
||||
"moment": "2.29.1",
|
||||
"moment": "2.29.2",
|
||||
"moment-duration-format": "2.2.2",
|
||||
"optional-require": "1.0.3",
|
||||
"promise.allsettled": "1.0.4",
|
||||
@@ -93,12 +91,12 @@
|
||||
"react-focus-lock": "2.5.1",
|
||||
"react-i18next": "10.11.4",
|
||||
"react-linkify": "1.0.0-alpha",
|
||||
"react-native": "0.66.4",
|
||||
"react-native": "0.67.4",
|
||||
"react-native-background-timer": "2.4.1",
|
||||
"react-native-calendar-events": "2.2.0",
|
||||
"react-native-callstats": "3.73.7",
|
||||
"react-native-collapsible": "1.6.0",
|
||||
"react-native-default-preference": "https://git@github.com/kevinresol/react-native-default-preference#11bff5eb05cb04fd8d35b5e761eeee80525e8c6c",
|
||||
"react-native-default-preference": "1.4.4",
|
||||
"react-native-device-info": "8.4.8",
|
||||
"react-native-dialog": "9.2.1",
|
||||
"react-native-gesture-handler": "2.1.0",
|
||||
@@ -108,7 +106,7 @@
|
||||
"react-native-pager-view": "5.4.9",
|
||||
"react-native-paper": "4.11.1",
|
||||
"react-native-performance": "2.1.0",
|
||||
"react-native-reanimated": "1.13.3",
|
||||
"react-native-reanimated": "1.13.4",
|
||||
"react-native-safe-area-context": "3.3.2",
|
||||
"react-native-screens": "3.10.1",
|
||||
"react-native-sound": "0.11.1",
|
||||
@@ -119,7 +117,7 @@
|
||||
"react-native-url-polyfill": "1.3.0",
|
||||
"react-native-video": "https://git@github.com/jitsi/react-native-video#4f6dad990d17ce42894df993780b5386a9c11b85",
|
||||
"react-native-watch-connectivity": "1.0.4",
|
||||
"react-native-webrtc": "1.94.2",
|
||||
"react-native-webrtc": "1.100.0",
|
||||
"react-native-webview": "11.15.1",
|
||||
"react-native-youtube-iframe": "2.2.1",
|
||||
"react-redux": "7.1.0",
|
||||
@@ -168,6 +166,7 @@
|
||||
"string-replace-loader": "3.0.3",
|
||||
"style-loader": "0.19.0",
|
||||
"traverse": "0.6.6",
|
||||
"ts-loader": "9.2.6",
|
||||
"typescript": "4.3.5",
|
||||
"unorm": "1.6.0",
|
||||
"webpack": "5.57.1",
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
diff --git a/node_modules/react-native/React/CoreModules/RCTTiming.mm b/node_modules/react-native/React/CoreModules/RCTTiming.mm
|
||||
index 70f0543..d43a4be 100644
|
||||
--- a/node_modules/react-native/React/CoreModules/RCTTiming.mm
|
||||
+++ b/node_modules/react-native/React/CoreModules/RCTTiming.mm
|
||||
@@ -146,6 +146,11 @@ - (void)setup
|
||||
name:name
|
||||
object:nil];
|
||||
}
|
||||
+
|
||||
+ [[NSNotificationCenter defaultCenter] addObserver:self
|
||||
+ selector:@selector(proximityChanged)
|
||||
+ name:UIDeviceProximityStateDidChangeNotification
|
||||
+ object:nil];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
@@ -182,6 +187,16 @@ - (void)appDidMoveToForeground
|
||||
[self startTimers];
|
||||
}
|
||||
|
||||
+- (void)proximityChanged
|
||||
+{
|
||||
+ BOOL isClose = [UIDevice currentDevice].proximityState;
|
||||
+ if (isClose) {
|
||||
+ [self appDidMoveToBackground];
|
||||
+ } else {
|
||||
+ [self appDidMoveToForeground];
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
- (void)stopTimers
|
||||
{
|
||||
if (_inBackground) {
|
||||
diff --git a/node_modules/react-native/scripts/react_native_pods.rb b/node_modules/react-native/scripts/react_native_pods.rb
|
||||
index df31139..061ded9 100644
|
||||
--- a/node_modules/react-native/scripts/react_native_pods.rb
|
||||
+++ b/node_modules/react-native/scripts/react_native_pods.rb
|
||||
@@ -125,20 +125,49 @@ def exclude_architectures(installer)
|
||||
.uniq{ |p| p.path }
|
||||
.push(installer.pods_project)
|
||||
|
||||
- arm_value = `/usr/sbin/sysctl -n hw.optional.arm64 2>&1`.to_i
|
||||
-
|
||||
# Hermes does not support `i386` architecture
|
||||
excluded_archs_default = has_pod(installer, 'hermes-engine') ? "i386" : ""
|
||||
|
||||
projects.each do |project|
|
||||
project.build_configurations.each do |config|
|
||||
- if arm_value == 1 then
|
||||
- config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = excluded_archs_default
|
||||
- else
|
||||
- config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64 " + excluded_archs_default
|
||||
+ config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = excluded_archs_default
|
||||
+ end
|
||||
+
|
||||
+ project.save()
|
||||
+ end
|
||||
+end
|
||||
+
|
||||
+def fix_library_search_paths(installer)
|
||||
+ def fix_config(config)
|
||||
+ lib_search_paths = config.build_settings["LIBRARY_SEARCH_PATHS"]
|
||||
+ if lib_search_paths
|
||||
+ if lib_search_paths.include?("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)") || lib_search_paths.include?("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"")
|
||||
+ # $(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME) causes problem with Xcode 12.5 + arm64 (Apple M1)
|
||||
+ # since the libraries there are only built for x86_64 and i386.
|
||||
+ lib_search_paths.delete("$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)")
|
||||
+ lib_search_paths.delete("\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"")
|
||||
+ if !(lib_search_paths.include?("$(SDKROOT)/usr/lib/swift") || lib_search_paths.include?("\"$(SDKROOT)/usr/lib/swift\""))
|
||||
+ # however, $(SDKROOT)/usr/lib/swift is required, at least if user is not running CocoaPods 1.11
|
||||
+ lib_search_paths.insert(0, "$(SDKROOT)/usr/lib/swift")
|
||||
+ end
|
||||
end
|
||||
end
|
||||
+ end
|
||||
+
|
||||
+ projects = installer.aggregate_targets
|
||||
+ .map{ |t| t.user_project }
|
||||
+ .uniq{ |p| p.path }
|
||||
+ .push(installer.pods_project)
|
||||
|
||||
+ projects.each do |project|
|
||||
+ project.build_configurations.each do |config|
|
||||
+ fix_config(config)
|
||||
+ end
|
||||
+ project.native_targets.each do |target|
|
||||
+ target.build_configurations.each do |config|
|
||||
+ fix_config(config)
|
||||
+ end
|
||||
+ end
|
||||
project.save()
|
||||
end
|
||||
end
|
||||
@@ -149,6 +178,7 @@ def react_native_post_install(installer)
|
||||
end
|
||||
|
||||
exclude_architectures(installer)
|
||||
+ fix_library_search_paths(installer)
|
||||
end
|
||||
|
||||
def use_react_native_codegen!(spec, options={})
|
||||
@@ -218,36 +248,8 @@ end
|
||||
# See https://github.com/facebook/react-native/issues/31480#issuecomment-902912841 for more context.
|
||||
# Actual fix was authored by https://github.com/mikehardy.
|
||||
# New app template will call this for now until the underlying issue is resolved.
|
||||
+#
|
||||
+# It's not needed anymore and will be removed later
|
||||
def __apply_Xcode_12_5_M1_post_install_workaround(installer)
|
||||
- # Apple Silicon builds require a library path tweak for Swift library discovery to resolve Swift-related "symbol not found".
|
||||
- # Note: this was fixed via https://github.com/facebook/react-native/commit/eb938863063f5535735af2be4e706f70647e5b90
|
||||
- # Keeping this logic here but commented out for future reference.
|
||||
- #
|
||||
- # installer.aggregate_targets.each do |aggregate_target|
|
||||
- # aggregate_target.user_project.native_targets.each do |target|
|
||||
- # target.build_configurations.each do |config|
|
||||
- # config.build_settings['LIBRARY_SEARCH_PATHS'] = ['$(SDKROOT)/usr/lib/swift', '$(inherited)']
|
||||
- # end
|
||||
- # end
|
||||
- # aggregate_target.user_project.save
|
||||
- # end
|
||||
-
|
||||
- # Flipper podspecs are still targeting an older iOS deployment target, and may cause an error like:
|
||||
- # "error: thread-local storage is not supported for the current target"
|
||||
- # The most reliable known workaround is to bump iOS deployment target to match react-native (iOS 11 now).
|
||||
- installer.pods_project.targets.each do |target|
|
||||
- target.build_configurations.each do |config|
|
||||
- # ensure IPHONEOS_DEPLOYMENT_TARGET is at least 11.0
|
||||
- should_upgrade = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].split('.')[0].to_i < 11
|
||||
- if should_upgrade
|
||||
- config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
|
||||
- end
|
||||
- end
|
||||
- end
|
||||
-
|
||||
- # But... doing so caused another issue in Flipper:
|
||||
- # "Time.h:52:17: error: typedef redefinition with different types"
|
||||
- # We need to make a patch to RCT-Folly - remove the `__IPHONE_OS_VERSION_MIN_REQUIRED` check.
|
||||
- # See https://github.com/facebook/flipper/issues/834 for more details.
|
||||
- `sed -i -e $'s/ && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0)//' Pods/RCT-Folly/folly/portability/Time.h`
|
||||
+ puts "__apply_Xcode_12_5_M1_post_install_workaround() is not needed anymore"
|
||||
end
|
||||
50
patches/react-native+0.67.4.patch
Normal file
50
patches/react-native+0.67.4.patch
Normal file
@@ -0,0 +1,50 @@
|
||||
diff --git a/node_modules/react-native/React/CoreModules/RCTTiming.mm b/node_modules/react-native/React/CoreModules/RCTTiming.mm
|
||||
index 70f0543..d003662 100644
|
||||
--- a/node_modules/react-native/React/CoreModules/RCTTiming.mm
|
||||
+++ b/node_modules/react-native/React/CoreModules/RCTTiming.mm
|
||||
@@ -127,7 +127,15 @@ - (void)setup
|
||||
{
|
||||
_paused = YES;
|
||||
_timers = [NSMutableDictionary new];
|
||||
- _inBackground = NO;
|
||||
+
|
||||
+ __block BOOL initialInBackground;
|
||||
+ dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
+ initialInBackground
|
||||
+ = [UIApplication sharedApplication].applicationState == UIApplicationStateBackground
|
||||
+ || [UIDevice currentDevice].proximityState;
|
||||
+ });
|
||||
+
|
||||
+ _inBackground = initialInBackground;
|
||||
|
||||
for (NSString *name in @[
|
||||
UIApplicationWillResignActiveNotification,
|
||||
@@ -146,6 +154,11 @@ - (void)setup
|
||||
name:name
|
||||
object:nil];
|
||||
}
|
||||
+
|
||||
+ [[NSNotificationCenter defaultCenter] addObserver:self
|
||||
+ selector:@selector(proximityChanged)
|
||||
+ name:UIDeviceProximityStateDidChangeNotification
|
||||
+ object:nil];
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
@@ -182,6 +195,16 @@ - (void)appDidMoveToForeground
|
||||
[self startTimers];
|
||||
}
|
||||
|
||||
+- (void)proximityChanged
|
||||
+{
|
||||
+ BOOL isClose = [UIDevice currentDevice].proximityState;
|
||||
+ if (isClose) {
|
||||
+ [self appDidMoveToBackground];
|
||||
+ } else {
|
||||
+ [self appDidMoveToForeground];
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
- (void)stopTimers
|
||||
{
|
||||
if (_inBackground) {
|
||||
@@ -1,10 +1,14 @@
|
||||
// @flow
|
||||
|
||||
import React, { Component } from 'react';
|
||||
|
||||
// We need to reference these files directly to avoid loading things that are not available
|
||||
// in this environment (e.g. JitsiMeetJS or interfaceConfig)
|
||||
import AbstractAudioMuteButton from '../base/toolbox/components/AbstractAudioMuteButton';
|
||||
import { IconMicrophoneEmpty, IconMicrophoneEmptySlash } from '../base/icons';
|
||||
import type { Props } from '../base/toolbox/components/AbstractButton';
|
||||
|
||||
import ToolbarButton from './ToolbarButton';
|
||||
|
||||
const { api } = window.alwaysOnTop;
|
||||
|
||||
/**
|
||||
@@ -26,9 +30,9 @@ type State = {
|
||||
/**
|
||||
* Stateless "mute/unmute audio" button for the Always-on-Top windows.
|
||||
*/
|
||||
export default class AudioMuteButton
|
||||
extends AbstractAudioMuteButton<Props, State> {
|
||||
|
||||
export default class AudioMuteButton extends Component<Props, State> {
|
||||
icon = IconMicrophoneEmpty;
|
||||
toggledIcon = IconMicrophoneEmptySlash;
|
||||
accessibilityLabel = 'Audio mute';
|
||||
|
||||
/**
|
||||
@@ -49,6 +53,7 @@ export default class AudioMuteButton
|
||||
this._audioAvailabilityListener
|
||||
= this._audioAvailabilityListener.bind(this);
|
||||
this._audioMutedListener = this._audioMutedListener.bind(this);
|
||||
this._onClick = this._onClick.bind(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -145,4 +150,33 @@ export default class AudioMuteButton
|
||||
_setAudioMuted(audioMuted: boolean) { // eslint-disable-line no-unused-vars
|
||||
this.state.audioAvailable && api.executeCommand('toggleAudio');
|
||||
}
|
||||
|
||||
_onClick: () => {};
|
||||
|
||||
/**
|
||||
* Handles clicking / pressing the button, and toggles the audio mute state
|
||||
* accordingly.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
_onClick() {
|
||||
this._setAudioMuted(!this._isAudioMuted());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements React's {@link Component#render()}.
|
||||
*
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
render() {
|
||||
const toggled = this._isAudioMuted();
|
||||
|
||||
return (<ToolbarButton
|
||||
accessibilityLabel = { this.accessibilityLabel }
|
||||
disabled = { this._isDisabled() }
|
||||
icon = { toggled ? this.toggledIcon : this.icon }
|
||||
onClick = { this._onClick }
|
||||
toggled = { toggled } />);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1,59 @@
|
||||
// @flow
|
||||
import React, { Component } from 'react';
|
||||
|
||||
// We need to reference these files directly to avoid loading things that are not available
|
||||
// in this environment (e.g. JitsiMeetJS or interfaceConfig)
|
||||
import { IconHangup } from '../base/icons';
|
||||
import type { Props } from '../base/toolbox/components/AbstractButton';
|
||||
import AbstractHangupButton from '../base/toolbox/components/AbstractHangupButton';
|
||||
|
||||
import ToolbarButton from './ToolbarButton';
|
||||
|
||||
const { api } = window.alwaysOnTop;
|
||||
|
||||
/**
|
||||
* Stateless hangup button for the Always-on-Top windows.
|
||||
*/
|
||||
export default class HangupButton extends AbstractHangupButton<Props, *> {
|
||||
export default class HangupButton extends Component<Props, *> {
|
||||
|
||||
accessibilityLabel = 'Hangup';
|
||||
icon = IconHangup;
|
||||
|
||||
/**
|
||||
* Helper function to perform the actual hangup action.
|
||||
* Initializes a new {@code HangupButton} instance.
|
||||
*
|
||||
* @param {Props} props - The React {@code Component} props to initialize
|
||||
* the new {@code HangupButton} instance with.
|
||||
*/
|
||||
constructor(props: Props) {
|
||||
super(props);
|
||||
|
||||
// Bind event handlers so they are only bound once per instance.
|
||||
this._onClick = this._onClick.bind(this);
|
||||
}
|
||||
|
||||
_onClick: () => {};
|
||||
|
||||
/**
|
||||
* Handles clicking / pressing the button, and disconnects the conference.
|
||||
*
|
||||
* @override
|
||||
* @protected
|
||||
* @returns {void}
|
||||
*/
|
||||
_doHangup() {
|
||||
_onClick() {
|
||||
api.executeCommand('hangup');
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements React's {@link Component#render()}.
|
||||
*
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
render() {
|
||||
return (<ToolbarButton
|
||||
accessibilityLabel = { this.accessibilityLabel }
|
||||
customClass = 'hangup-button'
|
||||
icon = { this.icon }
|
||||
onClick = { this._onClick } />);
|
||||
}
|
||||
}
|
||||
|
||||
69
react/features/always-on-top/ToolbarButton.js
Normal file
69
react/features/always-on-top/ToolbarButton.js
Normal file
@@ -0,0 +1,69 @@
|
||||
import React, { useCallback } from 'react';
|
||||
|
||||
import { Icon } from '../base/icons';
|
||||
|
||||
type Props = {
|
||||
|
||||
/**
|
||||
* Accessibility label for button.
|
||||
*/
|
||||
accessibilityLabel: string,
|
||||
|
||||
/**
|
||||
* An extra class name to be added at the end of the element's class name
|
||||
* in order to enable custom styling.
|
||||
*/
|
||||
customClass?: string,
|
||||
|
||||
/**
|
||||
* Whether or not the button is disabled.
|
||||
*/
|
||||
disabled?: boolean,
|
||||
|
||||
/**
|
||||
* Click handler.
|
||||
*/
|
||||
onClick: Function,
|
||||
|
||||
/**
|
||||
* Button icon.
|
||||
*/
|
||||
icon: Object,
|
||||
|
||||
/**
|
||||
* Whether or not the button is toggled.
|
||||
*/
|
||||
toggled?: boolean
|
||||
}
|
||||
|
||||
const ToolbarButton = ({
|
||||
accessibilityLabel,
|
||||
customClass,
|
||||
disabled = false,
|
||||
onClick,
|
||||
icon,
|
||||
toggled = false
|
||||
}: Props) => {
|
||||
const onKeyPress = useCallback(event => {
|
||||
if (event.key === 'Enter' || event.key === ' ') {
|
||||
event.preventDefault();
|
||||
onClick();
|
||||
}
|
||||
}, [ onClick ]);
|
||||
|
||||
return (<div
|
||||
aria-disabled = { disabled }
|
||||
aria-label = { accessibilityLabel }
|
||||
aria-pressed = { toggled }
|
||||
className = { `toolbox-button ${disabled ? ' disabled' : ''}` }
|
||||
onClick = { disabled ? undefined : onClick }
|
||||
onKeyPress = { disabled ? undefined : onKeyPress }
|
||||
role = 'button'
|
||||
tabIndex = { 0 }>
|
||||
<div className = { `toolbox-icon ${disabled ? 'disabled' : ''} ${customClass ?? ''}` }>
|
||||
<Icon src = { icon } />
|
||||
</div>
|
||||
</div>);
|
||||
};
|
||||
|
||||
export default ToolbarButton;
|
||||
@@ -1,9 +1,12 @@
|
||||
// @flow
|
||||
import React, { Component } from 'react';
|
||||
|
||||
// We need to reference these files directly to avoid loading things that are not available
|
||||
// in this environment (e.g. JitsiMeetJS or interfaceConfig)
|
||||
import { IconCameraEmpty, IconCameraEmptyDisabled } from '../base/icons';
|
||||
import type { Props } from '../base/toolbox/components/AbstractButton';
|
||||
import AbstractVideoMuteButton from '../base/toolbox/components/AbstractVideoMuteButton';
|
||||
|
||||
import ToolbarButton from './ToolbarButton';
|
||||
|
||||
const { api } = window.alwaysOnTop;
|
||||
|
||||
@@ -26,9 +29,10 @@ type State = {
|
||||
/**
|
||||
* Stateless "mute/unmute video" button for the Always-on-Top windows.
|
||||
*/
|
||||
export default class VideoMuteButton
|
||||
extends AbstractVideoMuteButton<Props, State> {
|
||||
export default class VideoMuteButton extends Component<Props, State> {
|
||||
|
||||
icon = IconCameraEmpty;
|
||||
toggledIcon = IconCameraEmptyDisabled;
|
||||
accessibilityLabel = 'Video mute';
|
||||
|
||||
/**
|
||||
@@ -49,6 +53,7 @@ export default class VideoMuteButton
|
||||
this._videoAvailabilityListener
|
||||
= this._videoAvailabilityListener.bind(this);
|
||||
this._videoMutedListener = this._videoMutedListener.bind(this);
|
||||
this._onClick = this._onClick.bind(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -145,4 +150,34 @@ export default class VideoMuteButton
|
||||
_videoMutedListener({ muted }) {
|
||||
this.setState({ videoMuted: muted });
|
||||
}
|
||||
|
||||
_onClick: () => {};
|
||||
|
||||
/**
|
||||
* Handles clicking / pressing the button, and toggles the video mute state
|
||||
* accordingly.
|
||||
*
|
||||
* @protected
|
||||
* @returns {void}
|
||||
*/
|
||||
_onClick() {
|
||||
this._setVideoMuted(!this._isVideoMuted());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements React's {@link Component#render()}.
|
||||
*
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
render() {
|
||||
const toggled = this._isVideoMuted();
|
||||
|
||||
return (<ToolbarButton
|
||||
accessibilityLabel = { this.accessibilityLabel }
|
||||
disabled = { this._isDisabled() }
|
||||
icon = { toggled ? this.toggledIcon : this.icon }
|
||||
onClick = { this._onClick }
|
||||
toggled = { toggled } />);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@ import {
|
||||
} from '../base/environment/utils';
|
||||
import JitsiMeetJS, {
|
||||
analytics,
|
||||
browser,
|
||||
isAnalyticsEnabled
|
||||
browser
|
||||
} from '../base/lib-jitsi-meet';
|
||||
import { isAnalyticsEnabled } from '../base/lib-jitsi-meet/functions';
|
||||
import { getJitsiMeetGlobalNS, loadScript, parseURIString } from '../base/util';
|
||||
|
||||
import { AmplitudeHandler, MatomoHandler } from './handlers';
|
||||
|
||||
@@ -13,7 +13,7 @@ import {
|
||||
storeConfig
|
||||
} from '../base/config';
|
||||
import { setLocationURL } from '../base/connection';
|
||||
import { loadConfig } from '../base/lib-jitsi-meet';
|
||||
import { loadConfig } from '../base/lib-jitsi-meet/functions.web';
|
||||
import {
|
||||
getBackendSafeRoomName,
|
||||
parseURIString
|
||||
|
||||
@@ -37,7 +37,6 @@ import '../lobby/middleware';
|
||||
import '../notifications/middleware';
|
||||
import '../overlay/middleware';
|
||||
import '../polls/middleware';
|
||||
import '../polls/subscriber';
|
||||
import '../reactions/middleware';
|
||||
import '../recent-list/middleware';
|
||||
import '../recording/middleware';
|
||||
|
||||
@@ -20,8 +20,7 @@ import '../shared-video/middleware';
|
||||
import '../settings/middleware';
|
||||
import '../talk-while-muted/middleware';
|
||||
import '../virtual-background/middleware';
|
||||
import '../face-centering/middleware';
|
||||
import '../facial-recognition/middleware';
|
||||
import '../face-landmarks/middleware';
|
||||
import '../gifs/middleware';
|
||||
|
||||
import './middlewares.any';
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
|
||||
import '../base/devices/reducer';
|
||||
import '../e2ee/reducer';
|
||||
import '../face-centering/reducer';
|
||||
import '../facial-recognition/reducer';
|
||||
import '../face-landmarks/reducer';
|
||||
import '../feedback/reducer';
|
||||
import '../local-recording/reducer';
|
||||
import '../no-audio-signal/reducer';
|
||||
|
||||
@@ -22,8 +22,7 @@ import {
|
||||
import {
|
||||
hideLoginDialog,
|
||||
openWaitForOwnerDialog,
|
||||
stopWaitForOwner,
|
||||
waitForOwner
|
||||
stopWaitForOwner
|
||||
} from './actions.web';
|
||||
import { LoginDialog, WaitForOwnerDialog } from './components';
|
||||
|
||||
@@ -72,7 +71,11 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
recoverable = error.recoverable;
|
||||
}
|
||||
if (recoverable) {
|
||||
store.dispatch(waitForOwner());
|
||||
// we haven't migrated all the code from AuthHandler, and we need for now conference.js to trigger
|
||||
// the dialog to pass all required parameters to WaitForOwnerDialog
|
||||
// keep it commented, so we do not trigger sending iqs to jicofo twice
|
||||
// and showing the broken dialog with no handler
|
||||
// store.dispatch(waitForOwner());
|
||||
} else {
|
||||
store.dispatch(stopWaitForOwner());
|
||||
}
|
||||
|
||||
@@ -11,6 +11,11 @@ import participantsPaneTheme from '../themes/participantsPaneTheme.json';
|
||||
|
||||
type Props = {
|
||||
|
||||
/**
|
||||
* Accessibility label for menu container.
|
||||
*/
|
||||
accessibilityLabel?: string,
|
||||
|
||||
/**
|
||||
* Children of the context menu.
|
||||
*/
|
||||
@@ -51,6 +56,11 @@ type Props = {
|
||||
*/
|
||||
onClick?: Function,
|
||||
|
||||
/**
|
||||
* Keydown handler.
|
||||
*/
|
||||
onKeyDown?: Function,
|
||||
|
||||
/**
|
||||
* Callback for drawer close.
|
||||
*/
|
||||
@@ -111,6 +121,7 @@ const useStyles = makeStyles(theme => {
|
||||
});
|
||||
|
||||
const ContextMenu = ({
|
||||
accessibilityLabel,
|
||||
children,
|
||||
className,
|
||||
entity,
|
||||
@@ -119,6 +130,7 @@ const ContextMenu = ({
|
||||
isDrawerOpen,
|
||||
offsetTarget,
|
||||
onClick,
|
||||
onKeyDown,
|
||||
onDrawerClose,
|
||||
onMouseEnter,
|
||||
onMouseLeave
|
||||
@@ -179,12 +191,14 @@ const ContextMenu = ({
|
||||
</Drawer>
|
||||
</JitsiPortal>
|
||||
: <div
|
||||
aria-label = { accessibilityLabel }
|
||||
className = { clsx(participantsPaneTheme.ignoredChildClassName,
|
||||
styles.contextMenu,
|
||||
isHidden && styles.contextMenuHidden,
|
||||
className
|
||||
) }
|
||||
onClick = { onClick }
|
||||
onKeyDown = { onKeyDown }
|
||||
onMouseEnter = { onMouseEnter }
|
||||
onMouseLeave = { onMouseLeave }
|
||||
ref = { containerRef }>
|
||||
|
||||
@@ -46,6 +46,21 @@ export type Props = {
|
||||
*/
|
||||
onClick?: Function,
|
||||
|
||||
/**
|
||||
* Keydown handler.
|
||||
*/
|
||||
onKeyDown?: Function,
|
||||
|
||||
/**
|
||||
* Keypress handler.
|
||||
*/
|
||||
onKeyPress?: Function,
|
||||
|
||||
/**
|
||||
* TestId of the element, if any.
|
||||
*/
|
||||
testId?: string,
|
||||
|
||||
/**
|
||||
* Action text.
|
||||
*/
|
||||
@@ -100,6 +115,9 @@ const ContextMenuItem = ({
|
||||
id,
|
||||
icon,
|
||||
onClick,
|
||||
onKeyDown,
|
||||
onKeyPress,
|
||||
testId,
|
||||
text,
|
||||
textClassName }: Props) => {
|
||||
const styles = useStyles();
|
||||
@@ -107,15 +125,19 @@ const ContextMenuItem = ({
|
||||
|
||||
return (
|
||||
<div
|
||||
aria-disabled = { disabled }
|
||||
aria-label = { accessibilityLabel }
|
||||
className = { clsx(styles.contextMenuItem,
|
||||
_overflowDrawer && styles.contextMenuItemDrawer,
|
||||
disabled && styles.contextMenuItemDisabled,
|
||||
className
|
||||
) }
|
||||
data-testid = { testId }
|
||||
id = { id }
|
||||
key = { text }
|
||||
onClick = { onClick }>
|
||||
onClick = { disabled ? undefined : onClick }
|
||||
onKeyDown = { disabled ? undefined : onKeyDown }
|
||||
onKeyPress = { disabled ? undefined : onKeyPress }>
|
||||
{customIcon ? customIcon
|
||||
: icon && <Icon
|
||||
className = { styles.contextMenuItemIcon }
|
||||
|
||||
@@ -32,6 +32,17 @@ export const CONFERENCE_FAILED = 'CONFERENCE_FAILED';
|
||||
*/
|
||||
export const CONFERENCE_JOINED = 'CONFERENCE_JOINED';
|
||||
|
||||
/**
|
||||
* The type of (redux) action which signals that a specific conference joining is in progress.
|
||||
* A CONFERENCE_JOINED is guaranteed to follow.
|
||||
*
|
||||
* {
|
||||
* type: CONFERENCE_JOIN_IN_PROGRESS,
|
||||
* conference: JitsiConference
|
||||
* }
|
||||
*/
|
||||
export const CONFERENCE_JOIN_IN_PROGRESS = 'CONFERENCE_JOIN_IN_PROGRESS';
|
||||
|
||||
/**
|
||||
* The type of (redux) action which signals that a specific conference was left.
|
||||
*
|
||||
@@ -82,6 +93,19 @@ export const CONFERENCE_TIMESTAMP_CHANGED = 'CONFERENCE_TIMESTAMP_CHANGED';
|
||||
*/
|
||||
export const CONFERENCE_UNIQUE_ID_SET = 'CONFERENCE_UNIQUE_ID_SET';
|
||||
|
||||
/**
|
||||
* The type of (redux) action which signals that the end-to-end RTT against a specific remote participant has changed.
|
||||
*
|
||||
* {
|
||||
* type: E2E_RTT_CHANGED,
|
||||
* e2eRtt: {
|
||||
* rtt: number,
|
||||
* participant: Object,
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
export const E2E_RTT_CHANGED = 'E2E_RTT_CHANGED'
|
||||
|
||||
/**
|
||||
* The type of (redux) action which signals that a specific conference will be
|
||||
* joined.
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
import { endpointMessageReceived } from '../../subtitles';
|
||||
import { getReplaceParticipant } from '../config/functions';
|
||||
import { JITSI_CONNECTION_CONFERENCE_KEY } from '../connection';
|
||||
import { JitsiConferenceEvents } from '../lib-jitsi-meet';
|
||||
import { JitsiConferenceEvents, JitsiE2ePingEvents } from '../lib-jitsi-meet';
|
||||
import {
|
||||
MEDIA_TYPE,
|
||||
setAudioMuted,
|
||||
@@ -39,6 +39,7 @@ import { getBackendSafeRoomName } from '../util';
|
||||
import {
|
||||
AUTH_STATUS_CHANGED,
|
||||
CONFERENCE_FAILED,
|
||||
CONFERENCE_JOIN_IN_PROGRESS,
|
||||
CONFERENCE_JOINED,
|
||||
CONFERENCE_LEFT,
|
||||
CONFERENCE_LOCAL_SUBJECT_CHANGED,
|
||||
@@ -48,6 +49,7 @@ import {
|
||||
CONFERENCE_WILL_JOIN,
|
||||
CONFERENCE_WILL_LEAVE,
|
||||
DATA_CHANNEL_OPENED,
|
||||
E2E_RTT_CHANGED,
|
||||
KICKED_OUT,
|
||||
LOCK_STATE_CHANGED,
|
||||
NON_PARTICIPANT_MESSAGE_RECEIVED,
|
||||
@@ -104,6 +106,9 @@ function _addConferenceListeners(conference, dispatch, state) {
|
||||
conference.on(
|
||||
JitsiConferenceEvents.CONFERENCE_JOINED,
|
||||
(...args) => dispatch(conferenceJoined(conference, ...args)));
|
||||
conference.on(
|
||||
JitsiConferenceEvents.CONFERENCE_JOIN_IN_PROGRESS,
|
||||
(...args) => dispatch(conferenceJoinInProgress(conference, ...args)));
|
||||
conference.on(
|
||||
JitsiConferenceEvents.CONFERENCE_LEFT,
|
||||
(...args) => {
|
||||
@@ -231,6 +236,10 @@ function _addConferenceListeners(conference, dispatch, state) {
|
||||
JitsiConferenceEvents.USER_STATUS_CHANGED,
|
||||
(...args) => dispatch(participantPresenceChanged(...args)));
|
||||
|
||||
conference.on(
|
||||
JitsiE2ePingEvents.E2E_RTT_CHANGED,
|
||||
(...args) => dispatch(e2eRttChanged(...args)));
|
||||
|
||||
conference.on(
|
||||
JitsiConferenceEvents.BOT_TYPE_CHANGED,
|
||||
(id, botType) => dispatch(participantUpdated({
|
||||
@@ -255,6 +264,30 @@ function _addConferenceListeners(conference, dispatch, state) {
|
||||
})));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create an action for when the end-to-end RTT against a specific remote participant has changed.
|
||||
*
|
||||
* @param {Object} participant - The participant against which the rtt is measured.
|
||||
* @param {number} rtt - The rtt.
|
||||
* @returns {{
|
||||
* type: E2E_RTT_CHANGED,
|
||||
* e2eRtt: {
|
||||
* participant: Object,
|
||||
* rtt: number
|
||||
* }
|
||||
* }}
|
||||
*/
|
||||
export function e2eRttChanged(participant, rtt) {
|
||||
return {
|
||||
type: E2E_RTT_CHANGED,
|
||||
e2eRtt: {
|
||||
rtt,
|
||||
participant
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the current known state of server-side authentication.
|
||||
*
|
||||
@@ -321,6 +354,23 @@ export function conferenceJoined(conference: Object) {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Signals that a specific conference join is in progress.
|
||||
*
|
||||
* @param {JitsiConference} conference - The JitsiConference instance for which join by the local participant
|
||||
* is in progress.
|
||||
* @returns {{
|
||||
* type: CONFERENCE_JOIN_IN_PROGRESS,
|
||||
* conference: JitsiConference
|
||||
* }}
|
||||
*/
|
||||
export function conferenceJoinInProgress(conference: Object) {
|
||||
return {
|
||||
type: CONFERENCE_JOIN_IN_PROGRESS,
|
||||
conference
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Signals that a specific conference has been left.
|
||||
*
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
|
||||
import { AUDIO_ONLY_SCREEN_SHARE_NO_TRACK } from '../../../../modules/UI/UIErrors';
|
||||
import { showNotification, NOTIFICATION_TIMEOUT_TYPE } from '../../notifications';
|
||||
import { setSkipPrejoinOnReload } from '../../prejoin';
|
||||
import {
|
||||
setPrejoinPageVisibility,
|
||||
setSkipPrejoinOnReload
|
||||
} from '../../prejoin';
|
||||
import { setScreenAudioShareState, setScreenshareAudioTrack } from '../../screen-share';
|
||||
import { AudioMixerEffect } from '../../stream-effects/audio-mixer/AudioMixerEffect';
|
||||
import { setAudioOnly } from '../audio-only';
|
||||
@@ -19,7 +22,7 @@ import {
|
||||
TOGGLE_SCREENSHARING
|
||||
} from '../tracks';
|
||||
|
||||
import { CONFERENCE_FAILED, CONFERENCE_JOINED } from './actionTypes';
|
||||
import { CONFERENCE_FAILED, CONFERENCE_JOIN_IN_PROGRESS, CONFERENCE_JOINED } from './actionTypes';
|
||||
import { getCurrentConference } from './functions';
|
||||
import './middleware.any';
|
||||
|
||||
@@ -28,6 +31,11 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
const { enableForcedReload } = getState()['features/base/config'];
|
||||
|
||||
switch (action.type) {
|
||||
case CONFERENCE_JOIN_IN_PROGRESS: {
|
||||
dispatch(setPrejoinPageVisibility(false));
|
||||
|
||||
break;
|
||||
}
|
||||
case CONFERENCE_JOINED: {
|
||||
if (enableForcedReload) {
|
||||
dispatch(setSkipPrejoinOnReload(false));
|
||||
|
||||
@@ -136,7 +136,6 @@ export default [
|
||||
'enableDisplayNameInStats',
|
||||
'enableEmailInStats',
|
||||
'enableEncodedTransformSupport',
|
||||
'enableFacialRecognition',
|
||||
'enableIceRestart',
|
||||
'enableInsecureRoomNameWarning',
|
||||
'enableLayerSuspension',
|
||||
@@ -152,12 +151,13 @@ export default [
|
||||
'enableTcc',
|
||||
'enableAutomaticUrlCopy',
|
||||
'etherpad_base',
|
||||
'faceCoordinatesSharing',
|
||||
'faceLandmarks',
|
||||
'failICE',
|
||||
'feedbackPercentage',
|
||||
'fileRecordingsEnabled',
|
||||
'filmstrip',
|
||||
'firefox_fake_device',
|
||||
'flags',
|
||||
'forceJVB121Ratio',
|
||||
'forceTurnRelay',
|
||||
'gatherStats',
|
||||
|
||||
3
react/features/base/icons/svg/car.svg
Normal file
3
react/features/base/icons/svg/car.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.44701 5H15.553C16.427 5 17.1997 5.56747 17.4613 6.40136L18.2765 9H18H6H5.7235L6.5387 6.40136C6.8003 5.56747 7.57305 5 8.44701 5ZM3.29779 10.0507L4.6304 5.80272C5.15358 4.13493 6.69908 3 8.44701 3H15.553C17.3009 3 18.8464 4.13494 19.3696 5.80272L20.7022 10.0507C21.4999 10.782 22 11.8326 22 13V17V18V21H20V18H4V21H2V18V17V13C2 11.8326 2.50012 10.782 3.29779 10.0507ZM6 11C4.89543 11 4 11.8954 4 13V16H20V13C20 11.8954 19.1046 11 18 11H6ZM9 13.5C9 14.3284 8.32843 15 7.5 15C6.67157 15 6 14.3284 6 13.5C6 12.6716 6.67157 12 7.5 12C8.32843 12 9 12.6716 9 13.5ZM16.5 15C17.3284 15 18 14.3284 18 13.5C18 12.6716 17.3284 12 16.5 12C15.6716 12 15 12.6716 15 13.5C15 14.3284 15.6716 15 16.5 15Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 844 B |
@@ -22,6 +22,7 @@ export { default as IconCameraEmpty } from './camera-empty.svg';
|
||||
export { default as IconCameraEmptyDisabled } from './camera-empty-disabled.svg';
|
||||
export { default as IconCameraRefresh } from './camera-refresh.svg';
|
||||
export { default as IconCancelSelection } from './cancel.svg';
|
||||
export { default as IconCar } from './car.svg';
|
||||
export { default as IconChat } from './chat.svg';
|
||||
export { default as IconChatSend } from './send.svg';
|
||||
export { default as IconChatUnread } from './chat-unread.svg';
|
||||
|
||||
@@ -5,7 +5,11 @@ import debounce from 'lodash/debounce';
|
||||
import { SET_FILMSTRIP_ENABLED } from '../../filmstrip/actionTypes';
|
||||
import { SELECT_LARGE_VIDEO_PARTICIPANT } from '../../large-video/actionTypes';
|
||||
import { APP_STATE_CHANGED } from '../../mobile/background/actionTypes';
|
||||
import { SCREEN_SHARE_REMOTE_PARTICIPANTS_UPDATED, SET_TILE_VIEW } from '../../video-layout/actionTypes';
|
||||
import {
|
||||
FAKE_SCREEN_SHARE_REMOTE_PARTICIPANTS_UPDATED,
|
||||
SCREEN_SHARE_REMOTE_PARTICIPANTS_UPDATED,
|
||||
SET_TILE_VIEW
|
||||
} from '../../video-layout/actionTypes';
|
||||
import { SET_AUDIO_ONLY } from '../audio-only/actionTypes';
|
||||
import { CONFERENCE_JOINED } from '../conference/actionTypes';
|
||||
import {
|
||||
@@ -92,6 +96,7 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
switch (action.type) {
|
||||
case APP_STATE_CHANGED:
|
||||
case CONFERENCE_JOINED:
|
||||
case FAKE_SCREEN_SHARE_REMOTE_PARTICIPANTS_UPDATED:
|
||||
case PARTICIPANT_JOINED:
|
||||
case PARTICIPANT_KICKED:
|
||||
case PARTICIPANT_LEFT:
|
||||
|
||||
@@ -24,7 +24,3 @@ export const JitsiRecordingConstants = JitsiMeetJS.constants.recording;
|
||||
export const JitsiSIPVideoGWStatus = JitsiMeetJS.constants.sipVideoGW;
|
||||
export const JitsiTrackErrors = JitsiMeetJS.errors.track;
|
||||
export const JitsiTrackEvents = JitsiMeetJS.events.track;
|
||||
|
||||
export * from './actions';
|
||||
export * from './actionTypes';
|
||||
export * from './functions';
|
||||
|
||||
@@ -5,9 +5,9 @@ import Logger from '@jitsi/logger';
|
||||
import { APP_WILL_MOUNT } from '../app';
|
||||
import { CONFERENCE_JOINED, getCurrentConference } from '../conference';
|
||||
import JitsiMeetJS, {
|
||||
LIB_WILL_INIT,
|
||||
JitsiConferenceEvents
|
||||
} from '../lib-jitsi-meet';
|
||||
import { LIB_WILL_INIT } from '../lib-jitsi-meet/actionTypes';
|
||||
import { MiddlewareRegistry } from '../redux';
|
||||
import { isTestModeEnabled } from '../testing';
|
||||
|
||||
|
||||
@@ -200,4 +200,4 @@ export const RAISE_HAND_UPDATED = 'RAISE_HAND_UPDATED';
|
||||
* level: number
|
||||
* }
|
||||
*/
|
||||
export const LOCAL_PARTICIPANT_AUDIO_LEVEL_CHANGED = 'LOCAL_PARTICIPANT_AUDIO_LEVEL_CHANGED'
|
||||
export const LOCAL_PARTICIPANT_AUDIO_LEVEL_CHANGED = 'LOCAL_PARTICIPANT_AUDIO_LEVEL_CHANGED'
|
||||
@@ -5,6 +5,7 @@ import type { Store } from 'redux';
|
||||
|
||||
import { isStageFilmstripEnabled } from '../../filmstrip/functions';
|
||||
import { GRAVATAR_BASE_URL, isCORSAvatarURL } from '../avatar';
|
||||
import { getSourceNameSignalingFeatureFlag } from '../config';
|
||||
import { JitsiParticipantConnectionStatus } from '../lib-jitsi-meet';
|
||||
import { MEDIA_TYPE, shouldRenderVideoTrack } from '../media';
|
||||
import { toState } from '../redux';
|
||||
@@ -91,6 +92,19 @@ export function getLocalParticipant(stateful: Object | Function) {
|
||||
return state.local;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns local screen share participant from Redux state.
|
||||
*
|
||||
* @param {(Function|Object)} stateful - The (whole) redux state, or redux's
|
||||
* {@code getState} function to be used to retrieve the state features/base/participants.
|
||||
* @returns {(Participant|undefined)}
|
||||
*/
|
||||
export function getLocalScreenShareParticipant(stateful: Object | Function) {
|
||||
const state = toState(stateful)['features/base/participants'];
|
||||
|
||||
return state.localScreenShare;
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes a display name so then no invalid values (padding, length...etc)
|
||||
* can be set.
|
||||
@@ -119,9 +133,11 @@ export function getNormalizedDisplayName(name: string) {
|
||||
export function getParticipantById(
|
||||
stateful: Object | Function, id: string): ?Object {
|
||||
const state = toState(stateful)['features/base/participants'];
|
||||
const { local, remote } = state;
|
||||
const { local, localScreenShare, remote } = state;
|
||||
|
||||
return remote.get(id) || (local?.id === id ? local : undefined);
|
||||
return remote.get(id)
|
||||
|| (local?.id === id ? local : undefined)
|
||||
|| (localScreenShare?.id === id ? localScreenShare : undefined);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -148,10 +164,31 @@ export function getParticipantByIdOrUndefined(stateful: Object | Function, parti
|
||||
* @returns {number}
|
||||
*/
|
||||
export function getParticipantCount(stateful: Object | Function) {
|
||||
const state = toState(stateful)['features/base/participants'];
|
||||
const { local, remote, fakeParticipants } = state;
|
||||
const state = toState(stateful);
|
||||
const {
|
||||
local,
|
||||
remote,
|
||||
fakeParticipants,
|
||||
sortedRemoteFakeScreenShareParticipants
|
||||
} = state['features/base/participants'];
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
return remote.size - fakeParticipants.size - sortedRemoteFakeScreenShareParticipants.size + (local ? 1 : 0);
|
||||
}
|
||||
|
||||
return remote.size - fakeParticipants.size + (local ? 1 : 0);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns participant ID of the owner of a fake screenshare participant.
|
||||
*
|
||||
* @param {string} id - The ID of the fake screenshare participant.
|
||||
* @private
|
||||
* @returns {(string|undefined)}
|
||||
*/
|
||||
export function getFakeScreenShareParticipantOwnerId(id: string) {
|
||||
return id.split('-')[0];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -177,6 +214,10 @@ export function getFakeParticipants(stateful: Object | Function) {
|
||||
export function getRemoteParticipantCount(stateful: Object | Function) {
|
||||
const state = toState(stateful)['features/base/participants'];
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
return state.remote.size - state.sortedRemoteFakeScreenShareParticipants.size;
|
||||
}
|
||||
|
||||
return state.remote.size;
|
||||
}
|
||||
|
||||
@@ -190,8 +231,12 @@ export function getRemoteParticipantCount(stateful: Object | Function) {
|
||||
* @returns {number}
|
||||
*/
|
||||
export function getParticipantCountWithFake(stateful: Object | Function) {
|
||||
const state = toState(stateful)['features/base/participants'];
|
||||
const { local, remote } = state;
|
||||
const state = toState(stateful);
|
||||
const { local, localScreenShare, remote } = state['features/base/participants'];
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)) {
|
||||
return remote.size + (local ? 1 : 0) + (localScreenShare ? 1 : 0);
|
||||
}
|
||||
|
||||
return remote.size + (local ? 1 : 0);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// @flow
|
||||
|
||||
import { SCREEN_SHARE_REMOTE_PARTICIPANTS_UPDATED } from '../../video-layout/actionTypes';
|
||||
import {
|
||||
SCREEN_SHARE_REMOTE_PARTICIPANTS_UPDATED
|
||||
} from '../../video-layout/actionTypes';
|
||||
import { ReducerRegistry, set } from '../redux';
|
||||
|
||||
import {
|
||||
@@ -59,9 +61,11 @@ const DEFAULT_STATE = {
|
||||
fakeParticipants: new Map(),
|
||||
haveParticipantWithScreenSharingFeature: false,
|
||||
local: undefined,
|
||||
localScreenShare: undefined,
|
||||
pinnedParticipant: undefined,
|
||||
raisedHandsQueue: [],
|
||||
remote: new Map(),
|
||||
sortedRemoteFakeScreenShareParticipants: new Map(),
|
||||
sortedRemoteParticipants: new Map(),
|
||||
sortedRemoteScreenshares: new Map(),
|
||||
speakersList: new Map()
|
||||
@@ -207,7 +211,7 @@ ReducerRegistry.register('features/base/participants', (state = DEFAULT_STATE, a
|
||||
}
|
||||
case PARTICIPANT_JOINED: {
|
||||
const participant = _participantJoined(action);
|
||||
const { id, isFakeParticipant, name, pinned } = participant;
|
||||
const { id, isFakeParticipant, isFakeScreenShareParticipant, isLocalScreenShare, name, pinned } = participant;
|
||||
const { pinnedParticipant, dominantSpeaker } = state;
|
||||
|
||||
if (pinned) {
|
||||
@@ -241,6 +245,13 @@ ReducerRegistry.register('features/base/participants', (state = DEFAULT_STATE, a
|
||||
};
|
||||
}
|
||||
|
||||
if (isLocalScreenShare) {
|
||||
return {
|
||||
...state,
|
||||
localScreenShare: participant
|
||||
};
|
||||
}
|
||||
|
||||
state.remote.set(id, participant);
|
||||
|
||||
// Insert the new participant.
|
||||
@@ -253,6 +264,14 @@ ReducerRegistry.register('features/base/participants', (state = DEFAULT_STATE, a
|
||||
// The sort order of participants is preserved since Map remembers the original insertion order of the keys.
|
||||
state.sortedRemoteParticipants = new Map(sortedRemoteParticipants);
|
||||
|
||||
if (isFakeScreenShareParticipant) {
|
||||
const sortedRemoteFakeScreenShareParticipants = [ ...state.sortedRemoteFakeScreenShareParticipants ];
|
||||
|
||||
sortedRemoteFakeScreenShareParticipants.push([ id, name ]);
|
||||
sortedRemoteFakeScreenShareParticipants.sort((a, b) => a[1].localeCompare(b[1]));
|
||||
|
||||
state.sortedRemoteFakeScreenShareParticipants = new Map(sortedRemoteFakeScreenShareParticipants);
|
||||
}
|
||||
if (isFakeParticipant) {
|
||||
state.fakeParticipants.set(id, participant);
|
||||
}
|
||||
@@ -267,7 +286,15 @@ ReducerRegistry.register('features/base/participants', (state = DEFAULT_STATE, a
|
||||
// (and the fact that the local participant "joins" at the beginning of
|
||||
// the app and "leaves" at the end of the app).
|
||||
const { conference, id } = action.participant;
|
||||
const { fakeParticipants, remote, local, dominantSpeaker, pinnedParticipant } = state;
|
||||
const {
|
||||
fakeParticipants,
|
||||
sortedRemoteFakeScreenShareParticipants,
|
||||
remote,
|
||||
local,
|
||||
localScreenShare,
|
||||
dominantSpeaker,
|
||||
pinnedParticipant
|
||||
} = state;
|
||||
let oldParticipant = remote.get(id);
|
||||
|
||||
if (oldParticipant && oldParticipant.conference === conference) {
|
||||
@@ -275,6 +302,9 @@ ReducerRegistry.register('features/base/participants', (state = DEFAULT_STATE, a
|
||||
} else if (local?.id === id) {
|
||||
oldParticipant = state.local;
|
||||
delete state.local;
|
||||
} else if (localScreenShare?.id === id) {
|
||||
oldParticipant = state.local;
|
||||
delete state.localScreenShare;
|
||||
} else {
|
||||
// no participant found
|
||||
return state;
|
||||
@@ -324,6 +354,11 @@ ReducerRegistry.register('features/base/participants', (state = DEFAULT_STATE, a
|
||||
fakeParticipants.delete(id);
|
||||
}
|
||||
|
||||
if (sortedRemoteFakeScreenShareParticipants.has(id)) {
|
||||
sortedRemoteFakeScreenShareParticipants.delete(id);
|
||||
state.sortedRemoteFakeScreenShareParticipants = new Map(sortedRemoteFakeScreenShareParticipants);
|
||||
}
|
||||
|
||||
return { ...state };
|
||||
}
|
||||
case RAISE_HAND_UPDATED: {
|
||||
@@ -447,6 +482,8 @@ function _participantJoined({ participant }) {
|
||||
dominantSpeaker,
|
||||
email,
|
||||
isFakeParticipant,
|
||||
isFakeScreenShareParticipant,
|
||||
isLocalScreenShare,
|
||||
isReplacing,
|
||||
isJigasi,
|
||||
loadableAvatarUrl,
|
||||
@@ -479,6 +516,8 @@ function _participantJoined({ participant }) {
|
||||
email,
|
||||
id,
|
||||
isFakeParticipant,
|
||||
isFakeScreenShareParticipant,
|
||||
isLocalScreenShare,
|
||||
isReplacing,
|
||||
isJigasi,
|
||||
loadableAvatarUrl,
|
||||
@@ -500,7 +539,7 @@ function _participantJoined({ participant }) {
|
||||
* @returns {boolean} - True if a participant was updated and false otherwise.
|
||||
*/
|
||||
function _updateParticipantProperty(state, id, property, value) {
|
||||
const { remote, local } = state;
|
||||
const { remote, local, localScreenShare } = state;
|
||||
|
||||
if (remote.has(id)) {
|
||||
remote.set(id, set(remote.get(id), property, value));
|
||||
@@ -511,6 +550,11 @@ function _updateParticipantProperty(state, id, property, value) {
|
||||
// not in a conference.
|
||||
state.local = set(local, property, value);
|
||||
|
||||
return true;
|
||||
|
||||
} else if (localScreenShare?.id === id) {
|
||||
state.localScreenShare = set(localScreenShare, property, value);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// @flow
|
||||
|
||||
import { CONFERENCE_WILL_JOIN } from '../conference';
|
||||
import { CONFERENCE_JOIN_IN_PROGRESS } from '../conference/actionTypes';
|
||||
import { SET_CONFIG } from '../config';
|
||||
import { JitsiConferenceEvents } from '../lib-jitsi-meet';
|
||||
import { MiddlewareRegistry } from '../redux';
|
||||
@@ -24,7 +24,7 @@ import logger from './logger';
|
||||
*/
|
||||
MiddlewareRegistry.register(store => next => action => {
|
||||
switch (action.type) {
|
||||
case CONFERENCE_WILL_JOIN:
|
||||
case CONFERENCE_JOIN_IN_PROGRESS:
|
||||
_bindConferenceConnectionListener(action.conference, store);
|
||||
break;
|
||||
case SET_CONFIG: {
|
||||
|
||||
@@ -20,6 +20,11 @@ export type Props = {|
|
||||
*/
|
||||
buttonKey?: string,
|
||||
|
||||
/**
|
||||
* Whether or not the button is displayed in a context menu.
|
||||
*/
|
||||
contextMenu?: boolean,
|
||||
|
||||
/**
|
||||
* An extra class name to be added at the end of the element's class name
|
||||
* in order to enable custom styling.
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import React, { Fragment } from 'react';
|
||||
|
||||
import ContextMenuItem from '../../components/context-menu/ContextMenuItem';
|
||||
import { Icon } from '../../icons';
|
||||
import { Tooltip } from '../../tooltip';
|
||||
|
||||
@@ -10,6 +11,11 @@ import type { Props as AbstractToolboxItemProps } from './AbstractToolboxItem';
|
||||
|
||||
type Props = AbstractToolboxItemProps & {
|
||||
|
||||
/**
|
||||
* Whether or not the item is displayed in a context menu.
|
||||
*/
|
||||
contextMenu?: boolean,
|
||||
|
||||
/**
|
||||
* On key down handler.
|
||||
*/
|
||||
@@ -58,8 +64,10 @@ export default class ToolboxItem extends AbstractToolboxItem<Props> {
|
||||
*/
|
||||
_renderItem() {
|
||||
const {
|
||||
contextMenu,
|
||||
disabled,
|
||||
elementAfter,
|
||||
icon,
|
||||
onClick,
|
||||
onKeyDown,
|
||||
showLabel,
|
||||
@@ -81,6 +89,17 @@ export default class ToolboxItem extends AbstractToolboxItem<Props> {
|
||||
|
||||
const elementType = showLabel ? 'li' : 'div';
|
||||
const useTooltip = this.tooltip && this.tooltip.length > 0;
|
||||
|
||||
if (contextMenu) {
|
||||
return (<ContextMenuItem
|
||||
accessibilityLabel = { this.accessibilityLabel }
|
||||
disabled = { disabled }
|
||||
icon = { icon }
|
||||
onClick = { onClick }
|
||||
onKeyDown = { onKeyDown }
|
||||
onKeyPress = { this._onKeyPress }
|
||||
text = { this.label } />);
|
||||
}
|
||||
let children = (
|
||||
<Fragment>
|
||||
{ this._renderIcon() }
|
||||
|
||||
@@ -107,6 +107,18 @@ export const TRACK_STOPPED = 'TRACK_STOPPED';
|
||||
*/
|
||||
export const TRACK_UPDATED = 'TRACK_UPDATED';
|
||||
|
||||
/**
|
||||
* The type of redux action dispatched when a screenshare track's muted property were updated.
|
||||
*
|
||||
* {
|
||||
* type: SCREENSHARE_TRACK_MUTED_UPDATED,
|
||||
* track: Track,
|
||||
* muted: Boolean
|
||||
*
|
||||
* }
|
||||
*/
|
||||
export const SCREENSHARE_TRACK_MUTED_UPDATED = 'SCREENSHARE_TRACK_MUTED_UPDATED';
|
||||
|
||||
/**
|
||||
* The type of redux action dispatched when a local track starts being created
|
||||
* via a WebRTC {@code getUserMedia} call. The action's payload includes an
|
||||
@@ -6,8 +6,9 @@ import {
|
||||
} from '../../analytics';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE, showErrorNotification, showNotification } from '../../notifications';
|
||||
import { getCurrentConference } from '../conference';
|
||||
import { getMultipleVideoSupportFeatureFlag } from '../config';
|
||||
import { JitsiTrackErrors, JitsiTrackEvents, createLocalTrack } from '../lib-jitsi-meet';
|
||||
import { getMultipleVideoSupportFeatureFlag, getSourceNameSignalingFeatureFlag } from '../config';
|
||||
import { JitsiTrackErrors, JitsiTrackEvents } from '../lib-jitsi-meet';
|
||||
import { createLocalTrack } from '../lib-jitsi-meet/functions';
|
||||
import {
|
||||
CAMERA_FACING_MODE,
|
||||
MEDIA_TYPE,
|
||||
@@ -21,6 +22,7 @@ import { getLocalParticipant } from '../participants';
|
||||
import { updateSettings } from '../settings';
|
||||
|
||||
import {
|
||||
SCREENSHARE_TRACK_MUTED_UPDATED,
|
||||
SET_NO_SRC_DATA_NOTIFICATION_UID,
|
||||
TOGGLE_SCREENSHARING,
|
||||
TRACK_ADDED,
|
||||
@@ -395,7 +397,12 @@ export function trackAdded(track) {
|
||||
return async (dispatch, getState) => {
|
||||
track.on(
|
||||
JitsiTrackEvents.TRACK_MUTE_CHANGED,
|
||||
() => dispatch(trackMutedChanged(track)));
|
||||
() => {
|
||||
if (getSourceNameSignalingFeatureFlag(getState()) && track.getVideoType() === VIDEO_TYPE.DESKTOP) {
|
||||
dispatch(screenshareTrackMutedChanged(track));
|
||||
}
|
||||
dispatch(trackMutedChanged(track));
|
||||
});
|
||||
track.on(
|
||||
JitsiTrackEvents.TRACK_VIDEOTYPE_CHANGED,
|
||||
type => dispatch(trackVideoTypeChanged(track, type)));
|
||||
@@ -491,6 +498,24 @@ export function trackMutedChanged(track) {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an action for when a screenshare track's muted state has been signaled to be changed.
|
||||
*
|
||||
* @param {(JitsiLocalTrack|JitsiRemoteTrack)} track - JitsiTrack instance.
|
||||
* @returns {{
|
||||
* type: TRACK_UPDATED,
|
||||
* track: Track,
|
||||
* muted: boolean
|
||||
* }}
|
||||
*/
|
||||
export function screenshareTrackMutedChanged(track) {
|
||||
return {
|
||||
type: SCREENSHARE_TRACK_MUTED_UPDATED,
|
||||
track: { jitsiTrack: track },
|
||||
muted: track.isMuted()
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an action for when a track's muted state change action has failed. This could happen because of
|
||||
* {@code getUserMedia} errors during unmute or replace track errors at the peerconnection level.
|
||||
|
||||
@@ -4,6 +4,7 @@ import { getMultipleVideoSupportFeatureFlag } from '../config/functions.any';
|
||||
import { isMobileBrowser } from '../environment/utils';
|
||||
import JitsiMeetJS, { JitsiTrackErrors, browser } from '../lib-jitsi-meet';
|
||||
import { MEDIA_TYPE, VIDEO_TYPE, setAudioMuted } from '../media';
|
||||
import { getFakeScreenShareParticipantOwnerId } from '../participants';
|
||||
import { toState } from '../redux';
|
||||
import {
|
||||
getUserSelectedCameraDeviceId,
|
||||
@@ -410,6 +411,35 @@ export function getLocalJitsiAudioTrack(state) {
|
||||
return track?.jitsiTrack;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns track of specified media type for specified participant.
|
||||
*
|
||||
* @param {Track[]} tracks - List of all tracks.
|
||||
* @param {Object} participant - Participant Object.
|
||||
* @returns {(Track|undefined)}
|
||||
*/
|
||||
export function getVideoTrackByParticipant(
|
||||
tracks,
|
||||
participant) {
|
||||
|
||||
if (!participant) {
|
||||
return;
|
||||
}
|
||||
|
||||
let participantId;
|
||||
let mediaType;
|
||||
|
||||
if (participant?.isFakeScreenShareParticipant) {
|
||||
participantId = getFakeScreenShareParticipantOwnerId(participant.id);
|
||||
mediaType = MEDIA_TYPE.SCREENSHARE;
|
||||
} else {
|
||||
participantId = participant.id;
|
||||
mediaType = MEDIA_TYPE.VIDEO;
|
||||
}
|
||||
|
||||
return getTrackByMediaTypeAndParticipant(tracks, mediaType, participantId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns track of specified media type for specified participant id.
|
||||
*
|
||||
@@ -427,6 +457,19 @@ export function getTrackByMediaTypeAndParticipant(
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns track of given fakeScreenshareParticipantId.
|
||||
*
|
||||
* @param {Track[]} tracks - List of all tracks.
|
||||
* @param {string} fakeScreenshareParticipantId - Fake Screenshare Participant ID.
|
||||
* @returns {(Track|undefined)}
|
||||
*/
|
||||
export function getFakeScreenshareParticipantTrack(tracks, fakeScreenshareParticipantId) {
|
||||
const participantId = getFakeScreenShareParticipantOwnerId(fakeScreenshareParticipantId);
|
||||
|
||||
return getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.SCREENSHARE, participantId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns track source name of specified media type for specified participant id.
|
||||
*
|
||||
|
||||
@@ -8,7 +8,7 @@ import { shouldShowModeratedNotification } from '../../av-moderation/functions';
|
||||
import { hideNotification, isModerationNotificationDisplayed } from '../../notifications';
|
||||
import { isPrejoinPageVisible } from '../../prejoin/functions';
|
||||
import { getCurrentConference } from '../conference/functions';
|
||||
import { getMultipleVideoSupportFeatureFlag } from '../config';
|
||||
import { getMultipleVideoSupportFeatureFlag, getSourceNameSignalingFeatureFlag } from '../config';
|
||||
import { getAvailableDevices } from '../devices/actions';
|
||||
import {
|
||||
CAMERA_FACING_MODE,
|
||||
@@ -24,9 +24,11 @@ import {
|
||||
setScreenshareMuted,
|
||||
SCREENSHARE_MUTISM_AUTHORITY
|
||||
} from '../media';
|
||||
import { participantLeft, participantJoined, getParticipantById } from '../participants';
|
||||
import { MiddlewareRegistry, StateListenerRegistry } from '../redux';
|
||||
|
||||
import {
|
||||
SCREENSHARE_TRACK_MUTED_UPDATED,
|
||||
TOGGLE_SCREENSHARING,
|
||||
TRACK_ADDED,
|
||||
TRACK_MUTE_UNMUTE_FAILED,
|
||||
@@ -50,6 +52,7 @@ import {
|
||||
isUserInteractionRequiredForUnmute,
|
||||
setTrackMuted
|
||||
} from './functions';
|
||||
import logger from './logger';
|
||||
|
||||
import './subscriber';
|
||||
|
||||
@@ -66,13 +69,32 @@ declare var APP: Object;
|
||||
MiddlewareRegistry.register(store => next => action => {
|
||||
switch (action.type) {
|
||||
case TRACK_ADDED: {
|
||||
const state = store.getState();
|
||||
const { jitsiTrack, local } = action.track;
|
||||
|
||||
// The devices list needs to be refreshed when no initial video permissions
|
||||
// were granted and a local video track is added by umuting the video.
|
||||
if (action.track.local) {
|
||||
if (local) {
|
||||
store.dispatch(getAvailableDevices());
|
||||
}
|
||||
|
||||
break;
|
||||
// Call next before the creation of a fake screenshare participant to ensure a video track is available when
|
||||
// the participant is auto pinned.
|
||||
const result = next(action);
|
||||
|
||||
// The TRACK_ADDED action is dispatched when a presenter starts a screenshare. Do not create a local fake
|
||||
// screenshare participant when multiple stream is not enabled.
|
||||
const skipCreateFakeScreenShareParticipant = local && !getMultipleVideoSupportFeatureFlag(state);
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state)
|
||||
&& jitsiTrack.getVideoType() === VIDEO_TYPE.DESKTOP
|
||||
&& !jitsiTrack.isMuted()
|
||||
&& !skipCreateFakeScreenShareParticipant
|
||||
) {
|
||||
createFakeScreenShareParticipant(store, action);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
case TRACK_NO_DATA_FROM_SOURCE: {
|
||||
const result = next(action);
|
||||
@@ -81,7 +103,40 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
case SCREENSHARE_TRACK_MUTED_UPDATED: {
|
||||
const state = store.getState();
|
||||
|
||||
if (!getSourceNameSignalingFeatureFlag(state)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { track, muted } = action;
|
||||
|
||||
if (muted) {
|
||||
const conference = getCurrentConference(state);
|
||||
const participantId = track?.jitsiTrack.getSourceName();
|
||||
|
||||
store.dispatch(participantLeft(participantId, conference));
|
||||
}
|
||||
|
||||
if (!muted) {
|
||||
createFakeScreenShareParticipant(store, action);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case TRACK_REMOVED: {
|
||||
const state = store.getState();
|
||||
|
||||
if (getSourceNameSignalingFeatureFlag(state) && action.track.jitsiTrack.videoType === VIDEO_TYPE.DESKTOP) {
|
||||
const conference = getCurrentConference(state);
|
||||
const participantId = action.track.jitsiTrack.getSourceName();
|
||||
|
||||
store.dispatch(participantLeft(participantId, conference));
|
||||
}
|
||||
|
||||
_removeNoDataFromSourceNotification(store, action.track);
|
||||
break;
|
||||
}
|
||||
@@ -326,6 +381,32 @@ function _handleNoDataFromSourceErrors(store, action) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a fake participant for screen share using the track's source name as the participant id.
|
||||
*
|
||||
* @param {Store} store - The redux store in which the specified action is dispatched.
|
||||
* @param {Action} action - The redux action dispatched in the specified store.
|
||||
* @private
|
||||
* @returns {void}
|
||||
*/
|
||||
function createFakeScreenShareParticipant({ dispatch, getState }, { track }) {
|
||||
const state = getState();
|
||||
const participantId = track.jitsiTrack?.getParticipantId?.();
|
||||
const participant = getParticipantById(state, participantId);
|
||||
|
||||
if (participant.name) {
|
||||
dispatch(participantJoined({
|
||||
conference: state['features/base/conference'].conference,
|
||||
id: track.jitsiTrack.getSourceName(),
|
||||
isFakeScreenShareParticipant: true,
|
||||
isLocalScreenShare: track?.jitsiTrack.isLocal(),
|
||||
name: `${participant.name}'s screen`
|
||||
}));
|
||||
} else {
|
||||
logger.error(`Failed to create a screenshare participant for participantId: ${participantId}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the local track associated with a specific {@code MEDIA_TYPE} in a
|
||||
* specific redux store.
|
||||
|
||||
@@ -219,6 +219,18 @@ class ChatInput extends Component<Props, State> {
|
||||
* @returns {void}
|
||||
*/
|
||||
_onDetectSubmit(event) {
|
||||
// Composition events used to add accents to characters
|
||||
// despite their absence from standard US keyboards,
|
||||
// to build up logograms of many Asian languages
|
||||
// from their base components or categories and so on.
|
||||
if (event.isComposing || event.keyCode === 229) {
|
||||
// keyCode 229 means that user pressed some button,
|
||||
// but input method is still processing that.
|
||||
// This is a standard behavior for some input methods
|
||||
// like entering japanese or сhinese hieroglyphs.
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.key === 'Enter'
|
||||
&& event.shiftKey === false
|
||||
&& event.ctrlKey === false) {
|
||||
|
||||
@@ -6,6 +6,7 @@ import { withSafeAreaInsets } from 'react-native-safe-area-context';
|
||||
|
||||
import { appNavigate } from '../../../app/actions';
|
||||
import { PIP_ENABLED, FULLSCREEN_ENABLED, getFeatureFlag } from '../../../base/flags';
|
||||
import { getParticipantCount } from '../../../base/participants';
|
||||
import { Container, LoadingIndicator, TintedView } from '../../../base/react';
|
||||
import { connect } from '../../../base/redux';
|
||||
import { ASPECT_RATIO_NARROW } from '../../../base/responsive-ui/constants';
|
||||
@@ -76,6 +77,11 @@ type Props = AbstractProps & {
|
||||
*/
|
||||
_fullscreenEnabled: boolean,
|
||||
|
||||
/**
|
||||
* The indicator which determines if the conference type is one to one.
|
||||
*/
|
||||
_isOneToOneConference: boolean,
|
||||
|
||||
/**
|
||||
* The indicator which determines if the participants pane is open.
|
||||
*/
|
||||
@@ -315,6 +321,7 @@ class Conference extends AbstractConference<Props, State> {
|
||||
_renderContent() {
|
||||
const {
|
||||
_connecting,
|
||||
_isOneToOneConference,
|
||||
_largeVideoParticipantId,
|
||||
_reducedUI,
|
||||
_shouldDisplayTileView,
|
||||
@@ -357,9 +364,15 @@ class Conference extends AbstractConference<Props, State> {
|
||||
|
||||
<Captions onPress = { this._onClick } />
|
||||
|
||||
{ _shouldDisplayTileView || <Container style = { styles.displayNameContainer }>
|
||||
<DisplayNameLabel participantId = { _largeVideoParticipantId } />
|
||||
</Container> }
|
||||
{
|
||||
_shouldDisplayTileView || (
|
||||
!_isOneToOneConference
|
||||
&& <Container style = { styles.displayNameContainer }>
|
||||
<DisplayNameLabel
|
||||
participantId = { _largeVideoParticipantId } />
|
||||
</Container>
|
||||
)
|
||||
}
|
||||
|
||||
<LonelyMeetingExperience />
|
||||
|
||||
@@ -492,6 +505,7 @@ function _mapStateToProps(state) {
|
||||
} = state['features/base/conference'];
|
||||
const { isOpen } = state['features/participants-pane'];
|
||||
const { aspectRatio, reducedUI } = state['features/base/responsive-ui'];
|
||||
const participantCount = getParticipantCount(state);
|
||||
|
||||
// XXX There is a window of time between the successful establishment of the
|
||||
// XMPP connection and the subsequent commencement of joining the MUC during
|
||||
@@ -512,6 +526,7 @@ function _mapStateToProps(state) {
|
||||
_connecting: Boolean(connecting_),
|
||||
_filmstripVisible: isFilmstripVisible(state),
|
||||
_fullscreenEnabled: getFeatureFlag(state, FULLSCREEN_ENABLED, true),
|
||||
_isOneToOneConference: Boolean(participantCount === 2),
|
||||
_isParticipantsPaneOpen: isOpen,
|
||||
_largeVideoParticipantId: state['features/large-video'].participantId,
|
||||
_pictureInPictureEnabled: getFeatureFlag(state, PIP_ENABLED),
|
||||
|
||||
@@ -11,7 +11,9 @@ import { MEDIA_TYPE } from '../../../base/media';
|
||||
import { getLocalParticipant, getParticipantById } from '../../../base/participants';
|
||||
import { Popover } from '../../../base/popover';
|
||||
import { connect } from '../../../base/redux';
|
||||
import { getTrackByMediaTypeAndParticipant } from '../../../base/tracks';
|
||||
import {
|
||||
getFakeScreenshareParticipantTrack,
|
||||
getTrackByMediaTypeAndParticipant } from '../../../base/tracks';
|
||||
import {
|
||||
isParticipantConnectionStatusInactive,
|
||||
isParticipantConnectionStatusInterrupted,
|
||||
@@ -366,12 +368,18 @@ class ConnectionIndicator extends AbstractConnectionIndicator<Props, State> {
|
||||
*/
|
||||
export function _mapStateToProps(state: Object, ownProps: Props) {
|
||||
const { participantId } = ownProps;
|
||||
const tracks = state['features/base/tracks'];
|
||||
const sourceNameSignalingEnabled = getSourceNameSignalingFeatureFlag(state);
|
||||
const firstVideoTrack = getTrackByMediaTypeAndParticipant(
|
||||
state['features/base/tracks'], MEDIA_TYPE.VIDEO, participantId);
|
||||
|
||||
const participant = participantId ? getParticipantById(state, participantId) : getLocalParticipant(state);
|
||||
|
||||
let firstVideoTrack;
|
||||
|
||||
if (sourceNameSignalingEnabled && participant?.isFakeScreenShareParticipant) {
|
||||
firstVideoTrack = getFakeScreenshareParticipantTrack(tracks, participantId);
|
||||
} else {
|
||||
firstVideoTrack = getTrackByMediaTypeAndParticipant(tracks, MEDIA_TYPE.VIDEO, participantId);
|
||||
}
|
||||
|
||||
const _isConnectionStatusInactive = sourceNameSignalingEnabled
|
||||
? isTrackStreamingStatusInactive(firstVideoTrack)
|
||||
: isParticipantConnectionStatusInactive(participant);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user