mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-31 03:42:29 +00:00
Compare commits
421 Commits
rm-dead-co
...
7331
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55f66e236e | ||
|
|
70be08212d | ||
|
|
acb91990bf | ||
|
|
cd37cdd675 | ||
|
|
935a391525 | ||
|
|
d0f9231603 | ||
|
|
e461ec7027 | ||
|
|
5dc63f0632 | ||
|
|
f3dbf34842 | ||
|
|
66a9c4df25 | ||
|
|
e95a31c114 | ||
|
|
8565208d30 | ||
|
|
c1573057df | ||
|
|
904f820555 | ||
|
|
5172eda6b9 | ||
|
|
594a05a097 | ||
|
|
9ccdb62872 | ||
|
|
28d32cf740 | ||
|
|
ecc9b991ab | ||
|
|
5b83a91f9b | ||
|
|
bb7ae777b0 | ||
|
|
06e86a2f3e | ||
|
|
0a84dbb302 | ||
|
|
804f9041a6 | ||
|
|
7e8756a536 | ||
|
|
3b91e79675 | ||
|
|
dfc25e4519 | ||
|
|
d40aecb05d | ||
|
|
34e0b0392f | ||
|
|
8cc4a3c8b9 | ||
|
|
354a3c002a | ||
|
|
7d5eec779e | ||
|
|
90029003be | ||
|
|
c781884532 | ||
|
|
7272fd62a0 | ||
|
|
f21bd62ed0 | ||
|
|
842d0a9aef | ||
|
|
e06645a631 | ||
|
|
ebb65ea90c | ||
|
|
a7831ad809 | ||
|
|
80cfb80397 | ||
|
|
ae281e9935 | ||
|
|
b800ad8427 | ||
|
|
051cf67ce9 | ||
|
|
85e1333ad9 | ||
|
|
f02c7557af | ||
|
|
e82a5cf150 | ||
|
|
c92ce56110 | ||
|
|
4cae954eba | ||
|
|
b9d5838398 | ||
|
|
fcf723c679 | ||
|
|
06b67dcf44 | ||
|
|
61e9cacceb | ||
|
|
475c2f4606 | ||
|
|
20f2bfa449 | ||
|
|
4c0c36d233 | ||
|
|
59f1ee1e1e | ||
|
|
1af90a208e | ||
|
|
22c6b72a75 | ||
|
|
d8c7f8de81 | ||
|
|
f76122f0b0 | ||
|
|
63927db9e4 | ||
|
|
6b28af8329 | ||
|
|
ccebccf8e6 | ||
|
|
279a4efb83 | ||
|
|
ceac1ab25f | ||
|
|
2ba6bcf172 | ||
|
|
ae0669fa07 | ||
|
|
71627f97f7 | ||
|
|
e35338b73d | ||
|
|
a112d38943 | ||
|
|
b705c63a65 | ||
|
|
b4c8f7d097 | ||
|
|
74bac9806f | ||
|
|
65248d7d29 | ||
|
|
dc037bc8dd | ||
|
|
a22db037c7 | ||
|
|
44cc0f7e9a | ||
|
|
eafb337cd1 | ||
|
|
9b3be66287 | ||
|
|
1a10a00f74 | ||
|
|
a196bc27b8 | ||
|
|
ac8e4d9828 | ||
|
|
a6ade336b7 | ||
|
|
350443ad34 | ||
|
|
4c37ef7a2c | ||
|
|
3eedc2a49d | ||
|
|
aaeb1a90e5 | ||
|
|
ed89f9af20 | ||
|
|
863ad0b0e6 | ||
|
|
e2d701a8cc | ||
|
|
2710273069 | ||
|
|
07af18e284 | ||
|
|
519e37f567 | ||
|
|
7cf61eb776 | ||
|
|
f81446909c | ||
|
|
b4115593c0 | ||
|
|
f8bd8b616e | ||
|
|
be55ccd6f4 | ||
|
|
e7db18bd80 | ||
|
|
dff41e0fcb | ||
|
|
43be4324af | ||
|
|
c33baf4c96 | ||
|
|
f95a356025 | ||
|
|
1ba7765898 | ||
|
|
0346fca434 | ||
|
|
d267b2499d | ||
|
|
e3e5f1fbfa | ||
|
|
4697192b43 | ||
|
|
38a293f8f6 | ||
|
|
13e8f992b5 | ||
|
|
c384d0d3a9 | ||
|
|
2b71fa512b | ||
|
|
d381ceb040 | ||
|
|
e18c428f52 | ||
|
|
9fc32dc59b | ||
|
|
6f45622ef1 | ||
|
|
e56c7070c2 | ||
|
|
0aef7a36aa | ||
|
|
c030cf941e | ||
|
|
f6760e4ac7 | ||
|
|
9060c77307 | ||
|
|
a1d018eef4 | ||
|
|
3f724d8fb7 | ||
|
|
49d69a5a02 | ||
|
|
6db9e42876 | ||
|
|
ad3e8f9f53 | ||
|
|
9f39caa247 | ||
|
|
1402a63324 | ||
|
|
a9863e65c3 | ||
|
|
646c58f7d1 | ||
|
|
a78ea7ca9c | ||
|
|
8b8565bf60 | ||
|
|
b9e30f3c1b | ||
|
|
96b6edccf8 | ||
|
|
2af9dc88e6 | ||
|
|
eda25ca3c9 | ||
|
|
c99da17973 | ||
|
|
9e147d7842 | ||
|
|
d7afaf871f | ||
|
|
c4f6d37aa1 | ||
|
|
a5663872d9 | ||
|
|
007283aab3 | ||
|
|
3b612376f2 | ||
|
|
1a312e2140 | ||
|
|
6f5d0400b8 | ||
|
|
aec86cecc0 | ||
|
|
bf1dde7cd1 | ||
|
|
91e9005f08 | ||
|
|
57f9ea2865 | ||
|
|
1f6425fbfd | ||
|
|
e169979bab | ||
|
|
6e9e9c9a6a | ||
|
|
102a369bca | ||
|
|
b318b987a7 | ||
|
|
78ce68160a | ||
|
|
6aff616af4 | ||
|
|
0140a49641 | ||
|
|
732754c566 | ||
|
|
b360a9e572 | ||
|
|
f88fa81616 | ||
|
|
e0e66119f5 | ||
|
|
ba4784f149 | ||
|
|
7fb7c3de9c | ||
|
|
3d2d449d31 | ||
|
|
ca60c33dda | ||
|
|
162512496a | ||
|
|
7819c97839 | ||
|
|
e9c8603c3c | ||
|
|
9e165c337a | ||
|
|
58af1b98c0 | ||
|
|
6a077333c6 | ||
|
|
cb234e6b1b | ||
|
|
67a9f35176 | ||
|
|
9396e8b0c0 | ||
|
|
200d857012 | ||
|
|
1a22b7d0dd | ||
|
|
035cccb97b | ||
|
|
ca1c00acb0 | ||
|
|
8836669c9f | ||
|
|
13e818e135 | ||
|
|
fc0fd2d08c | ||
|
|
cc91cfe7b5 | ||
|
|
33564a311b | ||
|
|
2de416c1fa | ||
|
|
64838df712 | ||
|
|
84ad0200a8 | ||
|
|
046f9c53ab | ||
|
|
62f1139193 | ||
|
|
373be54b04 | ||
|
|
00c3ea07e7 | ||
|
|
5a64bd76fb | ||
|
|
57dbd3cf54 | ||
|
|
e772831f7c | ||
|
|
9363b79454 | ||
|
|
cf97ff724c | ||
|
|
c1f1c0d341 | ||
|
|
fd47225d30 | ||
|
|
0e9e884ab4 | ||
|
|
85d13ddfdf | ||
|
|
deadd8ad07 | ||
|
|
b9e5e5f114 | ||
|
|
e5d948af44 | ||
|
|
352ffa589c | ||
|
|
2dac69b679 | ||
|
|
a062fe0d0b | ||
|
|
67692149a2 | ||
|
|
ec4ab7c49c | ||
|
|
6efa4f2475 | ||
|
|
3a2a129f44 | ||
|
|
a828cacbfe | ||
|
|
5d840a5072 | ||
|
|
db5e63411f | ||
|
|
7457480f02 | ||
|
|
c834627949 | ||
|
|
2a0b87ee3e | ||
|
|
ff83276a2b | ||
|
|
0bea2926d2 | ||
|
|
aa3a8f24b8 | ||
|
|
be493c5343 | ||
|
|
47a2943682 | ||
|
|
5201f8791a | ||
|
|
0f4af44220 | ||
|
|
78bdbe2c3f | ||
|
|
e781bc9458 | ||
|
|
847d1dd4b7 | ||
|
|
05a79ec793 | ||
|
|
20fd544ded | ||
|
|
0b65acb528 | ||
|
|
75bb460ccf | ||
|
|
6afb7ba9a6 | ||
|
|
f1ad9dc2e0 | ||
|
|
9d76c54288 | ||
|
|
9ac039a408 | ||
|
|
275e7b00a9 | ||
|
|
44dde32bab | ||
|
|
f72fb4063b | ||
|
|
710dab8b76 | ||
|
|
fde975ba62 | ||
|
|
d75ab7b246 | ||
|
|
46c91b7566 | ||
|
|
206a4afd76 | ||
|
|
570ae81a37 | ||
|
|
5d0d23ac63 | ||
|
|
d61295a8a1 | ||
|
|
a52f9313a6 | ||
|
|
29945f4809 | ||
|
|
b942ce9378 | ||
|
|
1bf0bd6bca | ||
|
|
5706d077e2 | ||
|
|
f1e5903bd1 | ||
|
|
397b94da79 | ||
|
|
649a4ffd46 | ||
|
|
ba57b1afff | ||
|
|
d68f1572a3 | ||
|
|
8c15e940d8 | ||
|
|
89c914272c | ||
|
|
c879f5f04d | ||
|
|
c307a819f6 | ||
|
|
123fa6681f | ||
|
|
46597bd6e7 | ||
|
|
aae0ffc3b3 | ||
|
|
ce5f7ba317 | ||
|
|
1c04a41081 | ||
|
|
9e33839b31 | ||
|
|
ab809875f7 | ||
|
|
ac8e088e50 | ||
|
|
e95b964b78 | ||
|
|
34b2577b97 | ||
|
|
d7cad9d560 | ||
|
|
c6213eb160 | ||
|
|
b5f16c52c9 | ||
|
|
78a4f9b792 | ||
|
|
0792d89c46 | ||
|
|
09426643cf | ||
|
|
1d119cbd36 | ||
|
|
3dd9a303c3 | ||
|
|
31073fb5df | ||
|
|
bc1827fb4a | ||
|
|
aeeca7c343 | ||
|
|
a7fa33286d | ||
|
|
754f658489 | ||
|
|
679711534a | ||
|
|
238bd46480 | ||
|
|
e4d4bec175 | ||
|
|
2b3fbaa360 | ||
|
|
8949753874 | ||
|
|
16115a3a16 | ||
|
|
7c17d80ae8 | ||
|
|
511548060a | ||
|
|
00780929e5 | ||
|
|
a89f762a66 | ||
|
|
82a03c36c6 | ||
|
|
7968578a25 | ||
|
|
62b6411bb6 | ||
|
|
b3bce9e5ae | ||
|
|
ed37bedee2 | ||
|
|
2182a1e452 | ||
|
|
4eea924c02 | ||
|
|
de3b6d2a9f | ||
|
|
2a090d8034 | ||
|
|
238def34cf | ||
|
|
43c4ec0808 | ||
|
|
7910554625 | ||
|
|
56d2af197e | ||
|
|
466a36dc93 | ||
|
|
1fc5d6e97e | ||
|
|
7156df5b99 | ||
|
|
2c8c98aaf3 | ||
|
|
afcedd0f3c | ||
|
|
f253939f28 | ||
|
|
98cba457f2 | ||
|
|
f7e7750cfb | ||
|
|
d9749f3da6 | ||
|
|
45b7f53294 | ||
|
|
27765b47d7 | ||
|
|
185e9d4f58 | ||
|
|
39991da2cf | ||
|
|
f968d5e70a | ||
|
|
f846eb9234 | ||
|
|
126b0d385f | ||
|
|
306c979adb | ||
|
|
99d6012743 | ||
|
|
a94ba85a98 | ||
|
|
f618194587 | ||
|
|
e9c4774695 | ||
|
|
6421df7fa0 | ||
|
|
4ffc2bca5f | ||
|
|
79a252652c | ||
|
|
9eddb71e92 | ||
|
|
ac65b23ccf | ||
|
|
1f6483daae | ||
|
|
c8ecd47ff5 | ||
|
|
50885e258c | ||
|
|
164d305528 | ||
|
|
183de81a57 | ||
|
|
e12999d44f | ||
|
|
8982f17ce1 | ||
|
|
c8f1690057 | ||
|
|
aa57309057 | ||
|
|
fb81619fc5 | ||
|
|
5a5656020b | ||
|
|
0ff44a2f22 | ||
|
|
4d04ea325e | ||
|
|
42ce6dcc58 | ||
|
|
b033d0268a | ||
|
|
4aea40d34f | ||
|
|
e5a170fb28 | ||
|
|
d1cf5578fc | ||
|
|
4b29af6b5f | ||
|
|
f3481576ff | ||
|
|
455a91a5c6 | ||
|
|
297ab194a8 | ||
|
|
077a88a803 | ||
|
|
02c232440e | ||
|
|
f727b9295f | ||
|
|
0d0bec3aad | ||
|
|
cfb8589bef | ||
|
|
65730e256e | ||
|
|
7b8b911fee | ||
|
|
036286a1d6 | ||
|
|
d550254f31 | ||
|
|
b1a71d55d7 | ||
|
|
17ed45799c | ||
|
|
e5681382b0 | ||
|
|
c27cb25afe | ||
|
|
baf5aa14e8 | ||
|
|
29b6ce7721 | ||
|
|
4f95c45e50 | ||
|
|
72dd609247 | ||
|
|
fed74afffe | ||
|
|
204f34cccb | ||
|
|
c81777a475 | ||
|
|
778bca3031 | ||
|
|
336fa304ce | ||
|
|
f14b69166c | ||
|
|
e405595a11 | ||
|
|
cabe48d66a | ||
|
|
8d7f46024b | ||
|
|
d7f6c2bbf0 | ||
|
|
3c69645169 | ||
|
|
abe2fa4dd4 | ||
|
|
863fd12488 | ||
|
|
50c4748d40 | ||
|
|
f83840a3bc | ||
|
|
1466d7d149 | ||
|
|
d0fe034db5 | ||
|
|
8225f5e363 | ||
|
|
c641835d0f | ||
|
|
35ee92869f | ||
|
|
9b7a5ffdd1 | ||
|
|
581c2e621c | ||
|
|
f3117f3037 | ||
|
|
877ef58dfb | ||
|
|
19e61747b8 | ||
|
|
b4bf363237 | ||
|
|
f8af9c4fae | ||
|
|
9fa426d97f | ||
|
|
e3c95e376a | ||
|
|
00ed794c50 | ||
|
|
b52d5629e2 | ||
|
|
9d8e646d4e | ||
|
|
850c0b97e4 | ||
|
|
87035d0812 | ||
|
|
ef0168c9ff | ||
|
|
df1a5a25d4 | ||
|
|
c424884201 | ||
|
|
0a464a5223 | ||
|
|
8cd62bc132 | ||
|
|
123a74b38b | ||
|
|
dbeca806bb | ||
|
|
f790d3e3ed | ||
|
|
a12f7fc4d2 | ||
|
|
456ce38a10 | ||
|
|
72ef1668f2 | ||
|
|
fce8f52574 | ||
|
|
8fcfd7a308 | ||
|
|
04a41395c8 | ||
|
|
18e8201167 | ||
|
|
27b8794d8c | ||
|
|
3cb0df579c |
@@ -9,5 +9,8 @@ indent_style = space
|
||||
max_line_length = 80
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# The build artifacts of the jitsi-meet project.
|
||||
build/*
|
||||
|
||||
doc/*
|
||||
|
||||
# Third-party source code which we (1) do not want to modify or (2) try to
|
||||
# modify as little as possible.
|
||||
libs/*
|
||||
|
||||
16
.github/stale.yml
vendored
16
.github/stale.yml
vendored
@@ -1,16 +0,0 @@
|
||||
# Number of days of inactivity before an issue becomes stale
|
||||
daysUntilStale: 90
|
||||
# Number of days of inactivity before a stale issue is closed
|
||||
daysUntilClose: 7
|
||||
# Issues with these labels will never be considered stale
|
||||
exemptLabels:
|
||||
- confirmed
|
||||
staleLabel: wontfix
|
||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed if no further activity occurs. Thank you
|
||||
for your contributions.
|
||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||
closeComment: false
|
||||
|
||||
34
.github/workflows/ci.yml
vendored
34
.github/workflows/ci.yml
vendored
@@ -12,14 +12,24 @@ jobs:
|
||||
with:
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v35
|
||||
- name: Get changed lang files
|
||||
id: lang-files
|
||||
run: echo "all=$(echo "${{ steps.changed-files.outputs.all_changed_files }}" | grep -oE 'lang\/\S+' | tr '\n' ' ')" >> "$GITHUB_OUTPUT"
|
||||
- run: npm install
|
||||
- name: Check git status
|
||||
run: git status
|
||||
- name: Normalize lang files to ensure sorted
|
||||
if: steps.lang-files.outputs.all
|
||||
run: npm run lang-sort
|
||||
- name: Check lang files are formatted correctly
|
||||
if: steps.lang-files.outputs.all
|
||||
run: npm run lint:lang
|
||||
- name: Check if the git repository is clean
|
||||
run: $(exit $(git status --porcelain --untracked-files=no | head -255 | wc -l)) || (echo "Dirty git tree"; git diff; exit 1)
|
||||
- run: npm run lint:ci
|
||||
- run: npm run lint:ci && npm run tsc:ci
|
||||
linux-build:
|
||||
name: Build Frontend (Linux)
|
||||
runs-on: ubuntu-latest
|
||||
@@ -42,3 +52,25 @@ jobs:
|
||||
cache: 'npm'
|
||||
- run: npm install
|
||||
- run: make
|
||||
android-build:
|
||||
name: Build mobile bundle (Android)
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
- run: npm install
|
||||
- run: npx react-native bundle --entry-file react/index.native.js --platform android --bundle-output /tmp/android.bundle --reset-cache
|
||||
ios-build:
|
||||
name: Build mobile bundle (iOS)
|
||||
runs-on: macOS-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16
|
||||
cache: 'npm'
|
||||
- run: npm install
|
||||
- run: npx react-native bundle --entry-file react/index.native.js --platform ios --bundle-output /tmp/ios.bundle --reset-cache
|
||||
|
||||
21
.github/workflows/stale.yml
vendored
Normal file
21
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v8
|
||||
with:
|
||||
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
|
||||
stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
|
||||
stale-issue-label: 'stale'
|
||||
stale-pr-label: 'stale'
|
||||
exempt-issue-labels: 'confirmed,help-needed'
|
||||
exempt-pr-labels: 'confirmed'
|
||||
days-before-issue-stale: 60
|
||||
days-before-pr-stale: 90
|
||||
days-before-issue-close: 10
|
||||
days-before-pr-close: 10
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -61,8 +61,9 @@ buck-out/
|
||||
|
||||
# fastlane
|
||||
#
|
||||
*/fastlane/report.xml
|
||||
*/fastlane/Preview.html
|
||||
**/fastlane/report.xml
|
||||
**/fastlane/Preview.html
|
||||
**/fastlane/test_output
|
||||
|
||||
# Build artifacts
|
||||
*.jsbundle
|
||||
|
||||
12
Makefile
12
Makefile
@@ -44,12 +44,8 @@ deploy-appbundle:
|
||||
cp \
|
||||
$(BUILD_DIR)/app.bundle.min.js \
|
||||
$(BUILD_DIR)/app.bundle.min.js.map \
|
||||
$(BUILD_DIR)/do_external_connect.min.js \
|
||||
$(BUILD_DIR)/do_external_connect.min.js.map \
|
||||
$(BUILD_DIR)/external_api.min.js \
|
||||
$(BUILD_DIR)/external_api.min.js.map \
|
||||
$(BUILD_DIR)/dial_in_info_bundle.min.js \
|
||||
$(BUILD_DIR)/dial_in_info_bundle.min.js.map \
|
||||
$(BUILD_DIR)/alwaysontop.min.js \
|
||||
$(BUILD_DIR)/alwaysontop.min.js.map \
|
||||
$(OUTPUT_DIR)/analytics-ga.js \
|
||||
@@ -67,11 +63,7 @@ deploy-appbundle:
|
||||
|
||||
deploy-lib-jitsi-meet:
|
||||
cp \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.js \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.min.map \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.e2ee-worker.js \
|
||||
$(LIBJITSIMEET_DIR)/connection_optimization/external_connect.js \
|
||||
$(LIBJITSIMEET_DIR)/modules/browser/capabilities.json \
|
||||
$(LIBJITSIMEET_DIR)/dist/umd/lib-jitsi-meet.* \
|
||||
$(DEPLOY_DIR)
|
||||
|
||||
deploy-olm:
|
||||
@@ -131,7 +123,7 @@ dev: deploy-init deploy-css deploy-rnnoise-binary deploy-tflite deploy-meet-mode
|
||||
|
||||
source-package:
|
||||
mkdir -p source_package/jitsi-meet/css && \
|
||||
cp -r *.js *.html resources/*.txt connection_optimization favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
|
||||
cp -r *.js *.html resources/*.txt favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
|
||||
cp css/all.css source_package/jitsi-meet/css && \
|
||||
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
|
||||
rm -rf source_package
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
android:extractNativeLibs="true"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:name=".MainApplication"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
android:theme="@style/AppTheme">
|
||||
<meta-data
|
||||
@@ -17,7 +16,8 @@
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTask"
|
||||
android:launchMode="singleInstance"
|
||||
android:taskAffinity=""
|
||||
android:name=".MainActivity"
|
||||
android:resizeableActivity="true"
|
||||
android:supportsPictureInPicture="true"
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright @ 2022-present 8x8, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet;
|
||||
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import com.facebook.react.ReactApplication;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
|
||||
import org.jitsi.meet.sdk.JitsiReactNativeHost;
|
||||
|
||||
/**
|
||||
* Application class for Jitsi Meet. The only reason why this exists is for Detox
|
||||
* to believe our app is a "greenfield" app. SDK users need not use this.
|
||||
*/
|
||||
public class MainApplication extends Application implements ReactApplication {
|
||||
private final ReactNativeHost mReactNativeHost = new JitsiReactNativeHost(this);
|
||||
|
||||
@Override
|
||||
public ReactNativeHost getReactNativeHost() {
|
||||
return mReactNativeHost;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
// Initialize RN
|
||||
Log.d(this.getClass().getCanonicalName(), "app onCreate");
|
||||
getReactNativeHost().getReactInstanceManager();
|
||||
}
|
||||
}
|
||||
@@ -10,16 +10,17 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.4'
|
||||
classpath 'com.android.tools.build:gradle:7.1.1'
|
||||
classpath 'com.google.gms:google-services:4.3.14'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2'
|
||||
}
|
||||
}
|
||||
|
||||
ext {
|
||||
kotlinVersion = "1.7.0"
|
||||
buildToolsVersion = "31.0.0"
|
||||
compileSdkVersion = 32
|
||||
minSdkVersion = 23
|
||||
minSdkVersion = 24
|
||||
targetSdkVersion = 32
|
||||
supportLibVersion = "28.0.0"
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ if [[ $MVN_HTTP == 1 ]]; then
|
||||
deploy:deploy-file \
|
||||
-Durl=${MVN_REPO} \
|
||||
-DrepositoryId=${MVN_REPO_ID} \
|
||||
-Dfile=react-native-${RN_VERSION}.aar \
|
||||
-Dfile=react-native-${RN_VERSION}-release.aar \
|
||||
-Dpackaging=aar \
|
||||
-DgeneratePom=false \
|
||||
-DpomFile=react-native-${RN_VERSION}.pom || true
|
||||
@@ -58,7 +58,7 @@ else
|
||||
mvn \
|
||||
deploy:deploy-file \
|
||||
-Durl=${MVN_REPO} \
|
||||
-Dfile=react-native-${RN_VERSION}.aar \
|
||||
-Dfile=react-native-${RN_VERSION}-release.aar \
|
||||
-Dpackaging=aar \
|
||||
-DgeneratePom=false \
|
||||
-DpomFile=react-native-${RN_VERSION}.pom
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -32,7 +33,10 @@ import java.util.Map;
|
||||
class AppInfoModule
|
||||
extends ReactContextBaseJavaModule {
|
||||
|
||||
private static final String BUILD_CONFIG = "org.jitsi.meet.sdk.BuildConfig";
|
||||
public static final String NAME = "AppInfo";
|
||||
public static final boolean GOOGLE_SERVICES_ENABLED = getGoogleServicesEnabled();
|
||||
public static final boolean LIBRE_BUILD = getLibreBuild();
|
||||
|
||||
public AppInfoModule(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
@@ -75,8 +79,8 @@ class AppInfoModule
|
||||
constants.put(
|
||||
"version",
|
||||
packageInfo == null ? "" : packageInfo.versionName);
|
||||
constants.put("LIBRE_BUILD", BuildConfig.LIBRE_BUILD);
|
||||
constants.put("GOOGLE_SERVICES_ENABLED", BuildConfig.GOOGLE_SERVICES_ENABLED);
|
||||
constants.put("LIBRE_BUILD", LIBRE_BUILD);
|
||||
constants.put("GOOGLE_SERVICES_ENABLED", GOOGLE_SERVICES_ENABLED);
|
||||
|
||||
return constants;
|
||||
}
|
||||
@@ -85,4 +89,47 @@ class AppInfoModule
|
||||
public String getName() {
|
||||
return NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if libre google services object is null based on build configuration.
|
||||
*/
|
||||
private static boolean getGoogleServicesEnabled() {
|
||||
Object googleServicesEnabled = getBuildConfigValue("GOOGLE_SERVICES_ENABLED");
|
||||
|
||||
if (googleServicesEnabled !=null) {
|
||||
return (Boolean) googleServicesEnabled;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if libre build field is null based on build configuration.
|
||||
*/
|
||||
private static boolean getLibreBuild() {
|
||||
Object libreBuild = getBuildConfigValue("LIBRE_BUILD");
|
||||
|
||||
if (libreBuild !=null) {
|
||||
return (Boolean) libreBuild;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets build config value of a certain field.
|
||||
*
|
||||
* @param fieldName Field from build config.
|
||||
*/
|
||||
private static Object getBuildConfigValue(String fieldName) {
|
||||
try {
|
||||
Class<?> c = Class.forName(BUILD_CONFIG);
|
||||
Field f = c.getDeclaredField(fieldName);
|
||||
f.setAccessible(true);
|
||||
return f.get(null);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +45,12 @@ class AudioDeviceHandlerGeneric implements
|
||||
*/
|
||||
private AudioModeModule module;
|
||||
|
||||
/**
|
||||
* Constant defining a Hearing Aid. Only available on API level >= 28.
|
||||
* The value of: AudioDeviceInfo.TYPE_HEARING_AID
|
||||
*/
|
||||
private static final int TYPE_HEARING_AID = 23;
|
||||
|
||||
/**
|
||||
* Constant defining a USB headset. Only available on API level >= 26.
|
||||
* The value of: AudioDeviceInfo.TYPE_USB_HEADSET
|
||||
@@ -85,6 +91,7 @@ class AudioDeviceHandlerGeneric implements
|
||||
break;
|
||||
case AudioDeviceInfo.TYPE_WIRED_HEADPHONES:
|
||||
case AudioDeviceInfo.TYPE_WIRED_HEADSET:
|
||||
case TYPE_HEARING_AID:
|
||||
case TYPE_USB_HEADSET:
|
||||
devices.add(AudioModeModule.DEVICE_HEADPHONES);
|
||||
break;
|
||||
|
||||
@@ -13,6 +13,7 @@ import android.telecom.PhoneAccount;
|
||||
import android.telecom.PhoneAccountHandle;
|
||||
import android.telecom.TelecomManager;
|
||||
import android.telecom.VideoProfile;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.facebook.react.bridge.Promise;
|
||||
@@ -357,7 +358,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
||||
JitsiMeetLogger.i(TAG + " onDisconnect " + getCallUUID());
|
||||
WritableNativeMap data = new WritableNativeMap();
|
||||
data.putString("callUUID", getCallUUID());
|
||||
ReactInstanceManagerHolder.emitEvent(
|
||||
RNConnectionService.getInstance().emitEvent(
|
||||
"org.jitsi.meet:features/connection_service#disconnect",
|
||||
data);
|
||||
// The JavaScript side will not go back to the native with
|
||||
@@ -377,7 +378,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
||||
JitsiMeetLogger.i(TAG + " onAbort " + getCallUUID());
|
||||
WritableNativeMap data = new WritableNativeMap();
|
||||
data.putString("callUUID", getCallUUID());
|
||||
ReactInstanceManagerHolder.emitEvent(
|
||||
RNConnectionService.getInstance().emitEvent(
|
||||
"org.jitsi.meet:features/connection_service#abort",
|
||||
data);
|
||||
// The JavaScript side will not go back to the native with
|
||||
@@ -406,7 +407,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
|
||||
@Override
|
||||
public void onCallAudioStateChanged(CallAudioState state) {
|
||||
JitsiMeetLogger.d(TAG + " onCallAudioStateChanged: " + state);
|
||||
RNConnectionService module = ReactInstanceManagerHolder.getNativeModule(RNConnectionService.class);
|
||||
RNConnectionService module = RNConnectionService.getInstance();
|
||||
if (module != null) {
|
||||
module.onCallAudioStateChange(state);
|
||||
}
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
/*
|
||||
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import org.webrtc.VideoCodecInfo;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
/** Container for static helper functions related to dealing with H264 codecs. */
|
||||
class H264Utils {
|
||||
public static final String H264_FMTP_PROFILE_LEVEL_ID = "profile-level-id";
|
||||
public static final String H264_FMTP_LEVEL_ASYMMETRY_ALLOWED = "level-asymmetry-allowed";
|
||||
public static final String H264_FMTP_PACKETIZATION_MODE = "packetization-mode";
|
||||
|
||||
public static final String H264_PROFILE_CONSTRAINED_BASELINE = "42e0";
|
||||
public static final String H264_PROFILE_CONSTRAINED_HIGH = "640c";
|
||||
public static final String H264_LEVEL_3_1 = "1f"; // 31 in hex.
|
||||
public static final String H264_CONSTRAINED_HIGH_3_1 =
|
||||
H264_PROFILE_CONSTRAINED_HIGH + H264_LEVEL_3_1;
|
||||
public static final String H264_CONSTRAINED_BASELINE_3_1 =
|
||||
H264_PROFILE_CONSTRAINED_BASELINE + H264_LEVEL_3_1;
|
||||
|
||||
public static Map<String, String> getDefaultH264Params(boolean isHighProfile) {
|
||||
final Map<String, String> params = new HashMap<>();
|
||||
params.put(VideoCodecInfo.H264_FMTP_LEVEL_ASYMMETRY_ALLOWED, "1");
|
||||
params.put(VideoCodecInfo.H264_FMTP_PACKETIZATION_MODE, "1");
|
||||
params.put(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID,
|
||||
isHighProfile ? VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1
|
||||
: VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1);
|
||||
return params;
|
||||
}
|
||||
|
||||
public static VideoCodecInfo DEFAULT_H264_BASELINE_PROFILE_CODEC =
|
||||
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ false));
|
||||
public static VideoCodecInfo DEFAULT_H264_HIGH_PROFILE_CODEC =
|
||||
new VideoCodecInfo("H264", getDefaultH264Params(/* isHighProfile= */ true));
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
@@ -177,8 +178,11 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||
}
|
||||
|
||||
protected void leave() {
|
||||
Intent hangupBroadcastIntent = BroadcastIntentHelper.buildHangUpIntent();
|
||||
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(hangupBroadcastIntent);
|
||||
if (this.jitsiView != null) {
|
||||
this.jitsiView.abort();
|
||||
} else {
|
||||
JitsiMeetLogger.w("Cannot leave, view is null");
|
||||
}
|
||||
}
|
||||
|
||||
private @Nullable
|
||||
@@ -295,6 +299,7 @@ public class JitsiMeetActivity extends AppCompatActivity
|
||||
JitsiMeetActivityDelegate.requestPermissions(this, permissions, requestCode, listener);
|
||||
}
|
||||
|
||||
@SuppressLint("MissingSuperCall")
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||
JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
@@ -157,6 +157,14 @@ public class JitsiMeetView extends FrameLayout {
|
||||
setProps(options != null ? options.asProps() : new Bundle());
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method which aborts running RN by passing empty props.
|
||||
* This is only meant to be used from the enclosing Activity's onDestroy.
|
||||
*/
|
||||
public void abort() {
|
||||
setProps(new Bundle());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the {@code ReactRootView} for the given app name with the given
|
||||
* props. Once created it's set as the view of this {@code FrameLayout}.
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import com.facebook.react.ReactInstanceManager;
|
||||
import com.facebook.react.ReactNativeHost;
|
||||
import com.facebook.react.ReactPackage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is the minimal implementation of ReactNativeHost that will make things like the
|
||||
* Detox testing framework believe we are a "greenfield" app.
|
||||
*
|
||||
* Generally speaking, apps using the SDK (other than the Jitsi Meet app itself) should not
|
||||
* need to use this because the
|
||||
*/
|
||||
public class JitsiReactNativeHost extends ReactNativeHost {
|
||||
public JitsiReactNativeHost(Application application) {
|
||||
super(application);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getUseDeveloperSupport() {
|
||||
// Unused since we override `createReactInstanceManager`.
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<ReactPackage> getPackages() {
|
||||
// Unused since we override `createReactInstanceManager`.
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReactInstanceManager createReactInstanceManager() {
|
||||
ReactInstanceManagerHolder.initReactInstanceManager(this.getApplication());
|
||||
|
||||
return ReactInstanceManagerHolder.getReactInstanceManager();
|
||||
}
|
||||
}
|
||||
@@ -10,14 +10,19 @@ import android.telecom.PhoneAccount;
|
||||
import android.telecom.PhoneAccountHandle;
|
||||
import android.telecom.TelecomManager;
|
||||
import android.telecom.VideoProfile;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.facebook.react.bridge.NativeModule;
|
||||
import com.facebook.react.bridge.Promise;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
|
||||
import org.jitsi.meet.sdk.log.JitsiMeetLogger;
|
||||
|
||||
@@ -35,6 +40,7 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
||||
|
||||
private static final String TAG = ConnectionService.TAG;
|
||||
|
||||
private static RNConnectionService sRNConnectionServiceInstance;
|
||||
/**
|
||||
* Handler for dealing with call state changes. We are acting as a proxy between ConnectionService
|
||||
* and other modules such as {@link AudioModeModule}.
|
||||
@@ -57,6 +63,11 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
||||
|
||||
RNConnectionService(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
sRNConnectionServiceInstance = this;
|
||||
}
|
||||
|
||||
static RNConnectionService getInstance() {
|
||||
return sRNConnectionServiceInstance;
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
@@ -226,4 +237,22 @@ class RNConnectionService extends ReactContextBaseJavaModule {
|
||||
interface CallAudioStateListener {
|
||||
void onCallAudioStateChange(android.telecom.CallAudioState callAudioState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to send an event to JavaScript.
|
||||
*
|
||||
* @param eventName {@code String} containing the event name.
|
||||
* @param data {@code Object} optional ancillary data for the event.
|
||||
*/
|
||||
void emitEvent(
|
||||
String eventName,
|
||||
@Nullable Object data) {
|
||||
ReactContext reactContext = getReactApplicationContext();
|
||||
|
||||
if (reactContext != null) {
|
||||
reactContext
|
||||
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
||||
.emit(eventName, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -32,17 +31,17 @@ import com.facebook.react.jscexecutor.JSCExecutorFactory;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
import com.facebook.react.uimanager.ViewManager;
|
||||
import com.oney.WebRTCModule.EglUtils;
|
||||
import com.oney.WebRTCModule.RTCVideoViewManager;
|
||||
import com.oney.WebRTCModule.WebRTCModule;
|
||||
import com.oney.WebRTCModule.WebRTCModuleOptions;
|
||||
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoDecoderFactory;
|
||||
import com.oney.WebRTCModule.webrtcutils.H264AndSoftwareVideoEncoderFactory;
|
||||
|
||||
import org.devio.rn.splashscreen.SplashScreenModule;
|
||||
import org.webrtc.EglBase;
|
||||
import org.webrtc.audio.AudioDeviceModule;
|
||||
import org.webrtc.audio.JavaAudioDeviceModule;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
class ReactInstanceManagerHolder {
|
||||
@@ -79,30 +78,11 @@ class ReactInstanceManagerHolder {
|
||||
nativeModules.add(new RNConnectionService(reactContext));
|
||||
}
|
||||
|
||||
// Initialize the WebRTC module by hand, since we want to override some
|
||||
// initialization options.
|
||||
WebRTCModule.Options options = new WebRTCModule.Options();
|
||||
|
||||
AudioDeviceModule adm = JavaAudioDeviceModule.builder(reactContext)
|
||||
.setEnableVolumeLogger(false)
|
||||
.createAudioDeviceModule();
|
||||
options.setAudioDeviceModule(adm);
|
||||
|
||||
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
||||
|
||||
options.setVideoDecoderFactory(new WebRTCVideoDecoderFactory(eglContext));
|
||||
options.setVideoEncoderFactory(new WebRTCVideoEncoderFactory(eglContext));
|
||||
|
||||
nativeModules.add(new WebRTCModule(reactContext, options));
|
||||
|
||||
return nativeModules;
|
||||
}
|
||||
|
||||
private static List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||
return Arrays.<ViewManager>asList(
|
||||
// WebRTC, see createNativeModules for details.
|
||||
new RTCVideoViewManager()
|
||||
);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
static List<ReactPackage> getReactNativePackages() {
|
||||
@@ -122,6 +102,7 @@ class ReactInstanceManagerHolder {
|
||||
new com.reactnativecommunity.webview.RNCWebViewPackage(),
|
||||
new com.kevinresol.react_native_default_preference.RNDefaultPreferencePackage(),
|
||||
new com.learnium.RNDeviceInfo.RNDeviceInfo(),
|
||||
new com.oney.WebRTCModule.WebRTCModulePackage(),
|
||||
new com.swmansion.gesturehandler.RNGestureHandlerPackage(),
|
||||
new org.linusu.RNGetRandomValuesPackage(),
|
||||
new com.rnimmersive.RNImmersivePackage(),
|
||||
@@ -239,35 +220,6 @@ class ReactInstanceManagerHolder {
|
||||
return reactInstanceManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to initialize the React Native instance manager. We
|
||||
* create a single instance in order to load the JavaScript bundle a single
|
||||
* time. All {@code ReactRootView} instances will be tied to the one and
|
||||
* only {@code ReactInstanceManager}.
|
||||
*
|
||||
* This method is only meant to be called when integrating with {@code JitsiReactNativeHost}.
|
||||
*
|
||||
* @param app {@code Application} current running Application.
|
||||
*/
|
||||
static void initReactInstanceManager(Application app) {
|
||||
if (reactInstanceManager != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.d(TAG, "initializing RN with Application");
|
||||
|
||||
reactInstanceManager
|
||||
= ReactInstanceManager.builder()
|
||||
.setApplication(app)
|
||||
.setBundleAssetName("index.android.bundle")
|
||||
.setJSMainModulePath("index.android")
|
||||
.setJavaScriptExecutorFactory(getReactNativeJSFactory())
|
||||
.addPackages(getReactNativePackages())
|
||||
.setUseDeveloperSupport(BuildConfig.DEBUG)
|
||||
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE)
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method to initialize the React Native instance manager. We
|
||||
* create a single instance in order to load the JavaScript bundle a single
|
||||
@@ -281,7 +233,15 @@ class ReactInstanceManagerHolder {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.d(ReactInstanceManagerHolder.class.getCanonicalName(), "initializing RN with Activity");
|
||||
// Initialize the WebRTC module options.
|
||||
WebRTCModuleOptions options = WebRTCModuleOptions.getInstance();
|
||||
|
||||
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
||||
|
||||
options.videoDecoderFactory = new H264AndSoftwareVideoDecoderFactory(eglContext);
|
||||
options.videoEncoderFactory = new H264AndSoftwareVideoEncoderFactory(eglContext);
|
||||
|
||||
Log.d(TAG, "initializing RN with Activity");
|
||||
|
||||
reactInstanceManager
|
||||
= ReactInstanceManager.builder()
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
/** Enumeration of supported video codec types. */
|
||||
public enum VideoCodecMimeType {
|
||||
VP8("video/x-vnd.on2.vp8"),
|
||||
VP9("video/x-vnd.on2.vp9"),
|
||||
H264("video/avc"),
|
||||
AV1("video/av01");
|
||||
|
||||
private final String mimeType;
|
||||
|
||||
private VideoCodecMimeType(String mimeType) {
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
String mimeType() {
|
||||
return mimeType;
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.webrtc.EglBase;
|
||||
import org.webrtc.HardwareVideoDecoderFactory;
|
||||
import org.webrtc.SoftwareVideoDecoderFactory;
|
||||
import org.webrtc.VideoCodecInfo;
|
||||
import org.webrtc.VideoDecoder;
|
||||
import org.webrtc.VideoDecoderFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is a custom video decoder factory for WebRTC which behaves similarly
|
||||
* to the default one in iOS. It supports the following codecs:
|
||||
*
|
||||
* - In hardware: H.264 (baseline)
|
||||
* - In software: VP8, VP9, AV1
|
||||
*/
|
||||
public class WebRTCVideoDecoderFactory implements VideoDecoderFactory {
|
||||
private final VideoDecoderFactory hardwareVideoDecoderFactory;
|
||||
private final VideoDecoderFactory softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
|
||||
|
||||
public WebRTCVideoDecoderFactory(@Nullable EglBase.Context eglContext) {
|
||||
this.hardwareVideoDecoderFactory = new HardwareVideoDecoderFactory(eglContext);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public VideoDecoder createDecoder(VideoCodecInfo codecInfo) {
|
||||
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
|
||||
return this.hardwareVideoDecoderFactory.createDecoder(codecInfo);
|
||||
}
|
||||
|
||||
return this.softwareVideoDecoderFactory.createDecoder(codecInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VideoCodecInfo[] getSupportedCodecs() {
|
||||
List<VideoCodecInfo> codecs = new ArrayList<>();
|
||||
|
||||
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
|
||||
|
||||
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.webrtc.EglBase;
|
||||
import org.webrtc.HardwareVideoEncoderFactory;
|
||||
import org.webrtc.SoftwareVideoEncoderFactory;
|
||||
import org.webrtc.VideoCodecInfo;
|
||||
import org.webrtc.VideoEncoder;
|
||||
import org.webrtc.VideoEncoderFactory;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This is a custom video encoder factory for WebRTC which behaves similarly
|
||||
* to the default one in iOS. It supports the following codecs:
|
||||
*
|
||||
* - In hardware: H.264 (baseline)
|
||||
* - In software: VP8, VP9, AV1
|
||||
*/
|
||||
public class WebRTCVideoEncoderFactory implements VideoEncoderFactory {
|
||||
private final VideoEncoderFactory hardwareVideoEncoderFactory;
|
||||
private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
|
||||
|
||||
public WebRTCVideoEncoderFactory(@Nullable EglBase.Context eglContext) {
|
||||
this.hardwareVideoEncoderFactory =
|
||||
new HardwareVideoEncoderFactory(eglContext, false, false);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public VideoEncoder createEncoder(VideoCodecInfo codecInfo) {
|
||||
if (codecInfo.name.equalsIgnoreCase(VideoCodecMimeType.H264.name())) {
|
||||
return this.hardwareVideoEncoderFactory.createEncoder(codecInfo);
|
||||
}
|
||||
|
||||
return this.softwareVideoEncoderFactory.createEncoder(codecInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public VideoCodecInfo[] getSupportedCodecs() {
|
||||
List<VideoCodecInfo> codecs = new ArrayList<>();
|
||||
|
||||
codecs.add(H264Utils.DEFAULT_H264_BASELINE_PROFILE_CODEC);
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP8.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.VP9.name(), new HashMap<>()));
|
||||
codecs.add(new VideoCodecInfo(VideoCodecMimeType.AV1.name(), new HashMap<>()));
|
||||
|
||||
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
|
||||
}
|
||||
}
|
||||
13
app.js
13
app.js
@@ -18,7 +18,6 @@ import './react/features/base/jitsi-local-storage/setup';
|
||||
import conference from './conference';
|
||||
import API from './modules/API';
|
||||
import UI from './modules/UI/UI';
|
||||
import keyboardshortcut from './modules/keyboardshortcut/keyboardshortcut';
|
||||
import translation from './modules/translation/translation';
|
||||
|
||||
// Initialize Olm as early as possible.
|
||||
@@ -33,23 +32,11 @@ window.APP = {
|
||||
API,
|
||||
conference,
|
||||
|
||||
// Used by do_external_connect.js if we receive the attach data after
|
||||
// connect was already executed. status property can be 'initialized',
|
||||
// 'ready', or 'connecting'. We are interested in 'ready' status only which
|
||||
// means that connect was executed but we have to wait for the attach data.
|
||||
// In status 'ready' handler property will be set to a function that will
|
||||
// finish the connect process when the attach data or error is received.
|
||||
connect: {
|
||||
handler: null,
|
||||
status: 'initialized'
|
||||
},
|
||||
|
||||
// Used for automated performance tests.
|
||||
connectionTimes: {
|
||||
'index.loaded': window.indexLoadedTime
|
||||
},
|
||||
|
||||
keyboardshortcut,
|
||||
translation,
|
||||
UI
|
||||
};
|
||||
|
||||
438
conference.js
438
conference.js
@@ -17,9 +17,9 @@ import {
|
||||
createDeviceChangedEvent,
|
||||
createScreenSharingEvent,
|
||||
createStartSilentEvent,
|
||||
createTrackMutedEvent,
|
||||
sendAnalytics
|
||||
} from './react/features/analytics';
|
||||
createTrackMutedEvent
|
||||
} from './react/features/analytics/AnalyticsEvents';
|
||||
import { sendAnalytics } from './react/features/analytics/functions';
|
||||
import {
|
||||
maybeRedirectToWelcomePage,
|
||||
redirectToStaticPage,
|
||||
@@ -28,13 +28,8 @@ import {
|
||||
import { showModeratedNotification } from './react/features/av-moderation/actions';
|
||||
import { shouldShowModeratedNotification } from './react/features/av-moderation/functions';
|
||||
import {
|
||||
AVATAR_URL_COMMAND,
|
||||
CONFERENCE_LEAVE_REASONS,
|
||||
EMAIL_COMMAND,
|
||||
_conferenceWillJoin,
|
||||
authStatusChanged,
|
||||
commonUserJoinedHandling,
|
||||
commonUserLeftHandling,
|
||||
conferenceFailed,
|
||||
conferenceJoinInProgress,
|
||||
conferenceJoined,
|
||||
@@ -47,15 +42,26 @@ import {
|
||||
dataChannelClosed,
|
||||
dataChannelOpened,
|
||||
e2eRttChanged,
|
||||
generateVisitorConfig,
|
||||
getConferenceOptions,
|
||||
kickedOut,
|
||||
lockStateChanged,
|
||||
nonParticipantMessageReceived,
|
||||
onStartMutedPolicyChanged,
|
||||
p2pStatusChanged,
|
||||
p2pStatusChanged
|
||||
} from './react/features/base/conference/actions';
|
||||
import {
|
||||
AVATAR_URL_COMMAND,
|
||||
CONFERENCE_LEAVE_REASONS,
|
||||
EMAIL_COMMAND
|
||||
} from './react/features/base/conference/constants';
|
||||
import {
|
||||
commonUserJoinedHandling,
|
||||
commonUserLeftHandling,
|
||||
getConferenceOptions,
|
||||
getVisitorOptions,
|
||||
restoreConferenceOptions,
|
||||
sendLocalParticipant
|
||||
} from './react/features/base/conference';
|
||||
} from './react/features/base/conference/functions';
|
||||
import { overwriteConfig } from './react/features/base/config/actions';
|
||||
import { getReplaceParticipant } from './react/features/base/config/functions';
|
||||
import {
|
||||
checkAndNotifyForNewDevice,
|
||||
@@ -81,22 +87,23 @@ import {
|
||||
} from './react/features/base/lib-jitsi-meet';
|
||||
import { isFatalJitsiConnectionError } from './react/features/base/lib-jitsi-meet/functions';
|
||||
import {
|
||||
MEDIA_TYPE,
|
||||
getStartWithAudioMuted,
|
||||
getStartWithVideoMuted,
|
||||
isVideoMutedByUser,
|
||||
gumPending,
|
||||
setAudioAvailable,
|
||||
setAudioMuted,
|
||||
setAudioUnmutePermissions,
|
||||
setVideoAvailable,
|
||||
setVideoMuted,
|
||||
setVideoUnmutePermissions
|
||||
} from './react/features/base/media';
|
||||
} from './react/features/base/media/actions';
|
||||
import { MEDIA_TYPE } from './react/features/base/media/constants';
|
||||
import {
|
||||
getStartWithAudioMuted,
|
||||
getStartWithVideoMuted,
|
||||
isVideoMutedByUser
|
||||
} from './react/features/base/media/functions';
|
||||
import { IGUMPendingState } from './react/features/base/media/types';
|
||||
import {
|
||||
dominantSpeakerChanged,
|
||||
getLocalParticipant,
|
||||
getNormalizedDisplayName,
|
||||
getVirtualScreenshareParticipantByOwnerId,
|
||||
localParticipantAudioLevelChanged,
|
||||
localParticipantRoleChanged,
|
||||
participantKicked,
|
||||
@@ -107,52 +114,58 @@ import {
|
||||
participantUpdated,
|
||||
screenshareParticipantDisplayNameChanged,
|
||||
updateRemoteParticipantFeatures
|
||||
} from './react/features/base/participants';
|
||||
import { updateSettings } from './react/features/base/settings';
|
||||
} from './react/features/base/participants/actions';
|
||||
import {
|
||||
getLocalParticipant,
|
||||
getNormalizedDisplayName,
|
||||
getVirtualScreenshareParticipantByOwnerId
|
||||
} from './react/features/base/participants/functions';
|
||||
import { updateSettings } from './react/features/base/settings/actions';
|
||||
import {
|
||||
addLocalTrack,
|
||||
createLocalTracksF,
|
||||
destroyLocalTracks,
|
||||
replaceLocalTrack,
|
||||
toggleScreensharing as toggleScreensharingA,
|
||||
trackAdded,
|
||||
trackRemoved
|
||||
} from './react/features/base/tracks/actions';
|
||||
import {
|
||||
createLocalTracksF,
|
||||
getLocalJitsiAudioTrack,
|
||||
getLocalJitsiVideoTrack,
|
||||
getLocalTracks,
|
||||
getLocalVideoTrack,
|
||||
isLocalTrackMuted,
|
||||
isUserInteractionRequiredForUnmute,
|
||||
replaceLocalTrack,
|
||||
toggleScreensharing as toggleScreensharingA,
|
||||
trackAdded,
|
||||
trackRemoved
|
||||
} from './react/features/base/tracks';
|
||||
isUserInteractionRequiredForUnmute
|
||||
} from './react/features/base/tracks/functions';
|
||||
import { downloadJSON } from './react/features/base/util/downloadJSON';
|
||||
import { showDesktopPicker } from './react/features/desktop-picker';
|
||||
import { appendSuffix } from './react/features/display-name';
|
||||
import {
|
||||
maybeOpenFeedbackDialog,
|
||||
submitFeedback
|
||||
} from './react/features/feedback';
|
||||
import { showDesktopPicker } from './react/features/desktop-picker/actions';
|
||||
import { appendSuffix } from './react/features/display-name/functions';
|
||||
import { maybeOpenFeedbackDialog, submitFeedback } from './react/features/feedback/actions';
|
||||
import { initKeyboardShortcuts } from './react/features/keyboard-shortcuts/actions';
|
||||
import { maybeSetLobbyChatMessageListener } from './react/features/lobby/actions.any';
|
||||
import { setNoiseSuppressionEnabled } from './react/features/noise-suppression/actions';
|
||||
import { hideNotification, showNotification, showWarningNotification } from './react/features/notifications/actions';
|
||||
import {
|
||||
DATA_CHANNEL_CLOSED_NOTIFICATION_ID,
|
||||
NOTIFICATION_TIMEOUT_TYPE,
|
||||
hideNotification,
|
||||
isModerationNotificationDisplayed,
|
||||
showNotification,
|
||||
showWarningNotification
|
||||
} from './react/features/notifications';
|
||||
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay';
|
||||
import { suspendDetected } from './react/features/power-monitor';
|
||||
NOTIFICATION_TIMEOUT_TYPE
|
||||
} from './react/features/notifications/constants';
|
||||
import { isModerationNotificationDisplayed } from './react/features/notifications/functions';
|
||||
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay/actions';
|
||||
import { suspendDetected } from './react/features/power-monitor/actions';
|
||||
import { initPrejoin, makePrecallTest, setJoiningInProgress } from './react/features/prejoin/actions';
|
||||
import { isPrejoinPageVisible } from './react/features/prejoin/functions';
|
||||
import { disableReceiver, stopReceiver } from './react/features/remote-control';
|
||||
import { isScreenAudioShared, setScreenAudioShareState } from './react/features/screen-share/';
|
||||
import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capture';
|
||||
import { disableReceiver, stopReceiver } from './react/features/remote-control/actions';
|
||||
import { setScreenAudioShareState } from './react/features/screen-share/actions.web';
|
||||
import { isScreenAudioShared } from './react/features/screen-share/functions';
|
||||
import { toggleScreenshotCaptureSummary } from './react/features/screenshot-capture/actions';
|
||||
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
|
||||
import { createRnnoiseProcessor } from './react/features/stream-effects/rnnoise';
|
||||
import { endpointMessageReceived } from './react/features/subtitles';
|
||||
import { endpointMessageReceived } from './react/features/subtitles/actions.any';
|
||||
import { handleToggleVideoMuted } from './react/features/toolbox/actions.any';
|
||||
import { muteLocal } from './react/features/video-menu/actions.any';
|
||||
import { setIAmVisitor } from './react/features/visitors/actions';
|
||||
import { iAmVisitor } from './react/features/visitors/functions';
|
||||
import UIEvents from './service/UI/UIEvents';
|
||||
|
||||
const logger = Logger.getLogger(__filename);
|
||||
@@ -340,21 +353,30 @@ class ConferenceConnector {
|
||||
}
|
||||
|
||||
case JitsiConferenceErrors.REDIRECTED: {
|
||||
generateVisitorConfig(APP.store.getState(), params);
|
||||
const newConfig = getVisitorOptions(APP.store.getState(), params);
|
||||
|
||||
connection.disconnect().then(() => {
|
||||
connect(this._conference.roomName).then(con => {
|
||||
const localTracks = getLocalTracks(APP.store.getState()['features/base/tracks']);
|
||||
if (!newConfig) {
|
||||
logger.warn('Not redirected missing params');
|
||||
break;
|
||||
}
|
||||
|
||||
const jitsiTracks = localTracks.map(t => t.jitsiTrack);
|
||||
const [ vnode ] = params;
|
||||
|
||||
// visitors connect muted
|
||||
jitsiTracks.forEach(t => t.mute());
|
||||
APP.store.dispatch(overwriteConfig(newConfig))
|
||||
.then(() => this._conference.leaveRoom())
|
||||
.then(() => APP.store.dispatch(setIAmVisitor(Boolean(vnode))))
|
||||
|
||||
// TODO disable option to unmute audio or video
|
||||
this._conference.startConference(con, jitsiTracks);
|
||||
// we do not clear local tracks on error, so we need to manually clear them
|
||||
.then(() => APP.store.dispatch(destroyLocalTracks()))
|
||||
.then(() => {
|
||||
// Reset VideoLayout. It's destroyed in features/video-layout/middleware.web.js so re-initialize it.
|
||||
VideoLayout.initLargeVideo();
|
||||
VideoLayout.resizeVideoArea();
|
||||
|
||||
connect(this._conference.roomName).then(con => {
|
||||
this._conference.startConference(con, []);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -389,10 +411,28 @@ class ConferenceConnector {
|
||||
room.leave(CONFERENCE_LEAVE_REASONS.UNRECOVERABLE_ERROR).then(() => connection.disconnect());
|
||||
break;
|
||||
|
||||
case JitsiConferenceErrors.CONFERENCE_MAX_USERS:
|
||||
case JitsiConferenceErrors.CONFERENCE_MAX_USERS: {
|
||||
APP.UI.notifyMaxUsersLimitReached();
|
||||
break;
|
||||
|
||||
// in case of max users(it can be from a visitor node), let's restore
|
||||
// oldConfig if any as we will be back to the main prosody
|
||||
const newConfig = restoreConferenceOptions(APP.store.getState());
|
||||
|
||||
if (newConfig) {
|
||||
APP.store.dispatch(overwriteConfig(newConfig))
|
||||
.then(() => this._conference.leaveRoom())
|
||||
.then(() => {
|
||||
_connectionPromise = connect(this._conference.roomName);
|
||||
|
||||
return _connectionPromise;
|
||||
})
|
||||
.then(con => {
|
||||
APP.connection = connection = con;
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case JitsiConferenceErrors.INCOMPATIBLE_SERVER_VERSIONS:
|
||||
APP.store.dispatch(reloadWithStoredParams());
|
||||
break;
|
||||
@@ -455,6 +495,21 @@ function disconnect() {
|
||||
return connection.disconnect().then(onDisconnected, onDisconnected);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the GUM pending state for the tracks that have failed.
|
||||
*
|
||||
* NOTE: Some of the track that we will be setting to GUM pending state NONE may not have failed but they may have
|
||||
* been requested. This won't be a problem because their current GUM pending state will be NONE anyway.
|
||||
* @param {JitsiLocalTrack} tracks - The tracks that have been created.
|
||||
* @returns {void}
|
||||
*/
|
||||
function setGUMPendingStateOnFailedTracks(tracks) {
|
||||
const tracksTypes = tracks.map(track => track.getType());
|
||||
const nonPendingTracks = [ MEDIA_TYPE.AUDIO, MEDIA_TYPE.VIDEO ].filter(type => !tracksTypes.includes(type));
|
||||
|
||||
APP.store.dispatch(gumPending(nonPendingTracks, IGUMPendingState.NONE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles CONNECTION_FAILED events from lib-jitsi-meet.
|
||||
*
|
||||
@@ -521,7 +576,7 @@ export default {
|
||||
);
|
||||
}
|
||||
|
||||
let tryCreateLocalTracks;
|
||||
let tryCreateLocalTracks = Promise.resolve([]);
|
||||
|
||||
// On Electron there is no permission prompt for granting permissions. That's why we don't need to
|
||||
// spend much time displaying the overlay screen. If GUM is not resolved within 15 seconds it will
|
||||
@@ -562,76 +617,66 @@ export default {
|
||||
|
||||
return [];
|
||||
});
|
||||
} else if (!requestedAudio && !requestedVideo) {
|
||||
// Resolve with no tracks
|
||||
tryCreateLocalTracks = Promise.resolve([]);
|
||||
} else {
|
||||
} else if (requestedAudio || requestedVideo) {
|
||||
APP.store.dispatch(gumPending(initialDevices, IGUMPendingState.PENDING_UNMUTE));
|
||||
tryCreateLocalTracks = createLocalTracksF({
|
||||
devices: initialDevices,
|
||||
timeout,
|
||||
firePermissionPromptIsShownEvent: true
|
||||
})
|
||||
.catch(err => {
|
||||
if (requestedAudio && requestedVideo) {
|
||||
|
||||
// Try audio only...
|
||||
errors.audioAndVideoError = err;
|
||||
|
||||
if (err.name === JitsiTrackErrors.TIMEOUT && !browser.isElectron()) {
|
||||
// In this case we expect that the permission prompt is still visible. There is no point of
|
||||
// executing GUM with different source. Also at the time of writing the following
|
||||
// inconsistency have been noticed in some browsers - if the permissions prompt is visible
|
||||
// and another GUM is executed the prompt does not change its content but if the user
|
||||
// clicks allow the user action isassociated with the latest GUM call.
|
||||
errors.audioOnlyError = err;
|
||||
errors.videoOnlyError = err;
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
return createLocalTracksF(audioOptions);
|
||||
} else if (requestedAudio && !requestedVideo) {
|
||||
errors.audioOnlyError = err;
|
||||
|
||||
return [];
|
||||
} else if (requestedVideo && !requestedAudio) {
|
||||
errors.videoOnlyError = err;
|
||||
|
||||
return [];
|
||||
}
|
||||
logger.error('Should never happen');
|
||||
})
|
||||
.catch(err => {
|
||||
// Log this just in case...
|
||||
if (!requestedAudio) {
|
||||
logger.error('The impossible just happened', err);
|
||||
}
|
||||
errors.audioOnlyError = err;
|
||||
|
||||
// Try video only...
|
||||
return requestedVideo
|
||||
? createLocalTracksF({
|
||||
devices: [ MEDIA_TYPE.VIDEO ],
|
||||
firePermissionPromptIsShownEvent: true
|
||||
})
|
||||
: [];
|
||||
})
|
||||
.catch(err => {
|
||||
// Log this just in case...
|
||||
if (!requestedVideo) {
|
||||
logger.error('The impossible just happened', err);
|
||||
}
|
||||
errors.videoOnlyError = err;
|
||||
.catch(async error => {
|
||||
if (error.name === JitsiTrackErrors.TIMEOUT && !browser.isElectron()) {
|
||||
errors.audioAndVideoError = error;
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
// Retry with separate gUM calls.
|
||||
const gUMPromises = [];
|
||||
const tracks = [];
|
||||
|
||||
if (requestedAudio) {
|
||||
gUMPromises.push(createLocalTracksF(audioOptions));
|
||||
}
|
||||
|
||||
if (requestedVideo) {
|
||||
gUMPromises.push(createLocalTracksF({
|
||||
devices: [ MEDIA_TYPE.VIDEO ],
|
||||
timeout,
|
||||
firePermissionPromptIsShownEvent: true
|
||||
}));
|
||||
}
|
||||
|
||||
const results = await Promise.allSettled(gUMPromises);
|
||||
let errorMsg;
|
||||
|
||||
results.forEach((result, idx) => {
|
||||
if (result.status === 'fulfilled') {
|
||||
tracks.push(result.value[0]);
|
||||
} else {
|
||||
errorMsg = result.reason;
|
||||
const isAudio = idx === 0;
|
||||
|
||||
logger.error(`${isAudio ? 'Audio' : 'Video'} track creation failed with error ${errorMsg}`);
|
||||
if (isAudio) {
|
||||
errors.audioOnlyError = errorMsg;
|
||||
} else {
|
||||
errors.videoOnlyError = errorMsg;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (errors.audioOnlyError && errors.videoOnlyError) {
|
||||
errors.audioAndVideoError = errorMsg;
|
||||
}
|
||||
|
||||
return tracks;
|
||||
});
|
||||
}
|
||||
|
||||
// Hide the permissions prompt/overlay as soon as the tracks are
|
||||
// created. Don't wait for the connection to be made, since in some
|
||||
// cases, when auth is required, for instance, that won't happen until
|
||||
// the user inputs their credentials, but the dialog would be
|
||||
// overshadowed by the overlay.
|
||||
// Hide the permissions prompt/overlay as soon as the tracks are created. Don't wait for the connection to
|
||||
// be established, as in some cases like when auth is required, connection won't be established until the user
|
||||
// inputs their credentials, but the dialog would be overshadowed by the overlay.
|
||||
tryCreateLocalTracks.then(tracks => {
|
||||
APP.store.dispatch(mediaPermissionPromptVisibilityChanged(false));
|
||||
|
||||
@@ -768,46 +813,55 @@ export default {
|
||||
* @returns {Promise}
|
||||
*/
|
||||
async init({ roomName }) {
|
||||
const state = APP.store.getState();
|
||||
const initialOptions = {
|
||||
startAudioOnly: config.startAudioOnly,
|
||||
startScreenSharing: config.startScreenSharing,
|
||||
startWithAudioMuted: getStartWithAudioMuted(APP.store.getState())
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState()),
|
||||
startWithVideoMuted: getStartWithVideoMuted(APP.store.getState())
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState())
|
||||
startWithAudioMuted: getStartWithAudioMuted(state) || isUserInteractionRequiredForUnmute(state),
|
||||
startWithVideoMuted: getStartWithVideoMuted(state) || isUserInteractionRequiredForUnmute(state)
|
||||
};
|
||||
|
||||
this.roomName = roomName;
|
||||
|
||||
try {
|
||||
// Initialize the device list first. This way, when creating tracks
|
||||
// based on preferred devices, loose label matching can be done in
|
||||
// cases where the exact ID match is no longer available, such as
|
||||
// when the camera device has switched USB ports.
|
||||
// when in startSilent mode we want to start with audio muted
|
||||
// Initialize the device list first. This way, when creating tracks based on preferred devices, loose label
|
||||
// matching can be done in cases where the exact ID match is no longer available, such as -
|
||||
// 1. When the camera device has switched USB ports.
|
||||
// 2. When in startSilent mode we want to start with audio muted
|
||||
await this._initDeviceList();
|
||||
} catch (error) {
|
||||
logger.warn('initial device list initialization failed', error);
|
||||
}
|
||||
|
||||
const handleStartAudioMuted = (options, tracks) => {
|
||||
if (options.startWithAudioMuted) {
|
||||
// Filter out the local tracks based on various config options, i.e., when user joins muted or is muted by
|
||||
// focus. However, audio track will always be created even though it is not added to the conference since we
|
||||
// want audio related features (noisy mic, talk while muted, etc.) to work even if the mic is muted.
|
||||
const handleInitialTracks = (options, tracks) => {
|
||||
let localTracks = tracks;
|
||||
|
||||
// No local tracks are added when user joins as a visitor.
|
||||
if (iAmVisitor(state)) {
|
||||
return [];
|
||||
}
|
||||
if (options.startWithAudioMuted || room?.isStartAudioMuted()) {
|
||||
// Always add the track on Safari because of a known issue where audio playout doesn't happen
|
||||
// if the user joins audio and video muted, i.e., if there is no local media capture.
|
||||
if (browser.isWebKitBased()) {
|
||||
this.muteAudio(true, true);
|
||||
} else {
|
||||
return tracks.filter(track => track.getType() !== MEDIA_TYPE.AUDIO);
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.AUDIO);
|
||||
}
|
||||
}
|
||||
if (room?.isStartVideoMuted()) {
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.VIDEO);
|
||||
}
|
||||
|
||||
return tracks;
|
||||
return localTracks;
|
||||
};
|
||||
|
||||
if (isPrejoinPageVisible(APP.store.getState())) {
|
||||
if (isPrejoinPageVisible(state)) {
|
||||
_connectionPromise = connect(roomName).then(c => {
|
||||
// we want to initialize it early, in case of errors to be able
|
||||
// to gather logs
|
||||
// We want to initialize it early, in case of errors to be able to gather logs.
|
||||
APP.connection = c;
|
||||
|
||||
return c;
|
||||
@@ -820,43 +874,38 @@ export default {
|
||||
APP.store.dispatch(makePrecallTest(this._getConferenceOptions()));
|
||||
|
||||
const { tryCreateLocalTracks, errors } = this.createInitialLocalTracks(initialOptions);
|
||||
const tracks = await tryCreateLocalTracks;
|
||||
const localTracks = await tryCreateLocalTracks;
|
||||
|
||||
// Initialize device list a second time to ensure device labels
|
||||
// get populated in case of an initial gUM acceptance; otherwise
|
||||
// they may remain as empty strings.
|
||||
// Initialize device list a second time to ensure device labels get populated in case of an initial gUM
|
||||
// acceptance; otherwise they may remain as empty strings.
|
||||
this._initDeviceList(true);
|
||||
|
||||
if (isPrejoinPageVisible(APP.store.getState())) {
|
||||
return APP.store.dispatch(initPrejoin(tracks, errors));
|
||||
if (isPrejoinPageVisible(state)) {
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.AUDIO, MEDIA_TYPE.VIDEO ], IGUMPendingState.NONE));
|
||||
|
||||
return APP.store.dispatch(initPrejoin(localTracks, errors));
|
||||
}
|
||||
|
||||
logger.debug('Prejoin screen no longer displayed at the time when tracks were created');
|
||||
|
||||
this._displayErrorsForCreateInitialLocalTracks(errors);
|
||||
|
||||
let localTracks = handleStartAudioMuted(initialOptions, tracks);
|
||||
const tracks = handleInitialTracks(initialOptions, localTracks);
|
||||
|
||||
// in case where gum is slow and resolves after the startAudio/VideoMuted coming from jicofo, we can be
|
||||
// join unmuted even though jicofo had instruct us to mute, so let's respect that before passing the tracks
|
||||
if (!browser.isWebKitBased()) {
|
||||
if (room?.isStartAudioMuted()) {
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.AUDIO);
|
||||
}
|
||||
}
|
||||
setGUMPendingStateOnFailedTracks(tracks);
|
||||
|
||||
if (room?.isStartVideoMuted()) {
|
||||
localTracks = localTracks.filter(track => track.getType() !== MEDIA_TYPE.VIDEO);
|
||||
}
|
||||
|
||||
return this._setLocalAudioVideoStreams(localTracks);
|
||||
return this._setLocalAudioVideoStreams(tracks);
|
||||
}
|
||||
|
||||
const [ tracks, con ] = await this.createInitialLocalTracksAndConnect(roomName, initialOptions);
|
||||
|
||||
this._initDeviceList(true);
|
||||
|
||||
return this.startConference(con, handleStartAudioMuted(initialOptions, tracks));
|
||||
const filteredTracks = handleInitialTracks(initialOptions, tracks);
|
||||
|
||||
setGUMPendingStateOnFailedTracks(filteredTracks);
|
||||
|
||||
return this.startConference(con, filteredTracks);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -979,6 +1028,7 @@ export default {
|
||||
showUI && APP.store.dispatch(notifyMicError(error));
|
||||
};
|
||||
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.AUDIO ], IGUMPendingState.PENDING_UNMUTE));
|
||||
createLocalTracksF({ devices: [ 'audio' ] })
|
||||
.then(([ audioTrack ]) => audioTrack)
|
||||
.catch(error => {
|
||||
@@ -990,7 +1040,10 @@ export default {
|
||||
.then(async audioTrack => {
|
||||
await this._maybeApplyAudioMixerEffect(audioTrack);
|
||||
|
||||
this.useAudioStream(audioTrack);
|
||||
return this.useAudioStream(audioTrack);
|
||||
})
|
||||
.finally(() => {
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.AUDIO ], IGUMPendingState.NONE));
|
||||
});
|
||||
} else {
|
||||
muteLocalAudio(mute);
|
||||
@@ -1029,18 +1082,25 @@ export default {
|
||||
*/
|
||||
muteVideo(mute, showUI = true) {
|
||||
if (this.videoSwitchInProgress) {
|
||||
console.warn('muteVideo - unable to perform operations while video switch is in progress');
|
||||
logger.warn('muteVideo - unable to perform operations while video switch is in progress');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const state = APP.store.getState();
|
||||
|
||||
if (!mute
|
||||
&& isUserInteractionRequiredForUnmute(APP.store.getState())) {
|
||||
&& isUserInteractionRequiredForUnmute(state)) {
|
||||
logger.error('Unmuting video requires user interaction');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// check for A/V Moderation when trying to unmute and return early
|
||||
if (!mute && shouldShowModeratedNotification(MEDIA_TYPE.VIDEO, state)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If not ready to modify track's state yet adjust the base/media
|
||||
if (!this._localTracksInitialized) {
|
||||
// This will only modify base/media.video.muted which is then synced
|
||||
@@ -1054,7 +1114,7 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
const localVideo = getLocalJitsiVideoTrack(APP.store.getState());
|
||||
const localVideo = getLocalJitsiVideoTrack(state);
|
||||
|
||||
if (!localVideo && !mute && !this.isCreatingLocalTrack) {
|
||||
const maybeShowErrorDialog = error => {
|
||||
@@ -1063,6 +1123,8 @@ export default {
|
||||
|
||||
this.isCreatingLocalTrack = true;
|
||||
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.VIDEO ], IGUMPendingState.PENDING_UNMUTE));
|
||||
|
||||
// Try to create local video if there wasn't any.
|
||||
// This handles the case when user joined with no video
|
||||
// (dismissed screen sharing screen or in audio only mode), but
|
||||
@@ -1087,6 +1149,7 @@ export default {
|
||||
})
|
||||
.finally(() => {
|
||||
this.isCreatingLocalTrack = false;
|
||||
APP.store.dispatch(gumPending([ MEDIA_TYPE.VIDEO ], IGUMPendingState.NONE));
|
||||
});
|
||||
} else {
|
||||
// FIXME show error dialog if it fails (should be handled by react)
|
||||
@@ -1399,11 +1462,16 @@ export default {
|
||||
* @private
|
||||
*/
|
||||
_setLocalAudioVideoStreams(tracks = []) {
|
||||
const { dispatch } = APP.store;
|
||||
const pendingGUMDevicesToRemove = [];
|
||||
const promises = tracks.map(track => {
|
||||
if (track.isAudioTrack()) {
|
||||
pendingGUMDevicesToRemove.push(MEDIA_TYPE.AUDIO);
|
||||
|
||||
return this.useAudioStream(track);
|
||||
} else if (track.isVideoTrack()) {
|
||||
logger.debug(`_setLocalAudioVideoStreams is calling useVideoStream with track: ${track}`);
|
||||
pendingGUMDevicesToRemove.push(MEDIA_TYPE.VIDEO);
|
||||
|
||||
return this.useVideoStream(track);
|
||||
}
|
||||
@@ -1415,6 +1483,10 @@ export default {
|
||||
});
|
||||
|
||||
return Promise.allSettled(promises).then(() => {
|
||||
if (pendingGUMDevicesToRemove.length > 0) {
|
||||
dispatch(gumPending(pendingGUMDevicesToRemove, IGUMPendingState.NONE));
|
||||
}
|
||||
|
||||
this._localTracksInitialized = true;
|
||||
logger.log(`Initialized with ${tracks.length} local tracks`);
|
||||
});
|
||||
@@ -1445,7 +1517,7 @@ export default {
|
||||
|
||||
logger.debug(`useVideoStream: Replacing ${oldTrack} with ${newTrack}`);
|
||||
|
||||
if (oldTrack === newTrack) {
|
||||
if (oldTrack === newTrack || (!oldTrack && !newTrack)) {
|
||||
resolve();
|
||||
onFinish();
|
||||
|
||||
@@ -2128,6 +2200,11 @@ export default {
|
||||
UIEvents.VIDEO_DEVICE_CHANGED,
|
||||
cameraDeviceId => {
|
||||
const videoWasMuted = this.isLocalVideoMuted();
|
||||
const localVideoTrack = getLocalJitsiVideoTrack(APP.store.getState());
|
||||
|
||||
if (localVideoTrack?.getDeviceId() === cameraDeviceId) {
|
||||
return;
|
||||
}
|
||||
|
||||
sendAnalytics(createDeviceChangedEvent('video', 'input'));
|
||||
|
||||
@@ -2258,10 +2335,7 @@ export default {
|
||||
|
||||
APP.UI.initConference();
|
||||
|
||||
if (!config.disableShortcuts) {
|
||||
APP.keyboardshortcut.init();
|
||||
}
|
||||
|
||||
dispatch(initKeyboardShortcuts());
|
||||
dispatch(conferenceJoined(room));
|
||||
|
||||
const jwt = APP.store.getState()['features/base/jwt'];
|
||||
@@ -2375,7 +2449,9 @@ export default {
|
||||
const { dispatch } = APP.store;
|
||||
const setAudioOutputPromise
|
||||
= setAudioOutputDeviceId(newDevices.audiooutput, dispatch)
|
||||
.catch(); // Just ignore any errors in catch block.
|
||||
.catch(err => {
|
||||
logger.error(`Failed to set the audio output device to ${newDevices.audiooutput} - ${err}`);
|
||||
});
|
||||
|
||||
promises.push(setAudioOutputPromise);
|
||||
}
|
||||
@@ -2413,7 +2489,7 @@ export default {
|
||||
}
|
||||
|
||||
// check for video
|
||||
if (!requestedInput.video) {
|
||||
if (requestedInput.video) {
|
||||
APP.store.dispatch(checkAndNotifyForNewDevice(newAvailDevices.videoInput, oldDevices.videoInput));
|
||||
}
|
||||
|
||||
@@ -2457,14 +2533,15 @@ export default {
|
||||
// Create the tracks and replace them only if the user is unmuted.
|
||||
if (requestedInput.audio || requestedInput.video) {
|
||||
let tracks = [];
|
||||
const realAudioDeviceId = hasDefaultMicChanged
|
||||
? getDefaultDeviceId(APP.store.getState(), 'audioInput') : newDevices.audioinput;
|
||||
|
||||
try {
|
||||
tracks = await mediaDeviceHelper.createLocalTracksAfterDeviceListChanged(
|
||||
createLocalTracksF,
|
||||
newDevices.videoinput,
|
||||
hasDefaultMicChanged
|
||||
? getDefaultDeviceId(APP.store.getState(), 'audioInput')
|
||||
: newDevices.audioinput);
|
||||
requestedInput.video ? newDevices.videoinput : null,
|
||||
requestedInput.audio ? realAudioDeviceId : null
|
||||
);
|
||||
} catch (error) {
|
||||
logger.error(`Track creation failed on device change, ${error}`);
|
||||
|
||||
@@ -2595,17 +2672,22 @@ export default {
|
||||
async leaveRoom(doDisconnect = true, reason = '') {
|
||||
APP.store.dispatch(conferenceWillLeave(room));
|
||||
|
||||
const maybeDisconnect = () => {
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
};
|
||||
|
||||
if (room && room.isJoined()) {
|
||||
return room.leave(reason).finally(() => {
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
return room.leave(reason).then(() => maybeDisconnect())
|
||||
.catch(e => {
|
||||
logger.error(e);
|
||||
|
||||
return maybeDisconnect();
|
||||
});
|
||||
}
|
||||
|
||||
if (doDisconnect) {
|
||||
return disconnect();
|
||||
}
|
||||
return maybeDisconnect();
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
86
config.js
86
config.js
@@ -46,9 +46,9 @@ var config = {
|
||||
},
|
||||
|
||||
// BOSH URL. FIXME: use XEP-0156 to discover it.
|
||||
bosh: '//jitsi-meet.example.com/' + subdir + 'http-bind',
|
||||
bosh: 'https://jitsi-meet.example.com/' + subdir + 'http-bind',
|
||||
|
||||
// Websocket URL
|
||||
// Websocket URL (XMPP)
|
||||
// websocket: 'wss://jitsi-meet.example.com/' + subdir + 'xmpp-websocket',
|
||||
|
||||
// The real JID of focus participant - can be overridden here
|
||||
@@ -56,11 +56,27 @@ var config = {
|
||||
// https://github.com/jitsi/jitsi-meet/issues/7376
|
||||
// focusUserJid: 'focus@auth.jitsi-meet.example.com',
|
||||
|
||||
// Options related to the bridge (colibri) data channel
|
||||
bridgeChannel: {
|
||||
// If the backend advertises multiple colibri websockets, this options allows
|
||||
// to filter some of them out based on the domain name. We use the first URL
|
||||
// which does not match ignoreDomain, falling back to the first one that matches
|
||||
// ignoreDomain. Has no effect if undefined.
|
||||
// ignoreDomain: 'example.com',
|
||||
|
||||
// Prefer SCTP (WebRTC data channels over the media path) over a colibri websocket.
|
||||
// If SCTP is available in the backend it will be used instead of a WS. Defaults to
|
||||
// false (SCTP is used only if available and no WS are available).
|
||||
// preferSctp: false
|
||||
},
|
||||
|
||||
// Testing / experimental features.
|
||||
//
|
||||
|
||||
testing: {
|
||||
// Allows the setting of a custom bandwidth value from the UI.
|
||||
// assumeBandwidth: true,
|
||||
|
||||
// Disables the End to End Encryption feature. Useful for debugging
|
||||
// issues related to insertable streams.
|
||||
// disableE2EE: false,
|
||||
@@ -126,9 +142,6 @@ var config = {
|
||||
// Media
|
||||
//
|
||||
|
||||
// Enable unified plan implementation support on Chromium based browsers.
|
||||
// enableUnifiedOnChrome: false,
|
||||
|
||||
// Audio
|
||||
|
||||
// Disable measuring of audio levels.
|
||||
@@ -184,6 +197,22 @@ var config = {
|
||||
// enableOpusDtx: false,
|
||||
// },
|
||||
|
||||
// Noise suppression configuration. By default rnnoise is used. Optionally Krisp
|
||||
// can be used by enabling it below, but the Krisp JS SDK files must be supplied in your
|
||||
// installation. Specifically, these files are needed:
|
||||
// - https://meet.example.com/libs/krisp/krisp.mjs
|
||||
// - https://meet.example.com/libs/krisp/models/model_8.kw
|
||||
// - https://meet.example.com/libs/krisp/models/model_16.kw
|
||||
// - https://meet.example.com/libs/krisp/models/model_32.kw
|
||||
// NOTE: Krisp JS SDK v1.0.9 was tested.
|
||||
// noiseSuppression: {
|
||||
// krisp: {
|
||||
// enabled: false,
|
||||
// logProcessStats: false,
|
||||
// debugLogs: false,
|
||||
// },
|
||||
// },
|
||||
|
||||
// Video
|
||||
|
||||
// Sets the preferred resolution (height) for local video. Defaults to 720.
|
||||
@@ -244,12 +273,6 @@ var config = {
|
||||
// Enable / disable simulcast support.
|
||||
// disableSimulcast: false,
|
||||
|
||||
// Enable / disable layer suspension. If enabled, endpoints whose HD layers are not in use will be suspended
|
||||
// (no longer sent) until they are requested again. This is enabled by default. This must be enabled for screen
|
||||
// sharing to work as expected on Chrome. Disabling this might result in low resolution screenshare being sent
|
||||
// by the client.
|
||||
// enableLayerSuspension: false,
|
||||
|
||||
// Every participant after the Nth will start video muted.
|
||||
// startVideoMuted: 10,
|
||||
|
||||
@@ -402,22 +425,6 @@ var config = {
|
||||
// value will be used when the quality level is selected using "Manage Video Quality" slider.
|
||||
// startLastN: 1,
|
||||
|
||||
// Provides a way to use different "last N" values based on the number of participants in the conference.
|
||||
// The keys in an Object represent number of participants and the values are "last N" to be used when number of
|
||||
// participants gets to or above the number.
|
||||
//
|
||||
// For the given example mapping, "last N" will be set to 20 as long as there are at least 5, but less than
|
||||
// 29 participants in the call and it will be lowered to 15 when the 30th participant joins. The 'channelLastN'
|
||||
// will be used as default until the first threshold is reached.
|
||||
//
|
||||
// lastNLimits: {
|
||||
// 5: 20,
|
||||
// 30: 15,
|
||||
// 50: 10,
|
||||
// 70: 5,
|
||||
// 90: 2,
|
||||
// },
|
||||
|
||||
// Specify the settings for video quality optimizations on the client.
|
||||
// videoQuality: {
|
||||
// // Provides a way to prevent a video codec from being negotiated on the JVB connection. The codec specified
|
||||
@@ -561,6 +568,9 @@ var config = {
|
||||
// Require users to always specify a display name.
|
||||
// requireDisplayName: true,
|
||||
|
||||
// Enables webhid functionality for Audio.
|
||||
// enableWebHIDFeature: false,
|
||||
|
||||
// DEPRECATED! Use 'welcomePage.disabled' instead.
|
||||
// Whether to use a welcome page or not. In case it's false a random room
|
||||
// will be joined when no room is specified.
|
||||
@@ -917,9 +927,6 @@ var config = {
|
||||
// connection.
|
||||
enabled: true,
|
||||
|
||||
// Enable unified plan implementation support on Chromium for p2p connection.
|
||||
// enableUnifiedOnChrome: false,
|
||||
|
||||
// Sets the ICE transport policy for the p2p connection. At the time
|
||||
// of this writing the list of possible values are 'all' and 'relay',
|
||||
// but that is subject to change in the future. The enum is defined in
|
||||
@@ -1061,7 +1068,12 @@ var config = {
|
||||
// },
|
||||
|
||||
// e2ee: {
|
||||
// labels,
|
||||
// labels: {
|
||||
// description: '',
|
||||
// label: '',
|
||||
// tooltip: '',
|
||||
// warning: '',
|
||||
// },
|
||||
// externallyManagedKey: false,
|
||||
// },
|
||||
|
||||
@@ -1146,6 +1158,13 @@ var config = {
|
||||
// }
|
||||
// },
|
||||
|
||||
// // The terms, privacy and help centre URL's.
|
||||
// legalUrls: {
|
||||
// helpCentre: 'https://web-cdn.jitsi.net/faq/meet-faq.html',
|
||||
// privacy: 'https://jitsi.org/meet/privacy',
|
||||
// terms: 'https://jitsi.org/meet/terms'
|
||||
// },
|
||||
|
||||
// A property to disable the right click context menu for localVideo
|
||||
// the menu has option to flip the locally seen video for local presentations
|
||||
// disableLocalVideoFlip: false,
|
||||
@@ -1238,7 +1257,6 @@ var config = {
|
||||
ui03: "violet",
|
||||
ui04: "magenta",
|
||||
ui05: "blueviolet",
|
||||
field02Hover: 'red',
|
||||
action01: 'green',
|
||||
action01Hover: 'lightgreen',
|
||||
disabled01: 'beige',
|
||||
@@ -1365,8 +1383,6 @@ var config = {
|
||||
dialOutRegionUrl
|
||||
disableRemoteControl
|
||||
displayJids
|
||||
externalConnectUrl
|
||||
e2eeLabels
|
||||
firefox_fake_device
|
||||
googleApiApplicationClientID
|
||||
iAmRecorder
|
||||
@@ -1389,7 +1405,6 @@ var config = {
|
||||
/**
|
||||
_peerConnStatusOutOfLastNTimeout
|
||||
_peerConnStatusRtcMuteTimeout
|
||||
abTesting
|
||||
avgRtpStatsN
|
||||
callStatsConfIDNamespace
|
||||
callStatsCustomScriptUrl
|
||||
@@ -1398,6 +1413,7 @@ var config = {
|
||||
disableAGC
|
||||
disableAP
|
||||
disableHPF
|
||||
disableLocalStats
|
||||
disableNS
|
||||
enableTalkWhileMuted
|
||||
forceJVB121Ratio
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
constructOptions
|
||||
} from './react/features/base/connection/actions.web';
|
||||
import { openDialog } from './react/features/base/dialog/actions';
|
||||
import { setJWT } from './react/features/base/jwt';
|
||||
import { setJWT } from './react/features/base/jwt/actions';
|
||||
import {
|
||||
JitsiConnectionErrors,
|
||||
JitsiConnectionEvents
|
||||
@@ -32,54 +32,6 @@ const logger = Logger.getLogger(__filename);
|
||||
*/
|
||||
export const DISCO_JIBRI_FEATURE = 'http://jitsi.org/protocol/jibri';
|
||||
|
||||
/**
|
||||
* Checks if we have data to use attach instead of connect. If we have the data
|
||||
* executes attach otherwise check if we have to wait for the data. If we have
|
||||
* to wait for the attach data we are setting handler to APP.connect.handler
|
||||
* which is going to be called when the attach data is received otherwise
|
||||
* executes connect.
|
||||
*
|
||||
* @param {string} [id] user id
|
||||
* @param {string} [password] password
|
||||
* @param {string} [roomName] the name of the conference.
|
||||
*/
|
||||
function checkForAttachParametersAndConnect(id, password, connection) {
|
||||
if (window.XMPPAttachInfo) {
|
||||
APP.connect.status = 'connecting';
|
||||
|
||||
// When connection optimization is not deployed or enabled the default
|
||||
// value will be window.XMPPAttachInfo.status = "error"
|
||||
// If the connection optimization is deployed and enabled and there is
|
||||
// a failure the value will be window.XMPPAttachInfo.status = "error"
|
||||
if (window.XMPPAttachInfo.status === 'error') {
|
||||
connection.connect({
|
||||
id,
|
||||
password
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const attachOptions = window.XMPPAttachInfo.data;
|
||||
|
||||
if (attachOptions) {
|
||||
connection.attach(attachOptions);
|
||||
delete window.XMPPAttachInfo.data;
|
||||
} else {
|
||||
connection.connect({
|
||||
id,
|
||||
password
|
||||
});
|
||||
}
|
||||
} else {
|
||||
APP.connect.status = 'ready';
|
||||
APP.connect.handler
|
||||
= checkForAttachParametersAndConnect.bind(
|
||||
null,
|
||||
id, password, connection);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to open connection using provided credentials.
|
||||
* @param {string} [id]
|
||||
@@ -182,7 +134,10 @@ export async function connect(id, password) {
|
||||
APP.store.dispatch(setPrejoinDisplayNameRequired());
|
||||
}
|
||||
|
||||
checkForAttachParametersAndConnect(id, password, connection);
|
||||
connection.connect({
|
||||
id,
|
||||
password
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -212,7 +167,7 @@ export function openConnection({ id, password, retry, roomName }) {
|
||||
password = passwordOverride; // eslint-disable-line no-param-reassign
|
||||
}
|
||||
|
||||
return connect(id, password, roomName).catch(err => {
|
||||
return connect(id, password).catch(err => {
|
||||
if (retry) {
|
||||
const { jwt } = APP.store.getState()['features/base/jwt'];
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = {
|
||||
'extends': '../react/.eslintrc.js'
|
||||
};
|
||||
@@ -1,86 +0,0 @@
|
||||
/* global config, createConnectionExternally */
|
||||
|
||||
import getRoomName from '../react/features/base/config/getRoomName';
|
||||
import { parseURLParams } from '../react/features/base/util/parseURLParams';
|
||||
|
||||
/**
|
||||
* Implements external connect using createConnectionExternally function defined
|
||||
* in external_connect.js for Jitsi Meet. Parses the room name and JSON Web
|
||||
* Token (JWT) from the URL and executes createConnectionExternally.
|
||||
*
|
||||
* NOTE: If you are using lib-jitsi-meet without Jitsi Meet, you should use this
|
||||
* file as reference only because the implementation is Jitsi Meet-specific.
|
||||
*
|
||||
* NOTE: For optimal results this file should be included right after
|
||||
* external_connect.js.
|
||||
*/
|
||||
|
||||
if (typeof createConnectionExternally === 'function') {
|
||||
// URL params have higher priority than config params.
|
||||
// Do not use external connect if websocket is enabled.
|
||||
let url
|
||||
= parseURLParams(window.location, true, 'hash')[
|
||||
'config.externalConnectUrl']
|
||||
|| config.websocket ? undefined : config.externalConnectUrl;
|
||||
const isRecorder
|
||||
= parseURLParams(window.location, true, 'hash')['config.iAmRecorder'];
|
||||
|
||||
let roomName;
|
||||
|
||||
if (url && (roomName = getRoomName()) && !isRecorder) {
|
||||
url += `?room=${roomName}`;
|
||||
|
||||
const token = parseURLParams(window.location, true, 'search').jwt;
|
||||
|
||||
if (token) {
|
||||
url += `&token=${token}`;
|
||||
}
|
||||
|
||||
createConnectionExternally(
|
||||
url,
|
||||
connectionInfo => {
|
||||
// Sets that global variable to be used later by connect method
|
||||
// in connection.js.
|
||||
window.XMPPAttachInfo = {
|
||||
status: 'success',
|
||||
data: connectionInfo
|
||||
};
|
||||
checkForConnectHandlerAndConnect();
|
||||
},
|
||||
errorCallback);
|
||||
} else {
|
||||
errorCallback();
|
||||
}
|
||||
} else {
|
||||
errorCallback();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if connect from connection.js was executed and executes the handler
|
||||
* that is going to finish the connect work.
|
||||
*
|
||||
* @returns {void}
|
||||
*/
|
||||
function checkForConnectHandlerAndConnect() {
|
||||
window.APP
|
||||
&& window.APP.connect.status === 'ready'
|
||||
&& window.APP.connect.handler();
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements a callback to be invoked if anything goes wrong.
|
||||
*
|
||||
* @param {Error} error - The specifics of what went wrong.
|
||||
* @returns {void}
|
||||
*/
|
||||
function errorCallback(error) {
|
||||
// The value of error is undefined if external connect is disabled.
|
||||
error && console.warn(error);
|
||||
|
||||
// Sets that global variable to be used later by connect method in
|
||||
// connection.js.
|
||||
window.XMPPAttachInfo = {
|
||||
status: 'error'
|
||||
};
|
||||
checkForConnectHandlerAndConnect();
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
/**
|
||||
* Mixins that mimic the way Atlaskit fills the screen with modals at low screen widths.
|
||||
*/
|
||||
@mixin full-size-modal-positioner() {
|
||||
height: 100%;
|
||||
left: 0;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@mixin full-size-modal-dialog() {
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the @atlaskit/flag container up a little bit so it does not cover the
|
||||
* toolbar with the first notification.
|
||||
*/
|
||||
.atlaskit-portal > #notifications-container {
|
||||
bottom: calc(#{$newToolbarSizeWithPadding}) !important;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Keep overflow menu within screen vertical bounds and make it scrollable.
|
||||
*/
|
||||
.toolbox-button-wth-dialog > div:nth-child(2) {
|
||||
background: $menuBG;
|
||||
max-height: calc(100vh - #{$newToolbarSizeWithPadding} - 46px);
|
||||
margin-bottom: 4px;
|
||||
padding: 0;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove background color and box-shadow for the context menu container.
|
||||
*/
|
||||
.toolbox-button-wth-dialog.context-menu > div:nth-child(2) {
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
overflow-y: initial;
|
||||
}
|
||||
|
||||
.audio-preview > div:nth-child(2),
|
||||
.video-preview > div:nth-child(2) {
|
||||
margin-bottom: 4px;
|
||||
outline: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The following selectors keep the chat modal full-size anywhere between 100px
|
||||
* and 580px for desktop or 680px for mobile.
|
||||
*/
|
||||
@media (min-width: 100px) and (max-width: 320px) {
|
||||
.smiley-input {
|
||||
display: none;
|
||||
}
|
||||
.shift-right .focus-lock > div > div {
|
||||
@include full-size-modal-positioner();
|
||||
}
|
||||
|
||||
.shift-right .focus-lock [role="dialog"] {
|
||||
@include full-size-modal-dialog();
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 480px) and (max-width: 580px) {
|
||||
.shift-right .focus-lock > div > div {
|
||||
@include full-size-modal-positioner();
|
||||
}
|
||||
|
||||
.shift-right .focus-lock [role="dialog"] {
|
||||
@include full-size-modal-dialog();
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 580px) {
|
||||
// Override Atlaskit inline style for the modal background.
|
||||
// Important is unfortunately needed for that.
|
||||
.shift-right .focus-lock [role="dialog"][style] {
|
||||
background-color: $chatBackgroundColor !important;
|
||||
}
|
||||
|
||||
// Remove Atlaskit padding from the chat dialog.
|
||||
.shift-right .focus-lock [role="dialog"] > div:first-child > div:nth-child(2) {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
|
||||
div.Tooltip {
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
// make modal full screen on landscape orientation
|
||||
@media (max-height: 420px) {
|
||||
.atlaskit-portal {
|
||||
.css-1oc7v0j {
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
max-width: 100%;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
|
||||
&> div {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
.audio-preview {
|
||||
display: inline-block;
|
||||
|
||||
&-content {
|
||||
position: relative;
|
||||
right: auto;
|
||||
margin-bottom: 8px;
|
||||
max-height: 456px;
|
||||
overflow: auto;
|
||||
width: 300px;
|
||||
|
||||
&-ul {
|
||||
margin:0;
|
||||
padding:0;
|
||||
list-style-type: none;
|
||||
}
|
||||
}
|
||||
|
||||
&-header:hover {
|
||||
background-color: initial;
|
||||
cursor: initial;
|
||||
}
|
||||
|
||||
&-entry-text {
|
||||
display: inline-block;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 213px;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
|
||||
&.left-margin {
|
||||
margin-left: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
&-speaker {
|
||||
position: relative;
|
||||
|
||||
&:hover, &:focus-within, &:focus {
|
||||
.audio-preview-test-button {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.audio-preview-entry-text {
|
||||
max-width: 178px;
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.audio-preview-entry-text {
|
||||
max-width: 238px;
|
||||
}
|
||||
}
|
||||
|
||||
&-microphone {
|
||||
position: relative;
|
||||
|
||||
&--nometer {
|
||||
.audio-preview-entry-text {
|
||||
max-width: 238px;
|
||||
}
|
||||
}
|
||||
|
||||
&--withmeter {
|
||||
.audio-preview-entry-text {
|
||||
max-width: 178px;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
&-icon {
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
width: 14px;
|
||||
|
||||
&--exclamation {
|
||||
margin-left: 6px;
|
||||
|
||||
& svg {
|
||||
fill: #E54B4B;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-test-button {
|
||||
display: none;
|
||||
padding: 4px 10px;
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 6px;
|
||||
}
|
||||
|
||||
&-meter-mic {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 14px;
|
||||
}
|
||||
|
||||
&-checkbox-container {
|
||||
padding: 10px 16px;
|
||||
}
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
.cpick {
|
||||
border: 1px solid #A4B8D1;
|
||||
color: #fff;
|
||||
display: flex;
|
||||
font-size: 15px;
|
||||
height: 38px;
|
||||
line-height: 24px;
|
||||
|
||||
&-selector {
|
||||
align-items: center;
|
||||
background-color: #283447;
|
||||
border-right: 1px solid #A4B8D1;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
padding: 8px 10px;
|
||||
position: relative;
|
||||
width: 88px;
|
||||
}
|
||||
|
||||
&-icon {
|
||||
margin-right: 8px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 12px;
|
||||
|
||||
& > svg {
|
||||
fill: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
&-input {
|
||||
padding: 8px;
|
||||
background: #1C2025;
|
||||
border: 0;
|
||||
margin: 0;
|
||||
color: #fff;
|
||||
caret-color: #0376DA;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
&-dropdown {
|
||||
height: 190px;
|
||||
overflow-y: auto;
|
||||
width: 343px;
|
||||
}
|
||||
|
||||
&-dropdown-entry {
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
height: 40px;
|
||||
padding: 0 10px;
|
||||
|
||||
&:hover {
|
||||
background-color: #66768b;
|
||||
}
|
||||
|
||||
&-text {
|
||||
color: #fff;
|
||||
flex-grow: 1;
|
||||
font-size: 15px;
|
||||
line-height: 24px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Override @Atlaskit/inline-dialog styles
|
||||
.cpick-container > div:nth-child(2) {
|
||||
outline: none;
|
||||
padding: 8px 0 0 0;
|
||||
}
|
||||
@@ -82,6 +82,7 @@
|
||||
}
|
||||
|
||||
.left-column {
|
||||
order: -1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 0;
|
||||
@@ -92,6 +93,7 @@
|
||||
.right-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
flex-grow: 1;
|
||||
padding-left: 16px;
|
||||
padding-top: 13px;
|
||||
@@ -99,11 +101,11 @@
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
line-height: 16px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
line-height: 16px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
color: #5E6D7A;
|
||||
@@ -125,8 +127,7 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&.with-click-handler:hover,
|
||||
&.with-click-handler:focus {
|
||||
&.with-click-handler:hover {
|
||||
background-color: #c7ddff;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
.notification-appear, .notification-enter {
|
||||
opacity: 0;
|
||||
position: relative;
|
||||
left: -200px;
|
||||
transition: all .2s !important; // !important needed to overwrite atlaskit default style
|
||||
|
||||
&-active {
|
||||
opacity: 1;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.notification-exit {
|
||||
opacity: 1;
|
||||
position: relative;
|
||||
left: 0;
|
||||
transition: all .2s !important; // !important needed to overwrite atlaskit default style
|
||||
|
||||
&-active {
|
||||
opacity: 0;
|
||||
left: -200px;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
#polls-panel {
|
||||
.polls-panel {
|
||||
height: calc(100% - 119px);
|
||||
}
|
||||
|
||||
@@ -1,49 +1,33 @@
|
||||
/**
|
||||
* Mousemove padding styles are used to add invisible elements to the popover
|
||||
* to allow mouse movement from the popover trigger to the popover itself
|
||||
* without triggering a mouseleave event.
|
||||
*/
|
||||
%vertical-popover-padding {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 20px;
|
||||
padding: 20px 0;
|
||||
top: -20px;
|
||||
}
|
||||
|
||||
%horizontal-popover-padding {
|
||||
height: 25px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
padding: 0 35px;
|
||||
left: -35px;
|
||||
}
|
||||
|
||||
.popover-mousemove-padding-left {
|
||||
@extend %vertical-popover-padding;
|
||||
left: -35px;
|
||||
}
|
||||
|
||||
.popover-mousemove-padding-right {
|
||||
@extend %vertical-popover-padding;
|
||||
right: -35px;
|
||||
}
|
||||
|
||||
.popover-mousemove-padding-bottom {
|
||||
@extend %horizontal-popover-padding;
|
||||
bottom: -40px;
|
||||
}
|
||||
|
||||
.popover-mousemove-padding-top {
|
||||
@extend %horizontal-popover-padding;
|
||||
top: -40px;
|
||||
}
|
||||
|
||||
.popover {
|
||||
margin: -16px -24px;
|
||||
z-index: $popoverZ;
|
||||
|
||||
.popover-content {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&.hover {
|
||||
margin: -16px -24px;
|
||||
|
||||
.popover-content {
|
||||
margin: 16px 24px;
|
||||
|
||||
&.top {
|
||||
bottom: 8px;
|
||||
}
|
||||
|
||||
&.bottom {
|
||||
top: 4px;
|
||||
}
|
||||
|
||||
&.left {
|
||||
right: 4px;
|
||||
}
|
||||
|
||||
&.right {
|
||||
left: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.excalidraw .popover {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
width: 280px;
|
||||
background: $menuBG;
|
||||
box-shadow: 0px 3px 16px rgba(0, 0, 0, 0.6), 0px 0px 4px 1px rgba(0, 0, 0, 0.25);
|
||||
border-radius: 3px;
|
||||
border-radius: 6px;
|
||||
padding: 16px;
|
||||
|
||||
&.with-gif {
|
||||
@@ -104,10 +104,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
.reactions-menu-container {
|
||||
padding-bottom: 6px;
|
||||
}
|
||||
|
||||
.reactions-animations-container {
|
||||
position: absolute;
|
||||
width: 20%;
|
||||
|
||||
@@ -197,14 +197,6 @@
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.helper-link {
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.warning-text {
|
||||
color:#FFD740;
|
||||
font-size: 12px;
|
||||
|
||||
@@ -3,30 +3,33 @@
|
||||
display: block;
|
||||
|
||||
#enter_room {
|
||||
position: relative;
|
||||
height: 42px;
|
||||
|
||||
.welcome-page-button {
|
||||
font-size: 16px;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 68px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
font-size: 16px;
|
||||
left: 0;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.header {
|
||||
background-color: #002637;
|
||||
|
||||
.insecure-room-name-warning {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#enter_room {
|
||||
.enter-room-input-container {
|
||||
padding-right: 0;
|
||||
width: 100%;
|
||||
|
||||
.join-meeting-container {
|
||||
padding: 0;
|
||||
flex-direction: column;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.warning-without-link,
|
||||
.warning-with-link {
|
||||
top: 120px;
|
||||
.enter-room-input-container {
|
||||
padding-right: 0;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,20 +34,20 @@
|
||||
background: #F2F3F4;
|
||||
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 1px rgba(0, 0, 0, 0.1);
|
||||
|
||||
& > svg {
|
||||
& svg {
|
||||
fill: #040404;
|
||||
}
|
||||
|
||||
&.settings-button-small-icon--disabled {
|
||||
background: #36383C;
|
||||
|
||||
&> svg {
|
||||
& svg {
|
||||
fill: #929292;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& > svg {
|
||||
& svg {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
background-color: #36383c;
|
||||
cursor: default;
|
||||
|
||||
&> svg {
|
||||
& svg {
|
||||
fill: #929292;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,14 @@
|
||||
pointer-events: none;
|
||||
z-index: $toolbarZ + 2;
|
||||
|
||||
&.shift-up {
|
||||
bottom: calc(((#{$newToolbarSize} + 30px) * 2) * -1);
|
||||
|
||||
.toolbox-content {
|
||||
margin-bottom: 46px;
|
||||
}
|
||||
}
|
||||
|
||||
&.visible {
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ $welcomePageHeaderBackground: linear-gradient(0deg, rgba(0, 0, 0, 0.2), rgba(0,
|
||||
$welcomePageHeaderBackgroundPosition: center;
|
||||
$welcomePageHeaderBackgroundRepeat: none;
|
||||
$welcomePageHeaderBackgroundSize: cover;
|
||||
$welcomePageHeaderPaddingBottom: 0px;
|
||||
$welcomePageHeaderPaddingBottom: 15px;
|
||||
$welcomePageHeaderTitleMaxWidth: initial;
|
||||
$welcomePageHeaderTextAlign: center;
|
||||
|
||||
@@ -201,11 +201,6 @@ $deepLinkingDialInConferenceIdPadding: inherit;
|
||||
$deepLinkingDialInConferenceIdBackgroundColor: inherit;
|
||||
$deepLinkingDialInConferenceIdBorderRadius: inherit;
|
||||
|
||||
$deepLinkingDialInConferenceNameFontSize: inherit;
|
||||
$deepLinkingDialInConferenceNameLineHeight: inherit;
|
||||
$deepLinkingDialInConferenceNameMarginBottom: none;
|
||||
$deepLinkingDialInConferenceNameFontWeight: inherit;
|
||||
|
||||
$deepLinkingDialInConferenceDescriptionFontSize: 0.8em;
|
||||
$deepLinkingDialInConferenceDescriptionLineHeight: inherit;
|
||||
$deepLinkingDialInConferenceDescriptionMarginBottom: none;
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
.video-preview {
|
||||
background: none;
|
||||
display: inline-block;
|
||||
|
||||
&-container {
|
||||
max-height: 344px;
|
||||
background: $menuBG;
|
||||
border-radius: 3px;
|
||||
overflow: auto;
|
||||
padding: 8px;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
&-entry {
|
||||
cursor: pointer;
|
||||
height: 168px;
|
||||
margin-bottom: 8px;
|
||||
position: relative;
|
||||
width: 284px;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
&--selected {
|
||||
border: 3px solid #31B76A;
|
||||
border-radius: 3px;
|
||||
cursor: default;
|
||||
height: 162px;
|
||||
width: 278px;
|
||||
}
|
||||
}
|
||||
|
||||
&-video {
|
||||
border-radius: 3px;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-overlay {
|
||||
background: rgba(42, 58, 75, 0.6);
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
&-error {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
height: 100%;
|
||||
justify-content: center;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-label {
|
||||
bottom: 8px;
|
||||
color: #fff;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 2;
|
||||
|
||||
&-container {
|
||||
margin: 0 16px;
|
||||
}
|
||||
|
||||
&-text {
|
||||
background-color: #131519;
|
||||
border-radius: 3px;
|
||||
padding: 2px 8px;
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
margin: 0 auto;
|
||||
max-width: calc(100% - 16px);
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
width: fit-content;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
// Override @atlaskit/InlineDialog container which is made with styled components
|
||||
& > div:nth-child(2) {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
@@ -76,9 +76,42 @@
|
||||
}
|
||||
}
|
||||
|
||||
.animatedFadeIn {
|
||||
opacity: 0;
|
||||
animation: fadeInAnimation 0.3s ease forwards;
|
||||
}
|
||||
|
||||
@keyframes fadeInAnimation {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.animatedFadeOut {
|
||||
opacity: 1;
|
||||
animation: fadeOutAnimation 0.3s ease forwards;
|
||||
}
|
||||
|
||||
@keyframes fadeOutAnimation {
|
||||
from {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
#largeVideoContainer {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
#largeVideoWrapper {
|
||||
|
||||
@@ -20,7 +20,6 @@ body.welcome-page {
|
||||
background-size: $welcomePageHeaderBackgroundSize;
|
||||
padding-bottom: $welcomePageHeaderPaddingBottom;
|
||||
background-color: #131519;
|
||||
height: 400px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
@@ -62,26 +61,58 @@ body.welcome-page {
|
||||
|
||||
}
|
||||
|
||||
.insecure-room-name-warning {
|
||||
align-items: center;
|
||||
color: $defaultWarningColor;
|
||||
font-weight: 600;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: 15px;
|
||||
max-width: 480px;
|
||||
width: $welcomePageEnterRoomWidth;
|
||||
|
||||
.jitsi-icon {
|
||||
margin-right: 15px;
|
||||
|
||||
svg {
|
||||
fill: $defaultWarningColor;
|
||||
|
||||
& > *:first-child {
|
||||
fill: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::placeholder {
|
||||
color: #253858;
|
||||
}
|
||||
|
||||
#enter_room {
|
||||
display: $welcomePageEnterRoomDisplay;
|
||||
align-items: center;
|
||||
max-width: 480px;
|
||||
width: $welcomePageEnterRoomWidth;
|
||||
z-index: $zindex2;
|
||||
background-color: #fff;
|
||||
padding: $welcomePageEnterRoomPadding;
|
||||
border-radius: 4px;
|
||||
margin: $welcomePageEnterRoomMargin;
|
||||
height: fit-content;
|
||||
|
||||
.enter-room-input-container {
|
||||
.join-meeting-container {
|
||||
margin: $welcomePageEnterRoomMargin;
|
||||
padding: $welcomePageEnterRoomPadding;
|
||||
border-radius: 4px;
|
||||
background-color: #fff;
|
||||
display: flex;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
color: #253858;
|
||||
}
|
||||
|
||||
.enter-room-input-container {
|
||||
flex-grow: 1;
|
||||
height: fit-content;
|
||||
padding-right: 4px;
|
||||
position: relative;
|
||||
|
||||
.enter-room-input {
|
||||
border-radius: 4px;
|
||||
border: 0;
|
||||
background: #fff;
|
||||
display: inline-block;
|
||||
@@ -90,48 +121,17 @@ body.welcome-page {
|
||||
font-size: 14px;
|
||||
padding-left: 10px;
|
||||
|
||||
&:focus {
|
||||
&.focus-visible {
|
||||
outline: auto 2px #005fcc;
|
||||
}
|
||||
}
|
||||
|
||||
.insecure-room-name-warning {
|
||||
align-items: center;
|
||||
color: $defaultWarningColor;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
margin-top: 15px;
|
||||
|
||||
.jitsi-icon {
|
||||
margin-right: 15px;
|
||||
|
||||
svg {
|
||||
fill: $defaultWarningColor
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::placeholder {
|
||||
color: #253858;
|
||||
}
|
||||
}
|
||||
|
||||
.warning-without-link {
|
||||
position: absolute;
|
||||
top: 44px;
|
||||
left: -10px;
|
||||
}
|
||||
|
||||
.warning-with-link {
|
||||
position: absolute;
|
||||
top: 84px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#moderated-meetings {
|
||||
max-width: calc(100% - 40px);
|
||||
padding: 16px 0 39px 0;
|
||||
padding: 16px 0 0;
|
||||
width: $welcomePageEnterRoomWidth;
|
||||
text-align: center;
|
||||
|
||||
@@ -167,7 +167,7 @@ body.welcome-page {
|
||||
margin: 4px;
|
||||
display: $welcomePageTabButtonsDisplay;
|
||||
|
||||
.tab {
|
||||
[role="tab"] {
|
||||
background-color: #c7ddff;
|
||||
border-radius: 7px;
|
||||
cursor: pointer;
|
||||
@@ -176,8 +176,10 @@ body.welcome-page {
|
||||
margin: 2px;
|
||||
padding: 7px 0;
|
||||
text-align: center;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
|
||||
&.selected {
|
||||
&[aria-selected="true"] {
|
||||
background-color: #FFF;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
.button-control {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
border: 1px solid $buttonBorder;
|
||||
vertical-align: baseline;
|
||||
height: 30px;
|
||||
min-width: 60px;
|
||||
padding: 4px 10px;
|
||||
margin: 0;
|
||||
line-height: 1.5em;
|
||||
outline: none;
|
||||
background-color: transparent;
|
||||
float: right;
|
||||
font-size: 14px;
|
||||
margin-left: 10px;
|
||||
color: $buttonColor;
|
||||
font-weight: $buttonFontWeight;
|
||||
@include transition(background-color .1s ease-out);
|
||||
|
||||
&[disabled] {
|
||||
color: #666;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
&_full-width {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border: 1px solid $buttonHoverBorder;
|
||||
background-color: $buttonHoverBackground;
|
||||
@include transition(background-color .1s ease-in);
|
||||
}
|
||||
|
||||
&:active {
|
||||
@include box-shadow(0, 0, 1px, $buttonShadowColor, true);
|
||||
}
|
||||
|
||||
&_light {
|
||||
color: $defaultDarkColor;
|
||||
background-color: $buttonLightBackground;
|
||||
border: 1px solid $buttonLightBorder;
|
||||
|
||||
&:hover {
|
||||
border: 1px solid $buttonLightHoverBorder;
|
||||
background-color: $buttonLightHoverBackground;
|
||||
}
|
||||
}
|
||||
|
||||
&_link {
|
||||
color: $buttonLinkColor;
|
||||
background-color: $buttonLinkBackground;
|
||||
|
||||
&:hover {
|
||||
background-color: $buttonLinkBackground;
|
||||
}
|
||||
}
|
||||
|
||||
&_overlay {
|
||||
color: $primaryButtonColor;
|
||||
background-color: $overlayButtonBg;
|
||||
border-radius: 2px;
|
||||
border: none;
|
||||
|
||||
&:hover {
|
||||
background-color: $primaryButtonBackground;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
||||
&_primary {
|
||||
background-color: $primaryButtonBackground;
|
||||
border: 1px solid $primaryButtonBackground;
|
||||
color: $primaryButtonColor !important;
|
||||
font-weight: $primaryButtonFontWeight;
|
||||
|
||||
&:hover {
|
||||
border: 1px solid $primaryButtonHoverBackground;
|
||||
background-color: $primaryButtonHoverBackground;
|
||||
}
|
||||
|
||||
&[disabled] {
|
||||
color: $primaryButtonColor;
|
||||
}
|
||||
}
|
||||
|
||||
&_close {
|
||||
color: $defaultFontColor;
|
||||
}
|
||||
&_submit {
|
||||
color: $linkFontColor;
|
||||
&:hover {
|
||||
color: $linkHoverFontColor;
|
||||
}
|
||||
}
|
||||
|
||||
&_center {
|
||||
float: none !important;
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
.form-control {
|
||||
padding: $formPadding 0;
|
||||
|
||||
&:first-child {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
&__text {
|
||||
margin: 8px 0;
|
||||
font-size: 1em
|
||||
}
|
||||
|
||||
&__label {
|
||||
font-size: 1em;
|
||||
font-weight: $labelFontWeight;
|
||||
}
|
||||
|
||||
&__em {
|
||||
color: $inputControlEmColor;
|
||||
}
|
||||
|
||||
&__container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
@include flex();
|
||||
|
||||
.button-control {
|
||||
margin: 1px 0 1px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
&__right {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a specific color for read only style.
|
||||
*/
|
||||
input:read-only {
|
||||
color: $readOnlyInputColor;
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
.input-control {
|
||||
@include transition(all .2s ease-in);
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
padding: 5px 7px;
|
||||
border-radius: $borderRadius;
|
||||
line-height: 32px;
|
||||
height: 32px;
|
||||
text-align: left;
|
||||
margin-bottom: 8px;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: inherit;
|
||||
}
|
||||
|
||||
&::selection {
|
||||
background-color: $defaultDarkSelectionColor;
|
||||
}
|
||||
|
||||
|
||||
&.error {
|
||||
color: $errorColor;
|
||||
border-color: $errorColor;
|
||||
}
|
||||
}
|
||||
|
||||
@include placeholder {
|
||||
color: $placeHolderColor;
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
.link {
|
||||
cursor: pointer;
|
||||
color: $linkFontColor;
|
||||
@include transition(color .1s ease-out);
|
||||
|
||||
&:hover {
|
||||
color: $linkHoverFontColor;
|
||||
text-decoration: underline;
|
||||
@include transition(color .1s ease-in);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper links are links that are meant to open a documentation page or more
|
||||
* detailed info.
|
||||
*/
|
||||
.helper-link {
|
||||
@extend .link;
|
||||
font-size: 12px;
|
||||
}
|
||||
@@ -67,6 +67,13 @@
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
|
||||
.dial-in-conference-id {
|
||||
text-align: center;
|
||||
min-width: 200px;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.dial-in-conference-id {
|
||||
margin: $deepLinkingDialInConferenceIdMargin;
|
||||
padding: $deepLinkingDialInConferenceIdPadding;
|
||||
@@ -74,24 +81,12 @@
|
||||
border-radius: $deepLinkingDialInConferenceIdBorderRadius;
|
||||
}
|
||||
|
||||
.dial-in-conference-name {
|
||||
font-size: $deepLinkingDialInConferenceNameFontSize;
|
||||
line-height: $deepLinkingDialInConferenceNameLineHeight;
|
||||
margin-bottom: $deepLinkingDialInConferenceNameMarginBottom;
|
||||
font-weight: $deepLinkingDialInConferenceNameFontWeight;
|
||||
}
|
||||
|
||||
.dial-in-conference-description {
|
||||
font-size: $deepLinkingDialInConferenceDescriptionFontSize;
|
||||
line-height: $deepLinkingDialInConferenceDescriptionLineHeight;
|
||||
margin-bottom: $deepLinkingDialInConferenceDescriptionMarginBottom;
|
||||
}
|
||||
|
||||
.dial-in-conference-pin {
|
||||
font-size: $deepLinkingDialInConferencePinFontSize;
|
||||
line-height: $deepLinkingDialInConferencePinLineHeight;
|
||||
}
|
||||
|
||||
.toll-free-list {
|
||||
min-width: 80px;
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ $flagsImagePath: "../images/";
|
||||
|
||||
/* Modules BEGIN */
|
||||
@import 'reset';
|
||||
@import 'atlaskit_overrides';
|
||||
@import 'base';
|
||||
@import 'utils';
|
||||
@import 'overlay/overlay';
|
||||
@@ -33,10 +32,7 @@ $flagsImagePath: "../images/";
|
||||
@import 'reload_overlay/reload_overlay';
|
||||
@import 'mini_toolbox';
|
||||
@import 'modals/desktop-picker/desktop-picker';
|
||||
@import 'modals/device-selection/device-selection';
|
||||
@import 'modals/dialog';
|
||||
@import 'modals/embed-meeting/embed-meeting';
|
||||
@import 'modals/feedback/feedback';
|
||||
@import 'modals/invite/info';
|
||||
@import 'modals/screen-share/share-audio';
|
||||
@import 'modals/screen-share/share-screen-warning';
|
||||
@@ -53,10 +49,6 @@ $flagsImagePath: "../images/";
|
||||
@import 'welcome_page_settings_toolbar';
|
||||
@import 'toolbars';
|
||||
@import 'redirect_page';
|
||||
@import 'components/form-control';
|
||||
@import 'components/link';
|
||||
@import 'components/button-control';
|
||||
@import 'components/input-control';
|
||||
@import 'components/input-slider';
|
||||
@import '404';
|
||||
@import 'policy';
|
||||
@@ -68,7 +60,6 @@ $flagsImagePath: "../images/";
|
||||
@import 'filmstrip/vertical_filmstrip';
|
||||
@import 'filmstrip/vertical_filmstrip_overrides';
|
||||
@import 'unsupported-browser/main';
|
||||
@import 'modals/invite/add-people';
|
||||
@import 'deep-linking/main';
|
||||
@import 'transcription-subtitles';
|
||||
@import '_meetings_list.scss';
|
||||
@@ -79,10 +70,7 @@ $flagsImagePath: "../images/";
|
||||
@import 'chrome-extension-banner';
|
||||
@import 'settings-button';
|
||||
@import 'meter';
|
||||
@import 'audio-preview';
|
||||
@import 'video-preview';
|
||||
@import 'premeeting/main';
|
||||
@import 'country-picker';
|
||||
@import 'modals/invite/invite_more';
|
||||
@import 'modals/security/security';
|
||||
@import 'e2ee';
|
||||
@@ -92,6 +80,5 @@ $flagsImagePath: "../images/";
|
||||
@import 'reactions-menu';
|
||||
@import 'plan-limit';
|
||||
@import 'polls';
|
||||
@import 'notifications';
|
||||
|
||||
/* Modules END */
|
||||
|
||||
@@ -12,24 +12,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Styling inline dialog errors.
|
||||
*/
|
||||
.inline-dialog-error {
|
||||
margin-top: 16px;
|
||||
|
||||
&-text {
|
||||
color: $dialogErrorText;
|
||||
margin-bottom: 8px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-button {
|
||||
display: block;
|
||||
margin: 16px auto 0 auto;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Styling shared video dialog errors.
|
||||
*/
|
||||
|
||||
@@ -63,3 +63,8 @@
|
||||
.desktop-source-preview-image-container {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.desktop-picker-tabs-container {
|
||||
width: 65%;
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
.device-selection {
|
||||
.device-selectors {
|
||||
font-size: 14px;
|
||||
|
||||
> div {
|
||||
display: block;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.device-selector-icon {
|
||||
align-self: center;
|
||||
color: inherit;
|
||||
font-size: 20px;
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.device-selector-label {
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
/* device-selector-trigger stylings attempt to mimic AtlasKit button */
|
||||
.device-selector-trigger {
|
||||
background-color: #0E1624;
|
||||
border: 1px solid #455166;
|
||||
border-radius: 5px;
|
||||
display: flex;
|
||||
height: 2.3em;
|
||||
justify-content: space-between;
|
||||
line-height: 2.3em;
|
||||
overflow: hidden;
|
||||
padding: 0 8px;
|
||||
}
|
||||
.device-selector-trigger-disabled {
|
||||
.device-selector-trigger {
|
||||
color: #a5adba;
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.device-selector-trigger-text {
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.device-selection-column {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
|
||||
&.column-selectors {
|
||||
margin-left: 15px;
|
||||
width: 45%;
|
||||
}
|
||||
|
||||
&.column-video {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.device-selection-video-container {
|
||||
border-radius: 3px;
|
||||
margin-bottom: 5px;
|
||||
|
||||
.video-input-preview {
|
||||
margin-top: 2px;
|
||||
position: relative;
|
||||
|
||||
> video {
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.video-input-preview-error {
|
||||
color: $participantNameColor;
|
||||
display: none;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
top: 50%;
|
||||
}
|
||||
|
||||
&.video-preview-has-error {
|
||||
background: black;
|
||||
|
||||
.video-input-preview-error {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.video-input-preview-display {
|
||||
height: auto;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.audio-output-preview {
|
||||
font-size: 14px;
|
||||
|
||||
a {
|
||||
color: #6FB1EA;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #B3D4FF;
|
||||
}
|
||||
}
|
||||
|
||||
.audio-input-preview {
|
||||
background: #1B2638;
|
||||
border-radius: 5px;
|
||||
height: 8px;
|
||||
|
||||
.audio-input-preview-level {
|
||||
background: #75B1FF;
|
||||
border-radius: 5px;
|
||||
height: 100%;
|
||||
-webkit-transition: width .1s ease-in-out;
|
||||
-moz-transition: width .1s ease-in-out;
|
||||
-o-transition: width .1s ease-in-out;
|
||||
transition: width .1s ease-in-out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.device-selection.video-hidden {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
|
||||
.column-selectors {
|
||||
width: 100%;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.column-video {
|
||||
order: 1;
|
||||
width: 100%;
|
||||
margin-top: 8px;
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
.embed-meeting {
|
||||
&-dialog {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
&-copy {
|
||||
color: white;
|
||||
font-size: 15px;
|
||||
margin-left: auto;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
&-code {
|
||||
background: transparent;
|
||||
border: 1px solid #A4B8D1;
|
||||
color: white;
|
||||
font-size: 15px;
|
||||
height: 165px;
|
||||
line-height: 24px;
|
||||
padding: 8px;
|
||||
width: 100%;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
&-trigger {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8px 8px 8px 16px;
|
||||
margin-top: 24px;
|
||||
width: calc(100% - 24px);
|
||||
height: 24px;
|
||||
background: #2A3A4B;
|
||||
border: 1px solid #5E6D7A;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
|
||||
.jitsi-icon {
|
||||
margin-right: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
@-webkit-keyframes shake-rotate {
|
||||
0% {
|
||||
-webkit-transform:scale(1) rotate(0deg);
|
||||
transform:scale(1) rotate(0deg)
|
||||
}
|
||||
|
||||
50% {
|
||||
-webkit-transform:scale(.8) rotate(-5deg);
|
||||
transform:scale(.8) rotate(-5deg)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform:scale(1) rotate(3deg);
|
||||
transform:scale(1) rotate(3deg)
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes shake-rotate {
|
||||
0% {
|
||||
-webkit-transform:scale(1) rotate(0deg);
|
||||
transform:scale(1) rotate(0deg)
|
||||
}
|
||||
|
||||
50% {
|
||||
-webkit-transform:scale(.8) rotate(-5deg);
|
||||
transform:scale(.8) rotate(-5deg)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform:scale(1) rotate(3deg);
|
||||
transform:scale(1) rotate(3deg)
|
||||
}
|
||||
}
|
||||
|
||||
.shake-rotate {
|
||||
display: inline-block;
|
||||
|
||||
-webkit-animation-duration: .4s;
|
||||
animation-duration: .4s;
|
||||
-webkit-animation-iteration-count: infinite;
|
||||
animation-iteration-count: infinite;
|
||||
-webkit-animation-name: shake-rotate;
|
||||
animation-name: shake-rotate;
|
||||
-webkit-animation-timing-function: ease-in-out;
|
||||
animation-timing-function: ease-in-out
|
||||
}
|
||||
|
||||
.feedback-dialog {
|
||||
margin-bottom: 5px;
|
||||
|
||||
.details {
|
||||
textarea {
|
||||
min-height: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
.input-control {
|
||||
background-color: $feedbackInputBg;
|
||||
color: $feedbackInputTextColor;
|
||||
|
||||
&::-webkit-input-placeholder {
|
||||
color: $feedbackInputPlaceholderColor;
|
||||
}
|
||||
&::-moz-placeholder { /* Firefox 19+ */
|
||||
color: $feedbackInputPlaceholderColor;
|
||||
}
|
||||
&:-ms-input-placeholder {
|
||||
color: $feedbackInputPlaceholderColor;
|
||||
}
|
||||
}
|
||||
|
||||
.rating {
|
||||
line-height: 1.2;
|
||||
margin-top: 10px;
|
||||
text-align: center;
|
||||
|
||||
.star-label {
|
||||
font-size: 14px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.star-btn {
|
||||
color: inherit;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
font-size: 34px;
|
||||
outline: none;
|
||||
position: relative;
|
||||
text-decoration: none;
|
||||
@include transition(all .2s ease);
|
||||
|
||||
&.active,
|
||||
&:hover,
|
||||
&.starHover {
|
||||
color: #36B37E;
|
||||
};
|
||||
|
||||
}
|
||||
.star-btn:focus,
|
||||
.star-btn:active {
|
||||
outline: 1px solid #B8C7E0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -41,10 +41,3 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Styles errors in the MultiSelectAutocomplete.
|
||||
*/
|
||||
.autocomplete-error {
|
||||
min-width: 260px;
|
||||
}
|
||||
|
||||
@@ -50,17 +50,19 @@
|
||||
}
|
||||
|
||||
.dial-in-numbers-list {
|
||||
max-width: 334px;
|
||||
width: 100%;
|
||||
margin-top: 20px;
|
||||
font-size: 12px;
|
||||
line-height: 24px;
|
||||
border-collapse: collapse;
|
||||
|
||||
thead {
|
||||
text-align: left;
|
||||
* {
|
||||
user-select: text;
|
||||
}
|
||||
|
||||
tr {
|
||||
border-bottom: 1px solid #d1dbe8;
|
||||
thead {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.flag-cell {
|
||||
@@ -91,6 +93,7 @@
|
||||
font-weight: bold;
|
||||
list-style: none;
|
||||
vertical-align: top;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
li.toll-free:empty:before {
|
||||
@@ -119,11 +122,6 @@
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.dial-in-conference-name,
|
||||
.dial-in-conference-pin {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.dial-in-conference-description {
|
||||
margin: 12px;
|
||||
}
|
||||
|
||||
@@ -1,57 +1,4 @@
|
||||
.invite-more {
|
||||
&-container {
|
||||
margin-bottom: 8px;
|
||||
transition: margin-bottom 0.3s;
|
||||
|
||||
&.elevated {
|
||||
margin-bottom: 36px;
|
||||
}
|
||||
}
|
||||
|
||||
&-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 16px;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
border-radius: 8px;
|
||||
color: #fff;
|
||||
font-size: 14px;
|
||||
line-height: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
&-header {
|
||||
max-width: 100%;
|
||||
margin-bottom: 16px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
&-button {
|
||||
display: flex;
|
||||
max-width: 100%;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 8px 16px;
|
||||
background: #0376DA;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
|
||||
@media (hover: hover) and (pointer: fine) {
|
||||
&:hover {
|
||||
background: #278ADF;
|
||||
}
|
||||
}
|
||||
|
||||
&-text {
|
||||
margin-left: 8px;
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
&-dialog {
|
||||
color: #fff;
|
||||
font-size: 15px;
|
||||
@@ -65,59 +12,6 @@
|
||||
background: #5E6D7A;
|
||||
}
|
||||
|
||||
&.email-container {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 8px 8px 8px 16px;
|
||||
margin-top: 24px;
|
||||
width: calc(100% - 26px);
|
||||
height: 22px;
|
||||
|
||||
background: #2A3A4B;
|
||||
border: 1px solid #5E6D7A;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
|
||||
&.active {
|
||||
border-radius: 3px 3px 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
&.invite-buttons {
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
margin-top: 8px;
|
||||
|
||||
& > a {
|
||||
display: inline-block;
|
||||
height: 24px;
|
||||
min-width: 48px;
|
||||
border-radius: 3px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&-cancel {
|
||||
margin-right: 16px;
|
||||
padding: 7px 15px;
|
||||
background: #2A3A4B;
|
||||
border: 1px solid #5E6D7A;
|
||||
}
|
||||
|
||||
&-add {
|
||||
padding: 8px 16px;
|
||||
background: #0376DA;
|
||||
}
|
||||
|
||||
&.disabled {
|
||||
& > a {
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.stream {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
@@ -158,14 +52,3 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mobile-browser {
|
||||
.invite-more-content {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.invite-more-button {
|
||||
height: 48px;
|
||||
padding: 12px 16px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
.share-audio-dialog-container {
|
||||
max-height: none;
|
||||
}
|
||||
|
||||
.share-audio-dialog {
|
||||
.share-audio-animation {
|
||||
width: 100%;
|
||||
|
||||
@@ -208,3 +208,26 @@
|
||||
.lobby-button-margin {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.lobby-prejoin-error {
|
||||
background-color: #E04757;
|
||||
border-radius: 6px;
|
||||
box-sizing: border-box;
|
||||
color: white;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
margin-bottom: 16px;
|
||||
margin-top: -8px;
|
||||
padding: 4px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.lobby-prejoin-input {
|
||||
margin-bottom: 16px;
|
||||
width: 100%;
|
||||
|
||||
& input {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
@import 'lobby';
|
||||
@import 'premeeting-screens';
|
||||
@import 'prejoin';
|
||||
@import 'prejoin-third-party';
|
||||
|
||||
@@ -3,6 +3,7 @@ $sidePanelWidth: 300px;
|
||||
.prejoin-third-party {
|
||||
flex-direction: column-reverse;
|
||||
z-index: auto;
|
||||
align-items: center;
|
||||
|
||||
.content {
|
||||
height: auto;
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
.prejoin {
|
||||
&-input-area {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-avatar {
|
||||
margin: 8px auto 16px;
|
||||
|
||||
&-name {
|
||||
color: white;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
line-height: 26px;
|
||||
margin-bottom: 32px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
&-container {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
&-error {
|
||||
background-color: #E04757;
|
||||
border-radius: 6px;
|
||||
box-sizing: border-box;
|
||||
color: white;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
margin-bottom: 16px;
|
||||
margin-top: -8px;
|
||||
padding: 4px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.prejoin-preview {
|
||||
&-dropdown-btns {
|
||||
padding: 8px 0;
|
||||
}
|
||||
|
||||
&-dropdown-container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
||||
/**
|
||||
* Override default InlineDialog behaviour, since it does not play nicely with relative widths
|
||||
*/
|
||||
& > div:nth-child(2) {
|
||||
background: #E0E0E0;
|
||||
padding: 0;
|
||||
position: absolute !important;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.prejoin-input {
|
||||
margin-bottom: 16px;
|
||||
|
||||
& input {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
@@ -87,7 +87,7 @@
|
||||
.toolbox-content-wrapper,
|
||||
.toolbox-content-items {
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
3
debian/jitsi-meet-web-config.install
vendored
3
debian/jitsi-meet-web-config.install
vendored
@@ -1,3 +1,6 @@
|
||||
doc/debian/jitsi-meet/jitsi-meet.example /usr/share/jitsi-meet-web-config/
|
||||
doc/debian/jitsi-meet/jitsi-meet.example-apache /usr/share/jitsi-meet-web-config/
|
||||
config.js /usr/share/jitsi-meet-web-config/
|
||||
doc/jaas/nginx-jaas.conf /usr/share/jitsi-meet-web-config/
|
||||
doc/jaas/index-jaas.html /usr/share/jitsi-meet-web-config/
|
||||
doc/jaas/8x8.vc-config.js /usr/share/jitsi-meet-web-config/
|
||||
|
||||
3
debian/jitsi-meet-web.install
vendored
3
debian/jitsi-meet-web.install
vendored
@@ -8,8 +8,9 @@ sounds /usr/share/jitsi-meet/
|
||||
fonts /usr/share/jitsi-meet/
|
||||
images /usr/share/jitsi-meet/
|
||||
lang /usr/share/jitsi-meet/
|
||||
connection_optimization /usr/share/jitsi-meet/
|
||||
resources/robots.txt /usr/share/jitsi-meet/
|
||||
resources/*.sh /usr/share/jitsi-meet/scripts/
|
||||
pwa-worker.js /usr/share/jitsi-meet/
|
||||
manifest.json /usr/share/jitsi-meet/
|
||||
doc/jaas/move-to-jaas.sh /usr/share/jitsi-meet/scripts/
|
||||
doc/jaas/update-asap-daily.sh /usr/share/jitsi-meet/scripts/
|
||||
|
||||
@@ -78,13 +78,18 @@ Component "conference.jitmeet.example.com" "muc"
|
||||
restrict_room_creation = true
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"muc_meeting_id";
|
||||
"muc_domain_mapper";
|
||||
"polls";
|
||||
--"token_verification";
|
||||
"muc_rate_limit";
|
||||
"muc_password_whitelist";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com" }
|
||||
muc_password_whitelist = {
|
||||
"focusUser@auth.jitmeet.example.com"
|
||||
}
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
|
||||
@@ -92,6 +97,7 @@ Component "breakout.jitmeet.example.com" "muc"
|
||||
restrict_room_creation = true
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"muc_meeting_id";
|
||||
"muc_domain_mapper";
|
||||
"muc_rate_limit";
|
||||
@@ -105,6 +111,7 @@ Component "breakout.jitmeet.example.com" "muc"
|
||||
Component "internal.auth.jitmeet.example.com" "muc"
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"ping";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com", "jvb@auth.jitmeet.example.com" }
|
||||
@@ -139,6 +146,7 @@ Component "lobby.jitmeet.example.com" "muc"
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
modules_enabled = {
|
||||
"muc_hide_all";
|
||||
"muc_rate_limit";
|
||||
"polls";
|
||||
}
|
||||
|
||||
@@ -58,6 +58,8 @@ server {
|
||||
|
||||
add_header Strict-Transport-Security "max-age=63072000" always;
|
||||
set $prefix "";
|
||||
set $custom_index "";
|
||||
set $config_js_location /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
||||
|
||||
ssl_certificate /etc/jitsi/meet/jitsi-meet.example.com.crt;
|
||||
ssl_certificate_key /etc/jitsi/meet/jitsi-meet.example.com.key;
|
||||
@@ -77,8 +79,10 @@ server {
|
||||
gzip_proxied no-cache no-store private expired auth;
|
||||
gzip_min_length 512;
|
||||
|
||||
include /etc/jitsi/meet/jaas/*.conf;
|
||||
|
||||
location = /config.js {
|
||||
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
||||
alias $config_js_location;
|
||||
}
|
||||
|
||||
location = /external_api.js {
|
||||
@@ -92,8 +96,13 @@ server {
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
location ~ ^/_api/public/(.*)$ {
|
||||
autoindex off;
|
||||
alias /etc/jitsi/meet/public/$1;
|
||||
}
|
||||
|
||||
# ensure all static content can always be found first
|
||||
location ~ ^/(libs|css|static|images|fonts|lang|sounds|connection_optimization|.well-known)/(.*)$
|
||||
location ~ ^/(libs|css|static|images|fonts|lang|sounds|.well-known)/(.*)$
|
||||
{
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
alias /usr/share/jitsi-meet/$1/$2;
|
||||
@@ -142,11 +151,12 @@ server {
|
||||
#}
|
||||
|
||||
location ~ ^/([^/?&:'"]+)$ {
|
||||
set $roomname "$1";
|
||||
try_files $uri @root_path;
|
||||
}
|
||||
|
||||
location @root_path {
|
||||
rewrite ^/(.*)$ / break;
|
||||
rewrite ^/(.*)$ /$custom_index break;
|
||||
}
|
||||
|
||||
location ~ ^/([^/?&:'"]+)/config.js$
|
||||
@@ -154,7 +164,14 @@ server {
|
||||
set $subdomain "$1.";
|
||||
set $subdir "$1/";
|
||||
|
||||
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
||||
alias $config_js_location;
|
||||
}
|
||||
|
||||
# Matches /(TENANT)/pwa-worker.js or /(TENANT)/manifest.json to rewrite to / and look for file
|
||||
location ~ ^/([^/?&:'"]+)/(pwa-worker.js|manifest.json)$ {
|
||||
set $subdomain "$1.";
|
||||
set $subdir "$1/";
|
||||
rewrite ^/([^/?&:'"]+)/(pwa-worker.js|manifest.json)$ /$2;
|
||||
}
|
||||
|
||||
# BOSH for subdomains
|
||||
|
||||
7
doc/jaas/8x8.vc-config.js
Normal file
7
doc/jaas/8x8.vc-config.js
Normal file
@@ -0,0 +1,7 @@
|
||||
</script>
|
||||
<script src="https://8x8.vc/<!--# echo var="subdir" default="" -->config.js" onload="{
|
||||
config.p2p.disabledCodec='VP9';
|
||||
config.videoQuality.disabledCodec='VP9';
|
||||
config.e2ee = { externallyManagedKey: true };
|
||||
}"/>
|
||||
<script>
|
||||
22
doc/jaas/README.md
Normal file
22
doc/jaas/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
## How to switch your deployment to [JaaS](https://jaas.8x8.vc) in one easy step
|
||||
|
||||
Note: By default it will have e2ee(end-to-end) encryption enabled that works only on chromium based browsers (Chrome, Edge, ...). If a participant joins from another browser or mobile the e2ee is turned off.
|
||||
|
||||
In order to use your deployment with JaaS you first need to login to your [JaaS Developer console](https://jaas.8x8.vc/#/apikeys) and generate a key pair.
|
||||
Use `Add API key` button and then `Generate API key pair`. Make sure you download the generated private key from:
|
||||
|
||||
<img src="generated_key_dialog.png" height="250">
|
||||
|
||||
Make sure you transfer this downloaded private key to your server. Copy the key id from:
|
||||
|
||||
<img src="api_keys_kid.png" height="200">
|
||||
|
||||
Now on your server run the helper script passing the private key file and the key id:
|
||||
|
||||
```
|
||||
sudo /usr/share/jitsi-meet/scripts/move-to-jaas.sh /my/path/test-key.pk <key_id>
|
||||
```
|
||||
|
||||
More information about JaaS Api keys at: https://developer.8x8.com/jaas/docs/jaas-console-api-keys
|
||||
|
||||
If you want to adjust the enabled services you can do that in /etc/jits/meet/jaas/nginx-jaas.conf. The part after `proxy_set_body` is the jwt token content that will be used for the client tokens. More info about the JaaS tokens: https://developer.8x8.com/jaas/docs/api-keys-jwt
|
||||
BIN
doc/jaas/api_keys_kid.png
Normal file
BIN
doc/jaas/api_keys_kid.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
BIN
doc/jaas/generated_key_dialog.png
Normal file
BIN
doc/jaas/generated_key_dialog.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
33
doc/jaas/index-jaas.html
Normal file
33
doc/jaas/index-jaas.html
Normal file
@@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<script src='external_api.js' async></script>
|
||||
<style>html, body, #jaas-container { height: 100%; }</style>
|
||||
<script type="text/javascript">
|
||||
function getRoomName(pathname) {
|
||||
const contextRootEndIndex = pathname.lastIndexOf('/');
|
||||
|
||||
return pathname.substring(contextRootEndIndex + 1);
|
||||
}
|
||||
window.onload = () => {
|
||||
const jaasJwt = <!--#include virtual="/jaas-jwt" -->;
|
||||
const api = new JitsiMeetExternalAPI(
|
||||
window.location.host, {
|
||||
roomName: `${jaasJwt.tenant}/${jaasJwt.confId}`,
|
||||
parentNode: document.querySelector('#jaas-container'),
|
||||
jwt: jaasJwt.token,
|
||||
e2eeKey: jaasJwt.e2eeKey
|
||||
});
|
||||
api.addListener('videoConferenceJoined', () => {
|
||||
if (jaasJwt.e2eeKey) {
|
||||
console.info('Toggling e2ee on!')
|
||||
api.executeCommand('toggleE2EE', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="jaas-container" />
|
||||
</body>
|
||||
</html>
|
||||
59
doc/jaas/move-to-jaas.sh
Executable file
59
doc/jaas/move-to-jaas.sh
Executable file
@@ -0,0 +1,59 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
PRIVATE_KEY=$1
|
||||
JAAS_KEY_ID=$2
|
||||
|
||||
if [ ! -f "${PRIVATE_KEY}" ] ; then
|
||||
echo "You need to specify a correct path for the private key as a first argument."
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
if [[ ! "${JAAS_KEY_ID}" =~ ^vpaas-magic-cookie-[0-9a-z]+/[0-9a-z]+$ ]]; then
|
||||
echo "Invalid key id passed as a second argument."
|
||||
exit 2;
|
||||
fi
|
||||
|
||||
command -v node >/dev/null 2>&1 || { echo >&2 "You must install node first, go to https://nodejs.org. Aborting."; exit 4; }
|
||||
|
||||
NODE_VER=$(node -v);
|
||||
NODE_MAJOR_VER=$(echo ${NODE_VER:1} | cut -d. -f1);
|
||||
|
||||
if [ "$NODE_MAJOR_VER" -lt "18" ]; then
|
||||
echo "Please install latest LTS version of node (18+)";
|
||||
exit 3;
|
||||
fi
|
||||
|
||||
# we need this util for debconf-set-selections
|
||||
sudo apt install debconf-utils
|
||||
|
||||
# Let's pre-set some settings for token-generator
|
||||
cat << EOF | sudo debconf-set-selections
|
||||
token-generator token-generator/private-key string ${PRIVATE_KEY}
|
||||
token-generator token-generator/kid string ${JAAS_KEY_ID}
|
||||
EOF
|
||||
|
||||
apt install token-generator
|
||||
|
||||
mkdir -p /etc/jitsi/meet/jaas
|
||||
|
||||
VPASS_COOKIE=$(echo -n ${JAAS_KEY_ID}| cut -d/ -f1)
|
||||
cp /usr/share/jitsi-meet-web-config/nginx-jaas.conf /etc/jitsi/meet/jaas
|
||||
sed -i "s/jaas_magic_cookie/${VPASS_COOKIE}/g" /etc/jitsi/meet/jaas/nginx-jaas.conf
|
||||
|
||||
cp /usr/share/jitsi-meet-web-config/8x8.vc-config.js /etc/jitsi/meet/jaas/
|
||||
echo "set \$config_js_location /etc/jitsi/meet/jaas/8x8.vc-config.js;" >> /etc/jitsi/meet/jaas/jaas-vars
|
||||
echo "set \$custom_index index-jaas.html;" >> /etc/jitsi/meet/jaas/jaas-vars
|
||||
|
||||
ln -s /usr/share/jitsi-meet-web-config/index-jaas.html /usr/share/jitsi-meet/index-jaas.html
|
||||
|
||||
# let's create the daily key now
|
||||
/usr/share/jitsi-meet/scripts/update-asap-daily.sh
|
||||
|
||||
# let's add to cron daily the update of the asap key
|
||||
if [ -d /etc/cron.daily ]; then
|
||||
ln -s /usr/share/jitsi-meet/scripts/update-asap-daily.sh /etc/cron.daily/update-jaas-asap.sh
|
||||
else
|
||||
echo "No /etc/cron.daily. Please add to your cron jobs to execute as root daily the script: /usr/share/jitsi-meet/scripts/update-asap-daily.sh"
|
||||
fi
|
||||
23
doc/jaas/nginx-jaas.conf
Normal file
23
doc/jaas/nginx-jaas.conf
Normal file
@@ -0,0 +1,23 @@
|
||||
include /etc/jitsi/meet/jaas/jaas-vars;
|
||||
location = /jaas-jwt {
|
||||
include /etc/jitsi/token-generator/daily-key;
|
||||
ssi on;
|
||||
proxy_method POST;
|
||||
proxy_set_header content-type "application/json";
|
||||
proxy_set_header Accept-Encoding "";
|
||||
proxy_set_header Authorization "Bearer $jaas_asap_key";
|
||||
proxy_pass_request_body off;
|
||||
proxy_set_body '{"sub":"jaas_magic_cookie","context":{"features":{"livestreaming":false,"outbound-call":false,"sip-outbound-call":false,"transcription":false,"recording":false},"user":{"moderator":true}},"room": "$roomname"}';
|
||||
proxy_pass http://127.0.0.1:8017/generate/client?e2eeKey=true&confId=true;
|
||||
}
|
||||
|
||||
location @magic_root_path {
|
||||
rewrite ^/(.*)$ /index.html break;
|
||||
}
|
||||
|
||||
# Anything that didn't match above, and isn't a real file, assume it's a room name and redirect to /
|
||||
location ~ ^/jaas_magic_cookie/(.*)$ {
|
||||
set $subdomain "jaas_magic_cookie.";
|
||||
set $subdir "jaas_magic_cookie/";
|
||||
try_files $1 @magic_root_path;
|
||||
}
|
||||
9
doc/jaas/update-asap-daily.sh
Executable file
9
doc/jaas/update-asap-daily.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
JWT_KID=$(cat /etc/jitsi/token-generator/config | grep SYSTEM_ASAP_BASE_URL_MAPPINGS | cut -d= -f2- | jq -r .[].kid)
|
||||
JWT_DATE=$(echo -n $JWT_KID | cut -d/ -f2-)
|
||||
JWT_DATE=${JWT_DATE#jwt-}
|
||||
KEY_FILE=/etc/jitsi/token-generator/daily-key
|
||||
echo -n "set \$jaas_asap_key " > ${KEY_FILE}
|
||||
ASAP_KEY=$(ASAP_SIGNING_KEY_FILE=/etc/jitsi/token-generator/asap-${JWT_DATE}.key ASAP_JWT_KID="${JWT_KID}" ASAP_EXPIRES_IN="1 day" node /usr/share/token-generator/jwt.js| tail -n1)
|
||||
echo -n "${ASAP_KEY};" >> ${KEY_FILE}
|
||||
|
||||
service nginx reload
|
||||
19
globals.d.ts
vendored
19
globals.d.ts
vendored
@@ -10,12 +10,6 @@ declare global {
|
||||
API: any;
|
||||
conference: any;
|
||||
debugLogs: any;
|
||||
keyboardshortcut: {
|
||||
registerShortcut: Function;
|
||||
unregisterShortcut: Function;
|
||||
openDialog: Function;
|
||||
enable: Function;
|
||||
}
|
||||
};
|
||||
const interfaceConfig: any;
|
||||
|
||||
@@ -25,9 +19,22 @@ declare global {
|
||||
interfaceConfig?: any;
|
||||
JitsiMeetJS?: any;
|
||||
JitsiMeetElectron?: any;
|
||||
// selenium tests handler
|
||||
_sharedVideoPlayer: any;
|
||||
alwaysOnTop: { api: any };
|
||||
}
|
||||
|
||||
interface Document {
|
||||
mozCancelFullScreen?: Function;
|
||||
webkitExitFullscreen?: Function;
|
||||
}
|
||||
|
||||
const config: IConfig;
|
||||
|
||||
const JitsiMeetJS: any;
|
||||
|
||||
interface HTMLMediaElement {
|
||||
setSinkId: (id: string) => Promise<undefined>;
|
||||
stop: () => void;
|
||||
}
|
||||
}
|
||||
|
||||
1
globals.native.d.ts
vendored
1
globals.native.d.ts
vendored
@@ -30,6 +30,7 @@ interface IWindow {
|
||||
setImmediate: typeof setImmediate;
|
||||
clearImmediate: typeof clearImmediate;
|
||||
addEventListener: Function;
|
||||
removeEventListener: Function;
|
||||
}
|
||||
|
||||
interface INavigator {
|
||||
|
||||
BIN
images/logo-deep-linking-mobile.png
Normal file
BIN
images/logo-deep-linking-mobile.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 6.3 KiB |
15
index.html
15
index.html
@@ -13,10 +13,19 @@
|
||||
<link rel="manifest" id="manifest-placeholder">
|
||||
|
||||
<script>
|
||||
function contextRoot(pathname) {
|
||||
const contextRootEndIndex = pathname.lastIndexOf('/');
|
||||
|
||||
return (
|
||||
contextRootEndIndex === -1
|
||||
? '/'
|
||||
: pathname.substring(0, contextRootEndIndex + 1)
|
||||
);
|
||||
}
|
||||
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');
|
||||
document.querySelector('#manifest-placeholder').setAttribute('href', window.location.origin + contextRoot(window.location.pathname) + 'manifest.json');
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
if (!JitsiMeetJS.app) {
|
||||
@@ -40,7 +49,7 @@
|
||||
|
||||
if (shouldRegisterWorker) {
|
||||
navigator.serviceWorker
|
||||
.register(window.location.origin + '/pwa-worker.js')
|
||||
.register(window.location.origin + contextRoot(window.location.pathname) + 'pwa-worker.js')
|
||||
.then(reg => {
|
||||
console.log('Service worker registered.', reg);
|
||||
})
|
||||
@@ -182,8 +191,6 @@
|
||||
'error', loadErrHandler, true /* capture phase type of listener */);
|
||||
</script>
|
||||
<script><!--#include virtual="/config.js" --></script><!-- adapt to your needs, i.e. set hosts and bosh path -->
|
||||
<!--#include virtual="connection_optimization/connection_optimization.html" -->
|
||||
<script src="libs/do_external_connect.min.js?v=1"></script>
|
||||
<script><!--#include virtual="/interface_config.js" --></script>
|
||||
<script src="libs/lib-jitsi-meet.min.js?v=139"></script>
|
||||
<script src="libs/app.bundle.min.js?v=139"></script>
|
||||
|
||||
@@ -70,7 +70,8 @@ var interfaceConfig = {
|
||||
|
||||
ENABLE_DIAL_OUT: true,
|
||||
|
||||
ENABLE_FEEDBACK_ANIMATION: false, // Enables feedback star animation.
|
||||
// DEPRECATED. Animation no longer supported.
|
||||
// ENABLE_FEEDBACK_ANIMATION: false,
|
||||
|
||||
FILM_STRIP_MAX_HEIGHT: 120,
|
||||
|
||||
|
||||
12
ios/Podfile
12
ios/Podfile
@@ -1,11 +1,13 @@
|
||||
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
||||
|
||||
platform :ios, '12.0'
|
||||
platform :ios, '12.4'
|
||||
workspace 'jitsi-meet'
|
||||
|
||||
install! 'cocoapods', :deterministic_uuids => false
|
||||
|
||||
production = ENV["PRODUCTION"] == "1"
|
||||
|
||||
target 'JitsiMeet' do
|
||||
project 'app/app.xcodeproj'
|
||||
|
||||
@@ -21,8 +23,10 @@ target 'JitsiMeetSDK' do
|
||||
#
|
||||
|
||||
config = use_native_modules!
|
||||
flags = get_default_flags()
|
||||
use_react_native!(
|
||||
:path => config["reactNativePath"],
|
||||
:path => config[:reactNativePath],
|
||||
:production => production,
|
||||
:hermes_enabled => false,
|
||||
:fabric_enabled => false,
|
||||
# An absolute path to your application root.
|
||||
@@ -42,7 +46,7 @@ target 'JitsiMeetSDK' do
|
||||
|
||||
pod 'CocoaLumberjack', '3.7.2'
|
||||
pod 'ObjectiveDropboxOfficial', '6.2.3'
|
||||
pod 'JitsiWebRTC', '~> 106.0.0'
|
||||
pod 'JitsiWebRTC', '~> 111.0.0'
|
||||
end
|
||||
|
||||
target 'JitsiMeetSDKLite' do
|
||||
@@ -81,7 +85,7 @@ post_install do |installer|
|
||||
end
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['SUPPORTS_MACCATALYST'] = 'NO'
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
|
||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.4'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
563
ios/Podfile.lock
563
ios/Podfile.lock
@@ -3,24 +3,25 @@ PODS:
|
||||
- amplitude-react-native (2.7.0):
|
||||
- Amplitude (= 8.7.1)
|
||||
- React-Core
|
||||
- AppAuth (1.4.0):
|
||||
- AppAuth/Core (= 1.4.0)
|
||||
- AppAuth/ExternalUserAgent (= 1.4.0)
|
||||
- AppAuth/Core (1.4.0)
|
||||
- AppAuth/ExternalUserAgent (1.4.0)
|
||||
- AppAuth (1.6.1):
|
||||
- AppAuth/Core (= 1.6.1)
|
||||
- AppAuth/ExternalUserAgent (= 1.6.1)
|
||||
- AppAuth/Core (1.6.1)
|
||||
- AppAuth/ExternalUserAgent (1.6.1):
|
||||
- AppAuth/Core
|
||||
- boost (1.76.0)
|
||||
- CocoaLumberjack (3.7.2):
|
||||
- CocoaLumberjack/Core (= 3.7.2)
|
||||
- CocoaLumberjack/Core (3.7.2)
|
||||
- DoubleConversion (1.1.6)
|
||||
- FBLazyVector (0.68.5)
|
||||
- FBReactNativeSpec (0.68.5):
|
||||
- FBLazyVector (0.69.10)
|
||||
- FBReactNativeSpec (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.5)
|
||||
- RCTTypeSafety (= 0.68.5)
|
||||
- React-Core (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- RCTRequired (= 0.69.10)
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- Firebase/Analytics (8.15.0):
|
||||
- Firebase/Core
|
||||
- Firebase/Core (8.15.0):
|
||||
@@ -76,10 +77,10 @@ PODS:
|
||||
- GoogleUtilities/UserDefaults (~> 7.7)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- fmt (6.2.1)
|
||||
- Giphy (2.1.20):
|
||||
- Giphy (2.2.4):
|
||||
- libwebp
|
||||
- giphy-react-native-sdk (1.7.0):
|
||||
- Giphy (= 2.1.20)
|
||||
- giphy-react-native-sdk (2.3.0):
|
||||
- Giphy (= 2.2.4)
|
||||
- React-Core
|
||||
- glog (0.3.5)
|
||||
- GoogleAppMeasurement (8.15.0):
|
||||
@@ -102,56 +103,56 @@ PODS:
|
||||
- GoogleUtilities/Network (~> 7.7)
|
||||
- "GoogleUtilities/NSData+zlib (~> 7.7)"
|
||||
- nanopb (~> 2.30908.0)
|
||||
- GoogleDataTransport (9.1.4):
|
||||
- GoogleDataTransport (9.2.2):
|
||||
- GoogleUtilities/Environment (~> 7.7)
|
||||
- nanopb (< 2.30910.0, >= 2.30908.0)
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleSignIn (6.0.2):
|
||||
- AppAuth (~> 1.4)
|
||||
- GTMAppAuth (~> 1.0)
|
||||
- GTMSessionFetcher/Core (~> 1.1)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.7.0):
|
||||
- GoogleSignIn (6.2.4):
|
||||
- AppAuth (~> 1.5)
|
||||
- GTMAppAuth (~> 1.3)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
|
||||
- GoogleUtilities/AppDelegateSwizzler (7.11.1):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Environment (7.7.0):
|
||||
- GoogleUtilities/Environment (7.11.1):
|
||||
- PromisesObjC (< 3.0, >= 1.2)
|
||||
- GoogleUtilities/Logger (7.7.0):
|
||||
- GoogleUtilities/Logger (7.11.1):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/MethodSwizzler (7.7.0):
|
||||
- GoogleUtilities/MethodSwizzler (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network (7.7.0):
|
||||
- GoogleUtilities/Network (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (7.7.0)"
|
||||
- GoogleUtilities/Reachability (7.7.0):
|
||||
- "GoogleUtilities/NSData+zlib (7.11.1)"
|
||||
- GoogleUtilities/Reachability (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/UserDefaults (7.7.0):
|
||||
- GoogleUtilities/UserDefaults (7.11.1):
|
||||
- GoogleUtilities/Logger
|
||||
- GTMAppAuth (1.2.2):
|
||||
- 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)
|
||||
- libwebp/webp (= 1.2.1)
|
||||
- libwebp/demux (1.2.1):
|
||||
- GTMAppAuth (1.3.1):
|
||||
- AppAuth/Core (~> 1.6)
|
||||
- GTMSessionFetcher/Core (< 3.0, >= 1.5)
|
||||
- GTMSessionFetcher/Core (2.3.0)
|
||||
- JitsiWebRTC (111.0.2)
|
||||
- libwebp (1.2.4):
|
||||
- libwebp/demux (= 1.2.4)
|
||||
- libwebp/mux (= 1.2.4)
|
||||
- libwebp/webp (= 1.2.4)
|
||||
- libwebp/demux (1.2.4):
|
||||
- libwebp/webp
|
||||
- libwebp/mux (1.2.1):
|
||||
- libwebp/mux (1.2.4):
|
||||
- libwebp/demux
|
||||
- libwebp/webp (1.2.1)
|
||||
- libwebp/webp (1.2.4)
|
||||
- nanopb (2.30908.0):
|
||||
- nanopb/decode (= 2.30908.0)
|
||||
- nanopb/encode (= 2.30908.0)
|
||||
- nanopb/decode (2.30908.0)
|
||||
- nanopb/encode (2.30908.0)
|
||||
- ObjectiveDropboxOfficial (6.2.3)
|
||||
- PromisesObjC (2.1.1)
|
||||
- PromisesSwift (2.1.1):
|
||||
- PromisesObjC (= 2.1.1)
|
||||
- PromisesObjC (2.2.0)
|
||||
- PromisesSwift (2.2.0):
|
||||
- PromisesObjC (= 2.2.0)
|
||||
- RCT-Folly (2021.06.28.00-v2):
|
||||
- boost
|
||||
- DoubleConversion
|
||||
@@ -163,201 +164,203 @@ PODS:
|
||||
- DoubleConversion
|
||||
- fmt (~> 6.2.1)
|
||||
- glog
|
||||
- RCTRequired (0.68.5)
|
||||
- RCTTypeSafety (0.68.5):
|
||||
- FBLazyVector (= 0.68.5)
|
||||
- RCTRequired (0.69.10)
|
||||
- RCTTypeSafety (0.69.10):
|
||||
- FBLazyVector (= 0.69.10)
|
||||
- RCTRequired (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React (0.69.10):
|
||||
- React-Core (= 0.69.10)
|
||||
- React-Core/DevSupport (= 0.69.10)
|
||||
- React-Core/RCTWebSocket (= 0.69.10)
|
||||
- React-RCTActionSheet (= 0.69.10)
|
||||
- React-RCTAnimation (= 0.69.10)
|
||||
- React-RCTBlob (= 0.69.10)
|
||||
- React-RCTImage (= 0.69.10)
|
||||
- React-RCTLinking (= 0.69.10)
|
||||
- React-RCTNetwork (= 0.69.10)
|
||||
- React-RCTSettings (= 0.69.10)
|
||||
- React-RCTText (= 0.69.10)
|
||||
- React-RCTVibration (= 0.69.10)
|
||||
- React-bridging (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.5)
|
||||
- React-Core (= 0.68.5)
|
||||
- React (0.68.5):
|
||||
- React-Core (= 0.68.5)
|
||||
- React-Core/DevSupport (= 0.68.5)
|
||||
- React-Core/RCTWebSocket (= 0.68.5)
|
||||
- React-RCTActionSheet (= 0.68.5)
|
||||
- React-RCTAnimation (= 0.68.5)
|
||||
- React-RCTBlob (= 0.68.5)
|
||||
- React-RCTImage (= 0.68.5)
|
||||
- React-RCTLinking (= 0.68.5)
|
||||
- React-RCTNetwork (= 0.68.5)
|
||||
- React-RCTSettings (= 0.68.5)
|
||||
- React-RCTText (= 0.68.5)
|
||||
- React-RCTVibration (= 0.68.5)
|
||||
- React-callinvoker (0.68.5)
|
||||
- React-Codegen (0.68.5):
|
||||
- FBReactNativeSpec (= 0.68.5)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-callinvoker (0.69.10)
|
||||
- React-Codegen (0.69.10):
|
||||
- FBReactNativeSpec (= 0.69.10)
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTRequired (= 0.68.5)
|
||||
- RCTTypeSafety (= 0.68.5)
|
||||
- React-Core (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-Core (0.68.5):
|
||||
- RCTRequired (= 0.69.10)
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-Core (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.5)
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-Core/Default (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/CoreModulesHeaders (0.68.5):
|
||||
- React-Core/CoreModulesHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/Default (0.68.5):
|
||||
- React-Core/Default (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/DevSupport (0.68.5):
|
||||
- React-Core/DevSupport (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.5)
|
||||
- React-Core/RCTWebSocket (= 0.68.5)
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-jsinspector (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-Core/Default (= 0.69.10)
|
||||
- React-Core/RCTWebSocket (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-jsinspector (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTActionSheetHeaders (0.68.5):
|
||||
- React-Core/RCTActionSheetHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTAnimationHeaders (0.68.5):
|
||||
- React-Core/RCTAnimationHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTBlobHeaders (0.68.5):
|
||||
- React-Core/RCTBlobHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTImageHeaders (0.68.5):
|
||||
- React-Core/RCTImageHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTLinkingHeaders (0.68.5):
|
||||
- React-Core/RCTLinkingHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTNetworkHeaders (0.68.5):
|
||||
- React-Core/RCTNetworkHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTSettingsHeaders (0.68.5):
|
||||
- React-Core/RCTSettingsHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTTextHeaders (0.68.5):
|
||||
- React-Core/RCTTextHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTVibrationHeaders (0.68.5):
|
||||
- React-Core/RCTVibrationHeaders (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-Core/RCTWebSocket (0.68.5):
|
||||
- React-Core/RCTWebSocket (0.69.10):
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Core/Default (= 0.68.5)
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsiexecutor (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-Core/Default (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsiexecutor (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- Yoga
|
||||
- React-CoreModules (0.68.5):
|
||||
- React-CoreModules (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.5)
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/CoreModulesHeaders (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-RCTImage (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-cxxreact (0.68.5):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/CoreModulesHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-RCTImage (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-cxxreact (0.69.10):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-jsinspector (= 0.68.5)
|
||||
- React-logger (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-runtimeexecutor (= 0.68.5)
|
||||
- React-jsi (0.68.5):
|
||||
- React-callinvoker (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-jsinspector (= 0.69.10)
|
||||
- React-logger (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- React-runtimeexecutor (= 0.69.10)
|
||||
- React-jsi (0.69.10):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsi/Default (= 0.68.5)
|
||||
- React-jsi/Default (0.68.5):
|
||||
- React-jsi/Default (= 0.69.10)
|
||||
- React-jsi/Default (0.69.10):
|
||||
- boost (= 1.76.0)
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-jsiexecutor (0.68.5):
|
||||
- React-jsiexecutor (0.69.10):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-jsinspector (0.68.5)
|
||||
- React-logger (0.68.5):
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- React-jsinspector (0.69.10)
|
||||
- React-logger (0.69.10):
|
||||
- glog
|
||||
- react-native-background-timer (2.4.1):
|
||||
- React-Core
|
||||
@@ -371,8 +374,6 @@ PODS:
|
||||
- React-Core
|
||||
- react-native-pager-view (5.4.9):
|
||||
- React-Core
|
||||
- react-native-performance (2.1.0):
|
||||
- React-Core
|
||||
- react-native-safe-area-context (4.4.1):
|
||||
- RCT-Folly
|
||||
- RCTRequired
|
||||
@@ -389,76 +390,77 @@ PODS:
|
||||
- react-native-video/Video (6.0.0-alpha.1):
|
||||
- PromisesSwift
|
||||
- React-Core
|
||||
- react-native-webrtc (106.0.5):
|
||||
- JitsiWebRTC (~> 106.0.0)
|
||||
- react-native-webrtc (111.0.1):
|
||||
- JitsiWebRTC (~> 111.0.0)
|
||||
- React-Core
|
||||
- react-native-webview (11.15.1):
|
||||
- React-Core
|
||||
- React-perflogger (0.68.5)
|
||||
- React-RCTActionSheet (0.68.5):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.68.5)
|
||||
- React-RCTAnimation (0.68.5):
|
||||
- React-perflogger (0.69.10)
|
||||
- React-RCTActionSheet (0.69.10):
|
||||
- React-Core/RCTActionSheetHeaders (= 0.69.10)
|
||||
- React-RCTAnimation (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.5)
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/RCTAnimationHeaders (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-RCTBlob (0.68.5):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTAnimationHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTBlob (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/RCTBlobHeaders (= 0.68.5)
|
||||
- React-Core/RCTWebSocket (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-RCTNetwork (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-RCTImage (0.68.5):
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTBlobHeaders (= 0.69.10)
|
||||
- React-Core/RCTWebSocket (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-RCTNetwork (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTImage (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.5)
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/RCTImageHeaders (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-RCTNetwork (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-RCTLinking (0.68.5):
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/RCTLinkingHeaders (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-RCTNetwork (0.68.5):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTImageHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-RCTNetwork (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTLinking (0.69.10):
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTLinkingHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTNetwork (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.5)
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/RCTNetworkHeaders (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-RCTSettings (0.68.5):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTNetworkHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTSettings (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- RCTTypeSafety (= 0.68.5)
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/RCTSettingsHeaders (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-RCTText (0.68.5):
|
||||
- React-Core/RCTTextHeaders (= 0.68.5)
|
||||
- React-RCTVibration (0.68.5):
|
||||
- RCTTypeSafety (= 0.69.10)
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTSettingsHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-RCTText (0.69.10):
|
||||
- React-Core/RCTTextHeaders (= 0.69.10)
|
||||
- React-RCTVibration (0.69.10):
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-Codegen (= 0.68.5)
|
||||
- React-Core/RCTVibrationHeaders (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (= 0.68.5)
|
||||
- React-runtimeexecutor (0.68.5):
|
||||
- React-jsi (= 0.68.5)
|
||||
- ReactCommon/turbomodule/core (0.68.5):
|
||||
- React-Codegen (= 0.69.10)
|
||||
- React-Core/RCTVibrationHeaders (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (= 0.69.10)
|
||||
- React-runtimeexecutor (0.69.10):
|
||||
- React-jsi (= 0.69.10)
|
||||
- ReactCommon/turbomodule/core (0.69.10):
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- RCT-Folly (= 2021.06.28.00-v2)
|
||||
- React-callinvoker (= 0.68.5)
|
||||
- React-Core (= 0.68.5)
|
||||
- React-cxxreact (= 0.68.5)
|
||||
- React-jsi (= 0.68.5)
|
||||
- React-logger (= 0.68.5)
|
||||
- React-perflogger (= 0.68.5)
|
||||
- React-bridging (= 0.69.10)
|
||||
- React-callinvoker (= 0.69.10)
|
||||
- React-Core (= 0.69.10)
|
||||
- React-cxxreact (= 0.69.10)
|
||||
- React-jsi (= 0.69.10)
|
||||
- React-logger (= 0.69.10)
|
||||
- React-perflogger (= 0.69.10)
|
||||
- RNCalendarEvents (2.2.0):
|
||||
- React
|
||||
- RNCAsyncStorage (1.17.3):
|
||||
@@ -471,8 +473,8 @@ PODS:
|
||||
- React-Core
|
||||
- RNGestureHandler (2.9.0):
|
||||
- React-Core
|
||||
- RNGoogleSignin (7.0.4):
|
||||
- GoogleSignIn (~> 6.0.0)
|
||||
- RNGoogleSignin (9.0.2):
|
||||
- GoogleSignIn (~> 6.2)
|
||||
- React-Core
|
||||
- RNScreens (3.13.1):
|
||||
- React-Core
|
||||
@@ -500,16 +502,16 @@ 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)
|
||||
- JitsiWebRTC (~> 111.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`)
|
||||
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
|
||||
- React (from `../node_modules/react-native/`)
|
||||
- React-bridging (from `../node_modules/react-native/ReactCommon`)
|
||||
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
|
||||
- React-Codegen (from `build/generated/ios`)
|
||||
- React-Core (from `../node_modules/react-native/`)
|
||||
- React-Core/DevSupport (from `../node_modules/react-native/`)
|
||||
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
|
||||
- React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
|
||||
- React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
|
||||
@@ -523,7 +525,6 @@ DEPENDENCIES:
|
||||
- "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)"
|
||||
- react-native-orientation-locker (from `../node_modules/react-native-orientation-locker`)
|
||||
- react-native-pager-view (from `../node_modules/react-native-pager-view`)
|
||||
- react-native-performance (from `../node_modules/react-native-performance/ios`)
|
||||
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
|
||||
- "react-native-slider (from `../node_modules/@react-native-community/slider`)"
|
||||
- react-native-splash-screen (from `../node_modules/react-native-splash-screen`)
|
||||
@@ -605,6 +606,8 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native/Libraries/TypeSafety"
|
||||
React:
|
||||
:path: "../node_modules/react-native/"
|
||||
React-bridging:
|
||||
:path: "../node_modules/react-native/ReactCommon"
|
||||
React-callinvoker:
|
||||
:path: "../node_modules/react-native/ReactCommon/callinvoker"
|
||||
React-Codegen:
|
||||
@@ -635,8 +638,6 @@ EXTERNAL SOURCES:
|
||||
:path: "../node_modules/react-native-orientation-locker"
|
||||
react-native-pager-view:
|
||||
:path: "../node_modules/react-native-pager-view"
|
||||
react-native-performance:
|
||||
:path: "../node_modules/react-native-performance/ios"
|
||||
react-native-safe-area-context:
|
||||
:path: "../node_modules/react-native-safe-area-context"
|
||||
react-native-slider:
|
||||
@@ -701,12 +702,12 @@ EXTERNAL SOURCES:
|
||||
SPEC CHECKSUMS:
|
||||
Amplitude: 834c7332dfb9640a751e21c13efb22a07c0c12d4
|
||||
amplitude-react-native: 0ed8cab759aafaa94961b82122bf56297da607ad
|
||||
AppAuth: 31bcec809a638d7bd2f86ea8a52bd45f6e81e7c7
|
||||
AppAuth: e48b432bb4ba88b10cb2bcc50d7f3af21e78b9c2
|
||||
boost: a7c83b31436843459a1961bfd74b96033dc77234
|
||||
CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da
|
||||
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
|
||||
FBLazyVector: 2b47ff52037bd9ae07cc9b051c9975797814b736
|
||||
FBReactNativeSpec: 0e0d384ef17a33b385f13f0c7f97702c7cd17858
|
||||
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
|
||||
FBLazyVector: a8af91c2b5a0029d12ff6b32e428863d63c48991
|
||||
FBReactNativeSpec: ec5e878f6452a3de5430e0b2324a4d4ae6ac63f6
|
||||
Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d
|
||||
FirebaseAnalytics: 7761cbadb00a717d8d0939363eb46041526474fa
|
||||
FirebaseCore: 5743c5785c074a794d35f2fff7ecc254a91e08b1
|
||||
@@ -715,72 +716,72 @@ SPEC CHECKSUMS:
|
||||
FirebaseDynamicLinks: 1dc816ef789c5adac6fede0b46d11478175c70e4
|
||||
FirebaseInstallations: 40bd9054049b2eae9a2c38ef1c3dd213df3605cd
|
||||
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
|
||||
Giphy: b6d5087521d251bb8c99cdc0eb07bbdf86d142d5
|
||||
giphy-react-native-sdk: 7abccf2b52123a0f30ce99da895ab6288023680c
|
||||
glog: 476ee3e89abb49e07f822b48323c51c57124b572
|
||||
Giphy: 6b5f6986c8df4f71e01a8ef86595f426b3439fb5
|
||||
giphy-react-native-sdk: fcda9639f8ca2cc47e0517b6ef11c19359db5f5a
|
||||
glog: 3d02b25ca00c2d456734d0bcff864cbc62f6ae1a
|
||||
GoogleAppMeasurement: 4c19f031220c72464d460c9daa1fb5d1acce958e
|
||||
GoogleDataTransport: 5fffe35792f8b96ec8d6775f5eccd83c998d5a3b
|
||||
GoogleSignIn: fd381840dbe7c1137aa6dc30849a5c3e070c034a
|
||||
GoogleUtilities: e0913149f6b0625b553d70dae12b49fc62914fd1
|
||||
GTMAppAuth: ad5c2b70b9a8689e1a04033c9369c4915bfcbe89
|
||||
GTMSessionFetcher: 43748f93435c2aa068b1cbe39655aaf600652e91
|
||||
JitsiWebRTC: f441eb0e2d67f0588bf24e21c5162e97342714fb
|
||||
libwebp: 98a37e597e40bfdb4c911fc98f2c53d0b12d05fc
|
||||
GoogleDataTransport: 8378d1fa8ac49753ea6ce70d65a7cb70ce5f66e6
|
||||
GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
|
||||
GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749
|
||||
GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
|
||||
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
|
||||
JitsiWebRTC: 80f62908fcf2a1160e0d14b584323fb6e6be630b
|
||||
libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
|
||||
nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96
|
||||
ObjectiveDropboxOfficial: fe206ce8c0bc49976c249d472db7fdbc53ebbd53
|
||||
PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb
|
||||
PromisesSwift: 99fddfe4a0ec88a56486644c0da106694c92a604
|
||||
RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8
|
||||
RCTRequired: 0f06b6068f530932d10e1a01a5352fad4eaacb74
|
||||
RCTTypeSafety: b0ee81f10ef1b7d977605a2b266823dabd565e65
|
||||
React: 3becd12bd51ea8a43bdde7e09d0f40fba7820e03
|
||||
React-callinvoker: 11abfff50e6bf7a55b3a90b4dc2187f71f224593
|
||||
React-Codegen: f8946ce0768fb8e92e092e30944489c4b2955b2d
|
||||
React-Core: 203cdb6ee2657b198d97d41031c249161060e6ca
|
||||
React-CoreModules: 6eb0c06a4a223fde2cb6a8d0f44f58b67e808942
|
||||
React-cxxreact: afb0c6c07d19adbd850747fedeac20c6832d40b9
|
||||
React-jsi: 14d37a6db2af2c1a49f6f5c2e4ee667c364ae45c
|
||||
React-jsiexecutor: 45c0496ca8cef6b02d9fa0274c25cf458fe91a56
|
||||
React-jsinspector: eb202e43b3879aba9a14f3f65788aec85d4e1ea9
|
||||
React-logger: 98f663b292a60967ebbc6d803ae96c1381183b6d
|
||||
PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef
|
||||
PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959
|
||||
RCT-Folly: b9d9fe1fc70114b751c076104e52f3b1b5e5a95a
|
||||
RCTRequired: 3581db0757e7ff9be10718a56b3d79b6a6bd3bdf
|
||||
RCTTypeSafety: ce13e630c48340401ebfb28710959913f74b8b36
|
||||
React: cca8f2b7cce018f79847ca79847fa367b206e8a1
|
||||
React-bridging: b893643f09d3964afba6c347e00dd86cf10691e5
|
||||
React-callinvoker: 9ac7cba30428eddf7a06d1253f8e7561b5c97334
|
||||
React-Codegen: 65ff9fbddf8a17a6d4f495f71d365288f934a93a
|
||||
React-Core: 550b694774bc778b5c7bf7608fc12a484e01ec05
|
||||
React-CoreModules: c332d5b416cb3ccf972e7af79d496498a700e073
|
||||
React-cxxreact: c5c4106bfd2d0cee80b848e33b7ff4e35a721b16
|
||||
React-jsi: 6ff3fb9b9764a499c959e0096c0d384fa2b4beef
|
||||
React-jsiexecutor: 388f1c99404c848141d7ea162f61233d04829ede
|
||||
React-jsinspector: a4463b3411b8b9b37153255ef694a84c77ba3c7f
|
||||
React-logger: 2a0497622cbabc47fb769d97620952df14c1f814
|
||||
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
|
||||
react-native-get-random-values: 30b3f74ca34e30e2e480de48e4add2706a40ac8f
|
||||
react-native-keep-awake: afad8a51dfef9fe9655a6344771be32c8596d774
|
||||
react-native-netinfo: 27f287f2d191693f3b9d01a4273137fcf91c3b5d
|
||||
react-native-orientation-locker: 851f6510d8046ea2f14aa169b1e01fcd309a94ba
|
||||
react-native-pager-view: 3ee7d4c7697fb3ef788346e834a60cca97ed8540
|
||||
react-native-performance: f4b6604a9d5a8a7407e34a82fab6c641d9a3ec12
|
||||
react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a
|
||||
react-native-slider: 6e9b86e76cce4b9e35b3403193a6432ed07e0c81
|
||||
react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
|
||||
react-native-video: bb6f12a7198db53b261fefb5d609dc77417acc8b
|
||||
react-native-webrtc: ef315d8adb68e78298b22100377d12ef168efdb5
|
||||
react-native-webrtc: 2702afae1e59882b423e6077768ca0d1e6fc42ed
|
||||
react-native-webview: ea4899a1056c782afa96dd082179a66cbebf5504
|
||||
React-perflogger: 0458a87ea9a7342079e7a31b0d32b3734fb8415f
|
||||
React-RCTActionSheet: 22538001ea2926dea001111dd2846c13a0730bc9
|
||||
React-RCTAnimation: 732ce66878d4aa151d56a0d142b1105aa12fd313
|
||||
React-RCTBlob: 9cb9e3e9a41d27be34aaf89b0e0f52c7ca415d57
|
||||
React-RCTImage: 6bd16627eb9c4bb79903c4cdec7c551266ee1a5b
|
||||
React-RCTLinking: e9edfc8919c8fa9a3f3c7b34362811f58a2ebba4
|
||||
React-RCTNetwork: 880eccd21bbe2660a0b63da5ccba75c46eceeaa6
|
||||
React-RCTSettings: 8c85d8188c97d6c6bd470af6631a6c4555b79bb3
|
||||
React-RCTText: bbd275ee287730c5acbab1aadc0db39c25c5c64e
|
||||
React-RCTVibration: 9819a3bf6230e4b2a99877c21268b0b2416157a1
|
||||
React-runtimeexecutor: b1f1995089b90696dbc2a7ffe0059a80db5c8eb1
|
||||
ReactCommon: 149e2c0acab9bac61378da0db5b2880a1b5ff59b
|
||||
React-perflogger: bc57c4a953c1ec913b0d984cf4f2b9842a12bde0
|
||||
React-RCTActionSheet: 3efa3546119a1050f6c34a461b386dd9e36eaf0b
|
||||
React-RCTAnimation: e58fb9f1adf7b38af329881ea2740f43ffeea854
|
||||
React-RCTBlob: d2238645553c3ec787324268c0676148d86e6cc4
|
||||
React-RCTImage: e6d7c9ab978cae99364fcc96b9238fc7740a13da
|
||||
React-RCTLinking: 329e88ce217dad464ef34b5d0c40b3ceaac6c9ec
|
||||
React-RCTNetwork: c8967f2382aac31761ddb750fee53fa34cf7a4ee
|
||||
React-RCTSettings: 8a825b4b5ea58f6713a7c97eea6cc82e9895188b
|
||||
React-RCTText: ffcaac5c66bc065f2ccf79b6fe34585adb9e589b
|
||||
React-RCTVibration: 0039c986626b78242401931bb23c803935fae9d1
|
||||
React-runtimeexecutor: 5ebf1ddaa706bf2986123f22d2cad905443c2c5f
|
||||
ReactCommon: 65754b8932ea80272714988268bbfb9f303264a5
|
||||
RNCalendarEvents: 7e65eb4a94f53c1744d1e275f7fafcfaa619f7a3
|
||||
RNCAsyncStorage: 005c0e2f09575360f142d0d1f1f15e4ec575b1af
|
||||
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
|
||||
RNDefaultPreference: 08bdb06cfa9188d5da97d4642dac745218d7fb31
|
||||
RNDeviceInfo: 0400a6d0c94186d1120c3cbd97b23abc022187a9
|
||||
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
|
||||
RNGoogleSignin: c4381751eefd73c552b923ba347a9bfc6f18771c
|
||||
RNGoogleSignin: 22e468a9474dbcb8618d8847205ad4f0b2575d13
|
||||
RNScreens: 40a2cb40a02a609938137a1e0acfbf8fc9eebf19
|
||||
RNSound: 27e8268bdb0a1f191f219a33267f7e0445e8d62f
|
||||
RNSVG: f3b60aeeaa81960e2e0536c3a9eef50b667ef3a9
|
||||
RNWatch: dae6c858a2051dbdcfb00b9a86cf4d90400263b4
|
||||
Yoga: c4d61225a466f250c35c1ee78d2d0b3d41fe661c
|
||||
Yoga: d24d6184b6b85f742536bd93bd07d69d7b9bb4c1
|
||||
|
||||
PODFILE CHECKSUM: e671cdcdb80fab67e305861c36bfae8ed5a5b0ef
|
||||
PODFILE CHECKSUM: e3579df5272b8b697c9fdc0e55aa0845b189c4dd
|
||||
|
||||
COCOAPODS: 1.11.3
|
||||
|
||||
@@ -439,7 +439,7 @@
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "app" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
compatibilityVersion = "Xcode 12.0";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
@@ -1025,9 +1025,10 @@
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
@@ -1078,8 +1079,9 @@
|
||||
"$(inherited)",
|
||||
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
|
||||
@@ -39,6 +39,11 @@
|
||||
[builder setFeatureFlag:@"ios.screensharing.enabled" withBoolean:YES];
|
||||
[builder setFeatureFlag:@"ios.recording.enabled" withBoolean:YES];
|
||||
builder.serverURL = [NSURL URLWithString:@"https://meet.jit.si"];
|
||||
#if TARGET_IPHONE_SIMULATOR
|
||||
// CallKit has started to create problems starting with the iOS 16 simulator.
|
||||
// Disable it since it never worked in the simulator anyway.
|
||||
[builder setFeatureFlag:@"call-integration.enabled" withBoolean:NO];
|
||||
#endif
|
||||
}];
|
||||
|
||||
[jitsiMeet application:application didFinishLaunchingWithOptions:launchOptions];
|
||||
|
||||
@@ -98,7 +98,6 @@ platform :ios do
|
||||
demo_account_required: false,
|
||||
distribute_external: true,
|
||||
groups: ENV["JITSI_BETA_TESTING_GROUPS"],
|
||||
reject_build_waiting_for_review: true,
|
||||
uses_non_exempt_encryption: false
|
||||
)
|
||||
|
||||
|
||||
@@ -472,7 +472,7 @@
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 0BD906DF1EC0C00300C8C18E /* Build configuration list for PBXProject "sdk" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
compatibilityVersion = "Xcode 12.0";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
@@ -526,7 +526,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "export NODE_BINARY=node\nexport NODE_ARGS=\"--max_old_space_size=4096\"\n../../node_modules/react-native/scripts/react-native-xcode.sh\n";
|
||||
shellScript = "WITH_ENVIRONMENT=\"../../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n";
|
||||
};
|
||||
26796D8589142D80C8AFDA51 /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
@@ -551,17 +551,12 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK-resources.sh",
|
||||
"${PODS_ROOT}/Amplitude/Sources/Resources/ComodoRsaDomainValidationCA.der",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/GoogleSignIn/GoogleSignIn.bundle",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ComodoRsaDomainValidationCA.der",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDK/Pods-JitsiMeetSDK-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
@@ -641,15 +636,12 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources.sh",
|
||||
"${PODS_ROOT}/Amplitude/Sources/Resources/ComodoRsaDomainValidationCA.der",
|
||||
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ComodoRsaDomainValidationCA.der",
|
||||
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-JitsiMeetSDKLite/Pods-JitsiMeetSDKLite-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
@@ -781,9 +773,10 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
@@ -837,8 +830,9 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.4;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
*/
|
||||
|
||||
#import <Intents/Intents.h>
|
||||
#import <WebRTC/RTCLogging.h>
|
||||
|
||||
#import "Orientation.h"
|
||||
|
||||
#import "JitsiMeet+Private.h"
|
||||
@@ -26,6 +26,8 @@
|
||||
#import "RNSplashScreen.h"
|
||||
#import "ScheenshareEventEmiter.h"
|
||||
|
||||
#import <react-native-webrtc/WebRTCModuleOptions.h>
|
||||
|
||||
#if !defined(JITSI_MEET_SDK_LITE)
|
||||
#import <RNGoogleSignin/RNGoogleSignin.h>
|
||||
#import "Dropbox.h"
|
||||
@@ -52,6 +54,12 @@
|
||||
|
||||
- (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
#if 0
|
||||
// Initialize WebRTC options.
|
||||
WebRTCModuleOptions *options = [WebRTCModuleOptions sharedInstance];
|
||||
options.loggingSeverity = RTCLoggingSeverityInfo;
|
||||
#endif
|
||||
|
||||
// Initialize the one and only bridge for interfacing with React Native.
|
||||
_bridgeWrapper = [[RCTBridgeWrapper alloc] init];
|
||||
|
||||
@@ -63,11 +71,6 @@
|
||||
|
||||
// Register a log handler for React.
|
||||
registerReactLogHandler();
|
||||
|
||||
#if 0
|
||||
// Enable WebRTC logs
|
||||
RTCSetMinDebugLogLevel(RTCLoggingSeverityInfo);
|
||||
#endif
|
||||
}
|
||||
|
||||
return self;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
"cs": "Čeština",
|
||||
"da": "Dansk",
|
||||
"de": "Deutsch",
|
||||
"dsb": "Dolnoserbšćina",
|
||||
"el": "Ελληνικά",
|
||||
"en": "English",
|
||||
"enGB": "English (United Kingdom)",
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
"today": "Днес"
|
||||
},
|
||||
"chat": {
|
||||
"error": "Грешка: вашето съобщение не бе изпратено, пради: {{error}}",
|
||||
"error": "Грешка: вашето съобщение не бе изпратено, поради: {{error}}",
|
||||
"fieldPlaceHolder": "Въведете съобщението",
|
||||
"messageTo": "Лично съобщение до {{recipient}}",
|
||||
"messagebox": "Въведете съобщение",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"defaultEmail": "La vostra adreça de correu electrònic predeterminada",
|
||||
"disabled": "No podeu convidar-hi persones.",
|
||||
"failedToAdd": "No s'han pogut afegir-hi participants",
|
||||
"footerText": "La marcació està desactivada.",
|
||||
"googleEmail": "Correu de Google",
|
||||
"inviteMoreHeader": "Sou l'única persona en la reunió",
|
||||
"inviteMoreMailSubject": "Entra a la reunió {{appName}}",
|
||||
@@ -97,6 +96,7 @@
|
||||
"messageAccessibleTitleMe": "jo dic:",
|
||||
"messageTo": "Missatge privat per a {{recipient}}",
|
||||
"messagebox": "Escriviu un missatge",
|
||||
"newMessages": "Missatges nous",
|
||||
"nickname": {
|
||||
"popover": "Trieu un sobrenom",
|
||||
"title": "Introduïu un sobrenom per a usar el xat",
|
||||
@@ -116,6 +116,7 @@
|
||||
},
|
||||
"chromeExtensionBanner": {
|
||||
"buttonText": "Instal·la l'extensió de Chrome",
|
||||
"buttonTextEdge": "Instal·la l'extensió d'Edge",
|
||||
"close": "Tanca",
|
||||
"dontShowAgain": "No m'ho mostris més",
|
||||
"installExtensionText": "Instal·la l'extensió per a la integració amb Google Calendar i Office 365"
|
||||
@@ -206,6 +207,9 @@
|
||||
"selectADevice": "Seleccioneu un aparell",
|
||||
"testAudio": "Reprodueix un so de prova"
|
||||
},
|
||||
"dialIn": {
|
||||
"screenTitle": "Resum de la trucada"
|
||||
},
|
||||
"dialOut": {
|
||||
"statusMessage": "ara és {{status}}"
|
||||
},
|
||||
@@ -267,6 +271,7 @@
|
||||
"gracefulShutdown": "El nostre servei ara mateix és en manteniment. Torneu-ho a intentar més tard.",
|
||||
"grantModeratorDialog": "Esteu segur que voleu concedir drets de moderador a {{participantName}}?",
|
||||
"grantModeratorTitle": "Concedeix drets de moderador",
|
||||
"hide": "Amaga",
|
||||
"hideShareAudioHelper": "No tornis a mostrar aquest diàleg",
|
||||
"incorrectPassword": "El nom o la contrasenya no són correctes",
|
||||
"incorrectRoomLockPassword": "La contrasenya no és correcta",
|
||||
@@ -281,7 +286,6 @@
|
||||
"linkMeetingTitle": "Enllaça la reunió a Salesforce",
|
||||
"liveStreaming": "Transmissió en directe",
|
||||
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No és possible mentre l'enregistrament estigui actiu",
|
||||
"liveStreamingDisabledTooltip": "No es pot iniciar la transmissió en directe.",
|
||||
"localUserControls": "Controls locals d'usuari",
|
||||
"lockMessage": "No s'ha pogut blocar la conferència.",
|
||||
"lockRoom": "Afegeix una $t(lockRoomPassword) de reunió",
|
||||
@@ -336,7 +340,6 @@
|
||||
"recentlyUsedObjects": "Els objectes que heu usat recentment",
|
||||
"recording": "Enregistrament",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No és possible mentre hi ha una transmissió en directe activa",
|
||||
"recordingDisabledTooltip": "No es pot enregistrar.",
|
||||
"rejoinNow": "Torna a entrar ara",
|
||||
"remoteControlAllowedMessage": "{{user}} ha acceptat la petició de control remot!",
|
||||
"remoteControlDeniedMessage": "{{user}} ha rebutjat la petició de control remot!",
|
||||
@@ -386,6 +389,7 @@
|
||||
"shareYourScreenDisabled": "S'ha inhabilitat la compartició de pantalla.",
|
||||
"sharedVideoDialogError": "Error: URL no vàlid",
|
||||
"sharedVideoLinkPlaceholder": "Enllaç de YouTube o enllaç directe del vídeo",
|
||||
"show": "Mostra",
|
||||
"start": "Inicia",
|
||||
"startLiveStreaming": "Inicia la transmissió en directe",
|
||||
"startRecording": "Inicia l'enregistrament",
|
||||
@@ -476,9 +480,11 @@
|
||||
"noRoom": "No s'ha indicat cap sala a què marcar.",
|
||||
"numbers": "Números de marcatge",
|
||||
"password": "$t(lockRoomPasswordUppercase): ",
|
||||
"reachedLimit": "Heu arribat al límit del vostre pla.",
|
||||
"sip": "Adreça SIP",
|
||||
"title": "Comparteix",
|
||||
"tooltip": "Comparteix l'enllaç i la informació de marcatge d'aquesta reunió"
|
||||
"tooltip": "Comparteix l'enllaç i la informació de marcatge d'aquesta reunió",
|
||||
"upgradeOptions": "Vegeu les opcions d'actualització"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "Vam ensopegar una mica.",
|
||||
@@ -513,6 +519,10 @@
|
||||
"toggleShortcuts": "Mostra o amaga les dreceres de teclat",
|
||||
"videoMute": "Inicia o atura la càmera"
|
||||
},
|
||||
"largeVideo": {
|
||||
"screenIsShared": "Esteu compartint la pantalla",
|
||||
"showMeWhatImSharing": "Mostra'm què estic compartint"
|
||||
},
|
||||
"liveStreaming": {
|
||||
"busy": "Treballem per a alliberar recursos de transmissió. Torneu-ho a intentar en uns minuts.",
|
||||
"busyTitle": "Ara mateix, tots els reproductors són ocupats",
|
||||
@@ -616,6 +626,7 @@
|
||||
"no": "No",
|
||||
"participant": "Participant",
|
||||
"participantStats": "Estadístiques del participant",
|
||||
"selectTabTitle": "🎥 Trieu aquesta pestanya per a enregistrar",
|
||||
"sessionToken": "Identificador de la sessió",
|
||||
"start": "Inicia l'enregistrament",
|
||||
"stop": "Atura l'enregistrament",
|
||||
@@ -638,6 +649,8 @@
|
||||
"connectedOneMember": "{{name}} s'ha unit a la reunió",
|
||||
"connectedThreePlusMembers": "{{name}} i molts altres s'han unit a la reunió",
|
||||
"connectedTwoMembers": "{{first}} i {{second}} s'han unit a la reunió",
|
||||
"dataChannelClosed": "Qualitat del vídeo deteriorada",
|
||||
"dataChannelClosedDescription": "El canal pont s'ha desconnectat i per la qualitat de vídeo està limitada al valor inferior.",
|
||||
"disconnected": "desconnectat",
|
||||
"displayNotifications": "Mostra les notificacions sobre",
|
||||
"focus": "Focus de la conferència",
|
||||
@@ -658,6 +671,8 @@
|
||||
"linkToSalesforceKey": "Enllaça aquesta reunió",
|
||||
"linkToSalesforceProgress": "S'està enllaçant la reunió a Salesforce...",
|
||||
"linkToSalesforceSuccess": "La reunió s'ha enllaçat a Salesforce",
|
||||
"localRecordingStarted": "{{name}} ha iniciat un enregistrament local.",
|
||||
"localRecordingStopped": "{{name}} ha aturat has stopped a local recording.",
|
||||
"me": "Jo",
|
||||
"moderationInEffectCSDescription": "Aixequeu la mà si voleu compartir la pantalla.",
|
||||
"moderationInEffectCSTitle": "El moderador ha blocat la compartició de pantalla",
|
||||
@@ -678,6 +693,10 @@
|
||||
"newDeviceAction": "Usa",
|
||||
"newDeviceAudioTitle": "S'ha detectat un aparell d'àudio nou",
|
||||
"newDeviceCameraTitle": "S'ha detectat una càmera nova",
|
||||
"noiseSuppressionDesktopAudioDescription": "La supressió de soroll no es pot activar mentre es comparteix l'àudio de l'escriptori. Desactiveu-lo i proveu una altra vegada.",
|
||||
"noiseSuppressionFailedTitle": "No s'ha pogut iniciar la supressió de soroll",
|
||||
"noiseSuppressionNoTrackDescription": "Abans, activeu el vostre micròfon.",
|
||||
"noiseSuppressionStereoDescription": "Ara per ara, no és possible la supressió de soroll d'àudio en estèreo",
|
||||
"oldElectronClientDescription1": "Sembla que useu una versió antiga del client Jitsi Meet, que té vulnerabilitats de seguretat conegudes. Assegureu-vos d'actualitzar-lo",
|
||||
"oldElectronClientDescription2": "última construcció",
|
||||
"oldElectronClientDescription3": "ara!",
|
||||
@@ -813,6 +832,7 @@
|
||||
"initiated": "S'ha iniciat la trucada",
|
||||
"joinAudioByPhone": "Entra amb àudio de telèfon",
|
||||
"joinMeeting": "Entra a la reunió",
|
||||
"joinMeetingInLowBandwidthMode": "Uneix-t'hi en mode de poca amplada de banda",
|
||||
"joinWithoutAudio": "Entra sense àudio",
|
||||
"keyboardShortcuts": "Activa les dreceres del teclat",
|
||||
"linkCopied": "L'enllaç s'ha copiat al porta-retalls",
|
||||
@@ -888,13 +908,23 @@
|
||||
"limitNotificationDescriptionWeb": "A causa de la gran demanda, l'enregistrament es limitarà a {{limit}} min. Per a enregistraments il·limitats, proveu <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
|
||||
"linkGenerated": "S'ha generat un enllaç a l'enregistrament.",
|
||||
"live": "EN DIRECTE",
|
||||
"localRecordingNoNotificationWarning": "L'enregistrament no s'anunciarà als altres participants. Els haureu d'informar que la reunió s'està enregistrant.",
|
||||
"localRecordingNoVideo": "El vídeo no s'està enregistrant",
|
||||
"localRecordingStartWarning": "Assegureu-vos que atureu l'enregistrament abans de sortir de la reunió per a poder-lo desar.",
|
||||
"localRecordingStartWarningTitle": "Atura l'enregistrament per a desar-lo",
|
||||
"localRecordingVideoStop": "Aturar el vídeo també aturarà l'enregistrament local. Segur que voleu continuar?",
|
||||
"localRecordingVideoWarning": "Per a enregistrar el vostre vídeo, cal que ho feu en començar l'enregistrament",
|
||||
"localRecordingWarning": "Assegureu-vos de triar la pestanya actual per a poder usar el vídeo i àudios correctes. L'enregistrament actualment està limitat a 1 GB. Això són, aproximadament, 100 minuts.",
|
||||
"loggedIn": "Sessió iniciada com a {{userName}}",
|
||||
"noStreams": "No s'ha detectat flux d'àudio ni vídeo.",
|
||||
"off": "S'ha aturat l'enregistrament",
|
||||
"offBy": "{{name}} ha aturat l'enregistrament",
|
||||
"on": "L'enregistrament ha començat",
|
||||
"onBy": "{{name}} ha iniciat l'enregistrament",
|
||||
"onlyRecordSelf": "Enregistra només el meu àudio i vídeo",
|
||||
"pending": "S'està preparant per a enregistrar la reunió...",
|
||||
"rec": "ENREG",
|
||||
"saveLocalRecording": "Desa el fitxer de l'enregistrament en local (beta)",
|
||||
"serviceDescription": "El servei d'enregistrament desarà el vostre enregistrament",
|
||||
"serviceDescriptionCloud": "Enregistrament al núvol",
|
||||
"serviceDescriptionCloudInfo": "Les reunions enregistrades s'esborren automàticament 24 hores després de l'enregistrament.",
|
||||
@@ -902,6 +932,7 @@
|
||||
"sessionAlreadyActive": "Aquesta sessió ja s'està enregistrant o emetent en directe.",
|
||||
"signIn": "Inicia la sessió",
|
||||
"signOut": "Tanca la sessió",
|
||||
"surfaceError": "Trieu la pestanya actual.",
|
||||
"title": "Enregistrament",
|
||||
"unavailable": "Vaja! El servei {{serviceName}} ara mateix no és disponible. Treballem per a resoldre el problema. Torneu-ho a intentar més tard.",
|
||||
"unavailableTitle": "L'enregistrament no és disponible",
|
||||
@@ -918,6 +949,7 @@
|
||||
"title": "Opcions de seguretat"
|
||||
},
|
||||
"settings": {
|
||||
"buttonLabel": "Paràmetres",
|
||||
"calendar": {
|
||||
"about": "La integració de l'agenda {{appName}} s'usa per a accedir de forma segura a la vostra agenda perquè pugui llegir els esdeveniments pròxims.",
|
||||
"disconnect": "Desconnectat",
|
||||
@@ -941,6 +973,7 @@
|
||||
"name": "Nom",
|
||||
"noDevice": "Cap",
|
||||
"participantJoined": "S'ha unit un participant",
|
||||
"participantKnocking": "El participant ha entrat a la sala d'espera",
|
||||
"participantLeft": "Un participant ha sortit de la reunió",
|
||||
"playSounds": "Reprodueix el so",
|
||||
"reactions": "Reaccions de la reunió",
|
||||
@@ -970,13 +1003,21 @@
|
||||
"disableCrashReportingWarning": "Esteu segur que voleu desactivar l'informe de fallades? La configuració s'aplicarà després de reiniciar l'aplicació.",
|
||||
"disableP2P": "Desactiva el mode d'igual a igual",
|
||||
"displayName": "Nom visible",
|
||||
"displayNamePlaceholderText": "P. ex.: Pere Cullera",
|
||||
"email": "Adreça electrònica",
|
||||
"emailPlaceholderText": "email@example.com",
|
||||
"goTo": "Ves a",
|
||||
"header": "Configuració",
|
||||
"help": "Ajuda",
|
||||
"links": "Enllaços",
|
||||
"privacy": "Privadesa",
|
||||
"profileSection": "Perfil",
|
||||
"serverURL": "URL del servidor",
|
||||
"showAdvanced": "Mostra la configuració avançada",
|
||||
"startCarModeInLowBandwidthMode": "Inicia el mode cotxe en el mode d'amplada de banda baixa",
|
||||
"startWithAudioMuted": "Comença amb l'àudio silenciat",
|
||||
"startWithVideoMuted": "Comença amb el vídeo desactivat",
|
||||
"terms": "Condicions",
|
||||
"version": "Versió"
|
||||
},
|
||||
"share": {
|
||||
@@ -1003,6 +1044,7 @@
|
||||
},
|
||||
"startupoverlay": {
|
||||
"genericTitle": "La reunió requereix usar el micròfon i la càmera.",
|
||||
"policyText": "",
|
||||
"title": "{{app}} requereix usar el micròfon i la càmera."
|
||||
},
|
||||
"suspendedoverlay": {
|
||||
@@ -1013,6 +1055,7 @@
|
||||
"termsView": {
|
||||
"title": "Condicions"
|
||||
},
|
||||
"toggleTopPanelLabel": "Mostra o amaga el panell superior",
|
||||
"toolbar": {
|
||||
"Settings": "Configuració",
|
||||
"accessibilityLabel": {
|
||||
@@ -1030,6 +1073,7 @@
|
||||
"document": "Activa o desactiva el document compartit",
|
||||
"download": "Baixeu les nostres aplicacions",
|
||||
"embedMeeting": "Insereix la reunió",
|
||||
"endConference": "Finalitza la reunió per a tothom",
|
||||
"expand": "Expandeix",
|
||||
"feedback": "Deixa comentaris",
|
||||
"fullScreen": "Activa o desactiva la pantalla completa",
|
||||
@@ -1054,6 +1098,7 @@
|
||||
"muteEveryoneElse": "Silencia tots els altres participants",
|
||||
"muteEveryoneElsesVideoStream": "Atura el vídeo a tots els altres",
|
||||
"muteEveryonesVideoStream": "Atura el vídeo a tothom",
|
||||
"noiseSuppression": "Supressió de soroll",
|
||||
"participants": "Participants",
|
||||
"pip": "Activa o desactiva el mode imatge en imatge",
|
||||
"privateMessage": "Envia un missatge privat",
|
||||
@@ -1079,7 +1124,8 @@
|
||||
"toggleCamera": "Activa o desactiva la càmera",
|
||||
"toggleFilmstrip": "Mostra o amaga la cinta",
|
||||
"videoblur": "Activa o desactiva el desenfocament del vídeo",
|
||||
"videomute": "Activa o desactiva la càmera"
|
||||
"videomute": "Activa o desactiva la càmera",
|
||||
"whiteboard": "Mostra o amaga la pissarra"
|
||||
},
|
||||
"addPeople": "Afegeix persones a la trucada",
|
||||
"audioOnlyOff": "Desactiva el mode de poca amplada de banda",
|
||||
@@ -1093,12 +1139,14 @@
|
||||
"clap": "Picament de mans",
|
||||
"closeChat": "Tanca el xat",
|
||||
"closeReactionsMenu": "Tanca el menú de reaccions",
|
||||
"disableNoiseSuppression": "Desactiva la supressió de soroll",
|
||||
"disableReactionSounds": "Podeu desactivar els sons de reacció per a aquesta reunió",
|
||||
"documentClose": "Tanca el document compartit",
|
||||
"documentOpen": "Obre el document compartit",
|
||||
"download": "Baixeu les nostres aplicacions",
|
||||
"e2ee": "Xifratge d'extrem a extrem",
|
||||
"embedMeeting": "Insereix la reunió",
|
||||
"endConference": "Finalitza la reunió per a tothom",
|
||||
"enterFullScreen": "Mostra en pantalla completa",
|
||||
"enterTileView": "Mostra en mode mosaic",
|
||||
"exitFullScreen": "Surt de la pantalla completa",
|
||||
@@ -1107,6 +1155,7 @@
|
||||
"giphy": "Mostra o amaga el menú GIPHY",
|
||||
"hangup": "Surt la reunió",
|
||||
"help": "Ajuda",
|
||||
"hideWhiteboard": "Amaga la pissarra",
|
||||
"invite": "Convida-hi persones",
|
||||
"joinBreakoutRoom": "Entra a la sala de descans",
|
||||
"laugh": "Riure",
|
||||
@@ -1129,6 +1178,7 @@
|
||||
"noAudioSignalDialInDesc": "També podeu marcar usant:",
|
||||
"noAudioSignalDialInLinkDesc": "Números de marcatge",
|
||||
"noAudioSignalTitle": "No entra cap so pel vostre micròfon!",
|
||||
"noiseSuppression": "Supressió de soroll",
|
||||
"noisyAudioInputDesc": "Sembla que el vostre micròfon fa soroll, considereu de silenciar-lo o canviar l'aparell.",
|
||||
"noisyAudioInputTitle": "Sembla que el micròfon fa soroll!",
|
||||
"openChat": "Obre el xat",
|
||||
@@ -1151,6 +1201,7 @@
|
||||
"shareaudio": "Comparteix l'àudio",
|
||||
"sharedvideo": "Comparteix el vídeo",
|
||||
"shortcuts": "Mostra les dreceres",
|
||||
"showWhiteboard": "Mostra la pissarra",
|
||||
"silence": "Silenci",
|
||||
"speakerStats": "Estadístiques de l'interlocutor",
|
||||
"startScreenSharing": "Atura la compartició de la pantalla",
|
||||
@@ -1174,8 +1225,12 @@
|
||||
"labelToolTip": "La reunió s'està transcrivint",
|
||||
"off": "La transcripció s'ha aturat",
|
||||
"pending": "S'està preparant per a enregistrar la reunió...",
|
||||
"sourceLanguageDesc": "La llengua actual de la reunió és <b>{{sourceLanguage}}</b>. <br/> Podeu canviar-la",
|
||||
"sourceLanguageHere": "aquí",
|
||||
"start": "Activa els subtítols",
|
||||
"stop": "Desactiva els subtítols",
|
||||
"subtitles": "Subtítols",
|
||||
"subtitlesOff": "Inactiu",
|
||||
"tr": "TR"
|
||||
},
|
||||
"userMedia": {
|
||||
@@ -1311,6 +1366,7 @@
|
||||
"roomname": "Introduïu el nom de la sala",
|
||||
"roomnameHint": "Introduïu el nom o l'URL de la sala on voleu entrar. Podeu crear un nom, només cal que les persones amb qui us reuniu el coneguin i introdueixin el mateix nom.",
|
||||
"sendFeedback": "Envia comentaris",
|
||||
"settings": "Paràmetres",
|
||||
"startMeeting": "Inicia la reunió",
|
||||
"terms": "Condicions",
|
||||
"title": "Videoconferència segura, plena de funcionalitats i completament gratuïta i lliure"
|
||||
|
||||
@@ -184,13 +184,21 @@
|
||||
"deepLinking": {
|
||||
"appNotInstalled": "Sie benötigen die „{{app}}“-App, um der Konferenz auf dem Smartphone beizutreten.",
|
||||
"description": "Nichts passiert? Wir haben versucht, die Konferenz in {{app}} zu öffnen. Versuchen Sie es erneut oder treten Sie der Konferenz in {{app}} im Web bei.",
|
||||
"descriptionNew": "Nichts passiert? Wir haben versucht, die Konferenz in {{app}} zu öffnen. <br /><br /> Versuchen Sie es erneut oder treten Sie der Konferenz im Web bei.",
|
||||
"descriptionWithoutWeb": "Ist nichts passiert? Wir haben versucht, Ihre Besprechung in der „{{app}}“-Desktop-App zu starten.",
|
||||
"downloadApp": "App herunterladen",
|
||||
"downloadMobileApp": "Aus dem App Store herunterladen",
|
||||
"ifDoNotHaveApp": "Wenn Sie die App noch nicht haben:",
|
||||
"ifHaveApp": "Wenn Sie die App bereits haben:",
|
||||
"joinInApp": "Mit der App am Meeting teilnehmen",
|
||||
"joinInAppNew": "Mit der App",
|
||||
"joinInBrowser": "Im Browser",
|
||||
"launchMeetingLabel": "Wie möchten Sie an der Konferenz teilnehmen?",
|
||||
"launchWebButton": "Im Web öffnen",
|
||||
"noMobileApp": "Sie haben die App noch nicht installiert?",
|
||||
"termsAndConditions": "Indem Sie fortfahren, stimmen Sie underen<a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>Nutzungsbedingungen</a> zu.",
|
||||
"title": "Die Konferenz wird in {{app}} geöffnet …",
|
||||
"titleNew": "Konferenz starten ...",
|
||||
"tryAgainButton": "Erneut mit der nativen Applikation versuchen",
|
||||
"unsupportedBrowser": "Sie verwenden einen Browser, der noch nicht unterstützt wird."
|
||||
},
|
||||
@@ -203,6 +211,12 @@
|
||||
"microphonePermission": "Fehler beim Bezug der Mikrofon-Zugriffsberechtigungen"
|
||||
},
|
||||
"deviceSelection": {
|
||||
"hid": {
|
||||
"callControl": "Anrufsteuerung",
|
||||
"connectedDevices": "Verbundene Geräte:",
|
||||
"deleteDevice": "Gerät löschen",
|
||||
"pairDevice": "Gerät verbinden"
|
||||
},
|
||||
"noPermission": "Berechtigungen nicht erteilt",
|
||||
"previewUnavailable": "Keine Vorschau verfügbar",
|
||||
"selectADevice": "Ein Gerät wählen",
|
||||
@@ -226,7 +240,9 @@
|
||||
"WaitingForHostTitle": "Warten auf den Beginn der Konferenz …",
|
||||
"Yes": "Ja",
|
||||
"accessibilityLabel": {
|
||||
"liveStreaming": "Livestream"
|
||||
"close": "Popup schließen",
|
||||
"liveStreaming": "Livestream",
|
||||
"sharingTabs": "Optionen zum Teilen"
|
||||
},
|
||||
"add": "Hinzufügen",
|
||||
"addMeetingNote": "Notiz zu dieser Konferenz hinzufügen",
|
||||
@@ -438,6 +454,11 @@
|
||||
"veryBad": "Sehr schlecht",
|
||||
"veryGood": "Sehr gut"
|
||||
},
|
||||
"filmstrip": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Videominiaturen"
|
||||
}
|
||||
},
|
||||
"giphy": {
|
||||
"noResults": "Keine Ergebnisse :(",
|
||||
"search": "GIPHY durchsuchen"
|
||||
@@ -654,6 +675,7 @@
|
||||
"dataChannelClosedDescription": "Die Steuerungsverbindung (Bridge Channel) wurde unterbrochen, daher ist die Videoqulität auf die schlechteste Stufe limitiert.",
|
||||
"disconnected": "getrennt",
|
||||
"displayNotifications": "Benachrichtigungen anzeigen für",
|
||||
"dontRemindMe": "Nicht erinnern",
|
||||
"focus": "Konferenzleitung",
|
||||
"focusFail": "{{component}} ist im Moment nicht verfügbar – wiederholen in {{ms}} Sekunden",
|
||||
"gifsMenu": "GIPHY",
|
||||
@@ -662,6 +684,7 @@
|
||||
"invitedOneMember": "{{name}} wurde eingeladen",
|
||||
"invitedThreePlusMembers": "{{name}} und {{count}} andere wurden eingeladen",
|
||||
"invitedTwoMembers": "{{first}} und {{second}} wurden eingeladen",
|
||||
"joinMeeting": "Beitreten",
|
||||
"kickParticipant": "{{kicked}} wurde von {{kicker}} ausgewiesen",
|
||||
"leftOneMember": "{{name}} hat die Konferenz verlassen",
|
||||
"leftThreePlusMembers": "{{name}} und Weitere haben die Konferenz verlassen",
|
||||
@@ -751,6 +774,7 @@
|
||||
"headings": {
|
||||
"lobby": "Lobby ({{count}})",
|
||||
"participantsList": "Anwesende ({{count}})",
|
||||
"visitors": "Gäste ({{count}})",
|
||||
"waitingLobby": "In der Lobby ({{count}})"
|
||||
},
|
||||
"search": "Suche Anwesende",
|
||||
@@ -758,6 +782,7 @@
|
||||
},
|
||||
"passwordDigitsOnly": "Bis zu {{number}} Ziffern",
|
||||
"passwordSetRemotely": "von einer anderen Person gesetzt",
|
||||
"pinParticipant": "{{participantName}} - anheften",
|
||||
"pinnedParticipant": "Die Person ist angeheftet",
|
||||
"polls": {
|
||||
"answer": {
|
||||
@@ -916,6 +941,7 @@
|
||||
"localRecordingVideoWarning": "Um Ihr eigenes Kamerabild aufzuzeichnen, müssen Sie Ihre Kamera beim Start der Aufnahme einschalten",
|
||||
"localRecordingWarning": "Bitte prüfen Sie, dass das aktuelle Tab auswählen, um Bild und Ton aufzuzeichnen. Die Länge der Aufzeichnung ist aktuell auf 1GB beschränkt, was ungefähr 100 Minuten entspricht.",
|
||||
"loggedIn": "Als {{userName}} angemeldet",
|
||||
"noMicPermission": "Zugriff auf Mikrofon fehlgeschlagen. Bitte erlauben Sie den Zugriff auf das Mikrofon.",
|
||||
"noStreams": "Kein Ton oder Video erkannt.",
|
||||
"off": "Aufnahme gestoppt",
|
||||
"offBy": "{{name}} stoppte die Aufnahme",
|
||||
@@ -949,6 +975,7 @@
|
||||
"title": "Sicherheitsoptionen"
|
||||
},
|
||||
"settings": {
|
||||
"audio": "Audio",
|
||||
"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.",
|
||||
@@ -969,9 +996,11 @@
|
||||
"maxStageParticipants": "Maximale Anzahl an Personen, die zur Hauptansicht angeheftet werden können",
|
||||
"microphones": "Mikrofon",
|
||||
"moderator": "Moderation",
|
||||
"moderatorOptions": "Moderationseinstellungen",
|
||||
"more": "Mehr",
|
||||
"name": "Name",
|
||||
"noDevice": "Kein",
|
||||
"notifications": "Benachrichtigungen",
|
||||
"participantJoined": "Neue Person nimmt teil",
|
||||
"participantKnocking": "Person hat Lobby betreten",
|
||||
"participantLeft": "Person verlässt die Konferenz",
|
||||
@@ -982,13 +1011,14 @@
|
||||
"selectCamera": "Kamera",
|
||||
"selectMic": "Mikrofon",
|
||||
"selfView": "Eigene Ansicht",
|
||||
"sounds": "Hinweistöne",
|
||||
"shortcuts": "Tastaturkürzel",
|
||||
"speakers": "Lautsprecher",
|
||||
"startAudioMuted": "Alle Personen treten stummgeschaltet bei",
|
||||
"startReactionsMuted": "Interaktionstöne für alle deaktivieren",
|
||||
"startVideoMuted": "Alle Personen treten ohne Video bei",
|
||||
"talkWhileMuted": "Wenn bei Stummschaltung gesprochen wird",
|
||||
"title": "Einstellungen"
|
||||
"title": "Einstellungen",
|
||||
"video": "Kamera"
|
||||
},
|
||||
"settingsView": {
|
||||
"advanced": "Erweitert",
|
||||
@@ -1069,18 +1099,29 @@
|
||||
"cc": "Untertitel ein-/ausschalten",
|
||||
"chat": "Chatfenster öffnen / schließen",
|
||||
"clap": "Klatschen",
|
||||
"closeChat": "Chat schließen",
|
||||
"closeMoreActions": "„Weitere Einstellungen“ schließen",
|
||||
"closeParticipantsPane": "Anwesendenliste schließen",
|
||||
"collapse": "Einklappen",
|
||||
"document": "Geteiltes Dokument schließen",
|
||||
"documentClose": "Geteiltes Dokument schließen",
|
||||
"documentOpen": "Geteiltes Dokument öffnen",
|
||||
"download": "Unsere Apps herunterladen",
|
||||
"embedMeeting": "Konferenz einbetten",
|
||||
"endConference": "Konferenz für alle beenden",
|
||||
"enterFullScreen": "Vollbildmodus einschalten",
|
||||
"enterTileView": "Kachelansicht einschalten",
|
||||
"exitFullScreen": "Vollbildansicht ausschalten",
|
||||
"exitTileView": "Kachelansicht ausschalten",
|
||||
"expand": "Ausklappen",
|
||||
"feedback": "Feedback hinterlassen",
|
||||
"fullScreen": "Vollbildmodus ein-/ausschalten",
|
||||
"giphy": "GIPHY ein-/ausschalten",
|
||||
"grantModerator": "Moderationsrechte vergeben",
|
||||
"hangup": "Konferenz verlassen",
|
||||
"heading": "Toolbar",
|
||||
"help": "Hilfe",
|
||||
"hideWhiteboard": "Whiteboard ausblenden",
|
||||
"invite": "Person einladen",
|
||||
"kick": "Person entfernen",
|
||||
"laugh": "Lachen",
|
||||
@@ -1090,6 +1131,7 @@
|
||||
"lobbyButton": "Lobbymodus ein-/ausschalten",
|
||||
"localRecording": "Lokale Aufzeichnungssteuerelemente ein-/ausschalten",
|
||||
"lockRoom": "Konferenzpasswort ein-/ausschalten",
|
||||
"lowerHand": "Hand senken",
|
||||
"moreActions": "Menü „Weitere Einstellungen“ ein-/ausschalten",
|
||||
"moreActionsMenu": "Menü „Weitere Einstellungen“",
|
||||
"moreOptions": "Menü „Weitere Optionen“",
|
||||
@@ -1099,6 +1141,7 @@
|
||||
"muteEveryoneElsesVideoStream": "Alle anderen Kameras ausschalten",
|
||||
"muteEveryonesVideoStream": "Alle Kameras ausschalten",
|
||||
"noiseSuppression": "Rauschunterdrückung",
|
||||
"openChat": "Chat öffnen",
|
||||
"participants": "Anwesende",
|
||||
"pip": "Bild-in-Bild-Modus ein-/ausschalten",
|
||||
"privateMessage": "Private Nachricht senden",
|
||||
@@ -1117,15 +1160,19 @@
|
||||
"sharedvideo": "Videofreigabe ein-/ausschalten",
|
||||
"shortcuts": "Tastenkombinationen ein-/ausblenden",
|
||||
"show": "Im Vordergrund anzeigen",
|
||||
"showWhiteboard": "Whiteboard anzeigen",
|
||||
"silence": "Stille",
|
||||
"speakerStats": "Sprechstatistik ein-/ausblenden",
|
||||
"stopScreenSharing": "Bildschirmfreigabe beenden",
|
||||
"stopSharedVideo": "Videofreigabe beenden",
|
||||
"surprised": "Überrascht",
|
||||
"tileView": "Kachelansicht ein-/ausschalten",
|
||||
"toggleCamera": "Kamera wechseln",
|
||||
"toggleFilmstrip": "Miniaturansichten ein-/ausschalten",
|
||||
"unmute": "Stummschaltung aufheben",
|
||||
"videoblur": "Unscharfer Hintergrund ein-/ausschalten",
|
||||
"videomute": "„Video stummschalten“ ein-/ausschalten",
|
||||
"whiteboard": "Whiteboard ein-/ausschalten"
|
||||
"videounmute": "Kamera einschalten"
|
||||
},
|
||||
"addPeople": "Personen zur Konferenz hinzufügen",
|
||||
"audioOnlyOff": "Modus „Nur Audio“ deaktivieren",
|
||||
@@ -1138,6 +1185,7 @@
|
||||
"chat": "Chat öffnen / schließen",
|
||||
"clap": "Klatschen",
|
||||
"closeChat": "Chat schließen",
|
||||
"closeParticipantsPane": "Anwesenheitsliste schließen",
|
||||
"closeReactionsMenu": "Interaktionsmenü schließen",
|
||||
"disableNoiseSuppression": "Rauschunterdrückung deaktivieren",
|
||||
"disableReactionSounds": "Sie können die Interaktionstöne für diese Konferenz deaktivieren",
|
||||
@@ -1146,6 +1194,7 @@
|
||||
"download": "Unsere Apps herunterladen",
|
||||
"e2ee": "Ende-zu-Ende-Verschlüsselung",
|
||||
"embedMeeting": "Konferenz einbetten",
|
||||
"enableNoiseSuppression": "Rauschunterdrückung einschalten",
|
||||
"endConference": "Konferenz für alle beenden",
|
||||
"enterFullScreen": "Vollbildmodus",
|
||||
"enterTileView": "Kachelansicht einschalten",
|
||||
@@ -1170,7 +1219,7 @@
|
||||
"lowerYourHand": "Hand senken",
|
||||
"moreActions": "Weitere Einstellungen",
|
||||
"moreOptions": "Weitere Optionen",
|
||||
"mute": "Mikrofon aktivieren / deaktivieren",
|
||||
"mute": "Stummschalten",
|
||||
"muteEveryone": "Alle stummschalten",
|
||||
"muteEveryonesVideo": "Alle Kameras ausschalten",
|
||||
"noAudioSignalDesc": "Wenn Sie das Gerät nicht absichtlich über die Systemeinstellungen oder die Hardware stumm geschaltet haben, sollten Sie einen Wechsel des Geräts in Erwägung ziehen.",
|
||||
@@ -1214,8 +1263,10 @@
|
||||
"talkWhileMutedPopup": "Versuchen Sie zu sprechen? Ihr Mikrofon ist stummgeschaltet.",
|
||||
"tileViewToggle": "Kachelansicht ein-/ausschalten",
|
||||
"toggleCamera": "Kamera wechseln",
|
||||
"unmute": "Stummschaltung aufheben",
|
||||
"videoSettings": "Kameraeinstellungen",
|
||||
"videomute": "Kamera starten / stoppen"
|
||||
"videomute": "Kamera stoppen",
|
||||
"videounmute": "Kamera einschalten"
|
||||
},
|
||||
"transcribing": {
|
||||
"ccButtonTooltip": "Untertitel ein-/ausschalten",
|
||||
@@ -1233,6 +1284,7 @@
|
||||
"subtitlesOff": "Ausschalten",
|
||||
"tr": "TR"
|
||||
},
|
||||
"unpinParticipant": "{{participantName}} - Nicht mehr anheften",
|
||||
"userMedia": {
|
||||
"androidGrantPermissions": "Wählen Sie <b><i>Zulassen</i></b>, wenn der Browser um Berechtigungen bittet.",
|
||||
"chromeGrantPermissions": "Wählen Sie <b><i>Zulassen</i></b>, wenn der Browser um Berechtigungen bittet.",
|
||||
@@ -1271,9 +1323,11 @@
|
||||
"ldTooltip": "Video wird in niedriger Auflösung angezeigt",
|
||||
"lowDefinition": "Niedrige Auflösung",
|
||||
"performanceSettings": "Qualitätseinstellungen",
|
||||
"recording": "Aufnahme läuft",
|
||||
"sd": "SD",
|
||||
"sdTooltip": "Video wird in Standardauflösung angezeigt",
|
||||
"standardDefinition": "Standardauflösung"
|
||||
"standardDefinition": "Standardauflösung",
|
||||
"streaming": "Streaming läuft"
|
||||
},
|
||||
"videothumbnail": {
|
||||
"connectionInfo": "Verbindungsinformationen",
|
||||
@@ -1285,6 +1339,7 @@
|
||||
"grantModerator": "Moderationsrechte vergeben",
|
||||
"hideSelfView": "Eigene Ansicht ausblenden",
|
||||
"kick": "Hinauswerfen",
|
||||
"mirrorVideo": "Mein Video spiegeln",
|
||||
"moderator": "Moderation",
|
||||
"mute": "Person ist stumm geschaltet",
|
||||
"muted": "Stummgeschaltet",
|
||||
@@ -1322,6 +1377,7 @@
|
||||
"webAssemblyWarning": "WebAssembly wird nicht unterstützt",
|
||||
"webAssemblyWarningDescription": "WebAssembly ist deaktiviert oder wird in diesem Browser nicht unterstützt"
|
||||
},
|
||||
"visitorsLabel": "Anzahl Gäste: {{count}}",
|
||||
"volumeSlider": "Lautstärkeregler",
|
||||
"welcomepage": {
|
||||
"accessibilityLabel": {
|
||||
@@ -1354,6 +1410,7 @@
|
||||
"microsoftLogo": "Microsoft Logo",
|
||||
"policyLogo": "Richtlinienlogo"
|
||||
},
|
||||
"meetingsAccessibilityLabel": "Konferenzen",
|
||||
"mobileDownLoadLinkAndroid": "Android App Download",
|
||||
"mobileDownLoadLinkFDroid": "F-Droid App Download",
|
||||
"mobileDownLoadLinkIos": "iOS App Download",
|
||||
@@ -1373,5 +1430,10 @@
|
||||
"terms": "AGB",
|
||||
"title": "Sichere, voll funktionale und komplett kostenlose Videokonferenzen",
|
||||
"upcomingMeetings": "Ihre zukünftigen Konferenzen"
|
||||
},
|
||||
"whiteboard": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Whiteboard"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1379
lang/main-dsb.json
Normal file
1379
lang/main-dsb.json
Normal file
File diff suppressed because it is too large
Load Diff
1440
lang/main-el.json
1440
lang/main-el.json
File diff suppressed because it is too large
Load Diff
@@ -46,21 +46,15 @@
|
||||
"today": "Today"
|
||||
},
|
||||
"chat": {
|
||||
"error": "Error: your message \"{{originalText}}\" was not sent. Reason: {{error}}",
|
||||
"fieldPlaceHolder": "",
|
||||
"messageTo": "",
|
||||
"messagebox": "Type a message",
|
||||
"nickname": {
|
||||
"popover": "Choose a nickname",
|
||||
"title": "Enter a nickname to use chat",
|
||||
"titleWithPolls": "Enter a nickname to use chat"
|
||||
},
|
||||
"noMessagesMessage": "",
|
||||
"privateNotice": "",
|
||||
"sendButton": "Send",
|
||||
"title": "Chat",
|
||||
"titleWithPolls": "Chat",
|
||||
"you": ""
|
||||
"titleWithPolls": "Chat"
|
||||
},
|
||||
"chromeExtensionBanner": {
|
||||
"buttonText": "",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"defaultEmail": "Dirección de correo por defecto",
|
||||
"disabled": "No puede invitar a otras personas.",
|
||||
"failedToAdd": "Error al agregar participantes",
|
||||
"footerText": "La marcación está desactivada.",
|
||||
"googleEmail": "Correo electrónico de Google",
|
||||
"inviteMoreHeader": "Usted se encuentra solo en la reunión",
|
||||
"inviteMoreMailSubject": "Unirse a la reunión {{appName}}",
|
||||
@@ -31,6 +30,7 @@
|
||||
},
|
||||
"audioDevices": {
|
||||
"bluetooth": "Bluetooth",
|
||||
"car": "Audio de automóvil",
|
||||
"headphones": "Auriculares",
|
||||
"none": "No hay dispositivos de audio disponibles",
|
||||
"phone": "Teléfono",
|
||||
@@ -39,6 +39,37 @@
|
||||
"audioOnly": {
|
||||
"audioOnly": "Solo sonido y pantalla compartida"
|
||||
},
|
||||
"bandwidthSettings": {
|
||||
"assumedBandwidthBps": "por ejemplo 10000000 para 10 Mbps",
|
||||
"assumedBandwidthBpsWarning": "Valores más altos podrían causar problemas de red.",
|
||||
"customValue": "valor personalizado",
|
||||
"customValueEffect": "para establecer el valor real de bps",
|
||||
"leaveEmpty": "dejar vacío",
|
||||
"leaveEmptyEffect": "para permitir que se realicen estimaciones",
|
||||
"possibleValues": "Valores posibles",
|
||||
"setAssumedBandwidthBps": "Ancho de banda asumido (bps)",
|
||||
"title": "Ajustes de ancho de banda",
|
||||
"zeroEffect": "para deshabilitar el video"
|
||||
},
|
||||
"breakoutRooms": {
|
||||
"actions": {
|
||||
"add": "Agregar sala para grupos pequeños",
|
||||
"autoAssign": "Autoasignar a sala para grupos pequeños",
|
||||
"close": "Cerrar",
|
||||
"join": "Unirse",
|
||||
"leaveBreakoutRoom": "Abandonar sala para grupos pequeños",
|
||||
"more": "Más",
|
||||
"remove": "Quitar",
|
||||
"sendToBreakoutRoom": "Enviar participante a:"
|
||||
},
|
||||
"defaultName": "Sala para grupos pequeños #{{index}}",
|
||||
"mainRoom": "Sala principal",
|
||||
"notifications": {
|
||||
"joined": "Uniéndose a la sala para grupos pequeños \"{{name}}\"",
|
||||
"joinedMainRoom": "Uniéndose a la sala principal",
|
||||
"joinedTitle": "Salas para grupos pequeños"
|
||||
}
|
||||
},
|
||||
"calendarSync": {
|
||||
"addMeetingURL": "Agregar un vínculo a la reunión",
|
||||
"confirmAddLink": "¿Quiere añadir un enlace de Jitsi a este evento?",
|
||||
@@ -57,15 +88,27 @@
|
||||
"refresh": "Actualizar calendario",
|
||||
"today": "Hoy"
|
||||
},
|
||||
"carmode": {
|
||||
"actions": {
|
||||
"selectSoundDevice": "Elija un dispositivo de sonido"
|
||||
},
|
||||
"labels": {
|
||||
"buttonLabel": "Modo automóvil",
|
||||
"title": "Modo automóvil",
|
||||
"videoStopped": "Su video se ha detenido"
|
||||
}
|
||||
},
|
||||
"chat": {
|
||||
"enter": "Entrar en la sala",
|
||||
"error": "Error: su mensaje no se envío. Motivo: {{error}}",
|
||||
"fieldPlaceHolder": "Escriba su mensaje aquí",
|
||||
"lobbyChatMessageTo": "Mensaje de chat de lobby a {{recipient}}",
|
||||
"message": "Mensaje",
|
||||
"messageAccessibleTitle": "{{user}} dice:",
|
||||
"messageAccessibleTitleMe": "yo digo:",
|
||||
"messageTo": "Mensaje privado para {{recipient}}",
|
||||
"messagebox": "Escriba un mensaje",
|
||||
"newMessages": "Mensajes nuevos",
|
||||
"nickname": {
|
||||
"popover": "Selecciona un apodo",
|
||||
"title": "Introduce un apodo para usar el chat",
|
||||
@@ -85,6 +128,7 @@
|
||||
},
|
||||
"chromeExtensionBanner": {
|
||||
"buttonText": "Instalar extensión de Chrome",
|
||||
"buttonTextEdge": "Instalar extensión de Edge",
|
||||
"close": "Cerrar",
|
||||
"dontShowAgain": "No mostrar nuevamente",
|
||||
"installExtensionText": "Instalar la extensión para Google Calendar y la integración con Office 365"
|
||||
@@ -115,6 +159,7 @@
|
||||
"bridgeCount": "Contador del servidor: ",
|
||||
"codecs": "Codecs (A/V):",
|
||||
"connectedTo": "Conectado a:",
|
||||
"e2eeVerified": "",
|
||||
"framerate": "Fotogramas por segundo:",
|
||||
"less": "Mostrar menos",
|
||||
"localaddress": "Dirección local:",
|
||||
@@ -123,6 +168,7 @@
|
||||
"localport_plural": "Puertos locales:",
|
||||
"maxEnabledResolution": "enviar max",
|
||||
"more": "Mostrar más",
|
||||
"no": "no",
|
||||
"packetloss": "Pérdida de paquetes:",
|
||||
"participant_id": "ID participante:",
|
||||
"quality": {
|
||||
@@ -141,7 +187,8 @@
|
||||
"status": "Calidad:",
|
||||
"transport": "Transporte:",
|
||||
"transport_plural": "Transportes:",
|
||||
"video_ssrc": "Video SSRC:"
|
||||
"video_ssrc": "Video SSRC:",
|
||||
"yes": "sí"
|
||||
},
|
||||
"dateUtils": {
|
||||
"earlier": "Anterior",
|
||||
@@ -150,15 +197,24 @@
|
||||
},
|
||||
"deepLinking": {
|
||||
"appNotInstalled": "Necesitas la aplicación {{app}} para unirte a esta reunión en el teléfono.",
|
||||
"description": "¿No pasó nada? Hemos intentado iniciar la reunión en la aplicación de escritorio {{app}}. Intenta de nuevo o inicia en la aplicación web {{app}}.",
|
||||
"description": "¿No pasó nada? Intentamos iniciar la reunión en la aplicación de escritorio {{app}}. Intenta de nuevo o inicia en la aplicación web {{app}}.",
|
||||
"descriptionNew": "¿No pasó nada? Intentamos iniciar la reunión en la aplicación de escritorio {{app}}. <br /><br /> Puedes volver a intentarlo o iniciar en la aplicación web.",
|
||||
"descriptionWithoutWeb": "¿No pasó nada? Intentamos iniciar su reunión en la aplicación de escritorio {{app}}.",
|
||||
"downloadApp": "Descargar la app",
|
||||
"downloadMobileApp": "",
|
||||
"ifDoNotHaveApp": "Si aún no tienes la app:",
|
||||
"ifHaveApp": "Si ya tienes la app:",
|
||||
"joinInApp": "Unirse a la reunion usando la app",
|
||||
"joinInAppNew": "Unirse en la app",
|
||||
"joinInBrowser": "Unirse en el navegador",
|
||||
"launchMeetingLabel": "¿Cómo quieres unirte a la reunión?",
|
||||
"launchWebButton": "Iniciar en el navegador",
|
||||
"noMobileApp": "¿No tienes la aplicación?",
|
||||
"termsAndConditions": "Al continuar aceptas nuestros <a href='{{termsAndConditionsLink}}' rel='noopener noreferrer' target='_blank'>términos y condiciones.</a>",
|
||||
"title": "Iniciando la reunión en {{app}}…",
|
||||
"tryAgainButton": "Intentar de nuevo en el escritorio"
|
||||
"titleNew": "Iniciando la reunión.",
|
||||
"tryAgainButton": "Intentar de nuevo en el escritorio",
|
||||
"unsupportedBrowser": "Parece que estás usando un navegador para el que no tenemos soporte."
|
||||
},
|
||||
"defaultLink": "ej. {{url}}",
|
||||
"defaultNickname": "ej. Juan Pérez",
|
||||
@@ -169,11 +225,20 @@
|
||||
"microphonePermission": "Error al obtener permiso del micrófono"
|
||||
},
|
||||
"deviceSelection": {
|
||||
"hid": {
|
||||
"callControl": "Control de llamadas",
|
||||
"connectedDevices": "Dispositivos conectados:",
|
||||
"deleteDevice": "Eliminar dispositivo",
|
||||
"pairDevice": "Emparejar dispositivo"
|
||||
},
|
||||
"noPermission": "Permiso no concedido",
|
||||
"previewUnavailable": "Vista previa no disponible",
|
||||
"selectADevice": "Seleccionar un dispositivo",
|
||||
"testAudio": "Reproducir un sonido de prueba"
|
||||
},
|
||||
"dialIn": {
|
||||
"screenTitle": ""
|
||||
},
|
||||
"dialOut": {
|
||||
"statusMessage": "está {{status}}"
|
||||
},
|
||||
@@ -189,9 +254,13 @@
|
||||
"WaitingForHostTitle": "Esperando al anfitrión...",
|
||||
"Yes": "Sí",
|
||||
"accessibilityLabel": {
|
||||
"liveStreaming": "Transmisión en vivo"
|
||||
"close": "Cerrar diálogo",
|
||||
"liveStreaming": "Transmisión en vivo",
|
||||
"sharingTabs": "Opciones para compartir"
|
||||
},
|
||||
"add": "Agregar",
|
||||
"addMeetingNote": "Agrega una nota acerca de esta reunión",
|
||||
"addOptionalNote": "Agrega una nota (opcional):",
|
||||
"allow": "Permitir",
|
||||
"alreadySharedVideoMsg": "Otro participante ya está compartiendo un vídeo. Esta conferencia sólo permite compartir un vídeo a la vez.",
|
||||
"alreadySharedVideoTitle": "Solo se permite un vídeo compartido a la vez",
|
||||
@@ -233,6 +302,7 @@
|
||||
"gracefulShutdown": "Nuestro servicio se encuentra en mantenimiento. Por favor, intente más tarde.",
|
||||
"grantModeratorDialog": "¿Estás seguro de que quieres convertir a este participante en moderador?",
|
||||
"grantModeratorTitle": "Convertir en moderador",
|
||||
"hide": "Esconder",
|
||||
"hideShareAudioHelper": "No volver a mostrar este diálogo",
|
||||
"incorrectPassword": "Nombre de usuario o contraseña incorrecta",
|
||||
"incorrectRoomLockPassword": "Contraseña incorrecta",
|
||||
@@ -243,9 +313,10 @@
|
||||
"kickParticipantDialog": "¿Seguro que quiere expulsar a este participante?",
|
||||
"kickParticipantTitle": "¿Expulsar a este participante?",
|
||||
"kickTitle": "¡Ay! {{participantDisplayName}} te expulsó de la reunión",
|
||||
"linkMeeting": "",
|
||||
"linkMeetingTitle": "",
|
||||
"liveStreaming": "Transmisión en vivo",
|
||||
"liveStreamingDisabledBecauseOfActiveRecordingTooltip": "No es posible mientras la grabación este activa",
|
||||
"liveStreamingDisabledTooltip": "Las trasmisiones están deshabilitadas.",
|
||||
"localUserControls": "Controles de usuario locales",
|
||||
"lockMessage": "No se pudo bloquear la conferencia.",
|
||||
"lockRoom": "Agregar $t(lockRoomPasswordUppercase) a la reunión",
|
||||
@@ -279,11 +350,11 @@
|
||||
"muteEveryonesVideoTitle": "¿Detener el vídeo de todos?",
|
||||
"muteParticipantBody": "No podrás quitarles el modo en silencio, pero ellos pueden quitárselo en cualquier momento.",
|
||||
"muteParticipantButton": "Silenciar",
|
||||
"muteParticipantDialog": "¿Seguro que quieres silenciar a este participante? No podrás revertir esta acción, pero el participante podrá hacerlo en cualquier momento",
|
||||
"muteParticipantTitle": "¿Silenciar a este participante?",
|
||||
"muteParticipantsVideoBody": "No podrás volver a encender la cámara, pero ellos pueden volver a encenderla en cualquier momento.",
|
||||
"muteParticipantsVideoBodyModerationOn": "",
|
||||
"muteParticipantsVideoButton": "Detener video",
|
||||
"muteParticipantsVideoDialog": "¿Estás seguro de que quieres apagar la cámara de este participante? No podrás volver a encender la cámara, pero ellos pueden volver a encenderla en cualquier momento.",
|
||||
"muteParticipantsVideoDialogModerationOn": "",
|
||||
"muteParticipantsVideoTitle": "¿Desactivar la cámara de este participante?",
|
||||
"noDropboxToken": "No hay un token válido de Dropbox",
|
||||
"password": "Contraseña",
|
||||
@@ -297,9 +368,9 @@
|
||||
"popupError": "Su navegador está bloqueando las ventanas emergentes de este sitio. Habilite las ventanas emergentes en la configuración de seguridad de su navegador y vuelva a intentarlo.",
|
||||
"popupErrorTitle": "Ventana emergente bloqueada",
|
||||
"readMore": "más",
|
||||
"recentlyUsedObjects": "Tus objetos usados recientemente",
|
||||
"recording": "Grabando",
|
||||
"recordingDisabledBecauseOfActiveLiveStreamingTooltip": "No es posible mientras la transmisión en vivo este activa",
|
||||
"recordingDisabledTooltip": "Inicio de grabación desactivado.",
|
||||
"rejoinNow": "Reunirse ahora",
|
||||
"remoteControlAllowedMessage": "¡{{user}} ha aceptado tu solicitud de control remoto!",
|
||||
"remoteControlDeniedMessage": "¡{{user}} ha rechazado tu solicitud de control remoto!",
|
||||
@@ -319,6 +390,12 @@
|
||||
"screenSharingFailed": "¡Ups! ¡Algo salió mal, no se pudo iniciar la compartición de su pantalla!",
|
||||
"screenSharingFailedTitle": "¡Fallo al compartir su pantalla!",
|
||||
"screenSharingPermissionDeniedError": "¡Uy! Algo salió mal con tus permisos de extensión para compartir pantalla. Vuelve a cargar la página e intenta de nuevo.",
|
||||
"searchInSalesforce": "Buscar en Salesforce",
|
||||
"searchResults": "Resultados de búsqueda({{count}}",
|
||||
"searchResultsDetailsError": "",
|
||||
"searchResultsError": "Hubo un error recuperando los datos.",
|
||||
"searchResultsNotFound": "No se encontraron resultados.",
|
||||
"searchResultsTryAgain": "Vuelve a intentar usando palabras clave alternativas",
|
||||
"sendPrivateMessage": "Acabas de recibir un mensaje privado. ¿Deseas responder en privado o a todos?",
|
||||
"sendPrivateMessageCancel": "Enviar al grupo",
|
||||
"sendPrivateMessageOk": "Enviar en privado",
|
||||
@@ -341,7 +418,10 @@
|
||||
"shareVideoTitle": "Compartir un vídeo",
|
||||
"shareYourScreen": "Compartir pantalla",
|
||||
"shareYourScreenDisabled": "Se desactivó la opción para compartir pantalla.",
|
||||
"sharedVideoDialogError": "Error: URL inválido",
|
||||
"sharedVideoLinkPlaceholder": "Enlace de YouTube o enlace de vídeo directo",
|
||||
"show": "Mostrar",
|
||||
"start": "Iniciar",
|
||||
"startLiveStreaming": "Iniciar transmisión en vivo",
|
||||
"startRecording": "Iniciar grabación",
|
||||
"startRemoteControlErrorMessage": "Se produjo un error al intentar iniciar la sesión de control remoto.",
|
||||
@@ -359,6 +439,10 @@
|
||||
"user": "Usuario",
|
||||
"userIdentifier": "Identificador de usuario",
|
||||
"userPassword": "contraseña del usuario",
|
||||
"verifyParticipantConfirm": "",
|
||||
"verifyParticipantDismiss": "",
|
||||
"verifyParticipantQuestion": "",
|
||||
"verifyParticipantTitle": "Verificación de usuario",
|
||||
"videoLink": "Enlace de vídeo",
|
||||
"viewUpgradeOptions": "Ver opciones de mejora",
|
||||
"viewUpgradeOptionsContent": "Para obtener acceso ilimitado a las funciones premium, como la grabación, las transcripciones, el streaming RTMP y otras, tendrás que actualizar tu plan.",
|
||||
@@ -384,8 +468,14 @@
|
||||
"veryBad": "Muy mala",
|
||||
"veryGood": "Muy buena"
|
||||
},
|
||||
"helpView": {
|
||||
"title": "Centro de ayuda"
|
||||
"filmstrip": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Miniaturas de video"
|
||||
}
|
||||
},
|
||||
"giphy": {
|
||||
"noResults": "No se encontraron resultados :(",
|
||||
"search": "Busca en GIPHY"
|
||||
},
|
||||
"incomingCall": {
|
||||
"answer": "Contestar",
|
||||
@@ -427,9 +517,11 @@
|
||||
"noRoom": "No se especificó la sala a marcar.",
|
||||
"numbers": "Números para entrar por llamada telefónica:",
|
||||
"password": "$t(lockRoomPasswordUppercase):",
|
||||
"reachedLimit": "Alcanzaste el límite de tu plan.",
|
||||
"sip": "Dirección SIP",
|
||||
"title": "Compartir",
|
||||
"tooltip": "Compartir el enlace y acceso telefónico para esta reunión"
|
||||
"tooltip": "Compartir el enlace y acceso telefónico para esta reunión",
|
||||
"upgradeOptions": "Por favor revisa las opciones de mejora en"
|
||||
},
|
||||
"inlineDialogFailure": {
|
||||
"msg": "Tuvimos un pequeño tropiezo.",
|
||||
@@ -450,6 +542,7 @@
|
||||
"focusLocal": "Ver tu cámara",
|
||||
"focusRemote": "Ver la cámara de otras personas",
|
||||
"fullScreen": "Entrar o salir de pantalla completa",
|
||||
"giphyMenu": "Alternar menú GIPHY",
|
||||
"keyboardShortcuts": "Atajos de teclado",
|
||||
"localRecording": "Mostrar u ocultar controles de grabación local",
|
||||
"mute": "Activar o silenciar el micrófono",
|
||||
@@ -463,6 +556,10 @@
|
||||
"toggleShortcuts": "Mostrar u ocultar atajos del teclado",
|
||||
"videoMute": "Encender o apagar la cámara"
|
||||
},
|
||||
"largeVideo": {
|
||||
"screenIsShared": "Estás compartiendo tu pantalla",
|
||||
"showMeWhatImSharing": "Muéstrame qué estoy compartiendo"
|
||||
},
|
||||
"liveStreaming": {
|
||||
"busy": "Nuestros servidores andan un poco ocupados. Vuelve a intentarlo en unos minutos.",
|
||||
"busyTitle": "Todos los transmisores están ocupados",
|
||||
@@ -479,6 +576,7 @@
|
||||
"failedToStart": "La transmisión en vivo no se pudo iniciar",
|
||||
"getStreamKeyManually": "No pudimos encontrar tu clave de transmisión. Por favor, obtenla de la página de YouTube y pégala.",
|
||||
"googlePrivacyPolicy": "Política de Privacidad de Google",
|
||||
"inProgress": "Grabación o transmisión en vivo en curso",
|
||||
"invalidStreamKey": "Es posible que la clave de transmisión sea incorrecta, o no es de YouTube.",
|
||||
"limitNotificationDescriptionNative": "Su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en {{app}}.",
|
||||
"limitNotificationDescriptionWeb": "Debido a la alta demanda su transmisión estará limitada a {{limit}} minutos. Puede obtener transmisiones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
|
||||
@@ -488,6 +586,7 @@
|
||||
"onBy": "{{name}} inició la transmisión en vivo",
|
||||
"pending": "Iniciando transmisión en vivo…",
|
||||
"serviceName": "Servicio de transmisión en vivo",
|
||||
"sessionAlreadyActive": "Esta sesión ya está siendo grabada o transmitida en vivo.",
|
||||
"signIn": "Iniciar sesión con Google",
|
||||
"signInCTA": "Para transmitir a YouTube, inicia sesión o introduce la clave de transmisión. Para transmitir a otro lugar, introduce el URL (que empieza en rtmp), seguido de la clave de transmisión. Debe haber una diagonal (/) entre ambos.",
|
||||
"signOut": "Cerrar sesión",
|
||||
@@ -501,8 +600,8 @@
|
||||
"lobby": {
|
||||
"admit": "Admitir",
|
||||
"admitAll": "Admitir todo",
|
||||
"allow": "permitir",
|
||||
"backToKnockModeButton": "No hay contraseña, pide permiso para entrar.",
|
||||
"chat": "Chat",
|
||||
"dialogTitle": "Sala de espera",
|
||||
"disableDialogContent": "Sala de espera activada. Así no entrarán intrusos. ¿Quieres desactivarla?",
|
||||
"disableDialogSubmit": "Desactivar",
|
||||
@@ -515,6 +614,7 @@
|
||||
"errorMissingPassword": "Por favor, introduzca la contraseña de la reunión",
|
||||
"invalidPassword": "Contraseña inválida",
|
||||
"joinRejectedMessage": "Tu solicitud para entrar ha sido rechazada por un moderador.",
|
||||
"joinRejectedTitle": "Solicitud para entrar rechazada.",
|
||||
"joinTitle": "Entrar a la reunión",
|
||||
"joinWithPasswordMessage": "Tratando de entrar con contraseña, por favor espera...",
|
||||
"joiningMessage": "Podrás entrar tan pronto te acepten tu solicitud.",
|
||||
@@ -523,6 +623,8 @@
|
||||
"knockButton": "Pedir entrar",
|
||||
"knockTitle": "Alguien quiere entrar a la reunión",
|
||||
"knockingParticipantList": "Participantes que quieren entrar",
|
||||
"lobbyChatStartedNotification": "{{moderator}} inició un chat de lobby con {{attendee}}",
|
||||
"lobbyChatStartedTitle": "{{moderator}} inició un chat de lobby contigo.",
|
||||
"nameField": "Introduce tu nombre",
|
||||
"notificationLobbyAccessDenied": "{{originParticipantName}} no dejó entrar a {{targetParticipantName}}",
|
||||
"notificationLobbyAccessGranted": "{{originParticipantName}} permitió entrar a {{targetParticipantName}}",
|
||||
@@ -560,6 +662,7 @@
|
||||
"no": "No",
|
||||
"participant": "Participante",
|
||||
"participantStats": "Estadística de participantes",
|
||||
"selectTabTitle": "🎥 Por favor seleccione esta pestaña para grabar",
|
||||
"sessionToken": "Token de sesión",
|
||||
"start": "Iniciar grabación",
|
||||
"stop": "Detener grabación",
|
||||
@@ -576,18 +679,39 @@
|
||||
"OldElectronAPPTitle": "¡Aplicación obsoleta e insegura!",
|
||||
"allowAction": "Permitir",
|
||||
"allowedUnmute": "Puedes anular el silencio del micrófono, iniciar la cámara o compartir la pantalla.",
|
||||
"audioUnmuteBlockedDescription": "La operación de activación del micrófono ha sido bloqueada temporalmente debido a límites del sistema.",
|
||||
"audioUnmuteBlockedTitle": "¡Activación del micrófono bloqueado!",
|
||||
"chatMessages": "Mensajes del chat",
|
||||
"connectedOneMember": "{{name}} se unió a la reunión",
|
||||
"connectedThreePlusMembers": "{{name}} y {{count}} más se unieron a la reunión",
|
||||
"connectedTwoMembers": "{{first}} y {{second}} se unieron a la reunión",
|
||||
"dataChannelClosed": "",
|
||||
"dataChannelClosedDescription": "",
|
||||
"disabledIframe": "",
|
||||
"disconnected": "desconectado",
|
||||
"displayNotifications": "Mostrar notificaciones para",
|
||||
"dontRemindMe": "No me lo recuerdes",
|
||||
"focus": "Enfocar conferencia",
|
||||
"focusFail": "{{component}} no disponible. Vuelve a intentar en {{ms}} segundos",
|
||||
"gifsMenu": "GIPHY",
|
||||
"groupTitle": "Notificaciones",
|
||||
"hostAskedUnmute": "El moderador quiere que hables",
|
||||
"invitedOneMember": "{{name}} ha sido invitado",
|
||||
"invitedThreePlusMembers": "{{name}} y {{count}} más han sido invitados",
|
||||
"invitedTwoMembers": "{{first}} y {{second}} han sido invitados",
|
||||
"joinMeeting": "Unirse",
|
||||
"kickParticipant": "{{kicker}} sacó a {{kicked}}",
|
||||
"leftOneMember": "{{name}} abandonó la reunión",
|
||||
"leftThreePlusMembers": "{{name}} y muchos otros abandonaron la reunión",
|
||||
"leftTwoMembers": "{{first}} y {{second}} abandonaron la reunión",
|
||||
"linkToSalesforce": "Enlace a Salesforce",
|
||||
"linkToSalesforceDescription": "Puedes vincular el resumen de la reunión a un objeto Salesforce",
|
||||
"linkToSalesforceError": "Error al vincular la reunión a Salesforce",
|
||||
"linkToSalesforceKey": "",
|
||||
"linkToSalesforceProgress": "Vinculando reunión a Salesorce...",
|
||||
"linkToSalesforceSuccess": "La reunión fue vinculada a Salesforce",
|
||||
"localRecordingStarted": "{{name}} ha iniciado una grabación local.",
|
||||
"localRecordingStopped": "{{name}} ha detenido una grabación local.",
|
||||
"me": "Yo",
|
||||
"moderationInEffectCSDescription": "Por favor, levante la mano si quiere compartir su pantalla.",
|
||||
"moderationInEffectCSTitle": "La pantalla compartida está bloqueada por el moderador",
|
||||
@@ -608,16 +732,27 @@
|
||||
"newDeviceAction": "Usar",
|
||||
"newDeviceAudioTitle": "Se detectó un dispositivo de audio nuevo",
|
||||
"newDeviceCameraTitle": "Se detectó una cámara nueva",
|
||||
"noiseSuppressionDesktopAudioDescription": "La supresión de ruido no puede ser habilitada mientras comparte audio del escritorio, por favor deshabilítelo y vuelva a intentar.",
|
||||
"noiseSuppressionFailedTitle": "Error al activar la supresión de ruido",
|
||||
"noiseSuppressionNoTrackDescription": "Por favor active su micrófono primero.",
|
||||
"noiseSuppressionStereoDescription": "La supresión de ruido en audio estéreo no tiene soporte actualmente",
|
||||
"oldElectronClientDescription1": "Estás usando una versión vieja de la aplicación de Jitsi Meet que tiene problemas de seguridad. ¡Por favor, actualiza a la ",
|
||||
"oldElectronClientDescription2": "versión más reciente",
|
||||
"oldElectronClientDescription3": " YA!",
|
||||
"participantWantsToJoin": "Quiere unirse a la reunión",
|
||||
"participantsWantToJoin": "Quieren unirse a la reunión",
|
||||
"passwordRemovedRemotely": "$t(lockRoomPasswordUppercase) eliminada por otro participante",
|
||||
"passwordSetRemotely": "$t(lockRoomPasswordUppercase) agregada por otro participante",
|
||||
"raiseHandAction": "Levantar la mano",
|
||||
"raisedHand": "{{name}} quisiera hablar.",
|
||||
"raisedHands": "",
|
||||
"reactionSounds": "Desactivar sonidos",
|
||||
"reactionSoundsForAll": "Desactivar sonidos para todos",
|
||||
"screenShareNoAudio": "La casilla Compartir audio no estaba marcada en la pantalla de selección de ventanas.",
|
||||
"screenShareNoAudioTitle": "No se pudo compartir el audio del sistema.",
|
||||
"screenSharingAudioOnlyDescription": "Por favor tenga en cuenta que al compartir si pantalla está afectando el modo \"Mejor rendimiento\" y usará más ancho de banda",
|
||||
"screenSharingAudioOnlyTitle": "Modo \"Mejor rendimiento\"",
|
||||
"selfViewTitle": "Siempre puedes reactivar la vista propia en los ajustes",
|
||||
"somebody": "Alguien",
|
||||
"startSilentDescription": "Vuelve a ingresar para activar el audio",
|
||||
"startSilentTitle": "¡Te uniste sin audio!",
|
||||
@@ -625,7 +760,11 @@
|
||||
"suboptimalExperienceTitle": "¡Tu navegador no es compatible!",
|
||||
"unmute": "Reactivar micrófono",
|
||||
"videoMutedRemotelyDescription": "Siempre puedes volver a encenderlo.",
|
||||
"videoMutedRemotelyTitle": "Su vídeo ha sido desactivado por {{moderator}}"
|
||||
"videoMutedRemotelyTitle": "Su vídeo ha sido desactivado por {{moderator}}",
|
||||
"videoUnmuteBlockedDescription": "Las operaciones de desactivar la cámara y compartir pantalla hansido bloqueadas temporalmente debido a límites del sistema.",
|
||||
"videoUnmuteBlockedTitle": "¡Desactivar cámara y compartir pantalla bloqueados!",
|
||||
"viewLobby": "Ver lobby",
|
||||
"waitingParticipants": "{{waitingParticipants}} personas"
|
||||
},
|
||||
"participantsPane": {
|
||||
"actions": {
|
||||
@@ -635,6 +774,9 @@
|
||||
"audioModeration": "Desmutearse a sí mismos",
|
||||
"blockEveryoneMicCamera": "Bloquear el micrófono y la cámara de todos.",
|
||||
"invite": "Invitar a alguien",
|
||||
"moreModerationActions": "Más opciones de moderación",
|
||||
"moreModerationControls": "Más controles de moderación",
|
||||
"moreParticipantOptions": "Más opciones de participantes",
|
||||
"mute": "Silenciar",
|
||||
"muteAll": "Silenciar a todos los demás",
|
||||
"muteEveryoneElse": "Silenciar al resto",
|
||||
@@ -647,17 +789,22 @@
|
||||
"headings": {
|
||||
"lobby": "Vestíbulo ({{count}})",
|
||||
"participantsList": "Participantes en la reunión ({{count}})",
|
||||
"visitors": "Visitantes ({{count}})",
|
||||
"waitingLobby": "Esperando en el vestíbulo ({{count}})"
|
||||
},
|
||||
"search": "Buscar participantes",
|
||||
"title": "Participantes"
|
||||
},
|
||||
"passwordDigitsOnly": "Hasta {{number}} cifras",
|
||||
"passwordSetRemotely": "Definida por otro participante",
|
||||
"pinParticipant": "",
|
||||
"pinnedParticipant": "",
|
||||
"polls": {
|
||||
"answer": {
|
||||
"skip": "Saltar",
|
||||
"submit": "Enviar"
|
||||
},
|
||||
"by": "Por {{ name }}",
|
||||
"create": {
|
||||
"addOption": "Añadir opción",
|
||||
"answerPlaceholder": "Opción {{index}}",
|
||||
@@ -728,15 +875,18 @@
|
||||
"initiated": "Llamada iniciada",
|
||||
"joinAudioByPhone": "Entrar con audio de llamada telefónica",
|
||||
"joinMeeting": "Entrar a la reunión",
|
||||
"joinMeetingInLowBandwidthMode": "Entrar en modo de ancho de banda bajo",
|
||||
"joinWithoutAudio": "Entrar sin sonido",
|
||||
"keyboardShortcuts": "Activar los atajos de teclado",
|
||||
"linkCopied": "Se copió el link",
|
||||
"lookGood": "Tu micrófono funciona bien.",
|
||||
"or": "o",
|
||||
"premeeting": "Pre-reunión",
|
||||
"proceedAnyway": "Continuar de todos modos",
|
||||
"screenSharingError": "Error al compartir pantalla:",
|
||||
"showScreen": "Habilitar pantalla pre-reunión",
|
||||
"startWithPhone": "Iniciar con audio de llamada telefónica",
|
||||
"unsafeRoomConsent": "Comprendo los riesgos, quiero unirme a la reunión",
|
||||
"videoOnlyError": "Error con el vídeo:",
|
||||
"videoTrackError": "No se pudo crear la pista de vídeo.",
|
||||
"viewAllNumbers": "ver todos los números"
|
||||
@@ -763,6 +913,19 @@
|
||||
"title": "Perfil"
|
||||
},
|
||||
"raisedHand": "Desea hablar",
|
||||
"raisedHandsLabel": "Cantidad de manos levantadas",
|
||||
"record": {
|
||||
"already": {
|
||||
"linked": "La reunión ya está vinculada a este objeto Salesforce"
|
||||
},
|
||||
"type": {
|
||||
"account": "Cuenta",
|
||||
"contact": "Contacto",
|
||||
"lead": "",
|
||||
"opportunity": "Oportunidad",
|
||||
"owner": "Dueño"
|
||||
}
|
||||
},
|
||||
"recording": {
|
||||
"authDropboxText": "Subir a Dropbox",
|
||||
"availableSpace": "Espacio disponible: {{spaceLeft}} MB (aproximadamente {{duration}} minutos de grabación)",
|
||||
@@ -777,37 +940,66 @@
|
||||
"expandedPending": "La grabación se está iniciando…",
|
||||
"failedToStart": "No se pudo iniciar la grabación",
|
||||
"fileSharingdescription": "Compartir la grabación con los participantes de la reunión",
|
||||
"highlight": "Destacar",
|
||||
"highlightMoment": "Destacar momento",
|
||||
"highlightMomentDisabled": "Puede destacar momentos cuando inicie la grabación",
|
||||
"highlightMomentSuccess": "Momento destacado",
|
||||
"highlightMomentSucessDescription": "Su momento destacado será agregado al resumen de la reunión.",
|
||||
"inProgress": "Grabación o transmisión en vivo en curso",
|
||||
"limitNotificationDescriptionNative": "Su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <3>{{app}}</3>.",
|
||||
"limitNotificationDescriptionWeb": "Debido a la alta demanda su grabación estará limitada a {{limit}} minutos. Puede obtener grabaciones ilimitadas en <a href={{url}} rel='noopener noreferrer' target='_blank'>{{app}}</a>.",
|
||||
"linkGenerated": "Hemos generado un enlace a su grabación.",
|
||||
"live": "EN VIVO",
|
||||
"localRecordingNoNotificationWarning": "La grabación no será anunciada al resto de participantes. Necesitarás hacerles saber que la reunión está siendo grabada.",
|
||||
"localRecordingNoVideo": "El video no está siendo grabado",
|
||||
"localRecordingStartWarning": "Por favor asegúrese de detener la grabación antes de abandonar la reunión para guardarla.",
|
||||
"localRecordingStartWarningTitle": "Detenga la grabación para guardarla",
|
||||
"localRecordingVideoStop": "Detener su video también detendrá la grabación local. ¿Está seguro de querer continuar?",
|
||||
"localRecordingVideoWarning": "Para grabar su video debe tenerlo encendido al iniciar la grabación",
|
||||
"localRecordingWarning": "Asegúrese de seleccionar la pestaña actual para usar el video y audio correctos. La grabación está actualmente limitada a 1GB, que son aproximadamente 100 minutos.",
|
||||
"loggedIn": "Sesión iniciada como {{userName}}",
|
||||
"noMicPermission": "No se pudo crear la pista de micrófono. Por favor otorgue permiso para usar el micrófono.",
|
||||
"noStreams": "",
|
||||
"off": "Grabación detenida",
|
||||
"offBy": "{{name}} detuvo la grabación",
|
||||
"on": "Grabando",
|
||||
"onBy": "{{name}} comenzó la grabación",
|
||||
"onlyRecordSelf": "",
|
||||
"pending": "Preparando para grabar la reunión…",
|
||||
"rec": "GRA",
|
||||
"saveLocalRecording": "Guardar archivo de grabación localmente (Beta)",
|
||||
"serviceDescription": "El servicio de grabación guardará la grabación",
|
||||
"serviceDescriptionCloud": "Grabación en la nube",
|
||||
"serviceDescriptionCloudInfo": "Las reuniones grabadas son limpiadas 24h luego de su horario de grabación.",
|
||||
"serviceName": "Servicio de grabación",
|
||||
"sessionAlreadyActive": "Esta sesión ya está siendo grabada o transmitida en vivo.",
|
||||
"signIn": "Iniciar sesión",
|
||||
"signOut": "Cerrar sesión",
|
||||
"surfaceError": "Por favor seleccione la pestaña actual.",
|
||||
"title": "Grabando",
|
||||
"unavailable": "¡Uy! {{serviceName}} actualmente no está disponible. Estamos trabajando para resolver el problema. Vuelve a intentarlo más tarde.",
|
||||
"unavailableTitle": "Grabación no disponible",
|
||||
"uploadToCloud": "Subir a la nube"
|
||||
},
|
||||
"screenshareDisplayName": "Pantalla de {{name}}",
|
||||
"sectionList": {
|
||||
"pullToRefresh": "Mueve el dedo para abajo para actualizar."
|
||||
},
|
||||
"security": {
|
||||
"about": "Puedes agregar una contraseña a la reunión. Los participantes necesitarán la contraseña para unirse a la reunión.",
|
||||
"aboutReadOnly": "Los participantes moderadores pueden agregar una $t(lockRoomPassword) a la reunión. Los participantes deberán proporcionar la $t(lockRoomPassword) antes de que se les permita unirse a la reunión.",
|
||||
"insecureRoomNameWarning": "El nombre de la sala es inseguro. Participantes no deseados pueden llegar a unirse a la reunión.",
|
||||
"securityOptions": "Opciones de seguridad"
|
||||
"insecureRoomNameWarningNative": "El nombre de esta sala es inseguro. Participantes indeseados podrían ingresar a su reunión. {{recommendAction}} Aprenda más sobre asegurar su reunión ",
|
||||
"insecureRoomNameWarningWeb": "El nombre de esta sala es inseguro. Participantes indeseados podrían ingresar a su reunión. {{recommendAction}} Aprenda más sobre asegurar su reunión <a href=\"{{securityUrl}}\" rel=\"security\" target=\"_blank\">aquí</a>.",
|
||||
"title": "Opciones de seguridad",
|
||||
"unsafeRoomActions": {
|
||||
"meeting": "Considere hacer más segura su reunión utilizando el botón de seguridad.",
|
||||
"prejoin": "Considere utilizar un nombre de reunión más único.",
|
||||
"welcome": "Considere utilizar un nombre de reunión más único, o elija una de las sugerencias"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"audio": "Audio",
|
||||
"buttonLabel": "Ajustes",
|
||||
"calendar": {
|
||||
"about": "La integración del calendario de {{appName}} se usa para acceder al calendario de manera segura para que puedas estar al tanto de los próximos eventos.",
|
||||
"disconnect": "Desconectar",
|
||||
@@ -824,12 +1016,16 @@
|
||||
"incomingMessage": "Mensaje entrante",
|
||||
"language": "Idioma",
|
||||
"loggedIn": "Sesión iniciada como {{name}}",
|
||||
"maxStageParticipants": "",
|
||||
"microphones": "Micrófono",
|
||||
"moderator": "Moderador",
|
||||
"moderatorOptions": "Opciones de moderador",
|
||||
"more": "Más",
|
||||
"name": "Nombre",
|
||||
"noDevice": "Ninguno",
|
||||
"participantJoined": "Un articipante incorporado",
|
||||
"notifications": "Notificaciones",
|
||||
"participantJoined": "Un participante se ha unido",
|
||||
"participantKnocking": "Un participante ha ingresado al lobby",
|
||||
"participantLeft": "Un participante se ha ido",
|
||||
"playSounds": "Reproducir sonido",
|
||||
"reactions": "Reacciones de la reunión",
|
||||
@@ -837,12 +1033,15 @@
|
||||
"selectAudioOutput": "Salida de audio",
|
||||
"selectCamera": "Cámara",
|
||||
"selectMic": "Micrófono",
|
||||
"sounds": "Sonidos",
|
||||
"speakers": "Parlantes",
|
||||
"selfView": "Vista propia",
|
||||
"shortcuts": "Atajos",
|
||||
"speakers": "Altavoces",
|
||||
"startAudioMuted": "Todos inician silenciados",
|
||||
"startReactionsMuted": "Silenciar sonidos de reacción para todos",
|
||||
"startVideoMuted": "Todos inician con cámara desactivada",
|
||||
"talkWhileMuted": "Hablar en silencio",
|
||||
"title": "Ajustes"
|
||||
"title": "Ajustes",
|
||||
"video": "Video"
|
||||
},
|
||||
"settingsView": {
|
||||
"advanced": "Avanzado",
|
||||
@@ -857,13 +1056,21 @@
|
||||
"disableCrashReportingWarning": "¿Estás seguro que no deseas reportarnos los crasheos? La opción se activará al reiniciar la app.",
|
||||
"disableP2P": "Desactivar la comunicación directa (\"Peer-To-Peer\")",
|
||||
"displayName": "Nombre a mostrar",
|
||||
"displayNamePlaceholderText": "Por ejemplo: Juan Pérez",
|
||||
"email": "Correo electrónico",
|
||||
"emailPlaceholderText": "",
|
||||
"goTo": "Ir a",
|
||||
"header": "Configuración",
|
||||
"help": "Ayuda",
|
||||
"links": "Enlaces",
|
||||
"privacy": "Privacidad",
|
||||
"profileSection": "Perfil",
|
||||
"serverURL": "URL del servidor",
|
||||
"showAdvanced": "Mostrar configuración avanzada",
|
||||
"startCarModeInLowBandwidthMode": "Iniciar módo automóvil en modo ancho de banda bajo",
|
||||
"startWithAudioMuted": "Iniciar con el micrófono apagado",
|
||||
"startWithVideoMuted": "Iniciar con la cámara apagada",
|
||||
"terms": "Términos",
|
||||
"version": "Versión"
|
||||
},
|
||||
"share": {
|
||||
@@ -872,13 +1079,21 @@
|
||||
},
|
||||
"speaker": "Participante",
|
||||
"speakerStats": {
|
||||
"angry": "Enojado",
|
||||
"disgusted": "Disgustado",
|
||||
"displayEmotions": "Mostrar emociones",
|
||||
"fearful": "Temeroso",
|
||||
"happy": "Feliz",
|
||||
"hours": "{{count}} h",
|
||||
"minutes": "{{count}} min",
|
||||
"name": "Nombre",
|
||||
"neutral": "Neutral",
|
||||
"sad": "Triste",
|
||||
"search": "Buscar",
|
||||
"seconds": "{{count}} s",
|
||||
"speakerStats": "Estadísticas de participantes",
|
||||
"speakerTime": "Tiempo hablado"
|
||||
"speakerTime": "Tiempo hablado",
|
||||
"surprised": "Sorprendido"
|
||||
},
|
||||
"startupoverlay": {
|
||||
"genericTitle": "La reunión debe utilizar su micrófono y su cámara.",
|
||||
@@ -890,6 +1105,10 @@
|
||||
"text": "Presiona el botón <i>Reconectar</i> para volver a conectarte.",
|
||||
"title": "La vídeollamada se interrumpió porque la computadora estaba suspendida."
|
||||
},
|
||||
"termsView": {
|
||||
"title": "Términos"
|
||||
},
|
||||
"toggleTopPanelLabel": "Alternar panel superior",
|
||||
"toolbar": {
|
||||
"Settings": "Configuración",
|
||||
"accessibilityLabel": {
|
||||
@@ -897,60 +1116,89 @@
|
||||
"audioOnly": "Alternar cámaras de los demás",
|
||||
"audioRoute": "Seleccionar el dispositivo de sonido",
|
||||
"boo": "Boo",
|
||||
"breakoutRoom": "Unirse/abandonar sala para grupos pequeños",
|
||||
"callQuality": "Administrar la calidad de vídeo",
|
||||
"carmode": "Modo automóvil",
|
||||
"cc": "Alternar subtítulos",
|
||||
"chat": "Alternar ventana de chat",
|
||||
"clap": "Aplauso",
|
||||
"closeChat": "Cerrar chat",
|
||||
"closeMoreActions": "Cerrar el menú de más acciones",
|
||||
"closeParticipantsPane": "Cerrar panel de participantes",
|
||||
"collapse": "Colapsar",
|
||||
"document": "Alternar documento compartido",
|
||||
"documentClose": "Cerrar documento compartido",
|
||||
"documentOpen": "Abrir documento compartido",
|
||||
"download": "Descargar nuestras aplicaciones",
|
||||
"embedMeeting": "Insertar reunión",
|
||||
"endConference": "Terminar reunión para todos",
|
||||
"enterFullScreen": "Ver en pantalla completa",
|
||||
"enterTileView": "Ingresar en vista de mosaico",
|
||||
"exitFullScreen": "Salir de pantalla completa",
|
||||
"exitTileView": "Salir de vista de mosaico",
|
||||
"expand": "Ampliar",
|
||||
"feedback": "Dejar comentarios",
|
||||
"fullScreen": "Alternar pantalla completa",
|
||||
"giphy": "Alternar menú GIPHY",
|
||||
"grantModerator": "Convertir en moderador",
|
||||
"hangup": "Colgar",
|
||||
"heading": "Barra de herramientas",
|
||||
"help": "Ayuda",
|
||||
"hideWhiteboard": "Esconder pizarra",
|
||||
"invite": "Invitar personas",
|
||||
"kick": "Expulsar participante",
|
||||
"laugh": "Ríete",
|
||||
"leaveConference": "Abandonar reunión",
|
||||
"like": "Pulgares arriba",
|
||||
"linkToSalesforce": "Enlace a Salesforce",
|
||||
"lobbyButton": "Activar / desactivar el modo lobby",
|
||||
"localRecording": "Alternar controles de grabación local",
|
||||
"lockRoom": "Alternar contraseña de la reunión",
|
||||
"lowerHand": "Bajar mano",
|
||||
"moreActions": "Alternar más acciones",
|
||||
"moreActionsMenu": "Menú de más acciones",
|
||||
"moreOptions": "Mostrar más opciones",
|
||||
"mute": "Silenciar micrófono",
|
||||
"muteEveryone": "Silenciar a todos",
|
||||
"muteEveryoneElse": "Silenciar a todos los demás",
|
||||
"muteEveryoneElsesVideo": "Desactivar el vídeo de los demás",
|
||||
"muteEveryonesVideo": "Desactivar el vídeo de todos",
|
||||
"muteEveryoneElsesVideoStream": "Detener el video del resto",
|
||||
"muteEveryonesVideoStream": "Detener el video de todos",
|
||||
"muteGUMPending": "Conectando su micrófono",
|
||||
"noiseSuppression": "Supresión de ruido",
|
||||
"openChat": "Abrir chat",
|
||||
"participants": "Participantes",
|
||||
"pip": "Alternar modo ventana en miniatura",
|
||||
"privateMessage": "Enviar mensaje privado",
|
||||
"profile": "Editar perfil",
|
||||
"raiseHand": "Levantar o bajar la mano",
|
||||
"reactions": "Reacciones",
|
||||
"reactionsMenu": "Abrir / Cerrar el menú de reacciones",
|
||||
"recording": "Alternar grabación",
|
||||
"remoteMute": "Silenciar participante",
|
||||
"remoteVideoMute": "Desactivar la cámara del participante",
|
||||
"security": "Opciones de seguridad",
|
||||
"selectBackground": "Seleccione el fondo",
|
||||
"selfView": "Alternar vista propia",
|
||||
"shareRoom": "Invitar a alguien",
|
||||
"shareYourScreen": "Comenzar / detener compartir pantalla",
|
||||
"shareaudio": "Compartir audio",
|
||||
"sharedvideo": "Alternar vídeo compartido",
|
||||
"shortcuts": "Alternar accesos directos",
|
||||
"show": "Mostrar en primer",
|
||||
"showWhiteboard": "Mostrar vista propia",
|
||||
"silence": "Silencio",
|
||||
"speakerStats": "Alternar estadísticas del orador",
|
||||
"stopScreenSharing": "Dejar de compartir pantalla",
|
||||
"stopSharedVideo": "Detener video",
|
||||
"surprised": "Sorprendido",
|
||||
"tileView": "Alternar vista de mosaico",
|
||||
"toggleCamera": "Alternar cámara",
|
||||
"toggleFilmstrip": "Alternar mosaicos",
|
||||
"unmute": "Activar micrófono",
|
||||
"videoblur": "Alternar desenfoque de vídeo",
|
||||
"videomute": "Alternar vídeo"
|
||||
"videomute": "Alternar vídeo",
|
||||
"videomuteGUMPending": "Conectando tu cámara",
|
||||
"videounmute": "Encender cámara"
|
||||
},
|
||||
"addPeople": "Agregar personas a la llamada",
|
||||
"audioOnlyOff": "Mostrar cámaras de los demás",
|
||||
@@ -963,23 +1211,33 @@
|
||||
"chat": "Abrir o cerrar chat",
|
||||
"clap": "Aplauso",
|
||||
"closeChat": "Cerrar chat",
|
||||
"closeParticipantsPane": "Cerrar panel de participantes",
|
||||
"closeReactionsMenu": "Cerrar el menú de reacciones",
|
||||
"disableNoiseSuppression": "Desactivar supresión de ruido",
|
||||
"disableReactionSounds": "Puede desactivar los sonidos de reacción para esta reunión",
|
||||
"documentClose": "Cerrar documento compartido",
|
||||
"documentOpen": "Abrir documento compartido",
|
||||
"download": "Descarga nuestras aplicaciones",
|
||||
"e2ee": "Cifrado de extremo a extremo",
|
||||
"embedMeeting": "Insertar reunión",
|
||||
"enableNoiseSuppression": "Activar supresión de ruido",
|
||||
"endConference": "Terminar reunión para todos",
|
||||
"enterFullScreen": "Pantalla completa",
|
||||
"enterTileView": "Ver en cuadrícula",
|
||||
"exitFullScreen": "Salir de pantalla completa",
|
||||
"exitTileView": "Salir de vista de mosaico",
|
||||
"feedback": "Dejar sugerencias",
|
||||
"giphy": "Alternar menú GIPHY",
|
||||
"hangup": "Colgar",
|
||||
"help": "Ayuda",
|
||||
"hideWhiteboard": "Esconder pizarra",
|
||||
"invite": "Invitar personas",
|
||||
"joinBreakoutRoom": "Unirse a sala para grupos pequeños",
|
||||
"laugh": "Ríete",
|
||||
"leaveBreakoutRoom": "Abandonar sala para grupos pequeños",
|
||||
"leaveConference": "Abandonar reunión",
|
||||
"like": "Pulgares arriba",
|
||||
"linkToSalesforce": "",
|
||||
"lobbyButtonDisable": "Desactivar el modo lobby",
|
||||
"lobbyButtonEnable": "Activar el modo lobby",
|
||||
"login": "Inicio de sesión",
|
||||
@@ -990,11 +1248,13 @@
|
||||
"mute": "Activar o silenciar el micrófono",
|
||||
"muteEveryone": "Silenciar a todos",
|
||||
"muteEveryonesVideo": "Desactivar la cámara de todos",
|
||||
"muteGUMPending": "Conectando tu micrónono",
|
||||
"noAudioSignalDesc": "Checa si no está silenciado en tu configuración del sistema o dispositivo, o cambia de micrófono.",
|
||||
"noAudioSignalDescSuggestion": "Si no lo silenciaste a propósito desde la configuración del sistema o el dispositivo, intenta usar este otro micrófono:",
|
||||
"noAudioSignalDialInDesc": "Además, puedes llamar usando:",
|
||||
"noAudioSignalDialInLinkDesc": "Números de llamada",
|
||||
"noAudioSignalTitle": "¡No se registra audio de tu micrófono!",
|
||||
"noiseSuppression": "Supresión de ruido",
|
||||
"noisyAudioInputDesc": "Tu micrófono está haciendo ruido, siléncialo, ajusta su volumen en configuración del sistema, o cambia de micrófono.",
|
||||
"noisyAudioInputTitle": "Tu micrófono parece estar ruidoso",
|
||||
"openChat": "Abrir chat",
|
||||
@@ -1011,12 +1271,14 @@
|
||||
"reactionLike": "Enviar la reacción de los pulgares hacia arriba",
|
||||
"reactionSilence": "Enviar reacción de silencio",
|
||||
"reactionSurprised": "Enviar reacción de sorpresa",
|
||||
"reactions": "Reacciones",
|
||||
"security": "Opciones de seguridad",
|
||||
"selectBackground": "Seleccionar fondo",
|
||||
"shareRoom": "Invitar a alguien",
|
||||
"shareaudio": "Compartir audio",
|
||||
"sharedvideo": "Compartir un vídeo",
|
||||
"shortcuts": "Ver atajos del teclado",
|
||||
"showWhiteboard": "Mostrar pizarra",
|
||||
"silence": "Silencio",
|
||||
"speakerStats": "Estadísticas de los participantes",
|
||||
"startScreenSharing": "Comenzar a compartir pantalla",
|
||||
@@ -1029,8 +1291,11 @@
|
||||
"talkWhileMutedPopup": "¿Intentas hablar? Estás silenciado.",
|
||||
"tileViewToggle": "Activar o desactivar vista en cuadrícula",
|
||||
"toggleCamera": "Alternar cámara",
|
||||
"unmute": "Activar",
|
||||
"videoSettings": "Ajustes de vídeo",
|
||||
"videomute": "Iniciar o detener cámara"
|
||||
"videomute": "Detener cámara",
|
||||
"videomuteGUMPending": "Conectando tu cámara",
|
||||
"videounmute": "Iniciar cámara"
|
||||
},
|
||||
"transcribing": {
|
||||
"ccButtonTooltip": "Iniciar o detener subtítulos",
|
||||
@@ -1040,10 +1305,15 @@
|
||||
"labelToolTip": "La reunión se está transcribiendo",
|
||||
"off": "Transcripción detenida",
|
||||
"pending": "Preparando para transcribir la reunión…",
|
||||
"sourceLanguageDesc": "El lenguaje actual de la reunión es <b>{{sourceLanguage}}</b>. <br/> Puedes cambiarlo desde ",
|
||||
"sourceLanguageHere": "aquí",
|
||||
"start": "Mostrar subtítulos",
|
||||
"stop": "Dejar de mostrar subtítulos",
|
||||
"subtitles": "Subtítulos",
|
||||
"subtitlesOff": "",
|
||||
"tr": "TR"
|
||||
},
|
||||
"unpinParticipant": "",
|
||||
"userMedia": {
|
||||
"androidGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
|
||||
"chromeGrantPermissions": "Selecciona <b><i>Permitir</i></b> cuando el navegador solicite permisos.",
|
||||
@@ -1067,20 +1337,26 @@
|
||||
"pending": "{{displayName}} ha sido invitado"
|
||||
},
|
||||
"videoStatus": {
|
||||
"adjustFor": "Ajustar para:",
|
||||
"audioOnly": "AUD",
|
||||
"audioOnlyExpanded": "Estás en modo de ancho de banda bajo. En este modo, sólo recibirás audio y pantalla compartida.",
|
||||
"bestPerformance": "Mejor rendimiento",
|
||||
"callQuality": "Calidad de vídeo",
|
||||
"hd": "HD",
|
||||
"hdTooltip": "Viendo vídeo en alta definición",
|
||||
"highDefinition": "Alta definición",
|
||||
"highestQuality": "Calidad máxima",
|
||||
"labelTooiltipNoVideo": "Sin vídeo",
|
||||
"labelTooltipAudioOnly": "Modo de ancho de banda bajo habilitado",
|
||||
"ld": "LD",
|
||||
"ldTooltip": "Viendo vídeo en baja definición",
|
||||
"lowDefinition": "Baja definición",
|
||||
"performanceSettings": "Ajustes de rendimiento",
|
||||
"recording": "Grabación en curso",
|
||||
"sd": "SD",
|
||||
"sdTooltip": "Viendo vídeo en definición estándar",
|
||||
"standardDefinition": "Definición estándar"
|
||||
"standardDefinition": "Definición estándar",
|
||||
"streaming": "Transmisión en curso"
|
||||
},
|
||||
"videothumbnail": {
|
||||
"connectionInfo": "Información de conexión",
|
||||
@@ -1090,12 +1366,19 @@
|
||||
"domuteVideoOfOthers": "Desactivar la cámara de todos los demás",
|
||||
"flip": "Voltear",
|
||||
"grantModerator": "Convertir en moderador",
|
||||
"hideSelfView": "Esconder vista propia",
|
||||
"kick": "Expulsar",
|
||||
"mirrorVideo": "Espejar mi video",
|
||||
"moderator": "Moderador",
|
||||
"mute": "Se silenció el participante",
|
||||
"muted": "Silenciado",
|
||||
"pinToStage": "",
|
||||
"remoteControl": "Control remoto",
|
||||
"screenSharing": "El participante está compartiendo su pantalla",
|
||||
"show": "Mostrar en primer plano",
|
||||
"showSelfView": "Mostrar vista propia",
|
||||
"unpinFromStage": "",
|
||||
"verify": "Verificar participante",
|
||||
"videoMuted": "Cámara desactivada",
|
||||
"videomute": "El participante paró su cámara"
|
||||
},
|
||||
@@ -1120,7 +1403,16 @@
|
||||
"slightBlur": "Desenfoque Ligero",
|
||||
"title": "Fondos virtuales",
|
||||
"uploadedImage": "Imagen subida {{index}}",
|
||||
"webAssemblyWarning": "No se admite WebAssembly"
|
||||
"webAssemblyWarning": "No se admite WebAssembly",
|
||||
"webAssemblyWarningDescription": "WebAssembly está desactivado o no cuenta con soporte en este navegador"
|
||||
},
|
||||
"visitors": {
|
||||
"chatIndicator": "(visitante)",
|
||||
"labelTooltip": "Cantidad de visitantes: {{count}}",
|
||||
"notification": {
|
||||
"description": "Levanta la mano para participar",
|
||||
"title": "Eres un visitante en la reunión"
|
||||
}
|
||||
},
|
||||
"volumeSlider": "Deslizador de volumen",
|
||||
"welcomepage": {
|
||||
@@ -1154,6 +1446,7 @@
|
||||
"microsoftLogo": "Logotipo de Microsoft",
|
||||
"policyLogo": "Logotipo de la política"
|
||||
},
|
||||
"meetingsAccessibilityLabel": "Reuniones",
|
||||
"mobileDownLoadLinkAndroid": "Descargar la aplicación móvil para Android",
|
||||
"mobileDownLoadLinkFDroid": "Descargar la aplicación móvil para F-Droid",
|
||||
"mobileDownLoadLinkIos": "Descargar la aplicación móvil para iOS",
|
||||
@@ -1162,13 +1455,21 @@
|
||||
"recentList": "Reciente",
|
||||
"recentListDelete": "Eliminar",
|
||||
"recentListEmpty": "Tu historial de reuniones está vacío. Reúnete y aparecerán aquí.",
|
||||
"recentMeetings": "Tus reuniones recientes",
|
||||
"reducedUIText": "¡Bienvenido a {{app}}!",
|
||||
"roomNameAllowedChars": "El nombre de la reunión no debe contener ninguno de estos caracteres: ?, &, :, ', \", %, #.",
|
||||
"roomname": "Introduce el nombre de la sala",
|
||||
"roomnameHint": "Introduce el nombre o URL de la sala a la que deseas unirte. Puedes inventar un nombre, simplemente infórmaselo a las personas con las que te reunirás para que introduzcan el mismo nombre.",
|
||||
"sendFeedback": "Enviar sugerencias",
|
||||
"settings": "Ajustes",
|
||||
"startMeeting": "Iniciar la reunión",
|
||||
"terms": "Términos",
|
||||
"title": "Videoconferencias seguras, con gran variedad de funcionalidades y completamente gratuitas"
|
||||
"title": "Videoconferencias seguras, con gran variedad de funcionalidades y completamente gratuitas",
|
||||
"upcomingMeetings": "Tus próximas reuniones"
|
||||
},
|
||||
"whiteboard": {
|
||||
"accessibilityLabel": {
|
||||
"heading": "Pizarra"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -429,7 +429,12 @@
|
||||
"startSilentTitle": "",
|
||||
"suboptimalExperienceDescription": "Valitettavasti {{appName}} ei taida toimia kovin hyvin täällä. Yritämme löytää parannuskeinoja, mutta sillä välin kannattaa käyttää jotain <a href='{{recommendedBrowserPageLink}}' target='_blank'>täysin tuettua selainta</a>.",
|
||||
"suboptimalExperienceTitle": "Selainvaroitus",
|
||||
"unmute": ""
|
||||
"unmute": "Poista mykistys"
|
||||
},
|
||||
"participantsPane": {
|
||||
"actions": {
|
||||
"muteEveryoneElse": "Mykistä kaikki muut"
|
||||
}
|
||||
},
|
||||
"passwordDigitsOnly": "",
|
||||
"passwordSetRemotely": "",
|
||||
@@ -563,11 +568,13 @@
|
||||
"moreActions": "Säädä Lisää toimintoja -valikkoa",
|
||||
"moreActionsMenu": "Lisää toimintoja -valikko",
|
||||
"mute": "Säädä äänen mykistystä",
|
||||
"muteEveryoneElse": "Mykistä kaikki muut",
|
||||
"pip": "Säädä Kuva kuvassa (PiP) -tilaa",
|
||||
"profile": "Muokkaa profiilia",
|
||||
"raiseHand": "Säädä käden nostoa",
|
||||
"recording": "Säädä nauhoitusta",
|
||||
"remoteMute": "Mykistä osanottaja",
|
||||
"selectBackground": "Valitse tausta",
|
||||
"shareRoom": "Kutsu joku",
|
||||
"shareYourScreen": "Säädä näytön jakoa",
|
||||
"sharedvideo": "Säädä videon jakoa",
|
||||
@@ -657,29 +664,37 @@
|
||||
"pending": "{{displayName}} on kutsuttu"
|
||||
},
|
||||
"videoStatus": {
|
||||
"adjustFor": "Muokkaa:",
|
||||
"audioOnly": "ÄÄNI",
|
||||
"audioOnlyExpanded": "Käytössäsi on Vain ääni -tila. Se säästää kaistanleveyttä, mutta et näe muiden videoita.",
|
||||
"callQuality": "",
|
||||
"bestPerformance": "Paras suorituskyky",
|
||||
"callQuality": "Videon laatu",
|
||||
"hd": "HD",
|
||||
"highDefinition": "Teräväpiirto",
|
||||
"highestQuality": "Korkein laatu",
|
||||
"labelTooiltipNoVideo": "Ei videota",
|
||||
"labelTooltipAudioOnly": "Vain ääni -tila käytössä",
|
||||
"ld": "LD",
|
||||
"lowDefinition": "Alhainen kuvanlaatu",
|
||||
"onlyAudioAvailable": "Vain ääni -tila on käytettävissä",
|
||||
"onlyAudioSupported": "Tässä selaimessa tuemme vain ääntä.",
|
||||
"performanceSettings": "Suorituskykyasetukset",
|
||||
"sd": "SD",
|
||||
"standardDefinition": "Vakiopiirto"
|
||||
},
|
||||
"videothumbnail": {
|
||||
"domute": "Mykistä",
|
||||
"domuteOthers": "Mykistä kaikki muut",
|
||||
"domuteVideoOfOthers": "Estä muiden kamera",
|
||||
"flip": "Käännä",
|
||||
"kick": "Poista",
|
||||
"moderator": "Valvoja",
|
||||
"mute": "",
|
||||
"mute": "Osallistuja on mykistetty",
|
||||
"muted": "Mykistetty",
|
||||
"pinToStage": "Kiinnitä ruutuun",
|
||||
"remoteControl": "Etäkäyttö",
|
||||
"show": "",
|
||||
"show": "Näytä ruudulla",
|
||||
"unpinFromStage": "Irroita kiinnitys",
|
||||
"videomute": ""
|
||||
},
|
||||
"welcomepage": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user