Compare commits

...

45 Commits

Author SHA1 Message Date
Saúl Ibarra Corretgé
cd48025d09 fix(doc) update README 2022-10-05 22:17:59 +02:00
Дамян Минков
e52c9043a5 feat: Adds some compatibility for building on windows. 2022-10-05 10:49:51 -05:00
Дамян Минков
ee5817539b fix: Fixes cert choice when pre-set in automations. (#12312)
* fix: Fixes cert choice when pre-set in automations.

* squash: fix
2022-10-05 10:49:21 -05:00
Jaya Allamsetty
da9b5a9156 fix(multi-stream): Set mediaType to screenshare on SS tracks.
Fixes an issue where camera video doesn't get requested by RN clients when the remote ep starts SS first before turning on their camera.
2022-10-05 09:50:57 -04:00
Дамян Минков
bb84c47e78 feat: Updates prosody dependency to be at least 0.11.7. 2022-10-05 08:16:43 -05:00
Дамян Минков
13f4da7855 fix: Workaround failure to install jitsi-meet-prosody Fixes #12300 2022-10-05 06:56:25 -05:00
Saúl Ibarra Corretgé
f935b29629 feat(rn,config) default to VP8 on mobile
VP9 is too resource intensive.

H.264 might be coming back for P2P but we need to fix support for
Android first, since it's not available with the default software codec
factory.
2022-10-04 22:43:51 +02:00
mbondarenko
f5f689c53d Added config option for enabling Opus DTX flag which used for reduction in the audio traffic, when a participant is silent then the audio packet won’t be transmitted. 2022-10-04 16:05:35 -04:00
Saúl Ibarra Corretgé
af4ba32803 chore(deps) react-native-webrtc@1.106.1
Last to support Plan B.

The method to embed WebRTC has changed to use CocoaPods.
2022-10-04 22:02:19 +02:00
kerem
9e11bc302b feat(deps,rn) update React Native to version 0.68.3 (#12293)
* feat(deps,rn) update React Native to version 0.68.3

Co-authored-by: keremoge <kerem.oge@albarakatech.com>
2022-10-04 19:29:23 +03:00
Saúl Ibarra Corretgé
438b3924d7 fix(ios,callkit) make sure the start call action is fulfilled 2022-10-04 16:32:46 +02:00
Horatiu Muresan
a2d0492007 feat(toolbar-buttons) Hide buttons disabled through JWT (#12261) 2022-10-04 16:02:49 +03:00
Robert Pintilii
c35d1d8d4b ref(polls) Convert files to TS (#12296) 2022-10-04 15:06:02 +03:00
Robert Pintilii
7d7bf987a1 fix(lobby) Make password hidden by default (#12295) 2022-10-04 13:52:37 +03:00
Robert Pintilii
3e744c5ffe ref(TS) Convert some files to TS (#12289) 2022-10-04 13:52:09 +03:00
Robert Pintilii
f4f8808d95 ref(ui-components) Update some dialogs to use the new component (#12288)
Improve Dialog component to auto close on cancel or on submit
Change logic to determine whether a dialog is using the new component
Convert some files to TS
2022-10-04 12:44:48 +03:00
Robert Pintilii
21bcbdc12f feat(local-recording) Change tab title to help identifying it (#12294) 2022-10-04 11:59:19 +03:00
Saúl Ibarra Corretgé
090433b6e8 feat(ci) cache npm package data
Ref: https://github.com/actions/setup-node#caching-global-packages-data
2022-10-03 13:13:53 +02:00
Saúl Ibarra Corretgé
230cbfac1e feat(ci) move linting to its own step
This allows it to run in parallel, and should make the overall run
faster.
2022-10-03 13:13:53 +02:00
Horatiu Muresan
c56c5bd145 fix(polls) Fix autoscroll for polls causing layout issues 2022-10-03 12:39:08 +03:00
Tamas Domokos
f5a4fd4bc2 fix (translation) remove unused i18n import 2022-10-03 11:15:12 +02:00
Calin-Teodor
cb881311e7 feat(mobile/navigation): updated translations for screen headers 2022-10-03 12:04:06 +03:00
Nakorn
ac2698f829 12272 2022-10-01 07:16:37 +02:00
Nakorn
5fafb5d29e Update Chinese translations 2022-10-01 07:16:37 +02:00
Saúl Ibarra Corretgé
fbcdb250f4 fix(ts) fix build on macOS
Why this line fails is a mystery, but it's only reproducible on macOS.
2022-09-30 15:43:40 -05:00
Saúl Ibarra Corretgé
ba8529d72b feat(ci) run GHA also on macOS 2022-09-30 15:43:40 -05:00
Mihaela Dumitru
1230cebde2 fix(avatar) support icons alongside cors avatars (#12280) 2022-09-30 17:51:16 +03:00
Mihaela Dumitru
93406bb12c feat(whiteboard) add initial implementation (#12185) 2022-09-30 17:50:45 +03:00
dependabot[bot]
d43eea91cf chore(deps): bump nth-check and @svgr/webpack
Bumps [nth-check](https://github.com/fb55/nth-check) to 2.1.1 and updates ancestor dependency [@svgr/webpack](https://github.com/gregberge/svgr). These dependencies need to be updated together.


Updates `nth-check` from 1.0.2 to 2.1.1
- [Release notes](https://github.com/fb55/nth-check/releases)
- [Commits](https://github.com/fb55/nth-check/compare/v1.0.2...v2.1.1)

Updates `@svgr/webpack` from 4.3.2 to 6.3.1
- [Release notes](https://github.com/gregberge/svgr/releases)
- [Changelog](https://github.com/gregberge/svgr/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gregberge/svgr/compare/v4.3.2...v6.3.1)

---
updated-dependencies:
- dependency-name: nth-check
  dependency-type: indirect
- dependency-name: "@svgr/webpack"
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-30 11:08:45 +02:00
Robert Pintilii
7364c7f27b ref(TS) Remove unnecessary ts-ignores 2022-09-30 11:08:03 +02:00
Calinteodor
2de2500080 feat(mobile/navigation/welcome): welcome page tabs translations 2022-09-30 11:07:00 +02:00
TTG
349e4bfb57 fix(lang) update Chinese translations & fix typo 2022-09-30 09:08:34 +02:00
Christoph Settgast
4f92811263 fix(lang) update German translation (#12277) 2022-09-29 22:10:01 +02:00
abora8x8
a4e35f81cf fix(polls) refactor message handling 2022-09-29 19:28:24 +02:00
Alexandru Petrus
7aefc3b94a feat(invite-dialog) Add limit message for invite dialog 2022-09-29 19:06:14 +03:00
Avram Tudor
3c180d3932 ref(join) remove overlay shown for a slow gUM flow (#12268) 2022-09-29 16:55:31 +03:00
Saúl Ibarra Corretgé
c523c07cb7 fix(config) drop debug lefover 2022-09-29 13:47:43 +02:00
Robert Pintilii
5c77f61037 ref(gifs) Convert feature to TS (#12264) 2022-09-29 14:45:34 +03:00
tamasdomokos
8162ae4dbe fix(translation) translation button visibility for users, add missing languages 2022-09-29 13:44:59 +02:00
Calin-Teodor
69e0a37529 feat(base/ui): added autofocus prop 2022-09-29 13:31:20 +03:00
Robert Pintilii
bfa88f13dc feat(ui-components) Add Dialog Component (#12260) 2022-09-29 13:26:34 +03:00
Robert Pintilii
0d917df1fb ref(feedback) Use new Input component (#12265)
Remove @atlaskit/field-text-area dep
2022-09-29 12:40:16 +03:00
Jaya Allamsetty
95a3a8de0b fix(face-landmarks): Check mute state from redux before starting detection. 2022-09-28 11:48:13 -04:00
Bogdan Duduman
f4985d8028 increase heap node for build 2022-09-28 06:27:31 -05:00
William Liang
5d6aec3f3c fix(speaker-stats) decouple sort order from speaker stats (#12197) 2022-09-28 10:51:53 +03:00
191 changed files with 5385 additions and 3894 deletions

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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"

View File

@@ -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;

View File

@@ -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 wont 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

View File

@@ -45,3 +45,7 @@
margin: -16px -24px;
z-index: $popoverZ;
}
.excalidraw .popover {
margin: 0;
}

View File

@@ -3,6 +3,7 @@
* tiled thumbnail experience.
*/
.tile-view,
.whiteboard-container,
.stage-filmstrip {
/**
* Let the avatar grow with the tile.

View File

@@ -28,7 +28,7 @@
color: #6FB1EA;
}
& > :first-child:not(:last-child) {
& > :not(:last-child) {
margin-right: 24px;
}
}

4
debian/control vendored
View File

@@ -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

View File

@@ -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"

View File

@@ -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
View File

@@ -14,5 +14,7 @@ declare global {
interface Window {
config?: IConfig;
JITSI_MEET_LITE_SDK?: boolean;
interfaceConfig?: any;
}
}

View File

@@ -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');

View File

@@ -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

View File

@@ -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

View File

@@ -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 */,

View File

@@ -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 {

View File

@@ -967,7 +967,6 @@
"playSounds": "تشغيل الصوت عند:",
"reactions": "ردود فعل المُلتقى",
"sameAsSystem": "مثل النظام ({{label}})",
"screenTitle": "إعدادات",
"selectAudioOutput": "خرج الصوت",
"selectCamera": "الكاميرا",
"selectMic": "المايكروفون",
@@ -1353,6 +1352,7 @@
"roomname": "أدخل اسم الغرفة",
"roomnameHint": "أدخل اسم أو رابط الغرفة التي تريد الانضمام إليها. يمكنك إنشاء اسم جديد لترسله إلى من تريد أن تجتمع معهم.",
"sendFeedback": "أبدِ رأيك",
"settings": "إعدادات",
"startMeeting": "إبدأ المُلتقى",
"terms": "الشروط",
"title": "منصة عقد مؤتمرات ومُلتقيات آمنة وكاملة المزايا ومجانية بالمطلق"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -967,7 +967,6 @@
"playSounds": "Увімкнути звукові сповіщення:",
"reactions": "Емоційна реакція",
"sameAsSystem": "Системний пристрій ({{label}})",
"screenTitle": "Налаштування",
"selectAudioOutput": "Вивід звуку",
"selectCamera": "Камера",
"selectMic": "Мікрофон",
@@ -1353,6 +1352,7 @@
"roomname": "Зазначте назву кімнати",
"roomnameHint": "Зазначте назву кімнати або URL-адресу зустрічі, до якої ви хочете приєднатися. Ви можете придумати будь-яку назву. Повідомте її іншим учасникам, щоб вони приєднувалися до цієї кімнати.",
"sendFeedback": "Надіслати відгук",
"settings": "Налаштування",
"startMeeting": "Почати зустріч",
"terms": "Умови користування",
"title": "Захищена, повнофункціональна та безкоштовна система відеоконференцій"

View File

@@ -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": "安全、功能完善、完全免费的视频会议"

View File

@@ -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": "安全、功能齊全、完全免費的視訊會議"

View File

@@ -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"

View 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

File diff suppressed because it is too large Load Diff

View File

@@ -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",

View File

@@ -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';

View File

@@ -1,4 +1,3 @@
// @ts-ignore
import amplitude from 'amplitude-js';
export default amplitude;

View File

@@ -16,7 +16,6 @@ import {
import {
getLocalAudioTrack,
getLocalVideoTrack
// @ts-ignore
} from '../base/tracks/functions';
import { createLocalTracksDurationEvent, createNetworkInfoEvent } from './AnalyticsEvents';

View File

@@ -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';

View File

@@ -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';

View File

@@ -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';

View File

@@ -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;
}

View File

@@ -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';

View File

@@ -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);
}
};

View File

@@ -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: {

View File

@@ -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));
}

View File

@@ -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';

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
};
}

View File

@@ -230,5 +230,6 @@ export default [
'useTurnUdp',
'videoQuality',
'webrtcIceTcpDisable',
'webrtcIceUdpDisable'
'webrtcIceUdpDisable',
'whiteboard.enabled'
].concat(extraConfigWhitelist);

View File

@@ -47,7 +47,8 @@ export const TOOLBAR_BUTTONS = [
'stats',
'tileview',
'toggle-camera',
'videoquality'
'videoquality',
'whiteboard'
];
/**

View File

@@ -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'];
}

View File

@@ -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'
}
};

View File

@@ -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';

View File

@@ -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 {

View File

@@ -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';

View File

@@ -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 {

View File

@@ -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'];

View File

@@ -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);

View File

@@ -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';

View File

@@ -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')
};

View 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);
});

View File

@@ -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:

View File

@@ -1,4 +1,3 @@
// @ts-ignore
import JitsiMeetJS from '../lib-jitsi-meet';
import Platform from '../react/Platform.web';

View File

@@ -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',

View File

@@ -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';

View File

@@ -1,5 +1,3 @@
// @flow
import { getLogger } from '../logging/functions';
export default getLogger('features/base/i18n');

View File

@@ -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';
/**

View File

@@ -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';

View 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

View 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

View File

@@ -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'
};

View File

@@ -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.

View File

@@ -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';

View File

@@ -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 {

View File

@@ -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.

View File

@@ -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;

View File

@@ -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

View File

@@ -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';

View File

@@ -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

View File

@@ -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';

View File

@@ -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
}
};

View File

@@ -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;

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -19,6 +19,7 @@ export interface Participant {
isReplaced?: boolean;
isReplacing?: number;
isVirtualScreenshareParticipant?: boolean;
isWhiteboard?: boolean;
jwtId?: string;
loadableAvatarUrl?: string;
loadableAvatarUrlUseCORS?: boolean;

View File

@@ -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 {

View File

@@ -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';

View File

@@ -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;
}

View File

@@ -10,7 +10,6 @@ import {
_ADD_AUDIO_ELEMENT,
_REMOVE_AUDIO_ELEMENT
} from './actionTypes';
// @ts-ignore
import logger from './logger';
/**

View File

@@ -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;

View File

@@ -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

View File

@@ -14,7 +14,6 @@ export interface TrackOptions {
devices?: string[];
facingMode?: string;
firePermissionPromptIsShownEvent?: boolean;
fireSlowPromiseEvent?: boolean;
micDeviceId?: string | null;
timeout?: number;
}

View File

@@ -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.
*/

View File

@@ -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`,

View File

@@ -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
},

View 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;

View 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);

View 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;

View File

@@ -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)
};

View File

@@ -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