mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-05-20 12:57:52 +00:00
Compare commits
45 Commits
6617
...
saghul-pat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd48025d09 | ||
|
|
e52c9043a5 | ||
|
|
ee5817539b | ||
|
|
da9b5a9156 | ||
|
|
bb84c47e78 | ||
|
|
13f4da7855 | ||
|
|
f935b29629 | ||
|
|
f5f689c53d | ||
|
|
af4ba32803 | ||
|
|
9e11bc302b | ||
|
|
438b3924d7 | ||
|
|
a2d0492007 | ||
|
|
c35d1d8d4b | ||
|
|
7d7bf987a1 | ||
|
|
3e744c5ffe | ||
|
|
f4f8808d95 | ||
|
|
21bcbdc12f | ||
|
|
090433b6e8 | ||
|
|
230cbfac1e | ||
|
|
c56c5bd145 | ||
|
|
f5a4fd4bc2 | ||
|
|
cb881311e7 | ||
|
|
ac2698f829 | ||
|
|
5fafb5d29e | ||
|
|
fbcdb250f4 | ||
|
|
ba8529d72b | ||
|
|
1230cebde2 | ||
|
|
93406bb12c | ||
|
|
d43eea91cf | ||
|
|
7364c7f27b | ||
|
|
2de2500080 | ||
|
|
349e4bfb57 | ||
|
|
4f92811263 | ||
|
|
a4e35f81cf | ||
|
|
7aefc3b94a | ||
|
|
3c180d3932 | ||
|
|
c523c07cb7 | ||
|
|
5c77f61037 | ||
|
|
8162ae4dbe | ||
|
|
69e0a37529 | ||
|
|
bfa88f13dc | ||
|
|
0d917df1fb | ||
|
|
95a3a8de0b | ||
|
|
f4985d8028 | ||
|
|
5d6aec3f3c |
34
.github/workflows/ci.yml
vendored
34
.github/workflows/ci.yml
vendored
@@ -3,14 +3,15 @@ name: Simple CI
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
run-ci:
|
||||
name: Build Frontend
|
||||
lint:
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '16.x'
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
- run: npm install
|
||||
- name: Check git status
|
||||
run: git status
|
||||
@@ -20,6 +21,25 @@ jobs:
|
||||
run: $(exit $(git status --porcelain --untracked-files=no | head -255 | wc -l)) || (echo "Dirty git tree"; git diff; exit 1)
|
||||
- run: npm run lint
|
||||
- run: for file in lang/*.json; do npx --yes jsonlint -q $file || exit 1; done
|
||||
- env:
|
||||
NODE_OPTIONS: '--max-old-space-size=8192'
|
||||
run: make
|
||||
linux-build:
|
||||
name: Build Frontend (Linux)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
- run: npm install
|
||||
- run: make
|
||||
macos-ci:
|
||||
name: Build Frontend (macOS)
|
||||
runs-on: macOS-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
- run: npm install
|
||||
- run: make
|
||||
|
||||
26
Makefile
26
Makefile
@@ -5,6 +5,8 @@ LIBJITSIMEET_DIR = node_modules/lib-jitsi-meet
|
||||
OLM_DIR = node_modules/@matrix-org/olm
|
||||
TF_WASM_DIR = node_modules/@tensorflow/tfjs-backend-wasm/dist/
|
||||
RNNOISE_WASM_DIR = node_modules/@jitsi/rnnoise-wasm/dist
|
||||
EXCALIDRAW_DIR = node_modules/@jitsi/excalidraw/dist/excalidraw-assets
|
||||
EXCALIDRAW_DIR_DEV = node_modules/@jitsi/excalidraw/dist/excalidraw-assets-dev
|
||||
TFLITE_WASM = react/features/stream-effects/virtual-background/vendor/tflite
|
||||
MEET_MODELS_DIR = react/features/stream-effects/virtual-background/vendor/models
|
||||
FACE_MODELS_DIR = node_modules/@vladmandic/human-models/models
|
||||
@@ -14,19 +16,25 @@ OUTPUT_DIR = .
|
||||
STYLES_BUNDLE = css/all.bundle.css
|
||||
STYLES_DESTINATION = css/all.css
|
||||
STYLES_MAIN = css/main.scss
|
||||
WEBPACK = ./node_modules/.bin/webpack
|
||||
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development
|
||||
ifeq ($(OS),Windows_NT)
|
||||
WEBPACK = .\node_modules\.bin\webpack
|
||||
WEBPACK_DEV_SERVER = .\node_modules\.bin\webpack serve --mode development
|
||||
else
|
||||
WEBPACK = ./node_modules/.bin/webpack
|
||||
WEBPACK_DEV_SERVER = ./node_modules/.bin/webpack serve --mode development
|
||||
endif
|
||||
|
||||
all: compile deploy clean
|
||||
|
||||
compile:
|
||||
NODE_OPTIONS=--max-old-space-size=8192 \
|
||||
$(WEBPACK)
|
||||
|
||||
clean:
|
||||
rm -fr $(BUILD_DIR)
|
||||
|
||||
.NOTPARALLEL:
|
||||
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-face-landmarks
|
||||
deploy: deploy-init deploy-appbundle deploy-rnnoise-binary deploy-excalidraw deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-css deploy-local deploy-face-landmarks
|
||||
|
||||
deploy-init:
|
||||
rm -fr $(DEPLOY_DIR)
|
||||
@@ -86,6 +94,16 @@ deploy-tflite:
|
||||
$(TFLITE_WASM)/*.wasm \
|
||||
$(DEPLOY_DIR)
|
||||
|
||||
deploy-excalidraw:
|
||||
cp -R \
|
||||
$(EXCALIDRAW_DIR) \
|
||||
$(DEPLOY_DIR)/
|
||||
|
||||
deploy-excalidraw-dev:
|
||||
cp -R \
|
||||
$(EXCALIDRAW_DIR_DEV) \
|
||||
$(DEPLOY_DIR)/
|
||||
|
||||
deploy-meet-models:
|
||||
cp \
|
||||
$(MEET_MODELS_DIR)/*.tflite \
|
||||
@@ -108,7 +126,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-olm deploy-tf-wasm deploy-face-landmarks
|
||||
dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-models deploy-lib-jitsi-meet deploy-olm deploy-tf-wasm deploy-excalidraw-dev deploy-face-landmarks
|
||||
$(WEBPACK_DEV_SERVER)
|
||||
|
||||
source-package:
|
||||
|
||||
@@ -18,7 +18,6 @@ Amongst others here are the main features Jitsi Meet offers:
|
||||
* Web and native SDKs for integration
|
||||
* HD audio and video
|
||||
* Content sharing
|
||||
* End-to-End Encryption
|
||||
* Raise hand and reactions
|
||||
* Chat with private conversations
|
||||
* Polls
|
||||
|
||||
@@ -27,10 +27,6 @@ ext {
|
||||
if (System.properties['os.arch'] == "aarch64") {
|
||||
// For M1 Users we need to use the NDK 24 which added support for aarch64
|
||||
ndkVersion = "24.0.8215888"
|
||||
} else if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||
// For Android Users, we need to use NDK 23, otherwise the build will
|
||||
// fail due to paths longer than the OS limit
|
||||
ndkVersion = "23.1.7779620"
|
||||
} else {
|
||||
// Otherwise we default to the side-by-side NDK version from AGP.
|
||||
ndkVersion = "21.4.7075529"
|
||||
|
||||
@@ -144,7 +144,7 @@ import {
|
||||
isModerationNotificationDisplayed,
|
||||
showNotification
|
||||
} from './react/features/notifications';
|
||||
import { mediaPermissionPromptVisibilityChanged, toggleSlowGUMOverlay } from './react/features/overlay';
|
||||
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay';
|
||||
import { suspendDetected } from './react/features/power-monitor';
|
||||
import {
|
||||
initPrejoin,
|
||||
@@ -519,11 +519,6 @@ export default {
|
||||
);
|
||||
}
|
||||
|
||||
JitsiMeetJS.mediaDevices.addEventListener(
|
||||
JitsiMediaDevicesEvents.SLOW_GET_USER_MEDIA,
|
||||
() => APP.store.dispatch(toggleSlowGUMOverlay(true))
|
||||
);
|
||||
|
||||
let tryCreateLocalTracks;
|
||||
|
||||
// On Electron there is no permission prompt for granting permissions. That's why we don't need to
|
||||
@@ -533,8 +528,7 @@ export default {
|
||||
const audioOptions = {
|
||||
devices: [ MEDIA_TYPE.AUDIO ],
|
||||
timeout,
|
||||
firePermissionPromptIsShownEvent: true,
|
||||
fireSlowPromiseEvent: true
|
||||
firePermissionPromptIsShownEvent: true
|
||||
};
|
||||
|
||||
// FIXME is there any simpler way to rewrite this spaghetti below ?
|
||||
@@ -585,8 +579,7 @@ export default {
|
||||
tryCreateLocalTracks = createLocalTracksF({
|
||||
devices: initialDevices,
|
||||
timeout,
|
||||
firePermissionPromptIsShownEvent: true,
|
||||
fireSlowPromiseEvent: true
|
||||
firePermissionPromptIsShownEvent: true
|
||||
})
|
||||
.catch(err => {
|
||||
if (requestedAudio && requestedVideo) {
|
||||
@@ -629,8 +622,7 @@ export default {
|
||||
return requestedVideo
|
||||
? createLocalTracksF({
|
||||
devices: [ MEDIA_TYPE.VIDEO ],
|
||||
firePermissionPromptIsShownEvent: true,
|
||||
fireSlowPromiseEvent: true
|
||||
firePermissionPromptIsShownEvent: true
|
||||
})
|
||||
: [];
|
||||
})
|
||||
@@ -651,7 +643,6 @@ export default {
|
||||
// the user inputs their credentials, but the dialog would be
|
||||
// overshadowed by the overlay.
|
||||
tryCreateLocalTracks.then(tracks => {
|
||||
APP.store.dispatch(toggleSlowGUMOverlay(false));
|
||||
APP.store.dispatch(mediaPermissionPromptVisibilityChanged(false));
|
||||
|
||||
return tracks;
|
||||
|
||||
20
config.js
20
config.js
@@ -208,9 +208,12 @@ var config = {
|
||||
|
||||
// Specify audio quality stereo and opusMaxAverageBitrate values in order to enable HD audio.
|
||||
// Beware, by doing so, you are disabling echo cancellation, noise suppression and AGC.
|
||||
// Specify enableOpusDtx to enable support for opus-dtx where
|
||||
// audio packets won’t be transmitted while participant is silent or muted.
|
||||
// audioQuality: {
|
||||
// stereo: false,
|
||||
// opusMaxAverageBitrate: null, // Value to fit the 6000 to 510000 range.
|
||||
// enableOpusDtx: false,
|
||||
// },
|
||||
|
||||
// Video
|
||||
@@ -375,6 +378,14 @@ var config = {
|
||||
// // Whether the feature should be enabled or not.
|
||||
// enabled: false,
|
||||
|
||||
// // Translation languages.
|
||||
// // Available languages can be found in
|
||||
// // ./src/react/features/transcribing/translation-languages.json.
|
||||
// translationLanguages: ['en', 'es', 'fr', 'ro'],
|
||||
|
||||
// // Important languages to show on the top of the language list.
|
||||
// translationLanguagesHead: ['en'],
|
||||
|
||||
// // If true transcriber will use the application language.
|
||||
// // The application language is either explicitly set by participants in their settings or automatically
|
||||
// // detected based on the environment, e.g. if the app is opened in a chrome instance which
|
||||
@@ -1494,6 +1505,15 @@ var config = {
|
||||
|
||||
// Application logo url
|
||||
// defaultLogoUrl: 'images/watermark.svg',
|
||||
|
||||
// Settings for the Excalidraw whiteboard integration.
|
||||
// whiteboard: {
|
||||
// // Whether the feature is enabled or not.
|
||||
// enabled: true,
|
||||
// // The server used to support whiteboard collaboration.
|
||||
// // https://github.com/jitsi/excalidraw-backend
|
||||
// collabServerBaseUrl: 'https://excalidraw-backend.example.com',
|
||||
// },
|
||||
};
|
||||
|
||||
// Set the default values for JaaS customers
|
||||
|
||||
@@ -45,3 +45,7 @@
|
||||
margin: -16px -24px;
|
||||
z-index: $popoverZ;
|
||||
}
|
||||
|
||||
.excalidraw .popover {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* tiled thumbnail experience.
|
||||
*/
|
||||
.tile-view,
|
||||
.whiteboard-container,
|
||||
.stage-filmstrip {
|
||||
/**
|
||||
* Let the avatar grow with the tile.
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
color: #6FB1EA;
|
||||
}
|
||||
|
||||
& > :first-child:not(:last-child) {
|
||||
& > :not(:last-child) {
|
||||
margin-right: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
4
debian/control
vendored
4
debian/control
vendored
@@ -33,7 +33,7 @@ Description: Configuration for web serving of Jitsi Meet
|
||||
|
||||
Package: jitsi-meet-prosody
|
||||
Architecture: all
|
||||
Depends: openssl, prosody (>= 0.11.0) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec, lua-basexx, lua-luaossl, lua-cjson, lua-inspect
|
||||
Depends: openssl, prosody (>= 0.11.7) | prosody-trunk | prosody-0.12 | prosody-0.11, lua-sec, lua-basexx, lua-luaossl, lua-cjson, lua-inspect
|
||||
Replaces: jitsi-meet-tokens
|
||||
Description: Prosody configuration for Jitsi Meet
|
||||
Jitsi Meet is a WebRTC JavaScript application that uses Jitsi
|
||||
@@ -47,7 +47,7 @@ Description: Prosody configuration for Jitsi Meet
|
||||
|
||||
Package: jitsi-meet-tokens
|
||||
Architecture: all
|
||||
Depends: ${misc:Depends}, prosody-trunk | prosody-0.11 | prosody-0.12 | prosody (>= 0.11.2), jitsi-meet-prosody
|
||||
Depends: ${misc:Depends}, prosody-trunk | prosody-0.11 | prosody-0.12 | prosody (>= 0.11.7), jitsi-meet-prosody
|
||||
Description: Prosody token authentication plugin for Jitsi Meet
|
||||
|
||||
Package: jitsi-meet-turnserver
|
||||
|
||||
5
debian/jitsi-meet-prosody.postinst
vendored
5
debian/jitsi-meet-prosody.postinst
vendored
@@ -83,9 +83,11 @@ case "$1" in
|
||||
TURN_SECRET="$RET"
|
||||
fi
|
||||
|
||||
SELF_SIGNED_CHOICE="Generate a new self-signed certificate"
|
||||
# In the case of updating from an older version the configure of -prosody package may happen before the -config
|
||||
# one, so if JAAS_INPUT is empty (the question is not asked), let's ask it now.
|
||||
db_get jitsi-meet/cert-choice
|
||||
# If db_get returns an error (workaround for strange Debian failure) continue without stopping the config
|
||||
db_get jitsi-meet/cert-choice || CERT_CHOICE=$SELF_SIGNED_CHOICE
|
||||
CERT_CHOICE="$RET"
|
||||
if [ -z "$CERT_CHOICE" ] ; then
|
||||
db_input critical jitsi-meet/cert-choice || true
|
||||
@@ -93,7 +95,6 @@ case "$1" in
|
||||
db_get jitsi-meet/cert-choice
|
||||
CERT_CHOICE="$RET"
|
||||
fi
|
||||
SELF_SIGNED_CHOICE="Generate a new self-signed certificate"
|
||||
if [ "$CERT_CHOICE" != "$SELF_SIGNED_CHOICE" ]; then
|
||||
db_get jitsi-meet/jaas-choice
|
||||
JAAS_INPUT="$RET"
|
||||
|
||||
9
debian/jitsi-meet-web-config.postinst
vendored
9
debian/jitsi-meet-web-config.postinst
vendored
@@ -73,10 +73,15 @@ case "$1" in
|
||||
# if first time config ask for certs, or if we are reconfiguring
|
||||
if [ -z "$JVB_HOSTNAME_OLD" ] || [ "$RECONFIGURING" = "true" ] ; then
|
||||
RET=""
|
||||
db_input critical jitsi-meet/cert-choice || true
|
||||
db_go
|
||||
# ask the question only if there is nothing stored, option to pre-set it on install in automations
|
||||
db_get jitsi-meet/cert-choice
|
||||
CERT_CHOICE="$RET"
|
||||
if [ -z "$CERT_CHOICE" ] ; then
|
||||
db_input critical jitsi-meet/cert-choice || true
|
||||
db_go
|
||||
db_get jitsi-meet/cert-choice
|
||||
CERT_CHOICE="$RET"
|
||||
fi
|
||||
|
||||
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ]; then
|
||||
RET=""
|
||||
|
||||
2
globals.d.ts
vendored
2
globals.d.ts
vendored
@@ -14,5 +14,7 @@ declare global {
|
||||
|
||||
interface Window {
|
||||
config?: IConfig;
|
||||
JITSI_MEET_LITE_SDK?: boolean;
|
||||
interfaceConfig?: any;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
<link rel="manifest" id="manifest-placeholder">
|
||||
|
||||
<script>
|
||||
window.EXCALIDRAW_ASSET_PATH = 'libs/';
|
||||
// Dynamically generate the manifest location URL. It must be served from the document origin, and we may have
|
||||
// the base pointing to the CDN. This way we can generate a full URL which will bypass the base.
|
||||
document.querySelector('#manifest-placeholder').setAttribute('href', window.location.origin + '/manifest.json');
|
||||
|
||||
@@ -42,6 +42,7 @@ target 'JitsiMeetSDK' do
|
||||
|
||||
pod 'CocoaLumberjack', '3.7.2'
|
||||
pod 'ObjectiveDropboxOfficial', '6.2.3'
|
||||
pod 'JitsiWebRTC', '~> 106.0.0'
|
||||
end
|
||||
|
||||
target 'JitsiMeetSDKLite' do
|
||||
|
||||
441
ios/Podfile.lock
441
ios/Podfile.lock
@@ -13,14 +13,14 @@ PODS:
|
||||
- CocoaLumberjack/Core (= 3.7.2)
|
||||
- CocoaLumberjack/Core (3.7.2)
|
||||
- DoubleConversion (1.1.6)
|
||||
- FBLazyVector (0.68.1)
|
||||
- FBReactNativeSpec (0.68.1):
|
||||
- FBLazyVector (0.68.3)
|
||||
- FBReactNativeSpec (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.1)
|
||||
- RCTTypeSafety (= 0.68.1)
|
||||
- React-Core (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- RCTRequired (= 0.68.3)
|
||||
- RCTTypeSafety (= 0.68.3)
|
||||
- React-Core (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- Firebase/Analytics (8.15.0):
|
||||
- Firebase/Core
|
||||
- Firebase/Core (8.15.0):
|
||||
@@ -133,6 +133,7 @@ PODS:
|
||||
- AppAuth/Core (~> 1.4)
|
||||
- GTMSessionFetcher/Core (~> 1.5)
|
||||
- GTMSessionFetcher/Core (1.7.0)
|
||||
- JitsiWebRTC (106.0.0)
|
||||
- libwebp (1.2.1):
|
||||
- libwebp/demux (= 1.2.1)
|
||||
- libwebp/mux (= 1.2.1)
|
||||
@@ -162,201 +163,201 @@ PODS:
|
||||
- DoubleConversion
|
||||
- fmt (~> 6.2.1)
|
||||
- glog
|
||||
- RCTRequired (0.68.1)
|
||||
- RCTTypeSafety (0.68.1):
|
||||
- FBLazyVector (= 0.68.1)
|
||||
- RCTRequired (0.68.3)
|
||||
- RCTTypeSafety (0.68.3):
|
||||
- FBLazyVector (= 0.68.3)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.1)
|
||||
- React-Core (= 0.68.1)
|
||||
- React (0.68.1):
|
||||
- React-Core (= 0.68.1)
|
||||
- React-Core/DevSupport (= 0.68.1)
|
||||
- React-Core/RCTWebSocket (= 0.68.1)
|
||||
- React-RCTActionSheet (= 0.68.1)
|
||||
- React-RCTAnimation (= 0.68.1)
|
||||
- React-RCTBlob (= 0.68.1)
|
||||
- React-RCTImage (= 0.68.1)
|
||||
- React-RCTLinking (= 0.68.1)
|
||||
- React-RCTNetwork (= 0.68.1)
|
||||
- React-RCTSettings (= 0.68.1)
|
||||
- React-RCTText (= 0.68.1)
|
||||
- React-RCTVibration (= 0.68.1)
|
||||
- React-callinvoker (0.68.1)
|
||||
- React-Codegen (0.68.1):
|
||||
- FBReactNativeSpec (= 0.68.1)
|
||||
- RCTRequired (= 0.68.3)
|
||||
- React-Core (= 0.68.3)
|
||||
- React (0.68.3):
|
||||
- React-Core (= 0.68.3)
|
||||
- React-Core/DevSupport (= 0.68.3)
|
||||
- React-Core/RCTWebSocket (= 0.68.3)
|
||||
- React-RCTActionSheet (= 0.68.3)
|
||||
- React-RCTAnimation (= 0.68.3)
|
||||
- React-RCTBlob (= 0.68.3)
|
||||
- React-RCTImage (= 0.68.3)
|
||||
- React-RCTLinking (= 0.68.3)
|
||||
- React-RCTNetwork (= 0.68.3)
|
||||
- React-RCTSettings (= 0.68.3)
|
||||
- React-RCTText (= 0.68.3)
|
||||
- React-RCTVibration (= 0.68.3)
|
||||
- React-callinvoker (0.68.3)
|
||||
- React-Codegen (0.68.3):
|
||||
- FBReactNativeSpec (= 0.68.3)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.1)
|
||||
- RCTTypeSafety (= 0.68.1)
|
||||
- React-Core (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-Core (0.68.1):
|
||||
- RCTRequired (= 0.68.3)
|
||||
- RCTTypeSafety (= 0.68.3)
|
||||
- React-Core (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-Core (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-Core/Default (= 0.68.3)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/CoreModulesHeaders (0.68.1):
|
||||
- React-Core/CoreModulesHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/Default (0.68.1):
|
||||
- React-Core/Default (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/DevSupport (0.68.1):
|
||||
- React-Core/DevSupport (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.1)
|
||||
- React-Core/RCTWebSocket (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-jsinspector (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-Core/Default (= 0.68.3)
|
||||
- React-Core/RCTWebSocket (= 0.68.3)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-jsinspector (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTActionSheetHeaders (0.68.1):
|
||||
- React-Core/RCTActionSheetHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTAnimationHeaders (0.68.1):
|
||||
- React-Core/RCTAnimationHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTBlobHeaders (0.68.1):
|
||||
- React-Core/RCTBlobHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTImageHeaders (0.68.1):
|
||||
- React-Core/RCTImageHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTLinkingHeaders (0.68.1):
|
||||
- React-Core/RCTLinkingHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTNetworkHeaders (0.68.1):
|
||||
- React-Core/RCTNetworkHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTSettingsHeaders (0.68.1):
|
||||
- React-Core/RCTSettingsHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTTextHeaders (0.68.1):
|
||||
- React-Core/RCTTextHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTVibrationHeaders (0.68.1):
|
||||
- React-Core/RCTVibrationHeaders (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-Core/RCTWebSocket (0.68.1):
|
||||
- React-Core/RCTWebSocket (0.68.3):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsiexecutor (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-Core/Default (= 0.68.3)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsiexecutor (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- Yoga
|
||||
- React-CoreModules (0.68.1):
|
||||
- React-CoreModules (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.1)
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/CoreModulesHeaders (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-RCTImage (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-cxxreact (0.68.1):
|
||||
- RCTTypeSafety (= 0.68.3)
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/CoreModulesHeaders (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-RCTImage (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-cxxreact (0.68.3):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-jsinspector (= 0.68.1)
|
||||
- React-logger (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-runtimeexecutor (= 0.68.1)
|
||||
- React-jsi (0.68.1):
|
||||
- React-callinvoker (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-jsinspector (= 0.68.3)
|
||||
- React-logger (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- React-runtimeexecutor (= 0.68.3)
|
||||
- React-jsi (0.68.3):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsi/Default (= 0.68.1)
|
||||
- React-jsi/Default (0.68.1):
|
||||
- React-jsi/Default (= 0.68.3)
|
||||
- React-jsi/Default (0.68.3):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsiexecutor (0.68.1):
|
||||
- React-jsiexecutor (0.68.3):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-jsinspector (0.68.1)
|
||||
- React-logger (0.68.1):
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- React-jsinspector (0.68.3)
|
||||
- React-logger (0.68.3):
|
||||
- glog
|
||||
- react-native-background-timer (2.4.1):
|
||||
- React-Core
|
||||
@@ -384,75 +385,76 @@ PODS:
|
||||
- react-native-video/Video (6.0.0-alpha.1):
|
||||
- PromisesSwift
|
||||
- React-Core
|
||||
- react-native-webrtc (1.106.0):
|
||||
- react-native-webrtc (1.106.1):
|
||||
- JitsiWebRTC (~> 106.0.0)
|
||||
- React-Core
|
||||
- react-native-webview (11.15.1):
|
||||
- React-Core
|
||||
- React-perflogger (0.68.1)
|
||||
- React-RCTActionSheet (0.68.1):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.68.1)
|
||||
- React-RCTAnimation (0.68.1):
|
||||
- React-perflogger (0.68.3)
|
||||
- React-RCTActionSheet (0.68.3):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.68.3)
|
||||
- React-RCTAnimation (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.1)
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/RCTAnimationHeaders (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-RCTBlob (0.68.1):
|
||||
- RCTTypeSafety (= 0.68.3)
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/RCTAnimationHeaders (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-RCTBlob (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/RCTBlobHeaders (= 0.68.1)
|
||||
- React-Core/RCTWebSocket (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-RCTNetwork (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-RCTImage (0.68.1):
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/RCTBlobHeaders (= 0.68.3)
|
||||
- React-Core/RCTWebSocket (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-RCTNetwork (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-RCTImage (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.1)
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/RCTImageHeaders (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-RCTNetwork (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-RCTLinking (0.68.1):
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/RCTLinkingHeaders (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-RCTNetwork (0.68.1):
|
||||
- RCTTypeSafety (= 0.68.3)
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/RCTImageHeaders (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-RCTNetwork (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-RCTLinking (0.68.3):
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/RCTLinkingHeaders (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-RCTNetwork (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.1)
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/RCTNetworkHeaders (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-RCTSettings (0.68.1):
|
||||
- RCTTypeSafety (= 0.68.3)
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/RCTNetworkHeaders (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-RCTSettings (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.1)
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/RCTSettingsHeaders (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-RCTText (0.68.1):
|
||||
- React-Core/RCTTextHeaders (= 0.68.1)
|
||||
- React-RCTVibration (0.68.1):
|
||||
- RCTTypeSafety (= 0.68.3)
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/RCTSettingsHeaders (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-RCTText (0.68.3):
|
||||
- React-Core/RCTTextHeaders (= 0.68.3)
|
||||
- React-RCTVibration (0.68.3):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.68.1)
|
||||
- React-Core/RCTVibrationHeaders (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (= 0.68.1)
|
||||
- React-runtimeexecutor (0.68.1):
|
||||
- React-jsi (= 0.68.1)
|
||||
- ReactCommon/turbomodule/core (0.68.1):
|
||||
- React-Codegen (= 0.68.3)
|
||||
- React-Core/RCTVibrationHeaders (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (= 0.68.3)
|
||||
- React-runtimeexecutor (0.68.3):
|
||||
- React-jsi (= 0.68.3)
|
||||
- ReactCommon/turbomodule/core (0.68.3):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.68.1)
|
||||
- React-Core (= 0.68.1)
|
||||
- React-cxxreact (= 0.68.1)
|
||||
- React-jsi (= 0.68.1)
|
||||
- React-logger (= 0.68.1)
|
||||
- React-perflogger (= 0.68.1)
|
||||
- React-callinvoker (= 0.68.3)
|
||||
- React-Core (= 0.68.3)
|
||||
- React-cxxreact (= 0.68.3)
|
||||
- React-jsi (= 0.68.3)
|
||||
- React-logger (= 0.68.3)
|
||||
- React-perflogger (= 0.68.3)
|
||||
- RNCalendarEvents (2.2.0):
|
||||
- React
|
||||
- RNCAsyncStorage (1.15.14):
|
||||
@@ -496,6 +498,7 @@ DEPENDENCIES:
|
||||
- Firebase/DynamicLinks (~> 8.0)
|
||||
- "giphy-react-native-sdk (from `../node_modules/@giphy/react-native-sdk`)"
|
||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||
- JitsiWebRTC (~> 106.0.0)
|
||||
- ObjectiveDropboxOfficial (= 6.2.3)
|
||||
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
||||
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
|
||||
@@ -571,6 +574,7 @@ SPEC REPOS:
|
||||
- GoogleUtilities
|
||||
- GTMAppAuth
|
||||
- GTMSessionFetcher
|
||||
- JitsiWebRTC
|
||||
- libwebp
|
||||
- nanopb
|
||||
- ObjectiveDropboxOfficial
|
||||
@@ -702,8 +706,8 @@ SPEC CHECKSUMS:
|
||||
boost: a7c83b31436843459a1961bfd74b96033dc77234
|
||||
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
|
||||
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
|
||||
FBLazyVector: 2c76493a346ef8cacf1f442926a39f805fffec1f
|
||||
FBReactNativeSpec: 371350f24afa87b6aba606972ec959dcd4a95c9a
|
||||
FBLazyVector: 34f7420274737b6fcf2e2d9fd42641e66b4436a3
|
||||
FBReactNativeSpec: 68c23fb2cea9393190e0815b673d742fa33d2dab
|
||||
Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d
|
||||
FirebaseAnalytics: 7761cbadb00a717d8d0939363eb46041526474fa
|
||||
FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1
|
||||
@@ -721,24 +725,25 @@ SPEC CHECKSUMS:
|
||||
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
|
||||
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
|
||||
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
|
||||
JitsiWebRTC: f441eb0e2d67f0588bf24e21c5162e97342714fb
|
||||
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
|
||||
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
|
||||
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
|
||||
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
|
||||
PromisesSwift: 99fddfe4a0ec88a56486644c0da106694c92a604
|
||||
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
|
||||
RCTRequired: 00581111c53531e39e3c6346ef0d2c0cf52a5a37
|
||||
RCTTypeSafety: 07e03ee7800e7dd65cba8e52ad0c2edb06c96604
|
||||
React: e61f4bf3c573d0c61c56b53dc3eb1d9daf0768a0
|
||||
React-callinvoker: 047d47230bb6fd66827f8cb0bea4e944ffd1309b
|
||||
React-Codegen: bb0403cde7374af091530e84e492589485aab480
|
||||
React-Core: a4a3a8e10d004b08e013c3d0438259dd89a3894c
|
||||
React-CoreModules: bb9f8bc36f1ae6d780b856927fa9d4aa01ccccc0
|
||||
React-cxxreact: 7dd472aefb8629d6080cbb859240bafccd902704
|
||||
React-jsi: b25808afe821b607d51c779bdd1717be8393b7ec
|
||||
React-jsiexecutor: 4a4bae5671b064a2248a690cf75957669489d08c
|
||||
React-jsinspector: 218a2503198ff28a085f8e16622a8d8f507c8019
|
||||
React-logger: f79dd3cc0f9b44f5611c6c7862badd891a862cf8
|
||||
RCTRequired: b8caca023d386d43740dfb94c2cf68f695fa5e77
|
||||
RCTTypeSafety: ec44ea1d6ad1e5cd6447b22159ff40c2ebbd23b1
|
||||
React: 9f8c8afb9a9d61b7a1b01a1c6fb7f0d4f902988f
|
||||
React-callinvoker: f813eee352cfd333208e8d67a72f584f5435769d
|
||||
React-Codegen: 771562186fec8c7830897f97ca59de683abd3184
|
||||
React-Core: 74670b4b715083e1c9003462f3f4fe32a70ba5c5
|
||||
React-CoreModules: 34bd5b93e5322e60102a5ad78b992c882e558022
|
||||
React-cxxreact: adc9fc6a9333ae779bd72effaf77173bd9f22bf7
|
||||
React-jsi: ab91137ea7d92a86e48b6f15d3a5580bea471776
|
||||
React-jsiexecutor: a5043e9e1e1bd13b80b58b228c6901b3721a4f54
|
||||
React-jsinspector: 86e89b9f135787a2e8eb74b3fc00ec61e9a80ae1
|
||||
React-logger: f790bd10f86b38012e108fb4b564023602702270
|
||||
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
|
||||
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
|
||||
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
|
||||
@@ -750,20 +755,20 @@ SPEC CHECKSUMS:
|
||||
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
|
||||
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
|
||||
react-native-video: bb6f12a7198db53b261fefb5d609dc77417acc8b
|
||||
react-native-webrtc: ae0a19dd7de9889f7596989f33db67c58632323c
|
||||
react-native-webrtc: 4a4c31be61f88d1d3356526eebce72f462a6760e
|
||||
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
|
||||
React-perflogger: 30ab8d6db10e175626069e742eead3ebe8f24fd5
|
||||
React-RCTActionSheet: 4b45da334a175b24dabe75f856b98fed3dfd6201
|
||||
React-RCTAnimation: d6237386cb04500889877845b3e9e9291146bc2e
|
||||
React-RCTBlob: bc9e2cd738c43bd2948e862e371402ef9584730a
|
||||
React-RCTImage: 9f8cac465c6e5837007f59ade2a0a741016dd6a3
|
||||
React-RCTLinking: 5073abb7d30cc0824b2172bd4582fc15bfc40510
|
||||
React-RCTNetwork: 28ff94aa7d8fc117fc800b87dd80869a00d2bef3
|
||||
React-RCTSettings: f27aa036f7270fe6ca43f8cdd1819e821fa429a0
|
||||
React-RCTText: 7cb6f86fa7bc86f22f16333ad243b158e63b2a68
|
||||
React-RCTVibration: 9e344c840176b0af9c84d5019eb4fed8b3c105a1
|
||||
React-runtimeexecutor: 7285b499d0339104b2813a1f58ad1ada4adbd6c0
|
||||
ReactCommon: bf2888a826ceedf54b99ad1b6182d1bc4a8a3984
|
||||
React-perflogger: fa15d1d29ff7557ee25ea48f7f59e65896fb3215
|
||||
React-RCTActionSheet: e83515333352a3cc19c146e3c7a63a8a9269da8f
|
||||
React-RCTAnimation: 8032daa2846e3db7ac28c4c5a207d0bfb5e1e3ad
|
||||
React-RCTBlob: fe40e206cebcb4f552e0ecdac3ef81b3baf3cb37
|
||||
React-RCTImage: dfc0df14cbfec1ec54fdd4700b8fe3bf8127dde2
|
||||
React-RCTLinking: ac9f65f0c8db738a6156ae7640ba92494b4770a5
|
||||
React-RCTNetwork: cf289a0386a1bd057e5eabb8563dfe5ce0af868c
|
||||
React-RCTSettings: 7889cfcf6c7d5738f3cb8889557a38eeea2f04ff
|
||||
React-RCTText: fd249e1f8406fb6e35cc77a2b9ff66a3477bf41a
|
||||
React-RCTVibration: f41f116aad644973f24653effb3db3de64fa0314
|
||||
React-runtimeexecutor: 8cdd80915ed6dabf2221a689f1f7ddb50ea5e9f3
|
||||
ReactCommon: 5b1b43a7d81a1ac4eec85f7c4db3283a14a3b13d
|
||||
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
|
||||
RNCAsyncStorage: ea6b5c280997b2b32a587793163b1f10e580c4f7
|
||||
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
|
||||
@@ -776,8 +781,8 @@ SPEC CHECKSUMS:
|
||||
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
|
||||
RNSVG: f3b60aeeaa81960e2e0536c3a9eef50b667ef3a9
|
||||
RNWatch: dae6c858a2051dbdcfb00b9a86cf4d90400263b4
|
||||
Yoga: 17cd9a50243093b547c1e539c749928dd68152da
|
||||
Yoga: 2f6a78c58dcc2963bd8e34d96a4246d9dff2e3a7
|
||||
|
||||
PODFILE CHECKSUM: 55f1a79792dd5f74b7510fc84068abcb79ddd518
|
||||
PODFILE CHECKSUM: e671cdcdb80fab67e305861c36bfae8ed5a5b0ef
|
||||
|
||||
COCOAPODS: 1.11.3
|
||||
|
||||
@@ -31,11 +31,11 @@
|
||||
4EB0603C260E09D000F524C5 /* SocketConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB06039260E09D000F524C5 /* SocketConnection.swift */; };
|
||||
4EB0603D260E09D000F524C5 /* DarwinNotificationCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0603A260E09D000F524C5 /* DarwinNotificationCenter.swift */; };
|
||||
4EB0603E260E09D000F524C5 /* SampleUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB0603B260E09D000F524C5 /* SampleUploader.swift */; };
|
||||
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; };
|
||||
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DE050388256E904600DEE3A5 /* WebRTC.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
DE4C456121DE1E4E00EA0709 /* FIRUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = DE4C455F21DE1E4E00EA0709 /* FIRUtilities.m */; };
|
||||
DEA9F289258A6EA800D4CD74 /* JitsiMeetSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */; };
|
||||
DEA9F28A258A6EA800D4CD74 /* JitsiMeetSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
DED016F128ECBC9D009D5E8D /* WebRTC.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = DED016F028ECBC9D009D5E8D /* WebRTC.xcframework */; };
|
||||
DED016F228ECBC9D009D5E8D /* WebRTC.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DED016F028ECBC9D009D5E8D /* WebRTC.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
E588011722789D43008B0561 /* JitsiMeetContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E58801132278944E008B0561 /* JitsiMeetContext.swift */; };
|
||||
E5C97B63227A1EB400199214 /* JitsiMeetCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */; };
|
||||
FD572B9827EDF32300A800FB /* GiphyUISDK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */; };
|
||||
@@ -75,7 +75,7 @@
|
||||
files = (
|
||||
DEA9F28A258A6EA800D4CD74 /* JitsiMeetSDK.framework in Embed Frameworks */,
|
||||
FD572B9927EDF32300A800FB /* GiphyUISDK.xcframework in Embed Frameworks */,
|
||||
DE05038A256E904600DEE3A5 /* WebRTC.xcframework in Embed Frameworks */,
|
||||
DED016F228ECBC9D009D5E8D /* WebRTC.xcframework in Embed Frameworks */,
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -158,6 +158,7 @@
|
||||
DE4C455F21DE1E4E00EA0709 /* FIRUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FIRUtilities.m; sourceTree = "<group>"; };
|
||||
DE4C456021DE1E4E00EA0709 /* FIRUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FIRUtilities.h; sourceTree = "<group>"; };
|
||||
DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = JitsiMeetSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DED016F028ECBC9D009D5E8D /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = ../Pods/JitsiWebRTC/WebRTC.xcframework; sourceTree = "<group>"; };
|
||||
DEFDBBDB25656E3B00344B23 /* WebRTC.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WebRTC.xcframework; path = "../../node_modules/react-native-webrtc/ios/WebRTC.xcframework"; sourceTree = "<group>"; };
|
||||
E58801132278944E008B0561 /* JitsiMeetContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetContext.swift; sourceTree = "<group>"; };
|
||||
E5C97B62227A1EB400199214 /* JitsiMeetCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JitsiMeetCommands.swift; sourceTree = "<group>"; };
|
||||
@@ -176,7 +177,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DE050389256E904600DEE3A5 /* WebRTC.xcframework in Frameworks */,
|
||||
DED016F128ECBC9D009D5E8D /* WebRTC.xcframework in Frameworks */,
|
||||
DEA9F289258A6EA800D4CD74 /* JitsiMeetSDK.framework in Frameworks */,
|
||||
FD572B9827EDF32300A800FB /* GiphyUISDK.xcframework in Frameworks */,
|
||||
2681BB562C7A0B42CFBA6719 /* libPods-JitsiMeet.a in Frameworks */,
|
||||
@@ -204,6 +205,7 @@
|
||||
0B26BE711EC5BC4D00EEFB41 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DED016F028ECBC9D009D5E8D /* WebRTC.xcframework */,
|
||||
FD572B9727EDF32300A800FB /* GiphyUISDK.xcframework */,
|
||||
DEA9F288258A6EA800D4CD74 /* JitsiMeetSDK.framework */,
|
||||
DE050388256E904600DEE3A5 /* WebRTC.xcframework */,
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
for (id listener in self.listeners) {
|
||||
[listener performStartCallWithUUID:action.callUUID isVideo:action.isVideo];
|
||||
}
|
||||
[action fulfill];
|
||||
}
|
||||
|
||||
- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession {
|
||||
|
||||
@@ -967,7 +967,6 @@
|
||||
"playSounds": "تشغيل الصوت عند:",
|
||||
"reactions": "ردود فعل المُلتقى",
|
||||
"sameAsSystem": "مثل النظام ({{label}})",
|
||||
"screenTitle": "إعدادات",
|
||||
"selectAudioOutput": "خرج الصوت",
|
||||
"selectCamera": "الكاميرا",
|
||||
"selectMic": "المايكروفون",
|
||||
@@ -1353,6 +1352,7 @@
|
||||
"roomname": "أدخل اسم الغرفة",
|
||||
"roomnameHint": "أدخل اسم أو رابط الغرفة التي تريد الانضمام إليها. يمكنك إنشاء اسم جديد لترسله إلى من تريد أن تجتمع معهم.",
|
||||
"sendFeedback": "أبدِ رأيك",
|
||||
"settings": "إعدادات",
|
||||
"startMeeting": "إبدأ المُلتقى",
|
||||
"terms": "الشروط",
|
||||
"title": "منصة عقد مؤتمرات ومُلتقيات آمنة وكاملة المزايا ومجانية بالمطلق"
|
||||
|
||||
@@ -477,9 +477,11 @@
|
||||
"noRoom": "Keine Konferenz für die Einwahlinformationen angegeben.",
|
||||
"numbers": "Einwahlnummern",
|
||||
"password": "$t(lockRoomPasswordUppercase):",
|
||||
"reachedLimit": "Sie haben die Grenzen Ihres Tarifs erreicht.",
|
||||
"sip": "SIP-Adresse",
|
||||
"title": "Teilen",
|
||||
"tooltip": "Freigabe-Link und Einwahlinformationen für dieses Meeting"
|
||||
"tooltip": "Freigabe-Link und Einwahlinformationen für dieses Meeting",
|
||||
"upgradeOptions": "Bitte prüfen Sie Ihre Upgrade-Optionen auf"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "Es ist ein Fehler aufgetreten.",
|
||||
@@ -938,6 +940,7 @@
|
||||
"insecureRoomNameWarning": "Der Raumname ist unsicher. Unerwünschte Teilnehmer könnten Ihrer Konferenz beitreten"
|
||||
},
|
||||
"settings": {
|
||||
"buttonLabel": "Einstellungen",
|
||||
"calendar": {
|
||||
"about": "Die Kalenderintegration von {{appName}} wird verwendet, um ein sicheres Zugreifen auf Ihren Kalender und Auslesen der bevorstehenden Termine zu ermöglichen.",
|
||||
"disconnect": "Getrennt",
|
||||
@@ -966,7 +969,6 @@
|
||||
"playSounds": "Hinweistöne aktiviert",
|
||||
"reactions": "Interaktionen",
|
||||
"sameAsSystem": "Wie System ({{label}})",
|
||||
"screenTitle": "Einstellungen",
|
||||
"selectAudioOutput": "Audioausgabe",
|
||||
"selectCamera": "Kamera",
|
||||
"selectMic": "Mikrofon",
|
||||
@@ -1352,6 +1354,7 @@
|
||||
"roomname": "Konferenzname eingeben",
|
||||
"roomnameHint": "Name oder URL der Konferenz, der Sie beitreten möchten. Sie können einen Namen erfinden, er muss nur den anderen Personen übermittelt werden, damit diese der gleichen Konferenz beitreten.",
|
||||
"sendFeedback": "Feedback senden",
|
||||
"settings": "Einstellungen",
|
||||
"startMeeting": "Meeting starten",
|
||||
"terms": "AGB",
|
||||
"title": "Sichere, voll funktionale und komplett kostenlose Videokonferenzen"
|
||||
|
||||
@@ -965,7 +965,6 @@
|
||||
"playSounds": "Sviranje zvuka uključeno",
|
||||
"reactions": "Reakcije sastanka",
|
||||
"sameAsSystem": "Isto kao sustav ({{label}})",
|
||||
"screenTitle": "Postavke",
|
||||
"selectAudioOutput": "Audio razultat",
|
||||
"selectCamera": "Kamera",
|
||||
"selectMic": "Mikrofon",
|
||||
@@ -1340,6 +1339,7 @@
|
||||
"roomname": "Upiši ime sobe",
|
||||
"roomnameHint": "Upiši ime ili URL sobe kojoj se želiš pridružiti. Možeš izmisliti ime, ali obavijesti ljude s kojima se sastaješ da upišu isto ime.",
|
||||
"sendFeedback": "Pošalji povratnu informaciju",
|
||||
"settings": "Postavke",
|
||||
"startMeeting": "Započni sastanak",
|
||||
"terms": "Uvjeti",
|
||||
"title": "Sigurno, funkcionalno i potpuno slobodno održavanje videokonferencija"
|
||||
|
||||
@@ -963,7 +963,6 @@
|
||||
"playSounds": "Włącz dźwięki",
|
||||
"reactions": "Reakcje",
|
||||
"sameAsSystem": "Jak system ({{label}})",
|
||||
"screenTitle": "Ustawienia",
|
||||
"selectAudioOutput": "Wyjście audio",
|
||||
"selectCamera": "Kamera",
|
||||
"selectMic": "Mikrofon",
|
||||
@@ -1343,6 +1342,7 @@
|
||||
"roomname": "Podaj nazwę sali konferencyjnej",
|
||||
"roomnameHint": "Wprowadź nazwę lub adres URL pokoju, do którego chcesz dołączyć. Możesz wymyślić nazwę, po prostu pozwól, aby osoby, z którymi się spotykasz, znały ją tak, aby wpisały tę samą nazwę.",
|
||||
"sendFeedback": "Wyślij opinię",
|
||||
"settings": "Ustawienia",
|
||||
"startMeeting": "Rozpocznij spotkanie",
|
||||
"terms": "Warunki korzystania",
|
||||
"title": "Bezpieczna, w pełni funkcjonalna i całkowicie bezpłatna wideokonferencja"
|
||||
|
||||
@@ -967,7 +967,6 @@
|
||||
"playSounds": "Reproduzir som quando",
|
||||
"reactions": "Há uma reação na reunião",
|
||||
"sameAsSystem": "O mesmo que o sistema ({{label}})",
|
||||
"screenTitle": "Definições",
|
||||
"selectAudioOutput": "Saída de áudio",
|
||||
"selectCamera": "Câmara",
|
||||
"selectMic": "Microfone",
|
||||
@@ -1353,6 +1352,7 @@
|
||||
"roomname": "Digite o nome da sala",
|
||||
"roomnameHint": "Digite o nome ou URL da sala a que pretende entrar. Pode inventar um nome, basta informar as pessoas com quem se vai encontrar para que entrem com o mesmo nome.",
|
||||
"sendFeedback": "Enviar comentários",
|
||||
"settings": "Definições",
|
||||
"startMeeting": "Iniciar reunião",
|
||||
"terms": "Termos",
|
||||
"title": "Videoconferências mais seguras, flexíveis e totalmente gratuitas"
|
||||
|
||||
@@ -967,7 +967,6 @@
|
||||
"playSounds": "Увімкнути звукові сповіщення:",
|
||||
"reactions": "Емоційна реакція",
|
||||
"sameAsSystem": "Системний пристрій ({{label}})",
|
||||
"screenTitle": "Налаштування",
|
||||
"selectAudioOutput": "Вивід звуку",
|
||||
"selectCamera": "Камера",
|
||||
"selectMic": "Мікрофон",
|
||||
@@ -1353,6 +1352,7 @@
|
||||
"roomname": "Зазначте назву кімнати",
|
||||
"roomnameHint": "Зазначте назву кімнати або URL-адресу зустрічі, до якої ви хочете приєднатися. Ви можете придумати будь-яку назву. Повідомте її іншим учасникам, щоб вони приєднувалися до цієї кімнати.",
|
||||
"sendFeedback": "Надіслати відгук",
|
||||
"settings": "Налаштування",
|
||||
"startMeeting": "Почати зустріч",
|
||||
"terms": "Умови користування",
|
||||
"title": "Захищена, повнофункціональна та безкоштовна система відеоконференцій"
|
||||
|
||||
@@ -441,7 +441,7 @@
|
||||
"answer": "接听",
|
||||
"audioCallTitle": "来电",
|
||||
"decline": "拒听",
|
||||
"productLabel": "来自Jitsi Meet",
|
||||
"productLabel": "来自 Jitsi Meet",
|
||||
"videoCallTitle": "视频通话"
|
||||
},
|
||||
"info": {
|
||||
@@ -477,9 +477,11 @@
|
||||
"noRoom": "没有指定要呼入的会议室。",
|
||||
"numbers": "拨入号码",
|
||||
"password": "$t(lockRoomPasswordUppercase):",
|
||||
"reachedLimit": "你已达到你的计划上限",
|
||||
"sip": "SIP地址",
|
||||
"title": "分享",
|
||||
"tooltip": "共享此会议的链接和拨号信息"
|
||||
"tooltip": "共享此会议的链接和拨号信息",
|
||||
"upgradeOptions": "请查看升级选项于"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "我们似乎出了点小问题。",
|
||||
@@ -967,7 +969,6 @@
|
||||
"playSounds": "播放提示音",
|
||||
"reactions": "会议反应",
|
||||
"sameAsSystem": "系统默认({{label}})",
|
||||
"screenTitle": "设置",
|
||||
"selectAudioOutput": "音频输出",
|
||||
"selectCamera": "摄像头",
|
||||
"selectMic": "麦克风",
|
||||
@@ -1114,7 +1115,8 @@
|
||||
"toggleFilmstrip": "开启/关闭幻灯片",
|
||||
"undock": "取消停靠到单独的窗口",
|
||||
"videoblur": "开启/关闭视频模糊",
|
||||
"videomute": "启动/停止摄像头"
|
||||
"videomute": "启动/停止摄像头",
|
||||
"whiteboard": "显示/隐藏白板"
|
||||
},
|
||||
"addPeople": "添加人员到你的通话中",
|
||||
"audioOnlyOff": "禁用省流模式",
|
||||
@@ -1145,6 +1147,7 @@
|
||||
"giphy": "关闭GIPHY菜单",
|
||||
"hangup": "离开会议",
|
||||
"help": "帮助",
|
||||
"hideWhiteboard": "隐藏白板",
|
||||
"invite": "邀请其他人",
|
||||
"joinBreakoutRoom": "加入分组讨论室",
|
||||
"laugh": "大笑",
|
||||
@@ -1190,6 +1193,7 @@
|
||||
"shareaudio": "分享音频",
|
||||
"sharedvideo": "分享视频",
|
||||
"shortcuts": "查看快捷键",
|
||||
"showWhiteboard": "显示白板",
|
||||
"silence": "沉默",
|
||||
"speakerStats": "发言统计",
|
||||
"startScreenSharing": "开启共享屏幕",
|
||||
@@ -1353,6 +1357,7 @@
|
||||
"roomname": "请输入会议室名称",
|
||||
"roomnameHint": "输入你想加入的会议室的名称或网址,你也可以使用不同的名称创建会议室,其他人只需输入相同的名称即可加入。",
|
||||
"sendFeedback": "发送反馈",
|
||||
"settings": "设置",
|
||||
"startMeeting": "开始会议",
|
||||
"terms": "条款",
|
||||
"title": "安全、功能完善、完全免费的视频会议"
|
||||
|
||||
@@ -63,8 +63,8 @@
|
||||
"confirmAddLink": "您要為此活動加入 Jitsi 連結嗎?",
|
||||
"error": {
|
||||
"appConfiguration": "行事曆整合尚未正確設定。",
|
||||
"generic": "發生錯誤。請檢查行事曆設定,或是重新整理行事曆。",
|
||||
"notSignedIn": "查看行事曆事件進行認證時發生錯誤。請檢查您的行事曆設定,並再次登入。"
|
||||
"generic": "發生錯誤,請檢查行事曆設定,或是重新整理行事曆。",
|
||||
"notSignedIn": "查看行事曆事件進行認證時發生錯誤,請檢查您的行事曆設定,並再次登入。"
|
||||
},
|
||||
"join": "參加",
|
||||
"joinTooltip": "參加會議",
|
||||
@@ -332,7 +332,7 @@
|
||||
"permissionCameraRequiredError": "參與視訊會議需要存取網路攝影機,請在設定中啟用權限",
|
||||
"permissionErrorTitle": "需要權限",
|
||||
"permissionMicRequiredError": "參與音訊會議需要存取麥克風,請在設定中啟用權限",
|
||||
"popupError": "您的瀏覽器在此網站上阻擋彈出視窗。請在瀏覽器的安全設定中啟用並再試一次。",
|
||||
"popupError": "您的瀏覽器在此網站上阻擋彈出視窗,請在瀏覽器的安全設定中啟用並再試一次。",
|
||||
"popupErrorTitle": "彈出視窗遭到阻擋",
|
||||
"readMore": "更多",
|
||||
"recentlyUsedObjects": "您近期使用過的物件",
|
||||
@@ -477,9 +477,11 @@
|
||||
"noRoom": "沒有會議室指定要撥入。",
|
||||
"numbers": "撥入號碼",
|
||||
"password": "$t(lockRoomPasswordUppercase):",
|
||||
"reachedLimit": "您已達到您的方案上限",
|
||||
"sip": "SIP位址",
|
||||
"title": "分享",
|
||||
"tooltip": "顯示此會議的連結及電話撥入號碼"
|
||||
"tooltip": "顯示此會議的連結及電話撥入號碼",
|
||||
"upgradeOptions": "請查看升級選項於"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "好像有點卡卡不順。",
|
||||
@@ -876,7 +878,7 @@
|
||||
},
|
||||
"recording": {
|
||||
"authDropboxText": "上傳至 Dropbox",
|
||||
"availableSpace": "可用空間:{{spaceLeft}}MB(錄製時間大約{{duration}}分鐘)",
|
||||
"availableSpace": "可用空間:{{spaceLeft}}MB(錄製時間大約{{duration}}分鐘)",
|
||||
"beta": "BETA",
|
||||
"busy": "我們正在釋放錄製資源,請過幾分鐘後再試。",
|
||||
"busyTitle": "全部錄製目前忙碌",
|
||||
@@ -967,7 +969,6 @@
|
||||
"playSounds": "播放音效",
|
||||
"reactions": "會議反應",
|
||||
"sameAsSystem": "系統預設({{label}})",
|
||||
"screenTitle": "設定",
|
||||
"selectAudioOutput": "音訊輸出",
|
||||
"selectCamera": "網路攝影機",
|
||||
"selectMic": "麥克風",
|
||||
@@ -1114,7 +1115,8 @@
|
||||
"toggleFilmstrip": "啟用/停用簡報",
|
||||
"undock": "取消停靠到單獨的视窗",
|
||||
"videoblur": "啟用/停用畫面模糊",
|
||||
"videomute": "啟用/停用網路攝影機"
|
||||
"videomute": "啟用/停用網路攝影機",
|
||||
"whiteboard": "啟用/停用白板"
|
||||
},
|
||||
"addPeople": "新增人員到您的通話中",
|
||||
"audioOnlyOff": "停用低頻寬模式",
|
||||
@@ -1145,6 +1147,7 @@
|
||||
"giphy": "啟用/停用GIPHY選單",
|
||||
"hangup": "離開會議",
|
||||
"help": "協助",
|
||||
"hideWhiteboard": "停用白板",
|
||||
"invite": "邀請他人",
|
||||
"joinBreakoutRoom": "加入分組討論室",
|
||||
"laugh": "大笑",
|
||||
@@ -1190,6 +1193,7 @@
|
||||
"shareaudio": "分享音訊",
|
||||
"sharedvideo": "分享影片",
|
||||
"shortcuts": "查看快捷鍵",
|
||||
"showWhiteboard": "啟用白板",
|
||||
"silence": "沉默",
|
||||
"speakerStats": "發言統計",
|
||||
"startScreenSharing": "啟動畫面分享",
|
||||
@@ -1245,7 +1249,7 @@
|
||||
"videoStatus": {
|
||||
"adjustFor": "調整:",
|
||||
"audioOnly": "僅聲音",
|
||||
"audioOnlyExpanded": "您目前處於低頻寬模式。在此模式下您僅會收到語音及畫面分享。",
|
||||
"audioOnlyExpanded": "您目前處於低頻寬模式,在此模式下您僅會收到語音及畫面分享。",
|
||||
"bestPerformance": "最佳效能",
|
||||
"callQuality": "影像品質",
|
||||
"hd": "HD",
|
||||
@@ -1293,9 +1297,9 @@
|
||||
"desktopShare": "桌面畫面分享",
|
||||
"desktopShareError": "無法建立桌面畫面分享",
|
||||
"image1": "海灘",
|
||||
"image2": "牆壁(白)",
|
||||
"image3": "空房間(白)",
|
||||
"image4": "落地燈(黑)",
|
||||
"image2": "牆壁(白)",
|
||||
"image3": "空房間(白)",
|
||||
"image4": "落地燈(黑)",
|
||||
"image5": "山岳",
|
||||
"image6": "森林",
|
||||
"image7": "日出",
|
||||
@@ -1347,12 +1351,13 @@
|
||||
"privacy": "隱私權",
|
||||
"recentList": "最近使用",
|
||||
"recentListDelete": "刪除",
|
||||
"recentListEmpty": "目前最近使用是空白的。與您的團隊成員聊天,即會在此處找到最近使用過的會議。",
|
||||
"recentListEmpty": "目前最近使用是空白的,與您的團隊成員聊天,即會在此處找到最近使用過的會議。",
|
||||
"reducedUIText": "歡迎使用{{app}}!",
|
||||
"roomNameAllowedChars": "會議室名稱不應包含以下字元:? & : '「 % #",
|
||||
"roomname": "輸入會議室名稱",
|
||||
"roomnameHint": "請輸入您想加入的會議室名稱或網址,您可以用個名稱來建立會議室,只要其他人輸入相同的名稱就能加入會議室喔。",
|
||||
"sendFeedback": "傳送回饋",
|
||||
"settings": "設定",
|
||||
"startMeeting": "開始會議",
|
||||
"terms": "條款",
|
||||
"title": "安全、功能齊全、完全免費的視訊會議"
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
},
|
||||
"labels": {
|
||||
"buttonLabel": "Car mode",
|
||||
"title": "Safe driving mode",
|
||||
"title": "Car mode",
|
||||
"videoStopped": "Your video is stopped"
|
||||
}
|
||||
},
|
||||
@@ -270,6 +270,7 @@
|
||||
"gracefulShutdown": "Our service is currently down for maintenance. Please try again later.",
|
||||
"grantModeratorDialog": "Are you sure you want to grant moderator rights to {{participantName}}?",
|
||||
"grantModeratorTitle": "Grant moderator rights",
|
||||
"hide": "Hide",
|
||||
"hideShareAudioHelper": "Don't show this dialog again",
|
||||
"incorrectPassword": "Incorrect username or password",
|
||||
"incorrectRoomLockPassword": "Incorrect password",
|
||||
@@ -387,6 +388,7 @@
|
||||
"shareYourScreenDisabled": "Screen sharing disabled.",
|
||||
"sharedVideoDialogError": "Error: Invalid URL",
|
||||
"sharedVideoLinkPlaceholder": "YouTube link or direct video link",
|
||||
"show": "Show",
|
||||
"start": "Start ",
|
||||
"startLiveStreaming": "Start live stream",
|
||||
"startRecording": "Start recording",
|
||||
@@ -435,7 +437,7 @@
|
||||
"search": "Search GIPHY"
|
||||
},
|
||||
"helpView": {
|
||||
"header": "Help center"
|
||||
"title": "Help center"
|
||||
},
|
||||
"incomingCall": {
|
||||
"answer": "Answer",
|
||||
@@ -477,9 +479,11 @@
|
||||
"noRoom": "No room was specified to dial-in into.",
|
||||
"numbers": "Dial-in Numbers",
|
||||
"password": "$t(lockRoomPasswordUppercase): ",
|
||||
"reachedLimit": "You have reached the limit of your plan.",
|
||||
"sip": "SIP address",
|
||||
"title": "Share",
|
||||
"tooltip": "Share link and dial-in info for this meeting"
|
||||
"tooltip": "Share link and dial-in info for this meeting",
|
||||
"upgradeOptions": "Please check the upgrade options on"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "We stumbled a bit.",
|
||||
@@ -551,6 +555,7 @@
|
||||
"signedInAs": "You are currently signed in as:",
|
||||
"start": "Start a live stream",
|
||||
"streamIdHelp": "What's this?",
|
||||
"title": "Live stream",
|
||||
"unavailableTitle": "Live Streaming unavailable",
|
||||
"youtubeTerms": "YouTube terms of services"
|
||||
},
|
||||
@@ -593,6 +598,7 @@
|
||||
"passwordJoinButton": "Join",
|
||||
"reject": "Reject",
|
||||
"rejectAll": "Reject all",
|
||||
"title": "Lobby",
|
||||
"toggleLabel": "Enable lobby"
|
||||
},
|
||||
"localRecording": {
|
||||
@@ -619,6 +625,7 @@
|
||||
"no": "No",
|
||||
"participant": "Participant",
|
||||
"participantStats": "Participant Stats",
|
||||
"selectTabTitle": "🎥 Please select this tab for recording",
|
||||
"sessionToken": "Session Token",
|
||||
"start": "Start Recording",
|
||||
"stop": "Stop Recording",
|
||||
@@ -735,13 +742,13 @@
|
||||
"videoModeration": "Start their video"
|
||||
},
|
||||
"close": "Close",
|
||||
"header": "Participants",
|
||||
"headings": {
|
||||
"lobby": "Lobby ({{count}})",
|
||||
"participantsList": "Meeting participants ({{count}})",
|
||||
"waitingLobby": "Waiting in lobby ({{count}})"
|
||||
},
|
||||
"search": "Search participants"
|
||||
"search": "Search participants",
|
||||
"title": "Participants"
|
||||
},
|
||||
"passwordDigitsOnly": "Up to {{number}} digits",
|
||||
"passwordSetRemotely": "Set by another participant",
|
||||
@@ -851,7 +858,7 @@
|
||||
"ringing": "Ringing..."
|
||||
},
|
||||
"privacyView": {
|
||||
"header": "Privacy"
|
||||
"title": "Privacy"
|
||||
},
|
||||
"profile": {
|
||||
"avatar": "avatar",
|
||||
@@ -923,6 +930,7 @@
|
||||
"signIn": "Sign in",
|
||||
"signOut": "Sign out",
|
||||
"surfaceError": "Please select the current tab.",
|
||||
"title": "Recording",
|
||||
"unavailable": "Oops! The {{serviceName}} is currently unavailable. We're working on resolving the issue. Please try again later.",
|
||||
"unavailableTitle": "Recording unavailable",
|
||||
"uploadToCloud": "Upload to the cloud"
|
||||
@@ -934,8 +942,8 @@
|
||||
"security": {
|
||||
"about": "You can add a $t(lockRoomPassword) to your meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
|
||||
"aboutReadOnly": "Moderator participants can add a $t(lockRoomPassword) to the meeting. Participants will need to provide the $t(lockRoomPassword) before they are allowed to join the meeting.",
|
||||
"header": "Security Options",
|
||||
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button."
|
||||
"insecureRoomNameWarning": "The room name is unsafe. Unwanted participants may join your conference. Consider securing your meeting using the security button.",
|
||||
"title": "Security Options"
|
||||
},
|
||||
"settings": {
|
||||
"buttonLabel": "Settings",
|
||||
@@ -967,7 +975,6 @@
|
||||
"playSounds": "Play sound on",
|
||||
"reactions": "Meeting reactions",
|
||||
"sameAsSystem": "Same as system ({{label}})",
|
||||
"screenTitle": "Settings",
|
||||
"selectAudioOutput": "Audio output",
|
||||
"selectCamera": "Camera",
|
||||
"selectMic": "Microphone",
|
||||
@@ -1041,7 +1048,7 @@
|
||||
"title": "Your video call was interrupted because this computer went to sleep."
|
||||
},
|
||||
"termsView": {
|
||||
"header": "Terms"
|
||||
"title": "Terms"
|
||||
},
|
||||
"toggleTopPanelLabel": "Toggle top panel",
|
||||
"toolbar": {
|
||||
@@ -1114,7 +1121,8 @@
|
||||
"toggleFilmstrip": "Toggle filmstrip",
|
||||
"undock": "Undock into separate window",
|
||||
"videoblur": "Toggle video blur",
|
||||
"videomute": "Start / Stop camera"
|
||||
"videomute": "Start / Stop camera",
|
||||
"whiteboard": "Show / Hide whiteboard"
|
||||
},
|
||||
"addPeople": "Add people to your call",
|
||||
"audioOnlyOff": "Disable low bandwidth mode",
|
||||
@@ -1145,6 +1153,7 @@
|
||||
"giphy": "Toggle GIPHY menu",
|
||||
"hangup": "Leave the meeting",
|
||||
"help": "Help",
|
||||
"hideWhiteboard": "Hide whiteboard",
|
||||
"invite": "Invite people",
|
||||
"joinBreakoutRoom": "Join breakout room",
|
||||
"laugh": "Laugh",
|
||||
@@ -1190,6 +1199,7 @@
|
||||
"shareaudio": "Share audio",
|
||||
"sharedvideo": "Share video",
|
||||
"shortcuts": "View shortcuts",
|
||||
"showWhiteboard": "Show whiteboard",
|
||||
"silence": "Silence",
|
||||
"speakerStats": "Speaker stats",
|
||||
"startScreenSharing": "Start screen sharing",
|
||||
@@ -1353,6 +1363,7 @@
|
||||
"roomname": "Enter room name",
|
||||
"roomnameHint": "Enter the name or URL of the room you want to join. You may make a name up, just let the people you are meeting know it so that they enter the same name.",
|
||||
"sendFeedback": "Send feedback",
|
||||
"settings": "Settings",
|
||||
"startMeeting": "Start meeting",
|
||||
"terms": "Terms",
|
||||
"title": "Secure, fully featured, and completely free video conferencing"
|
||||
|
||||
111
lang/translation-languages.json
Normal file
111
lang/translation-languages.json
Normal file
@@ -0,0 +1,111 @@
|
||||
{
|
||||
"af": "Afrikaans",
|
||||
"am": "Amharic",
|
||||
"ar": "Arabic",
|
||||
"az": "Azerbaijani",
|
||||
"be": "Belarusian",
|
||||
"bg": "Bulgarian",
|
||||
"bn": "Bengali",
|
||||
"bs": "Bosnian",
|
||||
"ca": "Catalan",
|
||||
"ceb": "Cebuano",
|
||||
"co": "Corsican",
|
||||
"cs": "Czech",
|
||||
"cy": "Welsh",
|
||||
"da": "Danish",
|
||||
"de": "German",
|
||||
"el": "Greek",
|
||||
"en": "English",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spanish",
|
||||
"et": "Estonian",
|
||||
"eu": "Basque",
|
||||
"fa": "Persian",
|
||||
"fi": "Finnish",
|
||||
"fr": "French",
|
||||
"fy": "Frisian",
|
||||
"ga": "Irish",
|
||||
"gd": "Scots Gaelic",
|
||||
"gl": "Galician",
|
||||
"gu": "Gujarati",
|
||||
"ha": "Hausa",
|
||||
"haw": "Hawaiian",
|
||||
"he": "Hebrew",
|
||||
"hi": "Hindi",
|
||||
"hmn": "Hmong",
|
||||
"hr": "Croatian",
|
||||
"ht": "Haitian Creole",
|
||||
"hu": "Hungarian",
|
||||
"hy": "Armenian",
|
||||
"id": "Indonesian",
|
||||
"ig": "Igbo",
|
||||
"is": "Icelandic",
|
||||
"it": "Italian",
|
||||
"ja": "Japanese",
|
||||
"jv": "Javanese",
|
||||
"ka": "Georgian",
|
||||
"kk": "Kazakh",
|
||||
"km": "Khmer",
|
||||
"kn": "Kannada",
|
||||
"ko": "Korean",
|
||||
"ku": "Kurdish",
|
||||
"ky": "Kyrgyz",
|
||||
"la": "Latin",
|
||||
"lb": "Luxembourgish",
|
||||
"lo": "Lao",
|
||||
"lt": "Lithuanian",
|
||||
"lv": "Latvian",
|
||||
"mg": "Malagasy",
|
||||
"mi": "Maori",
|
||||
"mk": "Macedonian",
|
||||
"ml": "Malayalam",
|
||||
"mn": "Mongolian",
|
||||
"mr": "Marathi",
|
||||
"ms": "Malay",
|
||||
"mt": "Maltese",
|
||||
"my": "Myanmar (Burmese)",
|
||||
"ne": "Nepali",
|
||||
"nl": "Dutch",
|
||||
"no": "Norwegian",
|
||||
"ny": "Nyanja (Chichewa)",
|
||||
"or": "Odia (Oriya)",
|
||||
"pa": "Punjabi",
|
||||
"pl": "Polish",
|
||||
"ps": "Pashto",
|
||||
"pt": "Portuguese (Portugal, Brazil)",
|
||||
"ro": "Romanian",
|
||||
"ru": "Russian",
|
||||
"rw": "Kinyarwanda",
|
||||
"sd": "Sindhi",
|
||||
"si": "Sinhala (Sinhalese)",
|
||||
"sk": "Slovak",
|
||||
"sl": "Slovenian",
|
||||
"sm": "Samoan",
|
||||
"sn": "Shona",
|
||||
"so": "Somali",
|
||||
"sq": "Albanian",
|
||||
"sr": "Serbian",
|
||||
"st": "Sesotho",
|
||||
"su": "Sundanese",
|
||||
"sv": "Swedish",
|
||||
"sw": "Swahili",
|
||||
"ta": "Tamil",
|
||||
"te": "Telugu",
|
||||
"tg": "Tajik",
|
||||
"th": "Thai",
|
||||
"tk": "Turkmen",
|
||||
"tl": "Tagalog (Filipino)",
|
||||
"tr": "Turkish",
|
||||
"tt": "Tatar",
|
||||
"ug": "Uyghur",
|
||||
"uk": "Ukrainian",
|
||||
"ur": "Urdu",
|
||||
"uz": "Uzbek",
|
||||
"vi": "Vietnamese",
|
||||
"xh": "Xhosa",
|
||||
"yi": "Yiddish",
|
||||
"yo": "Yoruba",
|
||||
"zh-CN": "Chinese (Simplified)",
|
||||
"zh-TW": "Chinese (Traditional)",
|
||||
"zu": "Zulu"
|
||||
}
|
||||
5451
package-lock.json
generated
5451
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
11
package.json
11
package.json
@@ -16,7 +16,6 @@
|
||||
"readmeFilename": "README.md",
|
||||
"dependencies": {
|
||||
"@amplitude/react-native": "2.7.0",
|
||||
"@atlaskit/field-text-area": "8.0.4",
|
||||
"@atlaskit/flag": "14.1.0",
|
||||
"@atlaskit/icon": "21.2.0",
|
||||
"@atlaskit/inline-dialog": "13.0.9",
|
||||
@@ -33,6 +32,7 @@
|
||||
"@giphy/react-components": "5.6.0",
|
||||
"@giphy/react-native-sdk": "1.7.0",
|
||||
"@hapi/bourne": "2.0.0",
|
||||
"@jitsi/excalidraw": "https://github.com/jitsi/excalidraw/releases/download/v0.0.11/jitsi-excalidraw-0.0.11.tgz",
|
||||
"@jitsi/js-utils": "2.0.4",
|
||||
"@jitsi/logger": "2.0.0",
|
||||
"@jitsi/rnnoise-wasm": "0.1.0",
|
||||
@@ -52,9 +52,10 @@
|
||||
"@react-navigation/material-top-tabs": "6.0.6",
|
||||
"@react-navigation/native": "6.0.6",
|
||||
"@react-navigation/stack": "6.2.2",
|
||||
"@svgr/webpack": "4.3.2",
|
||||
"@svgr/webpack": "6.3.1",
|
||||
"@tensorflow/tfjs-backend-wasm": "3.13.0",
|
||||
"@tensorflow/tfjs-core": "3.13.0",
|
||||
"@types/amplitude-js": "8.16.2",
|
||||
"@types/audioworklet": "0.0.29",
|
||||
"@types/w3c-image-capture": "1.0.6",
|
||||
"@vladmandic/human": "2.6.5",
|
||||
@@ -92,7 +93,7 @@
|
||||
"react-focus-lock": "2.5.1",
|
||||
"react-i18next": "10.11.4",
|
||||
"react-linkify": "1.0.0-alpha",
|
||||
"react-native": "0.68.1",
|
||||
"react-native": "0.68.3",
|
||||
"react-native-background-timer": "2.4.1",
|
||||
"react-native-calendar-events": "2.2.0",
|
||||
"react-native-callstats": "3.73.7",
|
||||
@@ -118,7 +119,7 @@
|
||||
"react-native-url-polyfill": "1.3.0",
|
||||
"react-native-video": "https://git@github.com/react-native-video/react-native-video#7c48ae7c8544b2b537fb60194e9620b9fcceae52",
|
||||
"react-native-watch-connectivity": "1.0.11",
|
||||
"react-native-webrtc": "https://git@github.com/react-native-webrtc/react-native-webrtc#ed07969a85c159953d3004cfd04d44792b95e8db",
|
||||
"react-native-webrtc": "1.106.1",
|
||||
"react-native-webview": "11.15.1",
|
||||
"react-native-youtube-iframe": "2.2.1",
|
||||
"react-redux": "7.1.0",
|
||||
@@ -151,7 +152,7 @@
|
||||
"@types/js-md5": "0.4.3",
|
||||
"@types/lodash": "4.14.182",
|
||||
"@types/react": "17.0.14",
|
||||
"@types/react-native": "0.68.1",
|
||||
"@types/react-native": "0.68.7",
|
||||
"@types/react-redux": "7.1.24",
|
||||
"@types/react-window": "1.8.5",
|
||||
"@types/unorm": "1.3.28",
|
||||
|
||||
@@ -4,8 +4,7 @@ import { API_ID } from '../../../modules/API/constants';
|
||||
// @ts-ignore
|
||||
import { getName as getAppName } from '../app/functions';
|
||||
import { IStore } from '../app/types';
|
||||
// @ts-ignore
|
||||
import { getAnalyticsRoomName } from '../base/conference';
|
||||
import { getAnalyticsRoomName } from '../base/conference/functions';
|
||||
import {
|
||||
checkChromeExtensionsInstalled,
|
||||
isMobileBrowser
|
||||
@@ -14,8 +13,7 @@ import JitsiMeetJS, {
|
||||
analytics,
|
||||
browser
|
||||
} from '../base/lib-jitsi-meet';
|
||||
// @ts-ignore
|
||||
import { isAnalyticsEnabled } from '../base/lib-jitsi-meet/functions';
|
||||
import { isAnalyticsEnabled } from '../base/lib-jitsi-meet/functions.any';
|
||||
// @ts-ignore
|
||||
import { loadScript } from '../base/util';
|
||||
import { getJitsiMeetGlobalNS } from '../base/util/helpers';
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-ignore
|
||||
import amplitude from 'amplitude-js';
|
||||
|
||||
export default amplitude;
|
||||
|
||||
@@ -16,7 +16,6 @@ import {
|
||||
import {
|
||||
getLocalAudioTrack,
|
||||
getLocalVideoTrack
|
||||
// @ts-ignore
|
||||
} from '../base/tracks/functions';
|
||||
|
||||
import { createLocalTracksDurationEvent, createNetworkInfoEvent } from './AnalyticsEvents';
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
import { AtlasKitThemeProvider } from '@atlaskit/theme';
|
||||
import React from 'react';
|
||||
|
||||
import { DialogContainer } from '../../base/dialog';
|
||||
import GlobalStyles from '../../base/ui/components/GlobalStyles';
|
||||
import JitsiThemeProvider from '../../base/ui/components/JitsiThemeProvider.web';
|
||||
import DialogContainer from '../../base/ui/components/web/DialogContainer';
|
||||
import { ChromeExtensionBanner } from '../../chrome-extension-banner';
|
||||
|
||||
import { AbstractApp } from './AbstractApp';
|
||||
|
||||
@@ -22,5 +22,7 @@ import '../talk-while-muted/middleware';
|
||||
import '../virtual-background/middleware';
|
||||
import '../face-landmarks/middleware';
|
||||
import '../gifs/middleware';
|
||||
import '../whiteboard/middleware';
|
||||
import '../base/dialog/middleware';
|
||||
|
||||
import './middlewares.any';
|
||||
|
||||
@@ -15,4 +15,6 @@ import '../noise-suppression/reducer';
|
||||
import '../screenshot-capture/reducer';
|
||||
import '../talk-while-muted/reducer';
|
||||
import '../virtual-background/reducer';
|
||||
import '../whiteboard/reducer';
|
||||
|
||||
import './reducers.any';
|
||||
|
||||
@@ -75,6 +75,7 @@ import { IVideoLayoutState } from '../video-layout/reducer';
|
||||
import { IVideoQualityPersistedState, IVideoQualityState } from '../video-quality/reducer';
|
||||
import { IVideoSipGW } from '../videosipgw/reducer';
|
||||
import { IVirtualBackground } from '../virtual-background/reducer';
|
||||
import { IWhiteboardState } from '../whiteboard/reducer';
|
||||
|
||||
export interface IStore {
|
||||
dispatch: ThunkDispatch<IState, void, AnyAction>;
|
||||
@@ -159,4 +160,5 @@ export interface IState {
|
||||
'features/video-quality-persistent-storage': IVideoQualityPersistedState;
|
||||
'features/videosipgw': IVideoSipGW;
|
||||
'features/virtual-background': IVirtualBackground;
|
||||
'features/whiteboard': IWhiteboardState;
|
||||
}
|
||||
|
||||
@@ -7,12 +7,10 @@ import type { Dispatch } from 'redux';
|
||||
import { connect } from '../../../../../connection';
|
||||
import { IState } from '../../../app/types';
|
||||
import { IConfig } from '../../../base/config/configType';
|
||||
// @ts-ignore
|
||||
import { toJid } from '../../../base/connection/functions';
|
||||
// @ts-ignore
|
||||
import { Dialog } from '../../../base/dialog';
|
||||
import { translate, translateToHTML } from '../../../base/i18n/functions';
|
||||
// @ts-ignore
|
||||
import { JitsiConnectionErrors } from '../../../base/lib-jitsi-meet';
|
||||
import { connect as reduxConnect } from '../../../base/redux/functions';
|
||||
import Input from '../../../base/ui/components/web/Input';
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import { IStore } from '../app/types';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { getConferenceState } from '../base/conference';
|
||||
import { getConferenceState } from '../base/conference/functions';
|
||||
import { MEDIA_TYPE, type MediaType } from '../base/media/constants';
|
||||
import { getParticipantById, isParticipantModerator } from '../base/participants/functions';
|
||||
import { Participant } from '../base/participants/types';
|
||||
@@ -40,7 +38,7 @@ export const approveParticipantAudio = (id: string) => (dispatch: IStore['dispat
|
||||
const isVideoForceMuted = isForceMuted(participant, MEDIA_TYPE.VIDEO, state);
|
||||
|
||||
if (isAudioModerationOn || !isVideoModerationOn || !isVideoForceMuted) {
|
||||
conference.avModerationApprove(MEDIA_TYPE.AUDIO, id);
|
||||
conference?.avModerationApprove(MEDIA_TYPE.AUDIO, id);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -59,7 +57,7 @@ export const approveParticipantVideo = (id: string) => (dispatch: IStore['dispat
|
||||
const isVideoModerationOn = isEnabledFromState(MEDIA_TYPE.VIDEO, state);
|
||||
|
||||
if (isVideoModerationOn && isVideoForceMuted) {
|
||||
conference.avModerationApprove(MEDIA_TYPE.VIDEO, id);
|
||||
conference?.avModerationApprove(MEDIA_TYPE.VIDEO, id);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -90,7 +88,7 @@ export const rejectParticipantAudio = (id: string) => (dispatch: IStore['dispatc
|
||||
const isModerator = isParticipantModerator(participant);
|
||||
|
||||
if (audioModeration && !isAudioForceMuted && !isModerator) {
|
||||
conference.avModerationReject(MEDIA_TYPE.AUDIO, id);
|
||||
conference?.avModerationReject(MEDIA_TYPE.AUDIO, id);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -110,7 +108,7 @@ export const rejectParticipantVideo = (id: string) => (dispatch: IStore['dispatc
|
||||
const isModerator = isParticipantModerator(participant);
|
||||
|
||||
if (videoModeration && !isVideoForceMuted && !isModerator) {
|
||||
conference.avModerationReject(MEDIA_TYPE.VIDEO, id);
|
||||
conference?.avModerationReject(MEDIA_TYPE.VIDEO, id);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
import { batch } from 'react-redux';
|
||||
|
||||
import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../base/app/actionTypes';
|
||||
// @ts-ignore
|
||||
import { getConferenceState } from '../base/conference';
|
||||
import { getConferenceState } from '../base/conference/functions';
|
||||
import { JitsiConferenceEvents } from '../base/lib-jitsi-meet';
|
||||
import { MEDIA_TYPE, MediaType } from '../base/media/constants';
|
||||
import { PARTICIPANT_UPDATED } from '../base/participants/actionTypes';
|
||||
@@ -17,10 +16,8 @@ import {
|
||||
} from '../base/participants/functions';
|
||||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
import StateListenerRegistry from '../base/redux/StateListenerRegistry';
|
||||
// @ts-ignore
|
||||
import { playSound, registerSound, unregisterSound } from '../base/sounds';
|
||||
// @ts-ignore
|
||||
import { hideNotification, showNotification } from '../notifications';
|
||||
import { playSound, registerSound, unregisterSound } from '../base/sounds/actions';
|
||||
import { hideNotification, showNotification } from '../notifications/actions';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE } from '../notifications/constants';
|
||||
// @ts-ignore
|
||||
import { muteLocal } from '../video-menu/actions.any';
|
||||
@@ -81,7 +78,7 @@ MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
|
||||
case LOCAL_PARTICIPANT_MODERATION_NOTIFICATION: {
|
||||
let descriptionKey;
|
||||
let titleKey;
|
||||
let uid: string | undefined;
|
||||
let uid = '';
|
||||
const localParticipant = getLocalParticipant(getState);
|
||||
const raisedHand = hasRaisedHand(localParticipant);
|
||||
|
||||
@@ -118,19 +115,19 @@ MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
|
||||
break;
|
||||
}
|
||||
case REQUEST_DISABLE_AUDIO_MODERATION: {
|
||||
conference.disableAVModeration(MEDIA_TYPE.AUDIO);
|
||||
conference?.disableAVModeration(MEDIA_TYPE.AUDIO);
|
||||
break;
|
||||
}
|
||||
case REQUEST_DISABLE_VIDEO_MODERATION: {
|
||||
conference.disableAVModeration(MEDIA_TYPE.VIDEO);
|
||||
conference?.disableAVModeration(MEDIA_TYPE.VIDEO);
|
||||
break;
|
||||
}
|
||||
case REQUEST_ENABLE_AUDIO_MODERATION: {
|
||||
conference.enableAVModeration(MEDIA_TYPE.AUDIO);
|
||||
conference?.enableAVModeration(MEDIA_TYPE.AUDIO);
|
||||
break;
|
||||
}
|
||||
case REQUEST_ENABLE_VIDEO_MODERATION: {
|
||||
conference.enableAVModeration(MEDIA_TYPE.VIDEO);
|
||||
conference?.enableAVModeration(MEDIA_TYPE.VIDEO);
|
||||
break;
|
||||
}
|
||||
case PARTICIPANT_UPDATED: {
|
||||
|
||||
@@ -76,6 +76,6 @@ export function getInitials(s?: string) {
|
||||
* @param {Array<string>} corsURLs - The URL pattern that matches a URL that needs to be handled with CORS.
|
||||
* @returns {void}
|
||||
*/
|
||||
export function isCORSAvatarURL(url: string | any = '', corsURLs: Array<string> = []) {
|
||||
export function isCORSAvatarURL(url: string, corsURLs: Array<string> = []): boolean {
|
||||
return corsURLs.some(pattern => url.startsWith(pattern));
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@ import React, { ReactNode, useEffect, useLayoutEffect, useRef, useState } from '
|
||||
import { useSelector } from 'react-redux';
|
||||
import { makeStyles } from 'tss-react/mui';
|
||||
|
||||
// @ts-ignore
|
||||
import { getComputedOuterHeight } from '../../../participants-pane/functions';
|
||||
// @ts-ignore
|
||||
import { Drawer, JitsiPortal } from '../../../toolbox/components/web';
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/* eslint-disable lines-around-comment */
|
||||
import { LOCKED_LOCALLY, LOCKED_REMOTELY } from '../../room-lock/constants';
|
||||
import { CONNECTION_WILL_CONNECT, SET_LOCATION_URL } from '../connection/actionTypes';
|
||||
// @ts-ignore
|
||||
import { JitsiConferenceErrors } from '../lib-jitsi-meet';
|
||||
import ReducerRegistry from '../redux/ReducerRegistry';
|
||||
import { assign, set } from '../redux/functions';
|
||||
@@ -26,7 +25,6 @@ import {
|
||||
SET_START_MUTED_POLICY,
|
||||
SET_START_REACTIONS_MUTED
|
||||
} from './actionTypes';
|
||||
// @ts-ignore
|
||||
import { isRoomValid } from './functions';
|
||||
|
||||
const DEFAULT_STATE = {
|
||||
@@ -42,6 +40,11 @@ const DEFAULT_STATE = {
|
||||
|
||||
export interface IJitsiConference {
|
||||
addTrack: Function;
|
||||
avModerationApprove: Function;
|
||||
avModerationReject: Function;
|
||||
createVideoSIPGWSession: Function;
|
||||
disableAVModeration: Function;
|
||||
enableAVModeration: Function;
|
||||
getBreakoutRooms: Function;
|
||||
getLocalTracks: Function;
|
||||
grantOwner: Function;
|
||||
|
||||
@@ -116,8 +116,6 @@ export function setConfig(config: Object = {}) {
|
||||
// On Web the config also comes from the window.config global,
|
||||
// but it is resolved in the loadConfig procedure.
|
||||
config,
|
||||
|
||||
// @ts-ignore
|
||||
window.interfaceConfig,
|
||||
locationURL);
|
||||
|
||||
@@ -144,7 +142,6 @@ export function storeConfig(baseURL: string, config: Object) {
|
||||
let b = false;
|
||||
|
||||
try {
|
||||
// @ts-ignore
|
||||
if (typeof window.config === 'undefined' || window.config !== config) {
|
||||
jitsiLocalStorage.setItem(`${_CONFIG_STORE_PREFIX}/${baseURL}`, JSON.stringify(config));
|
||||
b = true;
|
||||
|
||||
@@ -311,7 +311,7 @@ export interface IConfig {
|
||||
giphy?: {
|
||||
displayMode?: 'all' | 'tile' | 'chat';
|
||||
enabled?: boolean;
|
||||
sdkKey?: '';
|
||||
sdkKey?: string;
|
||||
tileTime?: number;
|
||||
};
|
||||
gravatar?: {
|
||||
@@ -464,6 +464,8 @@ export interface IConfig {
|
||||
disableStartForAll?: boolean;
|
||||
enabled?: boolean;
|
||||
preferredLanguage?: string;
|
||||
translationLanguages?: Array<string>;
|
||||
translationLanguagesHead?: Array<string>;
|
||||
useAppLanguage?: boolean;
|
||||
};
|
||||
useHostPageLocalStorage?: boolean;
|
||||
@@ -479,7 +481,7 @@ export interface IConfig {
|
||||
standard?: number;
|
||||
};
|
||||
};
|
||||
minHeightForQualityLvl: {
|
||||
minHeightForQualityLvl?: {
|
||||
[key: number]: string;
|
||||
};
|
||||
preferredCodec?: string;
|
||||
@@ -490,4 +492,8 @@ export interface IConfig {
|
||||
webrtcIceUdpDisable?: boolean;
|
||||
websocket?: string;
|
||||
websocketKeepAliveUrl?: string;
|
||||
whiteboard?: {
|
||||
collabServerBaseUrl?: string;
|
||||
enabled?: boolean;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -230,5 +230,6 @@ export default [
|
||||
'useTurnUdp',
|
||||
'videoQuality',
|
||||
'webrtcIceTcpDisable',
|
||||
'webrtcIceUdpDisable'
|
||||
'webrtcIceUdpDisable',
|
||||
'whiteboard.enabled'
|
||||
].concat(extraConfigWhitelist);
|
||||
|
||||
@@ -47,7 +47,8 @@ export const TOOLBAR_BUTTONS = [
|
||||
'stats',
|
||||
'tileview',
|
||||
'toggle-camera',
|
||||
'videoquality'
|
||||
'videoquality',
|
||||
'whiteboard'
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@@ -87,9 +87,7 @@ function _setConfig({ dispatch, getState }: IStore, next: Function, action: AnyA
|
||||
// not be the global variable which is being modified anymore due to
|
||||
// different merge methods being used along the way. The global variable
|
||||
// must be synchronized with the final state resolved by the reducer.
|
||||
// @ts-ignore
|
||||
if (typeof window.config !== 'undefined') {
|
||||
// @ts-ignore
|
||||
window.config = state['features/base/config'];
|
||||
}
|
||||
|
||||
|
||||
@@ -52,10 +52,11 @@ const INITIAL_RN_STATE: IConfig = {
|
||||
disableAudioLevels: true,
|
||||
|
||||
p2p: {
|
||||
disabledCodec: '',
|
||||
disableH264: false, // deprecated
|
||||
preferredCodec: 'H264',
|
||||
preferH264: true // deprecated
|
||||
preferredCodec: 'VP8'
|
||||
},
|
||||
|
||||
videoQuality: {
|
||||
preferredCodec: 'VP8'
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import { Dispatch } from 'redux';
|
||||
|
||||
// @ts-ignore
|
||||
import { conferenceLeft, conferenceWillLeave } from '../conference/actions';
|
||||
// @ts-ignore
|
||||
import { getCurrentConference } from '../conference/functions';
|
||||
import JitsiMeetJS, { JitsiConnectionEvents } from '../lib-jitsi-meet';
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/* eslint-disable lines-around-comment */
|
||||
import { SET_ROOM } from '../conference/actionTypes';
|
||||
// @ts-ignore
|
||||
import { JitsiConnectionErrors } from '../lib-jitsi-meet';
|
||||
import ReducerRegistry from '../redux/ReducerRegistry';
|
||||
import { assign, set } from '../redux/functions';
|
||||
@@ -13,7 +12,6 @@ import {
|
||||
SET_LOCATION_URL,
|
||||
SHOW_CONNECTION_INFO
|
||||
} from './actionTypes';
|
||||
// @ts-ignore
|
||||
import { ConnectionFailedError } from './actions.native';
|
||||
|
||||
export interface IConnectionState {
|
||||
|
||||
@@ -8,8 +8,6 @@ import {
|
||||
SET_VIDEO_INPUT_DEVICE,
|
||||
UPDATE_DEVICE_LIST
|
||||
} from './actionTypes';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { groupDevicesByKind } from './functions';
|
||||
import logger from './logger';
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// @flow
|
||||
import { ComponentType } from 'react';
|
||||
|
||||
import type { Dispatch } from 'redux';
|
||||
import { IStore } from '../../app/types';
|
||||
|
||||
import {
|
||||
HIDE_DIALOG,
|
||||
@@ -22,7 +22,7 @@ import { isDialogOpen } from './functions';
|
||||
* component: (React.Component | undefined)
|
||||
* }}
|
||||
*/
|
||||
export function hideDialog(component: ?Object) {
|
||||
export function hideDialog(component?: ComponentType) {
|
||||
return {
|
||||
type: HIDE_DIALOG,
|
||||
component
|
||||
@@ -54,7 +54,7 @@ export function hideSheet() {
|
||||
* componentProps: (Object | undefined)
|
||||
* }}
|
||||
*/
|
||||
export function openDialog(component: Object, componentProps: ?Object) {
|
||||
export function openDialog(component: ComponentType, componentProps?: Object) {
|
||||
return {
|
||||
type: OPEN_DIALOG,
|
||||
component,
|
||||
@@ -74,7 +74,7 @@ export function openDialog(component: Object, componentProps: ?Object) {
|
||||
* componentProps: (Object | undefined)
|
||||
* }}
|
||||
*/
|
||||
export function openSheet(component: Object, componentProps: ?Object) {
|
||||
export function openSheet(component: ComponentType, componentProps?: Object) {
|
||||
return {
|
||||
type: OPEN_SHEET,
|
||||
component,
|
||||
@@ -92,8 +92,8 @@ export function openSheet(component: Object, componentProps: ?Object) {
|
||||
* specified {@code component}.
|
||||
* @returns {Function}
|
||||
*/
|
||||
export function toggleDialog(component: Object, componentProps: ?Object) {
|
||||
return (dispatch: Dispatch<any>, getState: Function) => {
|
||||
export function toggleDialog(component: ComponentType, componentProps?: Object) {
|
||||
return (dispatch: IStore['dispatch'], getState: IStore['getState']) => {
|
||||
if (isDialogOpen(getState, component)) {
|
||||
dispatch(hideDialog(component));
|
||||
} else {
|
||||
@@ -1,34 +1,33 @@
|
||||
/* @flow */
|
||||
import React, { Component, ComponentType } from 'react';
|
||||
|
||||
import React, { Component } from 'react';
|
||||
|
||||
import { type ReactionEmojiProps } from '../../../reactions/constants';
|
||||
import { IState } from '../../../app/types';
|
||||
import { ReactionEmojiProps } from '../../../reactions/constants';
|
||||
|
||||
/**
|
||||
* The type of the React {@code Component} props of {@link DialogContainer}.
|
||||
*/
|
||||
type Props = {
|
||||
interface Props {
|
||||
|
||||
/**
|
||||
* The component to render.
|
||||
*/
|
||||
_component: Function,
|
||||
_component: ComponentType;
|
||||
|
||||
/**
|
||||
* The props to pass to the component that will be rendered.
|
||||
*/
|
||||
_componentProps: Object,
|
||||
|
||||
/**
|
||||
* True if the UI is in a compact state where we don't show dialogs.
|
||||
*/
|
||||
_reducedUI: boolean,
|
||||
_componentProps: Object;
|
||||
|
||||
/**
|
||||
* Array of reactions to be displayed.
|
||||
*/
|
||||
_reactionsQueue: Array<ReactionEmojiProps>
|
||||
};
|
||||
_reactionsQueue: Array<ReactionEmojiProps>;
|
||||
|
||||
/**
|
||||
* True if the UI is in a compact state where we don't show dialogs.
|
||||
*/
|
||||
_reducedUI: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements a DialogContainer responsible for showing all dialogs.
|
||||
@@ -61,7 +60,7 @@ export default class AbstractDialogContainer extends Component<Props> {
|
||||
* @private
|
||||
* @returns {Props}
|
||||
*/
|
||||
export function abstractMapStateToProps(state: Object): $Shape<Props> {
|
||||
export function abstractMapStateToProps(state: IState) {
|
||||
const stateFeaturesBaseDialog = state['features/base/dialog'];
|
||||
const { reducedUI } = state['features/base/responsive-ui'];
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
import { ModalTransition } from '@atlaskit/modal-dialog';
|
||||
import React from 'react';
|
||||
|
||||
import { connect } from '../../../redux';
|
||||
import AbstractDialogContainer, {
|
||||
abstractMapStateToProps
|
||||
} from '../AbstractDialogContainer';
|
||||
|
||||
/**
|
||||
* Implements a DialogContainer responsible for showing all dialogs. Necessary
|
||||
* for supporting @atlaskit's modal animations.
|
||||
*
|
||||
* @augments AbstractDialogContainer
|
||||
*/
|
||||
class DialogContainer extends AbstractDialogContainer {
|
||||
/**
|
||||
* Implements React's {@link Component#render()}.
|
||||
*
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
render() {
|
||||
return (
|
||||
<ModalTransition>
|
||||
{ this._renderDialogContent() }
|
||||
</ModalTransition>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default connect(abstractMapStateToProps)(DialogContainer);
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
export { default as AbstractDialogTab } from './AbstractDialogTab';
|
||||
export type { Props as AbstractDialogTabProps } from './AbstractDialogTab';
|
||||
export { default as Dialog } from './Dialog';
|
||||
export { default as DialogContainer } from './DialogContainer';
|
||||
export { default as Dialog } from './Dialog-old';
|
||||
export { default as DialogWithTabs } from './DialogWithTabs';
|
||||
export { default as StatelessDialog } from './StatelessDialog';
|
||||
export { default as DialogContainer } from '../../../ui/components/web/DialogContainer';
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
/* @flow */
|
||||
import { ComponentType } from 'react';
|
||||
|
||||
import { IState } from '../../app/types';
|
||||
import { IStateful } from '../app/types';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { ColorSchemeRegistry } from '../color-scheme';
|
||||
import { toState } from '../redux';
|
||||
import { toState } from '../redux/functions';
|
||||
|
||||
/**
|
||||
* Checks if any {@code Dialog} is currently open.
|
||||
*
|
||||
* @param {Function|Object} stateful - The redux store, the redux
|
||||
* @param {IStateful} stateful - The redux store, the redux
|
||||
* {@code getState} function, or the redux state itself.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isAnyDialogOpen(stateful: Function) {
|
||||
export function isAnyDialogOpen(stateful: IStateful) {
|
||||
return Boolean(toState(stateful)['features/base/dialog'].component);
|
||||
}
|
||||
|
||||
@@ -18,25 +22,25 @@ export function isAnyDialogOpen(stateful: Function) {
|
||||
* Checks if a {@code Dialog} with a specific {@code component} is currently
|
||||
* open.
|
||||
*
|
||||
* @param {Function|Object} stateful - The redux store, the redux
|
||||
* @param {IStateful} stateful - The redux store, the redux
|
||||
* {@code getState} function, or the redux state itself.
|
||||
* @param {React.Component} component - The {@code component} of a
|
||||
* {@code Dialog} to be checked.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isDialogOpen(stateful: Function | Object, component: Object) {
|
||||
export function isDialogOpen(stateful: IStateful, component: ComponentType) {
|
||||
return toState(stateful)['features/base/dialog'].component === component;
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps part of the Redux state to the props of any Dialog based component.
|
||||
*
|
||||
* @param {Object} state - The Redux state.
|
||||
* @param {IState} state - The Redux state.
|
||||
* @returns {{
|
||||
* _dialogStyles: StyleType
|
||||
* }}
|
||||
*/
|
||||
export function _abstractMapStateToProps(state: Object): Object {
|
||||
export function _abstractMapStateToProps(state: IState) {
|
||||
return {
|
||||
_dialogStyles: ColorSchemeRegistry.get(state, 'Dialog')
|
||||
};
|
||||
31
react/features/base/dialog/middleware.web.ts
Normal file
31
react/features/base/dialog/middleware.web.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import ChatPrivacyDialog from '../../chat/components/web/ChatPrivacyDialog';
|
||||
import DisplayNamePrompt from '../../display-name/components/web/DisplayNamePrompt';
|
||||
import EmbedMeetingDialog from '../../embed-meeting/components/EmbedMeetingDialog';
|
||||
import KeyboardShortcutsDialog from '../../keyboard-shortcuts/components/web/KeyboardShortcutsDialog';
|
||||
import MiddlewareRegistry from '../redux/MiddlewareRegistry';
|
||||
|
||||
import { OPEN_DIALOG } from './actionTypes';
|
||||
|
||||
// ! IMPORTANT - This whole middleware is only needed for the transition from from @atlaskit dialog to our component.
|
||||
// ! It should be removed when the transition is over.
|
||||
|
||||
const NEW_DIALOG_LIST = [ KeyboardShortcutsDialog, ChatPrivacyDialog, DisplayNamePrompt, EmbedMeetingDialog ];
|
||||
|
||||
// This function is necessary while the transition from @atlaskit dialog to our component is ongoing.
|
||||
const isNewDialog = (component: any) => NEW_DIALOG_LIST.some(comp => comp === component);
|
||||
|
||||
/**
|
||||
* Implements the entry point of the middleware of the feature base/media.
|
||||
*
|
||||
* @param {IStore} store - The redux store.
|
||||
* @returns {Function}
|
||||
*/
|
||||
MiddlewareRegistry.register(() => (next: Function) => (action: any) => {
|
||||
switch (action.type) {
|
||||
case OPEN_DIALOG: {
|
||||
action.isNewDialog = isNewDialog(action.component);
|
||||
}
|
||||
}
|
||||
|
||||
return next(action);
|
||||
});
|
||||
@@ -13,6 +13,7 @@ import {
|
||||
export interface IDialogState {
|
||||
component?: ComponentType;
|
||||
componentProps?: Object;
|
||||
isNewDialog?: boolean;
|
||||
sheet?: ComponentType;
|
||||
sheetProps?: Object;
|
||||
}
|
||||
@@ -43,7 +44,8 @@ ReducerRegistry.register<IDialogState>('features/base/dialog', (state = {}, acti
|
||||
case OPEN_DIALOG:
|
||||
return assign(state, {
|
||||
component: action.component,
|
||||
componentProps: action.componentProps
|
||||
componentProps: action.componentProps,
|
||||
isNewDialog: action.isNewDialog
|
||||
});
|
||||
|
||||
case HIDE_SHEET:
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// @ts-ignore
|
||||
import JitsiMeetJS from '../lib-jitsi-meet';
|
||||
import Platform from '../react/Platform.web';
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import _ from 'lodash';
|
||||
|
||||
import LANGUAGES_RESOURCES from '../../../../lang/languages.json';
|
||||
import MAIN_RESOURCES from '../../../../lang/main.json';
|
||||
import TRANSLATION_LANGUAGES_RESOURCES from '../../../../lang/translation-languages.json';
|
||||
|
||||
import { I18NEXT_INITIALIZED, LANGUAGE_CHANGED } from './actionTypes';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
@@ -36,22 +37,21 @@ const COUNTRIES = _.merge({}, COUNTRIES_RESOURCES, COUNTRIES_RESOURCES_OVERRIDES
|
||||
export const LANGUAGES: Array<string> = Object.keys(LANGUAGES_RESOURCES);
|
||||
|
||||
/**
|
||||
* The languages for the top section of the translation language list.
|
||||
* The available/supported translation languages.
|
||||
*
|
||||
* @public
|
||||
* @type {Array<string>}
|
||||
*/
|
||||
export const TRANSLATION_LANGUAGES: Array<string> = Object.keys(TRANSLATION_LANGUAGES_RESOURCES);
|
||||
|
||||
/**
|
||||
* The available/supported translation languages head. (Languages displayed on the top ).
|
||||
*
|
||||
* @public
|
||||
* @type {Array<string>}
|
||||
*/
|
||||
export const TRANSLATION_LANGUAGES_HEAD: Array<string> = [ 'en' ];
|
||||
|
||||
/**
|
||||
* The languages to explude from the translation language list.
|
||||
*
|
||||
* @public
|
||||
* @type {Array<string>}
|
||||
*/
|
||||
export const TRANSLATION_LANGUAGES_EXCLUDE: Array<string>
|
||||
= [ 'enGB', 'esUS', 'frCA', 'hsb', 'kab', 'ptBR', 'zhCN', 'zhTW' ];
|
||||
|
||||
/**
|
||||
* The default language.
|
||||
*
|
||||
@@ -77,7 +77,7 @@ const options = {
|
||||
escapeValue: false // not needed for react as it escapes by default
|
||||
},
|
||||
load: 'languageOnly',
|
||||
ns: [ 'main', 'languages', 'countries' ],
|
||||
ns: [ 'main', 'languages', 'countries', 'translation-languages' ],
|
||||
react: {
|
||||
// re-render when a new resource bundle is added
|
||||
bindI18nStore: 'added',
|
||||
@@ -109,6 +109,12 @@ i18next.addResourceBundle(
|
||||
LANGUAGES_RESOURCES,
|
||||
/* deep */ true,
|
||||
/* overwrite */ true);
|
||||
i18next.addResourceBundle(
|
||||
DEFAULT_LANGUAGE,
|
||||
'translation-languages',
|
||||
TRANSLATION_LANGUAGES_RESOURCES,
|
||||
/* deep */ true,
|
||||
/* overwrite */ true);
|
||||
i18next.addResourceBundle(
|
||||
DEFAULT_LANGUAGE,
|
||||
'main',
|
||||
|
||||
@@ -4,4 +4,4 @@ export * from './functions';
|
||||
// TODO Eventually (e.g. when the non-React Web app is rewritten into React), it
|
||||
// should not be necessary to export i18next.
|
||||
export { default as i18next, DEFAULT_LANGUAGE,
|
||||
LANGUAGES, TRANSLATION_LANGUAGES_HEAD, TRANSLATION_LANGUAGES_EXCLUDE } from './i18next';
|
||||
LANGUAGES, TRANSLATION_LANGUAGES, TRANSLATION_LANGUAGES_HEAD } from './i18next';
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
// @flow
|
||||
|
||||
import { getLogger } from '../logging/functions';
|
||||
|
||||
export default getLogger('features/base/i18n');
|
||||
@@ -4,8 +4,6 @@ import MiddlewareRegistry from '../redux/MiddlewareRegistry';
|
||||
import { I18NEXT_INITIALIZED, LANGUAGE_CHANGED } from './actionTypes';
|
||||
import { changeLanguageBundle } from './functions';
|
||||
import i18next from './i18next';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import logger from './logger';
|
||||
|
||||
/**
|
||||
|
||||
@@ -151,3 +151,5 @@ export { default as IconWifi2Bars } from './wifi-2.svg';
|
||||
export { default as IconWifi3Bars } from './wifi-3.svg';
|
||||
export { default as IconYahoo } from './yahoo.svg';
|
||||
export { default as IconSip } from './sip.svg';
|
||||
export { default as IconShowWhiteboard } from './whiteboard-show.svg';
|
||||
export { default as IconHideWhiteboard } from './whiteboard-hide.svg';
|
||||
|
||||
4
react/features/base/icons/svg/whiteboard-hide.svg
Normal file
4
react/features/base/icons/svg/whiteboard-hide.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<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="M4 5V14H9.0011H14.9994H20V5H4ZM16.7664 16H21C21.5523 16 22 15.5523 22 15V4C22 3.44772 21.5523 3 21 3H3C2.44772 3 2 3.44772 2 4V15C2 15.5523 2.44772 16 3 16H7.23405L5.14266 19.4857C4.85851 19.9592 5.01208 20.5735 5.48566 20.8576C5.95924 21.1418 6.5735 20.9882 6.85764 20.5146L9.56643 16H14.4341L17.1428 20.5146C17.427 20.9882 18.0413 21.1418 18.5148 20.8576C18.9884 20.5735 19.142 19.9592 18.8578 19.4857L16.7664 16Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M2.14686 3.47869C2.43485 3.00744 3.05034 2.85887 3.52159 3.14686L21.5216 14.1469C21.9928 14.4348 22.1414 15.0503 21.8534 15.5216C21.5654 15.9928 20.9499 16.1414 20.4787 15.8534L2.47869 4.85343C2.00744 4.56544 1.85887 3.94995 2.14686 3.47869Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 891 B |
3
react/features/base/icons/svg/whiteboard-show.svg
Normal file
3
react/features/base/icons/svg/whiteboard-show.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="M4 5V14H9.0011H14.9994H20V5H4ZM16.7664 16H21C21.5523 16 22 15.5523 22 15V4C22 3.44772 21.5523 3 21 3H3C2.44772 3 2 3.44772 2 4V15C2 15.5523 2.44772 16 3 16H7.23405L5.14266 19.4857C4.85851 19.9592 5.01208 20.5735 5.48566 20.8576C5.95924 21.1418 6.5735 20.9882 6.85764 20.5146L9.56643 16H14.4341L17.1428 20.5146C17.427 20.9882 18.0413 21.1418 18.5148 20.8576C18.9884 20.5735 19.142 19.9592 18.8578 19.4857L16.7664 16Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 584 B |
@@ -1,17 +1,29 @@
|
||||
/**
|
||||
* The list of supported meeting features to enable/disable through jwt.
|
||||
*/
|
||||
export const MEET_FEATURES = [
|
||||
'branding',
|
||||
'calendar',
|
||||
'callstats',
|
||||
'livestreaming',
|
||||
'lobby',
|
||||
'moderation',
|
||||
'outbound-call',
|
||||
'recording',
|
||||
'room',
|
||||
'screen-sharing',
|
||||
'sip-outbound-call',
|
||||
'transcription'
|
||||
];
|
||||
export const MEET_FEATURES = {
|
||||
BRANDING: 'branding',
|
||||
CALENDAR: 'calendar',
|
||||
CALLSTATS: 'callstats',
|
||||
FLIP: 'flip',
|
||||
INBOUND_CALL: 'inbound-call',
|
||||
LIVESTREAMING: 'livestreaming',
|
||||
LOBBY: 'lobby',
|
||||
MODERATION: 'moderation',
|
||||
OUTBOUND_CALL: 'outbound-call',
|
||||
RECORDING: 'recording',
|
||||
ROOM: 'room',
|
||||
SCREEN_SHARING: 'screen-sharing',
|
||||
SIP_INBOUND_CALL: 'sip-inbound-call',
|
||||
SIP_OUTBOUND_CALL: 'sip-outbound-call',
|
||||
TRANSCRIPTION: 'transcription'
|
||||
};
|
||||
|
||||
/**
|
||||
* A mapping between jwt features and toolbar buttons keys.
|
||||
*/
|
||||
export const FEATURES_TO_BUTTONS_MAPPING = {
|
||||
'livestreaming': 'livestreaming',
|
||||
'recording': 'recording',
|
||||
'transcription': 'closedcaptions'
|
||||
};
|
||||
|
||||
@@ -147,9 +147,10 @@ export function validateJwt(jwt: string) {
|
||||
errors.push('- `context` object is missing from the payload');
|
||||
} else if (context.features) {
|
||||
const { features } = context;
|
||||
const meetFeatures = Object.values(MEET_FEATURES);
|
||||
|
||||
Object.keys(features).forEach(feature => {
|
||||
if (MEET_FEATURES.includes(feature)) {
|
||||
if (meetFeatures.includes(feature)) {
|
||||
const featureValue = features[feature];
|
||||
|
||||
// cannot use truthy or falsy because we need the exact value and type check.
|
||||
|
||||
@@ -22,8 +22,6 @@ import {
|
||||
getParticipantCount
|
||||
} from '../participants/functions';
|
||||
import MiddlewareRegistry from '../redux/MiddlewareRegistry';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { isLocalVideoTrackDesktop } from '../tracks/functions';
|
||||
|
||||
import { setLastN } from './actions';
|
||||
|
||||
@@ -7,7 +7,6 @@ import ReducerRegistry from '../redux/ReducerRegistry';
|
||||
import { set } from '../redux/functions';
|
||||
|
||||
import { SET_LAST_N } from './actionTypes';
|
||||
// @ts-ignore
|
||||
import { validateLastNLimits } from './functions';
|
||||
|
||||
export interface ILastNState {
|
||||
|
||||
@@ -14,8 +14,7 @@ import {
|
||||
LIB_WILL_DISPOSE,
|
||||
LIB_WILL_INIT
|
||||
} from './actionTypes';
|
||||
// @ts-ignore
|
||||
import { isAnalyticsEnabled } from './functions';
|
||||
import { isAnalyticsEnabled } from './functions.any';
|
||||
|
||||
/**
|
||||
* Disposes (of) lib-jitsi-meet.
|
||||
|
||||
@@ -93,6 +93,8 @@ function _setErrorHandlers() {
|
||||
if (JitsiMeetJS.getGlobalOnErrorHandler) {
|
||||
const oldOnErrorHandler = window.onerror;
|
||||
|
||||
// TODO: Don't remove this ignore. The build fails on macOS and we don't know yet why.
|
||||
|
||||
// @ts-ignore
|
||||
window.onerror = (message, source, lineno, colno, error) => { // eslint-disable-line max-params
|
||||
const errMsg = message || error?.message;
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
/* eslint-disable lines-around-comment */
|
||||
// @ts-ignore
|
||||
import RTCStats from '../../rtcstats/RTCStats';
|
||||
// @ts-ignore
|
||||
import { canSendRtcstatsData } from '../../rtcstats/functions';
|
||||
// @ts-ignore
|
||||
import { getCurrentConference } from '../conference';
|
||||
import { getCurrentConference } from '../conference/functions';
|
||||
|
||||
/**
|
||||
* Implements log storage interface from the @jitsi/logger lib. Captured
|
||||
|
||||
@@ -4,16 +4,15 @@ import Logger from '@jitsi/logger';
|
||||
|
||||
import { IStore } from '../../app/types';
|
||||
import { APP_WILL_MOUNT } from '../app/actionTypes';
|
||||
// @ts-ignore
|
||||
import { CONFERENCE_JOINED, getCurrentConference } from '../conference';
|
||||
import { CONFERENCE_JOINED } from '../conference/actionTypes';
|
||||
import { getCurrentConference } from '../conference/functions';
|
||||
import { SET_CONFIG } from '../config/actionTypes';
|
||||
import JitsiMeetJS, {
|
||||
JitsiConferenceEvents
|
||||
} from '../lib-jitsi-meet';
|
||||
import { LIB_WILL_INIT } from '../lib-jitsi-meet/actionTypes';
|
||||
import MiddlewareRegistry from '../redux/MiddlewareRegistry';
|
||||
// @ts-ignore
|
||||
import { isTestModeEnabled } from '../testing';
|
||||
import { isTestModeEnabled } from '../testing/functions';
|
||||
|
||||
import buildExternalApiLogTransport from './ExternalApiLogTransport';
|
||||
import JitsiMeetInMemoryLogStorage from './JitsiMeetInMemoryLogStorage';
|
||||
|
||||
@@ -120,7 +120,7 @@ export function isVideoMutedByUser(stateful: IStateful) {
|
||||
* otherwise, false.
|
||||
*/
|
||||
export function shouldRenderVideoTrack(
|
||||
videoTrack: { muted: boolean; videoStarted: boolean; },
|
||||
videoTrack: { muted: boolean; videoStarted: boolean; } | undefined,
|
||||
waitForVideoStarted: boolean) {
|
||||
return (
|
||||
videoTrack
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
import './middleware.any.js';
|
||||
|
||||
import { IStore } from '../../app/types';
|
||||
// @ts-ignore
|
||||
import { showNotification } from '../../notifications/actions';
|
||||
import { NOTIFICATION_TIMEOUT_TYPE } from '../../notifications/constants';
|
||||
import LocalRecordingManager from '../../recording/components/Recording/LocalRecordingManager.web';
|
||||
|
||||
@@ -407,6 +407,7 @@ export function participantLeft(id: string, conference: any, participantLeftProp
|
||||
id,
|
||||
isReplaced: participantLeftProps.isReplaced,
|
||||
isVirtualScreenshareParticipant: participantLeftProps.isVirtualScreenshareParticipant,
|
||||
isWhiteboard: participantLeftProps.isWhiteboard,
|
||||
isFakeParticipant: participantLeftProps.isFakeParticipant
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { IconPhone } from '../icons/svg';
|
||||
import { IconPhone, IconShowWhiteboard } from '../icons/svg';
|
||||
|
||||
/**
|
||||
* The relative path to the default/stock avatar (image) file used on both
|
||||
@@ -75,3 +75,8 @@ export const PARTICIPANT_ROLE = {
|
||||
* @type {string}
|
||||
*/
|
||||
export const LOWER_HAND_AUDIO_LEVEL = 0.2;
|
||||
|
||||
/**
|
||||
* Icon URL for the whiteboard participant.
|
||||
*/
|
||||
export const WHITEBOARD_PARTICIPANT_ICON = IconShowWhiteboard;
|
||||
|
||||
@@ -8,18 +8,20 @@ import { isStageFilmstripAvailable } from '../../filmstrip/functions';
|
||||
import { IStateful } from '../app/types';
|
||||
import { GRAVATAR_BASE_URL } from '../avatar/constants';
|
||||
import { isCORSAvatarURL } from '../avatar/functions';
|
||||
// @ts-ignore
|
||||
import { getMultipleVideoSupportFeatureFlag, getSourceNameSignalingFeatureFlag } from '../config';
|
||||
import { getMultipleVideoSupportFeatureFlag, getSourceNameSignalingFeatureFlag } from '../config/functions.any';
|
||||
import i18next from '../i18n/i18next';
|
||||
import { JitsiParticipantConnectionStatus, JitsiTrackStreamingStatus } from '../lib-jitsi-meet';
|
||||
// @ts-ignore
|
||||
import { shouldRenderVideoTrack } from '../media';
|
||||
import { shouldRenderVideoTrack } from '../media/functions';
|
||||
import { toState } from '../redux/functions';
|
||||
// @ts-ignore
|
||||
import { getScreenShareTrack, getVideoTrackByParticipant } from '../tracks';
|
||||
import { getScreenShareTrack, getVideoTrackByParticipant } from '../tracks/functions';
|
||||
import { createDeferred } from '../util/helpers';
|
||||
|
||||
import { JIGASI_PARTICIPANT_ICON, MAX_DISPLAY_NAME_LENGTH, PARTICIPANT_ROLE } from './constants';
|
||||
import {
|
||||
JIGASI_PARTICIPANT_ICON,
|
||||
MAX_DISPLAY_NAME_LENGTH,
|
||||
PARTICIPANT_ROLE,
|
||||
WHITEBOARD_PARTICIPANT_ICON
|
||||
} from './constants';
|
||||
// @ts-ignore
|
||||
import { preloadImage } from './preloadImage';
|
||||
import { Participant } from './types';
|
||||
@@ -34,6 +36,9 @@ const AVATAR_CHECKER_FUNCTIONS = [
|
||||
(participant: Participant) => {
|
||||
return participant?.isJigasi ? JIGASI_PARTICIPANT_ICON : null;
|
||||
},
|
||||
(participant: Participant) => {
|
||||
return participant?.isWhiteboard ? WHITEBOARD_PARTICIPANT_ICON : null;
|
||||
},
|
||||
(participant: Participant) => {
|
||||
return participant?.avatarURL ? participant.avatarURL : null;
|
||||
},
|
||||
@@ -305,13 +310,14 @@ export function getFakeParticipants(stateful: IStateful) {
|
||||
* @returns {number}
|
||||
*/
|
||||
export function getRemoteParticipantCount(stateful: IStateful) {
|
||||
const state = toState(stateful)['features/base/participants'];
|
||||
const state = toState(stateful);
|
||||
const participantsState = state['features/base/participants'];
|
||||
|
||||
if (getMultipleVideoSupportFeatureFlag(state)) {
|
||||
return state.remote.size - state.sortedRemoteVirtualScreenshareParticipants.size;
|
||||
return participantsState.remote.size - participantsState.sortedRemoteVirtualScreenshareParticipants.size;
|
||||
}
|
||||
|
||||
return state.remote.size;
|
||||
return participantsState.remote.size;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -603,7 +609,8 @@ async function _getFirstLoadableAvatarUrl(participant: Participant, store: IStor
|
||||
} else {
|
||||
try {
|
||||
const { corsAvatarURLs } = store.getState()['features/base/config'];
|
||||
const { isUsingCORS, src } = await preloadImage(url, isCORSAvatarURL(url, corsAvatarURLs));
|
||||
const useCORS = isIconUrl(url) ? false : isCORSAvatarURL(url, corsAvatarURLs);
|
||||
const { isUsingCORS, src } = await preloadImage(url, useCORS);
|
||||
|
||||
AVATAR_CHECKED_URLS.set(src, {
|
||||
isLoadable: true,
|
||||
|
||||
@@ -267,19 +267,19 @@ MiddlewareRegistry.register(store => next => action => {
|
||||
}
|
||||
|
||||
case PARTICIPANT_JOINED: {
|
||||
const { isVirtualScreenshareParticipant } = action.participant;
|
||||
const { isVirtualScreenshareParticipant, isWhiteboard } = action.participant;
|
||||
|
||||
// Do not play sounds when a virtual participant tile is created for screenshare.
|
||||
!isVirtualScreenshareParticipant && _maybePlaySounds(store, action);
|
||||
(!isVirtualScreenshareParticipant && !isWhiteboard) && _maybePlaySounds(store, action);
|
||||
|
||||
return _participantJoinedOrUpdated(store, next, action);
|
||||
}
|
||||
|
||||
case PARTICIPANT_LEFT: {
|
||||
const { isVirtualScreenshareParticipant } = action.participant;
|
||||
const { isVirtualScreenshareParticipant, isWhiteboard } = action.participant;
|
||||
|
||||
// Do not play sounds when a tile for screenshare is removed.
|
||||
!isVirtualScreenshareParticipant && _maybePlaySounds(store, action);
|
||||
(!isVirtualScreenshareParticipant && !isWhiteboard) && _maybePlaySounds(store, action);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -514,6 +514,7 @@ function _participantJoined({ participant }: { participant: Participant; }) {
|
||||
isLocalScreenShare,
|
||||
isReplacing,
|
||||
isJigasi,
|
||||
isWhiteboard,
|
||||
loadableAvatarUrl,
|
||||
local,
|
||||
name,
|
||||
@@ -548,6 +549,7 @@ function _participantJoined({ participant }: { participant: Participant; }) {
|
||||
isLocalScreenShare,
|
||||
isReplacing,
|
||||
isJigasi,
|
||||
isWhiteboard,
|
||||
loadableAvatarUrl,
|
||||
local: local || false,
|
||||
name,
|
||||
|
||||
@@ -19,6 +19,7 @@ export interface Participant {
|
||||
isReplaced?: boolean;
|
||||
isReplacing?: number;
|
||||
isVirtualScreenshareParticipant?: boolean;
|
||||
isWhiteboard?: boolean;
|
||||
jwtId?: string;
|
||||
loadableAvatarUrl?: string;
|
||||
loadableAvatarUrlUseCORS?: boolean;
|
||||
|
||||
@@ -12,7 +12,6 @@ import { IconArrowDownSmall, IconWifi1Bar, IconWifi2Bars, IconWifi3Bars } from '
|
||||
import { connect } from '../../../redux/functions';
|
||||
import { PREJOIN_DEFAULT_CONTENT_WIDTH } from '../../../ui/components/variables';
|
||||
import { CONNECTION_TYPE } from '../../constants';
|
||||
// @ts-ignore
|
||||
import { getConnectionData } from '../../functions';
|
||||
|
||||
interface Props extends WithTranslation {
|
||||
|
||||
@@ -9,7 +9,6 @@ import { setPrejoinPageVisibility } from '../../prejoin/actions';
|
||||
import { APP_WILL_MOUNT } from '../app/actionTypes';
|
||||
import { setAudioOnly } from '../audio-only/actions';
|
||||
import { SET_LOCATION_URL } from '../connection/actionTypes'; // minimize imports to avoid circular imports
|
||||
// @ts-ignore
|
||||
import { getJwtName } from '../jwt/functions';
|
||||
import { participantUpdated } from '../participants/actions';
|
||||
import { getLocalParticipant } from '../participants/functions';
|
||||
|
||||
@@ -53,6 +53,7 @@ const DEFAULT_STATE: ISettingsState = {
|
||||
|
||||
export interface ISettingsState {
|
||||
audioOutputDeviceId?: string | boolean;
|
||||
audioSettingsVisible?: boolean;
|
||||
avatarURL?: string;
|
||||
cameraDeviceId?: string | boolean;
|
||||
disableCallIntegration?: boolean;
|
||||
@@ -85,6 +86,7 @@ export interface ISettingsState {
|
||||
[key: string]: boolean;
|
||||
} | boolean;
|
||||
userSelectedSkipPrejoin?: boolean;
|
||||
videoSettingsVisible?: boolean;
|
||||
visible?: boolean;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ import {
|
||||
_ADD_AUDIO_ELEMENT,
|
||||
_REMOVE_AUDIO_ELEMENT
|
||||
} from './actionTypes';
|
||||
// @ts-ignore
|
||||
import logger from './logger';
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,7 +5,7 @@ import { showErrorNotification, showNotification } from '../../notifications/act
|
||||
import { NOTIFICATION_TIMEOUT, NOTIFICATION_TIMEOUT_TYPE } from '../../notifications/constants';
|
||||
import { getCurrentConference } from '../conference/functions';
|
||||
import { IJitsiConference } from '../conference/reducer';
|
||||
import { getMultipleVideoSendingSupportFeatureFlag } from '../config/functions.any';
|
||||
import { getMultipleVideoSendingSupportFeatureFlag, getMultipleVideoSupportFeatureFlag } from '../config/functions.any';
|
||||
import { JitsiTrackErrors, JitsiTrackEvents } from '../lib-jitsi-meet';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
@@ -407,10 +407,11 @@ export function trackAdded(track: any) {
|
||||
JitsiTrackEvents.TRACK_VIDEOTYPE_CHANGED,
|
||||
(type: VideoType) => dispatch(trackVideoTypeChanged(track, type)));
|
||||
|
||||
// participantId
|
||||
const local = track.isLocal();
|
||||
const mediaType = getMultipleVideoSendingSupportFeatureFlag(getState())
|
||||
&& track.getVideoType() === VIDEO_TYPE.DESKTOP
|
||||
const isVirtualScreenshareParticipantCreated = local
|
||||
? getMultipleVideoSendingSupportFeatureFlag(getState())
|
||||
: getMultipleVideoSupportFeatureFlag(getState());
|
||||
const mediaType = track.getVideoType() === VIDEO_TYPE.DESKTOP && isVirtualScreenshareParticipantCreated
|
||||
? MEDIA_TYPE.SCREENSHARE
|
||||
: track.getType();
|
||||
let isReceivingData, noDataFromSourceNotificationInfo, participantId;
|
||||
|
||||
@@ -132,9 +132,6 @@ export async function createLocalPresenterTrack(options: TrackOptions, desktopHe
|
||||
* @param {boolean} [options.firePermissionPromptIsShownEvent] - Whether lib-jitsi-meet
|
||||
* should check for a {@code getUserMedia} permission prompt and fire a
|
||||
* corresponding event.
|
||||
* @param {boolean} [options.fireSlowPromiseEvent] - Whether lib-jitsi-meet
|
||||
* should check for a slow {@code getUserMedia} request and fire a
|
||||
* corresponding event.
|
||||
* @param {IStore} store - The redux store in the context of which the function
|
||||
* is to execute and from which state such as {@code config} is to be retrieved.
|
||||
* @returns {Promise<JitsiLocalTrack[]>}
|
||||
@@ -145,7 +142,6 @@ export function createLocalTracksF(options: TrackOptions = {}, store?: IStore) {
|
||||
desktopSharingSourceDevice,
|
||||
desktopSharingSources,
|
||||
firePermissionPromptIsShownEvent,
|
||||
fireSlowPromiseEvent,
|
||||
timeout
|
||||
} = options;
|
||||
|
||||
@@ -193,7 +189,6 @@ export function createLocalTracksF(options: TrackOptions = {}, store?: IStore) {
|
||||
effects,
|
||||
firefox_fake_device, // eslint-disable-line camelcase
|
||||
firePermissionPromptIsShownEvent,
|
||||
fireSlowPromiseEvent,
|
||||
micDeviceId,
|
||||
resolution,
|
||||
timeout
|
||||
|
||||
@@ -14,7 +14,6 @@ export interface TrackOptions {
|
||||
devices?: string[];
|
||||
facingMode?: string;
|
||||
firePermissionPromptIsShownEvent?: boolean;
|
||||
fireSlowPromiseEvent?: boolean;
|
||||
micDeviceId?: string | null;
|
||||
timeout?: number;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,11 @@ export interface ButtonProps {
|
||||
*/
|
||||
accessibilityLabel?: string;
|
||||
|
||||
/**
|
||||
* Whether or not the button should automatically focus.
|
||||
*/
|
||||
autoFocus?: boolean;
|
||||
|
||||
/**
|
||||
* Whether or not the button is disabled.
|
||||
*/
|
||||
|
||||
@@ -178,6 +178,7 @@ const useStyles = makeStyles()((theme: Theme) => {
|
||||
|
||||
const Button = React.forwardRef<any, any>(({
|
||||
accessibilityLabel,
|
||||
autoFocus = false,
|
||||
className,
|
||||
disabled,
|
||||
fullWidth,
|
||||
@@ -197,6 +198,7 @@ const Button = React.forwardRef<any, any>(({
|
||||
return (
|
||||
<button
|
||||
aria-label = { accessibilityLabel }
|
||||
autoFocus = { autoFocus }
|
||||
className = { cx(styles.button, styles[type],
|
||||
disabled && styles.disabled,
|
||||
icon && !(labelKey || label) && `${styles.iconButton} iconButton`,
|
||||
|
||||
@@ -24,6 +24,11 @@ const useStyles = makeStyles()((theme: Theme) => {
|
||||
backgroundColor: theme.palette.ui02
|
||||
},
|
||||
|
||||
'&:focus': {
|
||||
outline: 0,
|
||||
boxShadow: `0px 0px 0px 2px ${theme.palette.focus01}`
|
||||
},
|
||||
|
||||
'&:active': {
|
||||
backgroundColor: theme.palette.ui03
|
||||
},
|
||||
|
||||
267
react/features/base/ui/components/web/Dialog.tsx
Normal file
267
react/features/base/ui/components/web/Dialog.tsx
Normal file
@@ -0,0 +1,267 @@
|
||||
import { Theme } from '@mui/material';
|
||||
import React, { ReactElement, useCallback, useContext, useEffect } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useDispatch } from 'react-redux';
|
||||
import { keyframes } from 'tss-react';
|
||||
import { makeStyles } from 'tss-react/mui';
|
||||
|
||||
import { hideDialog } from '../../../dialog/actions';
|
||||
import { IconClose } from '../../../icons/svg';
|
||||
import { withPixelLineHeight } from '../../../styles/functions.web';
|
||||
|
||||
import Button from './Button';
|
||||
import ClickableIcon from './ClickableIcon';
|
||||
import { DialogTransitionContext } from './DialogTransition';
|
||||
|
||||
|
||||
const useStyles = makeStyles()((theme: Theme) => {
|
||||
return {
|
||||
container: {
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
position: 'fixed',
|
||||
top: 0,
|
||||
left: 0,
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'flex-start',
|
||||
animation: `${keyframes`
|
||||
0% {
|
||||
opacity: 0.4;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
`} 0.2s forwards ease-out`,
|
||||
|
||||
'&.unmount': {
|
||||
animation: `${keyframes`
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
opacity: 0.5;
|
||||
}
|
||||
`} 0.15s forwards ease-in`
|
||||
}
|
||||
},
|
||||
|
||||
backdrop: {
|
||||
position: 'absolute',
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
top: 0,
|
||||
left: 0,
|
||||
backgroundColor: theme.palette.ui02,
|
||||
opacity: 0.75
|
||||
},
|
||||
|
||||
modal: {
|
||||
zIndex: 1,
|
||||
backgroundColor: theme.palette.ui01,
|
||||
border: `1px solid ${theme.palette.ui03}`,
|
||||
boxShadow: '0px 4px 25px 4px rgba(20, 20, 20, 0.6)',
|
||||
borderRadius: `${theme.shape.borderRadius}px`,
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
height: 'auto',
|
||||
minHeight: '200px',
|
||||
maxHeight: '560px',
|
||||
marginTop: '64px',
|
||||
animation: `${keyframes`
|
||||
0% {
|
||||
margin-top: 85px
|
||||
}
|
||||
100% {
|
||||
margin-top: 64px
|
||||
}
|
||||
`} 0.2s forwards ease-out`,
|
||||
|
||||
'&.medium': {
|
||||
width: '400px'
|
||||
},
|
||||
|
||||
'&.large': {
|
||||
width: '664px'
|
||||
},
|
||||
|
||||
'&.unmount': {
|
||||
animation: `${keyframes`
|
||||
0% {
|
||||
margin-top: 64px
|
||||
}
|
||||
100% {
|
||||
margin-top: 40px
|
||||
}
|
||||
`} 0.15s forwards ease-in`
|
||||
},
|
||||
|
||||
'@media (max-width: 448px)': {
|
||||
width: '100% !important',
|
||||
maxHeight: 'initial',
|
||||
height: '100%',
|
||||
margin: 0,
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: 0,
|
||||
bottom: 0,
|
||||
animation: `${keyframes`
|
||||
0% {
|
||||
margin-top: 15px
|
||||
}
|
||||
100% {
|
||||
margin-top: 0
|
||||
}
|
||||
`} 0.2s forwards ease-out`,
|
||||
|
||||
'&.unmount': {
|
||||
animation: `${keyframes`
|
||||
0% {
|
||||
margin-top: 0
|
||||
}
|
||||
100% {
|
||||
margin-top: 15px
|
||||
}
|
||||
`} 0.15s forwards ease-in`
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
header: {
|
||||
width: '100%',
|
||||
padding: '24px',
|
||||
boxSizing: 'border-box',
|
||||
display: 'flex',
|
||||
alignItems: 'flex-start',
|
||||
justifyContent: 'space-between'
|
||||
},
|
||||
|
||||
title: {
|
||||
color: theme.palette.text01,
|
||||
...withPixelLineHeight(theme.typography.heading5),
|
||||
margin: 0,
|
||||
padding: 0
|
||||
},
|
||||
|
||||
content: {
|
||||
height: 'auto',
|
||||
overflowY: 'auto',
|
||||
width: '100%',
|
||||
boxSizing: 'border-box',
|
||||
padding: '0 24px',
|
||||
overflowX: 'hidden',
|
||||
|
||||
'@media (max-width: 448px)': {
|
||||
height: '100%'
|
||||
}
|
||||
},
|
||||
|
||||
footer: {
|
||||
width: '100%',
|
||||
boxSizing: 'border-box',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'flex-end',
|
||||
padding: '24px',
|
||||
|
||||
'& button:last-child': {
|
||||
marginLeft: '16px'
|
||||
}
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
interface DialogProps {
|
||||
cancel?: {
|
||||
hidden?: boolean;
|
||||
translationKey?: string;
|
||||
};
|
||||
children?: ReactElement | ReactElement[];
|
||||
description?: string;
|
||||
ok?: {
|
||||
disabled?: boolean;
|
||||
hidden?: boolean;
|
||||
translationKey?: string;
|
||||
};
|
||||
onCancel?: () => void;
|
||||
onSubmit?: () => void;
|
||||
size?: 'large' | 'medium';
|
||||
title?: string;
|
||||
titleKey?: string;
|
||||
}
|
||||
|
||||
const Dialog = ({
|
||||
cancel = { translationKey: 'dialog.Cancel' },
|
||||
children,
|
||||
description,
|
||||
ok = { translationKey: 'dialog.Ok' },
|
||||
onCancel,
|
||||
onSubmit,
|
||||
size = 'medium',
|
||||
title,
|
||||
titleKey
|
||||
}: DialogProps) => {
|
||||
const { classes, cx } = useStyles();
|
||||
const { t } = useTranslation();
|
||||
const { isUnmounting } = useContext(DialogTransitionContext);
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const onClose = useCallback(() => {
|
||||
onCancel?.();
|
||||
dispatch(hideDialog());
|
||||
}, [ onCancel ]);
|
||||
|
||||
const handleKeyDown = useCallback((e: KeyboardEvent) => {
|
||||
if (e.key === 'Escape') {
|
||||
onClose();
|
||||
}
|
||||
}, []);
|
||||
|
||||
const submit = useCallback(() => {
|
||||
onSubmit?.();
|
||||
dispatch(hideDialog());
|
||||
}, [ onSubmit ]);
|
||||
|
||||
useEffect(() => {
|
||||
window.addEventListener('keydown', handleKeyDown);
|
||||
|
||||
return () => window.removeEventListener('keydown', handleKeyDown);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className = { cx(classes.container, isUnmounting && 'unmount') }>
|
||||
<div
|
||||
className = { classes.backdrop }
|
||||
onClick = { onClose } />
|
||||
<div
|
||||
aria-describedby = { description }
|
||||
aria-labelledby = { title ?? t(titleKey ?? '') }
|
||||
aria-modal = { true }
|
||||
className = { cx(classes.modal, isUnmounting && 'unmount', size) }
|
||||
role = 'dialog'>
|
||||
<div className = { classes.header }>
|
||||
<p className = { classes.title }>{title ?? t(titleKey ?? '')}</p>
|
||||
<ClickableIcon
|
||||
accessibilityLabel = { t('dialog.close') }
|
||||
icon = { IconClose }
|
||||
onClick = { onClose } />
|
||||
</div>
|
||||
<div className = { classes.content }>{children}</div>
|
||||
<div className = { classes.footer }>
|
||||
{!cancel.hidden && <Button
|
||||
accessibilityLabel = { t(cancel.translationKey ?? '') }
|
||||
labelKey = { cancel.translationKey }
|
||||
onClick = { onClose }
|
||||
type = 'tertiary' />}
|
||||
{!ok.hidden && <Button
|
||||
accessibilityLabel = { t(ok.translationKey ?? '') }
|
||||
disabled = { ok.disabled }
|
||||
labelKey = { ok.translationKey }
|
||||
onClick = { submit } />}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Dialog;
|
||||
102
react/features/base/ui/components/web/DialogContainer.tsx
Normal file
102
react/features/base/ui/components/web/DialogContainer.tsx
Normal file
@@ -0,0 +1,102 @@
|
||||
import { ModalTransition } from '@atlaskit/modal-dialog';
|
||||
import React, { Component, ComponentType } from 'react';
|
||||
|
||||
import { IState } from '../../../../app/types';
|
||||
import { ReactionEmojiProps } from '../../../../reactions/constants';
|
||||
import { connect } from '../../../redux/functions';
|
||||
|
||||
import DialogTransition from './DialogTransition';
|
||||
|
||||
interface Props {
|
||||
|
||||
/**
|
||||
* The component to render.
|
||||
*/
|
||||
_component: ComponentType;
|
||||
|
||||
/**
|
||||
* The props to pass to the component that will be rendered.
|
||||
*/
|
||||
_componentProps: Object;
|
||||
|
||||
/**
|
||||
* Whether the dialog is using the new component.
|
||||
*/
|
||||
_isNewDialog: boolean;
|
||||
|
||||
/**
|
||||
* Array of reactions to be displayed.
|
||||
*/
|
||||
_reactionsQueue: Array<ReactionEmojiProps>;
|
||||
|
||||
/**
|
||||
* True if the UI is in a compact state where we don't show dialogs.
|
||||
*/
|
||||
_reducedUI: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements a DialogContainer responsible for showing all dialogs. Necessary
|
||||
* for supporting @atlaskit's modal animations.
|
||||
*
|
||||
*/
|
||||
class DialogContainer extends Component<Props> {
|
||||
|
||||
/**
|
||||
* Returns the dialog to be displayed.
|
||||
*
|
||||
* @private
|
||||
* @returns {ReactElement|null}
|
||||
*/
|
||||
_renderDialogContent() {
|
||||
const {
|
||||
_component: component,
|
||||
_reducedUI: reducedUI
|
||||
} = this.props;
|
||||
|
||||
return (
|
||||
component && !reducedUI
|
||||
? React.createElement(component, this.props._componentProps)
|
||||
: null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements React's {@link Component#render()}.
|
||||
*
|
||||
* @inheritdoc
|
||||
* @returns {ReactElement}
|
||||
*/
|
||||
render() {
|
||||
return this.props._isNewDialog ? (
|
||||
<DialogTransition>
|
||||
{this._renderDialogContent()}
|
||||
</DialogTransition>
|
||||
) : (
|
||||
<ModalTransition>
|
||||
{ this._renderDialogContent() }
|
||||
</ModalTransition>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps (parts of) the redux state to the associated
|
||||
* {@code AbstractDialogContainer}'s props.
|
||||
*
|
||||
* @param {Object} state - The redux state.
|
||||
* @private
|
||||
* @returns {Props}
|
||||
*/
|
||||
function mapStateToProps(state: IState) {
|
||||
const stateFeaturesBaseDialog = state['features/base/dialog'];
|
||||
const { reducedUI } = state['features/base/responsive-ui'];
|
||||
|
||||
return {
|
||||
_component: stateFeaturesBaseDialog.component,
|
||||
_componentProps: stateFeaturesBaseDialog.componentProps,
|
||||
_isNewDialog: stateFeaturesBaseDialog.isNewDialog,
|
||||
_reducedUI: reducedUI
|
||||
};
|
||||
}
|
||||
|
||||
export default connect(mapStateToProps)(DialogContainer);
|
||||
28
react/features/base/ui/components/web/DialogTransition.tsx
Normal file
28
react/features/base/ui/components/web/DialogTransition.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
import React, { ReactElement, useEffect, useState } from 'react';
|
||||
|
||||
export const DialogTransitionContext = React.createContext({ isUnmounting: false });
|
||||
|
||||
const DialogTransition = ({ children }: { children: ReactElement | null; }) => {
|
||||
const [ childrenToRender, setChildrenToRender ] = useState(children);
|
||||
const [ isUnmounting, setIsUnmounting ] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (children === null) {
|
||||
setIsUnmounting(true);
|
||||
setTimeout(() => {
|
||||
setChildrenToRender(children);
|
||||
setIsUnmounting(false);
|
||||
}, 150);
|
||||
} else {
|
||||
setChildrenToRender(children);
|
||||
}
|
||||
}, [ children ]);
|
||||
|
||||
return (
|
||||
<DialogTransitionContext.Provider value = {{ isUnmounting }}>
|
||||
{childrenToRender}
|
||||
</DialogTransitionContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
export default DialogTransition;
|
||||
@@ -1,42 +1,40 @@
|
||||
// @flow
|
||||
|
||||
import { PureComponent } from 'react';
|
||||
import { WithTranslation } from 'react-i18next';
|
||||
|
||||
import { getParticipantById } from '../../base/participants';
|
||||
import { IState, IStore } from '../../app/types';
|
||||
import { getParticipantById } from '../../base/participants/functions';
|
||||
import { Participant } from '../../base/participants/types';
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
import { sendMessage, setPrivateMessageRecipient } from '../actions';
|
||||
|
||||
type Props = {
|
||||
|
||||
/**
|
||||
* The message that is about to be sent.
|
||||
*/
|
||||
message: Object,
|
||||
|
||||
/**
|
||||
* The ID of the participant that we think the message may be intended to.
|
||||
*/
|
||||
participantID: string,
|
||||
|
||||
/**
|
||||
* Function to be used to translate i18n keys.
|
||||
*/
|
||||
t: Function,
|
||||
interface Props extends WithTranslation {
|
||||
|
||||
/**
|
||||
* Prop to be invoked on sending the message.
|
||||
*/
|
||||
_onSendMessage: Function,
|
||||
_onSendMessage: Function;
|
||||
|
||||
/**
|
||||
* Prop to be invoked when the user wants to set a private recipient.
|
||||
*/
|
||||
_onSetMessageRecipient: Function,
|
||||
_onSetMessageRecipient: Function;
|
||||
|
||||
/**
|
||||
* The participant retrieved from Redux by the participanrID prop.
|
||||
*/
|
||||
_participant: Object
|
||||
};
|
||||
_participant: Object;
|
||||
|
||||
/**
|
||||
* The message that is about to be sent.
|
||||
*/
|
||||
message: Object;
|
||||
|
||||
/**
|
||||
* The ID of the participant that we think the message may be intended to.
|
||||
*/
|
||||
participantID: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Abstract class for the dialog displayed to avoid mis-sending private messages.
|
||||
@@ -54,8 +52,6 @@ export class AbstractChatPrivacyDialog extends PureComponent<Props> {
|
||||
this._onSendPrivateMessage = this._onSendPrivateMessage.bind(this);
|
||||
}
|
||||
|
||||
_onSendGroupMessage: () => boolean;
|
||||
|
||||
/**
|
||||
* Callback to be invoked for cancel action (user wants to send a group message).
|
||||
*
|
||||
@@ -67,8 +63,6 @@ export class AbstractChatPrivacyDialog extends PureComponent<Props> {
|
||||
return true;
|
||||
}
|
||||
|
||||
_onSendPrivateMessage: () => boolean;
|
||||
|
||||
/**
|
||||
* Callback to be invoked for submit action (user wants to send a private message).
|
||||
*
|
||||
@@ -90,13 +84,13 @@ export class AbstractChatPrivacyDialog extends PureComponent<Props> {
|
||||
* @param {Function} dispatch - The Redux dispatch function.
|
||||
* @returns {Props}
|
||||
*/
|
||||
export function _mapDispatchToProps(dispatch: Function): $Shape<Props> {
|
||||
export function _mapDispatchToProps(dispatch: IStore['dispatch']) {
|
||||
return {
|
||||
_onSendMessage: (message: Object) => {
|
||||
dispatch(sendMessage(message, true));
|
||||
},
|
||||
|
||||
_onSetMessageRecipient: participant => {
|
||||
_onSetMessageRecipient: (participant: Participant) => {
|
||||
dispatch(setPrivateMessageRecipient(participant));
|
||||
}
|
||||
};
|
||||
@@ -105,11 +99,11 @@ export function _mapDispatchToProps(dispatch: Function): $Shape<Props> {
|
||||
/**
|
||||
* Maps part of the Redux store to the props of this component.
|
||||
*
|
||||
* @param {Object} state - The Redux state.
|
||||
* @param {IState} state - The Redux state.
|
||||
* @param {Props} ownProps - The own props of the component.
|
||||
* @returns {Props}
|
||||
*/
|
||||
export function _mapStateToProps(state: Object, ownProps: Props): $Shape<Props> {
|
||||
export function _mapStateToProps(state: IState, ownProps: Props) {
|
||||
return {
|
||||
_participant: getParticipantById(state, ownProps.participantID)
|
||||
};
|
||||
@@ -162,9 +162,7 @@ class Chat extends AbstractChat<Props> {
|
||||
<MessageContainer
|
||||
messages = { this.props._messages } />
|
||||
<MessageRecipient />
|
||||
|
||||
<ChatInput
|
||||
onResize = { this._onChatInputResize }
|
||||
onSend = { this._onSendMessage } />
|
||||
</div>
|
||||
</>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user