Merge branch 'develop' into katex

This commit is contained in:
Aleks Kissinger 2020-10-10 19:32:35 +01:00
commit 89ce904ebb
30 changed files with 1622 additions and 740 deletions

View file

@ -38,7 +38,7 @@ For the web app:
- **Browser**: Chrome, Safari, Firefox? which version? - **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc? - **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web? - **URL**: develop.element.io / app.element.io / somewhere else? If a private server, what version of Element Web?
For the desktop app: For the desktop app:

View file

@ -48,7 +48,7 @@ For the web app:
- **Browser**: Chrome, Safari, Firefox? which version? - **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc? - **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web? - **URL**: develop.element.io / app.element.io / somewhere else? If a private server, what version of Element Web?
For the desktop app: For the desktop app:

View file

@ -50,7 +50,7 @@ For the web app:
- **Browser**: Chrome, Safari, Firefox? which version? - **Browser**: Chrome, Safari, Firefox? which version?
- **OS**: Windows, macOS, Ubuntu, Arch Linux, etc? - **OS**: Windows, macOS, Ubuntu, Arch Linux, etc?
- **URL**: riot.im/develop / riot.im/app / somewhere else? If a private server, what version of riot-web? - **URL**: develop.element.io / app.element.io / somewhere else? If a private server, what version of Element Web?
For the desktop app: For the desktop app:

View file

@ -1,3 +1,35 @@
Changes in [1.7.8](https://github.com/vector-im/element-web/releases/tag/v1.7.8) (2020-09-28)
=============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.8-rc.1...v1.7.8)
* Upgrade to React SDK 3.5.0 and JS SDK 8.4.1
Changes in [1.7.8-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.8-rc.1) (2020-09-23)
=======================================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.7...v1.7.8-rc.1)
* Upgrade to React SDK 3.5.0-rc.1 and JS SDK 8.4.0-rc.1
* Update from Weblate
[\#15262](https://github.com/vector-im/element-web/pull/15262)
* Upgrade sanitize-html
[\#15260](https://github.com/vector-im/element-web/pull/15260)
* Document config for preferring Secure Backup setup methods
[\#15251](https://github.com/vector-im/element-web/pull/15251)
* Add end-user documentation for UI features
[\#15190](https://github.com/vector-im/element-web/pull/15190)
* Update git checkout instructions
[\#15218](https://github.com/vector-im/element-web/pull/15218)
* If no bug_report_endpoint_url, hide rageshaking from the App
[\#15201](https://github.com/vector-im/element-web/pull/15201)
* Bump node-fetch from 2.6.0 to 2.6.1
[\#15153](https://github.com/vector-im/element-web/pull/15153)
* Remove references to Travis CI
[\#15137](https://github.com/vector-im/element-web/pull/15137)
* Fix onNewScreen to use replace when going from roomId->roomAlias
[\#15127](https://github.com/vector-im/element-web/pull/15127)
* Enable Estonian in language menu
[\#15136](https://github.com/vector-im/element-web/pull/15136)
Changes in [1.7.7](https://github.com/vector-im/element-web/releases/tag/v1.7.7) (2020-09-14) Changes in [1.7.7](https://github.com/vector-im/element-web/releases/tag/v1.7.7) (2020-09-14)
============================================================================================= =============================================================================================
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.6...v1.7.7) [Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.6...v1.7.7)

View file

@ -35,7 +35,6 @@
"matrix.org" "matrix.org"
] ]
}, },
"welcomeUserId": "@riot-bot:matrix.org",
"piwik": { "piwik": {
"url": "https://piwik.riot.im/", "url": "https://piwik.riot.im/",
"whitelistedHSUrls": ["https://matrix.org"], "whitelistedHSUrls": ["https://matrix.org"],

View file

@ -1,13 +1,13 @@
{ {
"name": "Riot", "name": "Element",
"description": "A glossy Matrix collaboration client for the web.", "description": "A glossy Matrix collaboration client for the web.",
"repository": { "repository": {
"url": "https://github.com/vector-im/riot-web", "url": "https://github.com/vector-im/element-web",
"license": "Apache License 2.0" "license": "Apache License 2.0"
}, },
"bugs": { "bugs": {
"list": "https://github.com/vector-im/riot-web/issues", "list": "https://github.com/vector-im/element-web/issues",
"report": "https://github.com/vector-im/riot-web/issues/new/choose" "report": "https://github.com/vector-im/element-web/issues/new/choose"
}, },
"keywords": [ "keywords": [
"chat", "chat",

View file

@ -35,6 +35,27 @@ following on your homeserver's `/.well-known/matrix/client` config:
} }
``` ```
## Preferring setup methods
By default, Element offers users a choice of a random key or user-chosen
passphrase when setting up Secure Backup. If a homeserver admin would like to
only offer one of these, you can signal this via the
`/.well-known/matrix/client` config, for example:
```json
{
"io.element.e2ee": {
"secure_backup_setup_methods": ["passphrase"]
}
}
```
The field `secure_backup_setup_methods` is an array listing the methods the
client should display. Supported values currently include `key` and
`passphrase`. If the `secure_backup_setup_methods` field is not present or
exists but does not contain any supported methods, Element will fallback to the
default value of: `["key", "passphrase"]`.
# Compatibility # Compatibility
The settings above were first proposed under a `im.vector.riot.e2ee` key, which The settings above were first proposed under a `im.vector.riot.e2ee` key, which

View file

@ -8,7 +8,7 @@ For example, flags make the following things possible:
* Extended testing of a feature via labs on develop * Extended testing of a feature via labs on develop
* Enabling features when ready instead of the first moment the code is released * Enabling features when ready instead of the first moment the code is released
* Testing a feature with a specific set of users (by enabling only on a specific * Testing a feature with a specific set of users (by enabling only on a specific
Riot instance) Element instance)
The size of the feature controlled by a feature flag may vary widely: it could The size of the feature controlled by a feature flag may vary widely: it could
be a large project like reactions or a smaller change to an existing algorithm. be a large project like reactions or a smaller change to an existing algorithm.
@ -49,7 +49,7 @@ When starting work on a feature, we should create a matching feature flag:
```js ```js
SettingsStore.getValue("feature_cats") SettingsStore.getValue("feature_cats")
``` ```
3. Document the feature in the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md) 3. Document the feature in the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md)
With these steps completed, the feature is disabled by default, but can be With these steps completed, the feature is disabled by default, but can be
enabled on develop and nightly by interested users for testing. enabled on develop and nightly by interested users for testing.
@ -60,9 +60,9 @@ The following lists a few common options.
## Enabling by default on develop and nightly ## Enabling by default on develop and nightly
Set the feature to `true` in the Set the feature to `true` in the
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json) [develop](https://github.com/vector-im/element-web/blob/develop/element.io/develop/config.json)
and and
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json) [nightly](https://github.com/vector-im/element-desktop/blob/develop/element.io/nightly/config.json)
configs: configs:
```json ```json
@ -74,9 +74,9 @@ configs:
## Enabling by default on staging, app, and release ## Enabling by default on staging, app, and release
Set the feature to `true` in the Set the feature to `true` in the
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json) [staging / app](https://github.com/vector-im/element-web/blob/develop/element.io/app/config.json)
and and
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json) [release](https://github.com/vector-im/element-desktop/blob/develop/element.io/release/config.json)
configs. configs.
**Note:** The above will only enable the feature for https://app.element.io and official Element **Note:** The above will only enable the feature for https://app.element.io and official Element
@ -90,18 +90,18 @@ Once we're confident that a feature is working well, we should remove or convert
If the feature is meant to be turned off/on by the user: If the feature is meant to be turned off/on by the user:
1. Remove `isFeature` from the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts) 1. Remove `isFeature` from the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts)
2. Change the `default` to `true` (if desired). 2. Change the `default` to `true` (if desired).
3. Remove the feature from the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md) 3. Remove the feature from the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md)
4. Celebrate! 🥳 4. Celebrate! 🥳
If the feature is meant to be forced on (non-configurable): If the feature is meant to be forced on (non-configurable):
1. Remove the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts) 1. Remove the [setting](https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/settings/Settings.ts)
2. Remove all `getValue` lines that test for the feature. 2. Remove all `getValue` lines that test for the feature.
3. Remove the feature from the [labs documentation](https://github.com/vector-im/riot-web/blob/develop/docs/labs.md) 3. Remove the feature from the [labs documentation](https://github.com/vector-im/element-web/blob/develop/docs/labs.md)
4. If applicable, remove the feature state from 4. If applicable, remove the feature state from
[develop](https://github.com/vector-im/riot-web/blob/develop/riot.im/develop/config.json), [develop](https://github.com/vector-im/element-web/blob/develop/element.io/develop/config.json),
[nightly](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/nightly/config.json), [nightly](https://github.com/vector-im/element-desktop/blob/develop/element.io/nightly/config.json),
[staging / app](https://github.com/vector-im/riot-web/blob/develop/riot.im/app/config.json), [staging / app](https://github.com/vector-im/element-web/blob/develop/element.io/app/config.json),
and and
[release](https://github.com/vector-im/riot-desktop/blob/develop/riot.im/release/config.json) [release](https://github.com/vector-im/element-desktop/blob/develop/element.io/release/config.json)
configs configs
5. Celebrate! 🥳 5. Celebrate! 🥳

View file

@ -110,3 +110,8 @@ To enable message previews for reactions in DMs, enable `feature_roomlist_previe
represent what communities v2 will look/feel like and can/will change without notice. Due to the early represent what communities v2 will look/feel like and can/will change without notice. Due to the early
stages this feature is in and the requirement for a compatible homeserver, we will not be accepting issues stages this feature is in and the requirement for a compatible homeserver, we will not be accepting issues
or feedback for this functionality at this time. or feedback for this functionality at this time.
## Dehydrated devices (`feature_dehydration`)
Allows users to receive encrypted messages by creating a device that is stored
encrypted on the server, as described in [MSC2697](https://github.com/matrix-org/matrix-doc/pull/2697).

View file

@ -76,7 +76,7 @@ As it can be difficult to review design work from looking at just the changed
files in a PR, authors should be prepared for Design and / or Product teams to files in a PR, authors should be prepared for Design and / or Product teams to
request a link to an ad-hoc build of Element (hosted anywhere) that can be used for request a link to an ad-hoc build of Element (hosted anywhere) that can be used for
the review. In the future, we [hope to automate the review. In the future, we [hope to automate
this](https://github.com/vector-im/riot-web/issues/12624) for every PR. this](https://github.com/vector-im/element-web/issues/12624) for every PR.
Before starting work on a feature, it's best to ensure your plan aligns well Before starting work on a feature, it's best to ensure your plan aligns well
with our vision for Element. Please chat with the team in with our vision for Element. Please chat with the team in

View file

@ -6,7 +6,7 @@ official element.io distribution, but these files may be useful if you want to
inspect the configuration used there. inspect the configuration used there.
Element Desktop uses a separate config (see Element Desktop uses a separate config (see
https://github.com/vector-im/riot-desktop/tree/develop/element.io). https://github.com/vector-im/element-desktop/tree/develop/element.io).
Deployment scripts (such as app/deploy.py) are meant to be run on the web server Deployment scripts (such as app/deploy.py) are meant to be run on the web server
hosting the Element installation. hosting the Element installation.

View file

@ -1,7 +1,7 @@
{ {
"name": "riot-web", "name": "riot-web",
"productName": "Riot", "productName": "Riot",
"version": "1.7.7", "version": "1.7.8",
"description": "A feature-rich client for Matrix.org", "description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.", "author": "New Vector Ltd.",
"repository": { "repository": {
@ -46,7 +46,7 @@
"build:bundle-stats": "webpack --progress --bail --mode production --json > webpack-stats.json", "build:bundle-stats": "webpack --progress --bail --mode production --json > webpack-stats.json",
"build:types": "tsc --emitDeclarationOnly --jsx react", "build:types": "tsc --emitDeclarationOnly --jsx react",
"dist": "scripts/package.sh", "dist": "scripts/package.sh",
"start": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n reskindex,reskindex-react,res,riot-js \"yarn reskindex:watch\" \"yarn reskindex:watch-react\" \"yarn start:res\" \"yarn start:js\"", "start": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n reskindex,reskindex-react,res,element-js \"yarn reskindex:watch\" \"yarn reskindex:watch-react\" \"yarn start:res\" \"yarn start:js\"",
"start:res": "yarn build:jitsi && node scripts/copy-res.js -w", "start:res": "yarn build:jitsi && node scripts/copy-res.js -w",
"start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --progress --mode development", "start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --progress --mode development",
"lint": "yarn lint:types && yarn lint:js && yarn lint:style", "lint": "yarn lint:types && yarn lint:js && yarn lint:style",
@ -60,13 +60,14 @@
"gfm.css": "^1.1.2", "gfm.css": "^1.1.2",
"highlight.js": "^9.13.1", "highlight.js": "^9.13.1",
"jsrsasign": "^9.1.5", "jsrsasign": "^9.1.5",
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-js-sdk": "8.4.1",
"matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop", "matrix-react-sdk": "3.5.0",
"olm": "https://packages.matrix.org/npm/olm/olm-3.1.4.tgz", "matrix-widget-api": "^0.1.0-beta.2",
"olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz",
"prop-types": "^15.7.2", "prop-types": "^15.7.2",
"react": "^16.9.0", "react": "^16.9.0",
"react-dom": "^16.9.0", "react-dom": "^16.9.0",
"sanitize-html": "^1.19.1", "sanitize-html": "github:apostrophecms/sanitize-html#3c7f93f2058f696f5359e3e58d464161647226db",
"ua-parser-js": "^0.7.19", "ua-parser-js": "^0.7.19",
"url": "^0.11.0" "url": "^0.11.0"
}, },
@ -92,6 +93,7 @@
"@types/node": "^12.12.41", "@types/node": "^12.12.41",
"@types/react": "16.9", "@types/react": "16.9",
"@types/react-dom": "^16.9.4", "@types/react-dom": "^16.9.4",
"@types/sanitize-html": "^1.23.3",
"autoprefixer": "^9.7.3", "autoprefixer": "^9.7.3",
"babel-eslint": "^10.0.3", "babel-eslint": "^10.0.3",
"babel-jest": "^24.9.0", "babel-jest": "^24.9.0",
@ -112,8 +114,8 @@
"file-loader": "^5.0.2", "file-loader": "^5.0.2",
"fs-extra": "^0.30.0", "fs-extra": "^0.30.0",
"html-webpack-plugin": "^3.2.0", "html-webpack-plugin": "^3.2.0",
"jest": "^24.9.0", "jest": "^26.5.2",
"jest-environment-jsdom-fourteen": "^1.0.1", "jest-environment-jsdom-sixteen": "^1.0.3",
"json-loader": "^0.5.3", "json-loader": "^0.5.3",
"loader-utils": "^1.2.3", "loader-utils": "^1.2.3",
"matrix-mock-request": "^1.2.3", "matrix-mock-request": "^1.2.3",
@ -145,7 +147,7 @@
"webpack-dev-server": "^3.9.0" "webpack-dev-server": "^3.9.0"
}, },
"jest": { "jest": {
"testEnvironment": "jest-environment-jsdom-fourteen", "testEnvironment": "jest-environment-jsdom-sixteen",
"testMatch": [ "testMatch": [
"<rootDir>/test/**/*-test.js" "<rootDir>/test/**/*-test.js"
], ],

View file

@ -1 +1 @@
self.addEventListener('fetch',() => {}); self.addEventListener('fetch', () => {});

View file

@ -169,7 +169,7 @@ we don't have an account and should hide them. No account == no guest account ei
</style> </style>
<div class="mx_Parent"> <div class="mx_Parent">
<a href="https://riot.im" target="_blank" rel="noopener"> <a href="https://element.io" target="_blank" rel="noopener">
<img src="welcome/images/logo.svg" alt="" class="mx_Logo"/> <img src="welcome/images/logo.svg" alt="" class="mx_Logo"/>
</a> </a>
<h1 class="mx_Header_title">_t("Welcome to Element")</h1> <h1 class="mx_Header_title">_t("Welcome to Element")</h1>
@ -185,7 +185,7 @@ we don't have an account and should hide them. No account == no guest account ei
</div> </div>
<!-- The comments below are meant to be used by Ansible as a quick way <!-- The comments below are meant to be used by Ansible as a quick way
to strip out the marked content when desired. to strip out the marked content when desired.
See https://github.com/vector-im/riot-web/issues/8622. See https://github.com/vector-im/element-web/issues/8622.
TODO: Strip out these comments and rely on the guest flag --> TODO: Strip out these comments and rely on the guest flag -->
<!-- BEGIN Ansible: Remove these lines when guest access is disabled --> <!-- BEGIN Ansible: Remove these lines when guest access is disabled -->
<div class="mx_ButtonRow mx_WelcomePage_guestFunctions"> <div class="mx_ButtonRow mx_WelcomePage_guestFunctions">

View file

@ -18,7 +18,7 @@ my $gh = Net::GitHub->new(
login => 'ara4n', pass => read_password("github password: "), login => 'ara4n', pass => read_password("github password: "),
); );
$gh->set_default_user_repo('vector-im', 'riot-web'); $gh->set_default_user_repo('vector-im', 'element-web');
#my @issues = $gh->issue->repos_issues({ state => 'all', milestone => 3 }); #my @issues = $gh->issue->repos_issues({ state => 'all', milestone => 3 });
my @issues = $gh->issue->repos_issues({ state => 'all' }); my @issues = $gh->issue->repos_issues({ state => 'all' });

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
# #
# auto-deploy script for https://riot.im/develop # auto-deploy script for https://develop.element.io
# #
# Listens for buildkite webhook pokes (https://buildkite.com/docs/apis/webhooks) # Listens for buildkite webhook pokes (https://buildkite.com/docs/apis/webhooks)
# When it gets one, downloads the artifact from buildkite # When it gets one, downloads the artifact from buildkite
@ -191,7 +191,7 @@ def deploy_tarball(artifact, build_dir):
# Download the tarball here as buildkite needs auth to do this # Download the tarball here as buildkite needs auth to do this
# we don't pgp-sign buildkite artifacts, relying on HTTPS and buildkite # we don't pgp-sign buildkite artifacts, relying on HTTPS and buildkite
# not being evil. If that's not good enough for you, don't use riot.im/develop. # not being evil. If that's not good enough for you, don't use develop.element.io.
resp = requests.get(artifact['download_url'], stream=True, headers=req_headers()) resp = requests.get(artifact['download_url'], stream=True, headers=req_headers())
resp.raise_for_status() resp.raise_for_status()
with open(artifact['filename'], 'wb') as ofp: with open(artifact['filename'], 'wb') as ofp:

View file

@ -28,7 +28,7 @@ export default class VectorEmbeddedPage extends EmbeddedPage {
// we're overriding the base component here, for Element-specific tweaks // we're overriding the base component here, for Element-specific tweaks
translate(s) { translate(s) {
s = sanitizeHtml(_t(s)); s = sanitizeHtml(_t(s));
// ugly fix for https://github.com/vector-im/riot-web/issues/4243 // ugly fix for https://github.com/vector-im/element-web/issues/4243
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
s = s.replace(/\[matrix\]/, '<a href="https://matrix.org" target="_blank" rel="noreferrer noopener"><img width="79" height="34" alt="Matrix" style="padding-left: 1px;vertical-align: middle" src="welcome/images/matrix.svg"/></a>'); s = s.replace(/\[matrix\]/, '<a href="https://matrix.org" target="_blank" rel="noreferrer noopener"><img width="79" height="34" alt="Matrix" style="padding-left: 1px;vertical-align: middle" src="welcome/images/matrix.svg"/></a>');
return s; return s;

View file

@ -24,7 +24,7 @@ const VectorAuthFooter = () => {
let links = [ let links = [
{"text": "Blog", "url": "https://element.io/blog"}, {"text": "Blog", "url": "https://element.io/blog"},
{"text": "Twitter", "url": "https://twitter.com/element_hq"}, {"text": "Twitter", "url": "https://twitter.com/element_hq"},
{"text": "GitHub", "url": "https://github.com/vector-im/riot-web"}, {"text": "GitHub", "url": "https://github.com/vector-im/element-web"},
]; ];
if (brandingConfig && brandingConfig.authFooterLinks) { if (brandingConfig && brandingConfig.authFooterLinks) {

View file

@ -1,35 +1,36 @@
{ {
"Dismiss": "تجاهل", "Dismiss": "أهمِل",
"Unknown device": "جهاز مجهول", "Unknown device": "جهاز مجهول",
"You need to be using HTTPS to place a screen-sharing call.": "تحتاج الى استخدام الاتصال الآمن (HTTPS) للسماح بمشاركة الشاشة.", "You need to be using HTTPS to place a screen-sharing call.": "عليك استعمال ميفاق HTTPS للاتصال بمشاركة الشاشة.",
"powered by Matrix": "مشغل بواسطة Matrix", "powered by Matrix": "مشغل بواسطة Matrix",
"Welcome to Element": "مرحبا بك في Element", "Welcome to Element": "مرحبًا بك في Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "دردشة مشفرة غير مركزية &amp;تطبيق تعاوني مدعوم بواسطة [matrix]", "Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "دردشة وتعاون غير مركزي معمّى، تدعمه [matrix]",
"Create Account": "انشاء حساب", "Create Account": "أنشِئ حسابًا",
"Explore rooms": "استكشف غرف المحادثات", "Explore rooms": "استكشِف الغرف",
"Sign In": "الدخول", "Sign In": "لِج",
"Missing indexeddb worker script!": "منفذ السكريبت الخاص ب Indexeddb غير موجود!", "Missing indexeddb worker script!": "سكربت عامل indexeddb ناقص!",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "خطأ في الاعدادات: يمكنك فقط تحديد واحد فقط من: default_server_config، default_server_name، أو default_hs_url.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "الضبط غير صالح: يمكنك تحديد واحدًا من الآتي فقط: default_server_config أو default_server_name أو default_hs_url.",
"Invalid configuration: no default server specified.": "اعدادات خاطئة: لم يتم تحديد السيرفر الافتراضي.", "Invalid configuration: no default server specified.": "الضبط غير صالح: لم تحدّد خادومًا مبدئيًا.",
"Your Element is misconfigured": "تطبيقك معد بطريقة خاطئة", "Your Element is misconfigured": "لم يُضبط تطبيق Element كما ينبغي",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "اعداداتك تحتوى على بنية JSON غير صحيحة. يرجى تصحيح المشكلة واعادة تحديث الصفحة.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "يحتوي ضبط تطبيق Element على تنسيق JSON غير صالح. من فضلك صحّح المشكلة وأعِد تحميل الصفحة.",
"The message from the parser is: %(message)s": "الرسالة من المدقق هي:%(message)s", "The message from the parser is: %(message)s": "الرسالة القادمة من المحلّل: %(message)s",
"Invalid JSON": "JSON خاطئ", "Invalid JSON": "تنسيق JSON غير صالح",
"Unable to load config file: please refresh the page to try again.": "لم نستطع تحميل ملف الاعداد: يرجى تحديث الصفحة للمحاولة مرة اخرى.", "Unable to load config file: please refresh the page to try again.": "تعذّر تحميل ملف الضبط: من فضلك أنعِش الصفحة لمعاودة المحاولة.",
"Unexpected error preparing the app. See console for details.": "حدث خطأ غير متوقع عند تجهيز التطبيق. انظر الى منصة التحكم للمزيد من التفاصيل.", "Unexpected error preparing the app. See console for details.": "حدث عُطل غير متوقع أثناء تجهيز التطبيق. طالِع المِعراض للتفاصيل.",
"Download Completed": "تم اكتمال التحميل", "Download Completed": "اكتمل التنزيل",
"Open": "فتح", "Open": "افتح",
"Open user settings": "فتح اعدادات المستخدم", "Open user settings": "افتح إعدادات المستخدم",
"Previous/next recently visited room or community": "السابقة/اللاحقة الغرفة او المجتمع الذي تمت زيارته مؤخرا", "Previous/next recently visited room or community": "الغرفة أو المجتمع التالي/السابق الذي زرته حديثًا",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s سطح المكتب (%(platformName)s)", "%(brand)s Desktop (%(platformName)s)": "%(brand)s لسطح المكتب (%(platformName)s)",
"Go to your browser to complete Sign In": "اذهب الى المتصفح لاكمال تسجيل الدخول", "Go to your browser to complete Sign In": "افتح المتصفح لإكمال الولوج",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)", "%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s، %(osName)s)",
"Unsupported browser": "متصفح غير متوافق", "Unsupported browser": "متصفح غير مدعوم",
"Your browser can't run %(brand)s": "متصفحك لايمكنه تشغيل %(brand)s", "Your browser can't run %(brand)s": "لا يمكن لمتصفحك تشغيل %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s يستخدم مزايا المتصفح المتقدمة والتي لا يدعمها متصفحك الحالي.", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "يستعمل %(brand)s ميزات متقدمة في المتصفحات لا يدعمها متصفحك الحالي.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "يرجى تثبيت <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.", "Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "من فضلك ثبّت <chromeLink>كروم</chromeLink> أو <firefoxLink>فَيَرفُكس</firefoxLink> أو <safariLink>سفاري</safariLink> لأفضل تجربة.",
"You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.": "يمكنك الاستمرار في استخدام متصفحك الحالي، ولكن بعض او كل المزايا ربما لا تعمل ويكون شكل التطبيق وشعورك تجاهه غير صحيح.", "You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.": "يمكنك مواصل استعمال متصفحك الحالي ولكن قد لا تعمل بعض المزايا (أو كلها) وقد لا يظهر التطبيق كما ينبغي له أن يظهر.",
"I understand the risks and wish to continue": "ادرك المخاطر وارغب في الاستمرار", "I understand the risks and wish to continue": "أفهم المخاطرة وأود المواصلة",
"Go to element.io": "اذهب الى Element.io", "Go to element.io": "انتقل إلى element.io",
"Failed to start": "فشل الاقلاع" "Failed to start": "فشل البدء",
"Powered by Matrix": "تدعمه «ماترِكس»"
} }

View file

@ -1 +1,35 @@
{} {
"Missing indexeddb worker script!": "Nedostaje indexeddb radna skripta!",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Neispravna konfiguracija: navesti se samo može jedan od default_server_config, default_server_name ili default_hs_url.",
"Invalid configuration: no default server specified.": "Neispravna konfiguracija: nije naveden zadani server.",
"Your Element is misconfigured": "Vaš element je pogrešno konfiguriran",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Konfiguracija vašeg elementa sadrži nevažeći JSON. Ispravite problem i ponovo učitajte stranicu.",
"The message from the parser is: %(message)s": "Poruka parsera je: %(message)s",
"Invalid JSON": "Nevažeći JSON",
"Unable to load config file: please refresh the page to try again.": "Nije moguće učitati konfiguracijsku datoteku: osvježite stranicu i pokušajte ponovo.",
"Unexpected error preparing the app. See console for details.": "Neočekivana greška prilikom pripreme aplikacije. Pogledajte konzolu za detalje.",
"Download Completed": "Preuzimanje završeno",
"Open": "Otvori",
"Dismiss": "Odbaci",
"Open user settings": "Otvori korisničke postavke",
"Previous/next recently visited room or community": "Prethodna / sljedeća nedavno posjećena soba ili zajednica",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Radna povrsina (%(platformName)s)",
"Go to your browser to complete Sign In": "Idite na svoj pretraživač da biste dovršili prijavu",
"Unknown device": "Nepoznat uređaj",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"You need to be using HTTPS to place a screen-sharing call.": "Morate koristiti HTTPS za upućivanje poziva za dijeljenje ekrana.",
"Powered by Matrix": "Pokretano uz Matrix",
"Unsupported browser": "Nepodržani pretraživač",
"Your browser can't run %(brand)s": "Vaš pretraživač ne može pokretati %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s koristi napredne funkcije pretraživača koje vaš trenutni pretraživač ne podržava.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Molimo instalirajte <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> ili <safariLink>Safari</safariLink> za najbolje iskustvo.",
"You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.": "Možete nastaviti koristiti svoj trenutni pretraživač, ali neke ili sve funkcije možda neće raditi, a izgled i dojam aplikacije mogu biti neispravani.",
"I understand the risks and wish to continue": "Razumijem rizike i želim nastaviti",
"Go to element.io": "Idite na element.io",
"Failed to start": "Pokretanje nije uspjelo",
"Welcome to Element": "Dobrodošli u Element",
"Decentralised, encrypted chat &amp; collaboration powered by [matrix]": "Decentralizirani, šifrirani razgovor &amp; suradnja pokrenuta [matrix]",
"Sign In": "Prijavite se",
"Create Account": "Otvori račun",
"Explore rooms": "Istražite sobe"
}

View file

@ -10,5 +10,26 @@
"Sign In": "Inicia la sessió", "Sign In": "Inicia la sessió",
"Invalid configuration: no default server specified.": "Configuració no vàlida: no s'ha especificat cap servidor per defecte.", "Invalid configuration: no default server specified.": "Configuració no vàlida: no s'ha especificat cap servidor per defecte.",
"Invalid JSON": "JSON no vàlid", "Invalid JSON": "JSON no vàlid",
"Go to your browser to complete Sign In": "Aneu al vostre navegador per completar l'inici de sessió" "Go to your browser to complete Sign In": "Aneu al vostre navegador per completar l'inici de sessió",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuració incorrecta: només podeu especificar una de les opcions default_server_config, default_server_name, o default_hs_url.",
"Your Element is misconfigured": "El vostre Element està mal configurat",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "El vostre Element conté un JSON incorrecte. Si us plau arregleu el problema i recarregueu la pàgina.",
"The message from the parser is: %(message)s": "El missatge de l'analitzador és: %(message)s",
"Unable to load config file: please refresh the page to try again.": "No he pogut carregar l'arxiu de configuració: si us plau recarregueu la pàgina per provar-ho de nou.",
"Unexpected error preparing the app. See console for details.": "Error inesperat preparant l'app. Vegeu la consola pels detalls.",
"Download Completed": "Descàrrega completada",
"Open": "Obre",
"Open user settings": "Obre configuració d'usuari",
"Previous/next recently visited room or community": "Anterior/Següent sala o comunitat visitada recentment",
"%(brand)s Desktop (%(platformName)s)": "%(brand)s d'escriptori (%(platformName)s)",
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
"Powered by Matrix": "En funcionament gràcies a Matrix",
"Unsupported browser": "Navegador no suportat",
"Your browser can't run %(brand)s": "El vostre navegador no pot executar %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa característiques avançades del navegador que el vostre navegador no suporta.",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Si us plau instal·leu<chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, o <safariLink>Safari</safariLink> per una millor experiència.",
"You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.": "Podeu continuar usant el vostre navegador actual, però algunes o totes les característiques podrien no funcionar i l'aspepte de l'aplicació podria mostrar errors.",
"I understand the risks and wish to continue": "Entenc els riscos i voldria continuar",
"Go to element.io": "Vés a element.io",
"Failed to start": "Ha fallat en iniciar-se"
} }

View file

@ -10,7 +10,24 @@
"The message from the parser is: %(message)s": "Το μήνυμα από τον αναλυτή είναι: %(message)s", "The message from the parser is: %(message)s": "Το μήνυμα από τον αναλυτή είναι: %(message)s",
"Invalid JSON": "Μη έγκυρο JSON", "Invalid JSON": "Μη έγκυρο JSON",
"Unexpected error preparing the app. See console for details.": "Απρόοπτο σφάλμα κατά την προετοιμασία της εφαρμογής. Δείτε το τερματικό για λεπτομέρειες.", "Unexpected error preparing the app. See console for details.": "Απρόοπτο σφάλμα κατά την προετοιμασία της εφαρμογής. Δείτε το τερματικό για λεπτομέρειες.",
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Μη έγκυρη ρύθμιση παραμέτρων: δυνατότητα ορισμού μόνο ένα από τα default_server_config, default_server_name, ή default_hs_url.", "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Μη έγκυρη ρύθμιση: δυνατότητα ορισμού μόνο ένα από τα default_server_config, default_server_name, ή default_hs_url.",
"Invalid configuration: no default server specified.": "Μη έγκυρη ρύθμιση παραμέτρων: δεν έχει οριστεί προκαθορισμένος διακομιστής.", "Invalid configuration: no default server specified.": "Μη έγκυρη ρύθμιση παραμέτρων: δεν έχει οριστεί προκαθορισμένος διακομιστής.",
"Explore rooms": "Εξερευνήστε δωμάτια" "Explore rooms": "Εξερευνήστε δωμάτια",
"Open": "Άνοιγμα",
"Go to your browser to complete Sign In": "Μεταβείτε στο πρόγραμμα περιήγησής σας για να ολοκληρώσετε τη σύνδεση",
"Powered by Matrix": "Με την υποστήριξη του Matrix",
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Παρακαλούμε εγκαταστήστε <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ή <safariLink>Safari</safariLink> για καλύτερη εμπειρία χρήσης.",
"Your Element is misconfigured": "Το Element σας δεν εχει ρυθμιστεί σωστά",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Η ρύθμιση του Element περιέχει μη έγκυρο JSON. Διορθώστε το πρόβλημα και φορτώστε ξανά τη σελίδα.",
"Unable to load config file: please refresh the page to try again.": "Δεν είναι δυνατή η φόρτωση του αρχείου config: ανανεώστε τη σελίδα για να δοκιμάσετε ξανά.",
"Download Completed": "Η λήψη ολοκληρώθηκε",
"Open user settings": "Ανοίξτε τις ρυθμίσεις χρήστη",
"Previous/next recently visited room or community": "Προηγούμενο / επόμενο δωμάτιο ή κοινότητα που επισκεφτήκατε πρόσφατα",
"Unsupported browser": "Μη υποστηριζόμενο πρόγραμμα περιήγησης",
"Your browser can't run %(brand)s": "Το πρόγραμμα περιήγησής σας δεν μπορεί να εκτελέσει %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s χρησιμοποιεί προηγμένες δυνατότητες προγράμματος περιήγησης που δεν υποστηρίζονται από το τρέχον πρόγραμμα περιήγησής σας.",
"You can continue using your current browser, but some or all features may not work and the look and feel of the application may be incorrect.": "Μπορείτε να συνεχίσετε να χρησιμοποιείτε το τρέχον πρόγραμμα περιήγησής σας, αλλά ορισμένες ή όλες οι λειτουργίες ενδέχεται να μην λειτουργούν και η εμφάνιση και η αίσθηση της εφαρμογής ενδέχεται να είναι λανθασμένη.",
"I understand the risks and wish to continue": "Κατανοώ τους κινδύνους και επιθυμώ να συνεχίσω",
"Go to element.io": "Πήγαινε στο element.io",
"Failed to start": "Αποτυχία έναρξης"
} }

View file

@ -29,7 +29,8 @@
"Download Completed": "Preberanie dokončené", "Download Completed": "Preberanie dokončené",
"Open": "Otvoriť", "Open": "Otvoriť",
"Your Element is misconfigured": "Váš Element je nesprávne nastavený", "Your Element is misconfigured": "Váš Element je nesprávne nastavený",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Vaša konfigurácia Elementu obsahuje nesprávne JSON. Prosím, opravte chybu a obnovte stránku.", "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Vaša konfigurácia Elementu obsahuje nesprávny údaj JSON. Prosím, opravte chybu a obnovte stránku.",
"Your browser can't run %(brand)s": "Váš prehliadač nerozbehne %(brand)s", "Your browser can't run %(brand)s": "Váš prehliadač nerozbehne %(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s používa pokročilé funkcie prehliadača, ktoré nie sú podporované vaším aktuálnym prehliadačom." "%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s používa pokročilé funkcie prehliadača, ktoré nie sú podporované vaším aktuálnym prehliadačom.",
"Powered by Matrix": "používa protokol Matrix"
} }

View file

@ -32,5 +32,5 @@
"Open": "打开", "Open": "打开",
"Your browser can't run %(brand)s": "浏览器无法运行%(brand)s", "Your browser can't run %(brand)s": "浏览器无法运行%(brand)s",
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "当前浏览器不支持%(brand)s调用的高级浏览器特性。", "%(brand)s uses advanced browser features which aren't supported by your current browser.": "当前浏览器不支持%(brand)s调用的高级浏览器特性。",
"Powered by Matrix": "Powered by Matrix" "Powered by Matrix": "由 Matrix 驱动"
} }

View file

@ -26,7 +26,6 @@ window.React = React;
import url from 'url'; import url from 'url';
import * as sdk from 'matrix-react-sdk'; import * as sdk from 'matrix-react-sdk';
import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg'; import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg';
import * as VectorConferenceHandler from 'matrix-react-sdk/src/VectorConferenceHandler';
import {_td, newTranslatableError} from 'matrix-react-sdk/src/languageHandler'; import {_td, newTranslatableError} from 'matrix-react-sdk/src/languageHandler';
import AutoDiscoveryUtils from 'matrix-react-sdk/src/utils/AutoDiscoveryUtils'; import AutoDiscoveryUtils from 'matrix-react-sdk/src/utils/AutoDiscoveryUtils';
import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery"; import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery";
@ -34,7 +33,6 @@ import * as Lifecycle from "matrix-react-sdk/src/Lifecycle";
import type MatrixChatType from "matrix-react-sdk/src/components/structures/MatrixChat"; import type MatrixChatType from "matrix-react-sdk/src/components/structures/MatrixChat";
import {MatrixClientPeg} from 'matrix-react-sdk/src/MatrixClientPeg'; import {MatrixClientPeg} from 'matrix-react-sdk/src/MatrixClientPeg';
import SdkConfig from "matrix-react-sdk/src/SdkConfig"; import SdkConfig from "matrix-react-sdk/src/SdkConfig";
import CallHandler from 'matrix-react-sdk/src/CallHandler';
import {parseQs, parseQsFromFragment} from './url_utils'; import {parseQs, parseQsFromFragment} from './url_utils';
import VectorBasePlatform from "./platform/VectorBasePlatform"; import VectorBasePlatform from "./platform/VectorBasePlatform";
@ -141,7 +139,6 @@ export async function loadApp(fragParams: {}) {
throw newTranslatableError(_td("Missing indexeddb worker script!")); throw newTranslatableError(_td("Missing indexeddb worker script!"));
} }
MatrixClientPeg.setIndexedDbWorkerScript(vectorIndexeddbWorkerScript); MatrixClientPeg.setIndexedDbWorkerScript(vectorIndexeddbWorkerScript);
CallHandler.setConferenceHandler(VectorConferenceHandler);
window.addEventListener('hashchange', onHashChange); window.addEventListener('hashchange', onHashChange);
@ -160,7 +157,6 @@ export async function loadApp(fragParams: {}) {
return <MatrixChat return <MatrixChat
onNewScreen={onNewScreen} onNewScreen={onNewScreen}
makeRegistrationUrl={makeRegistrationUrl} makeRegistrationUrl={makeRegistrationUrl}
ConferenceHandler={VectorConferenceHandler}
config={config} config={config}
realQueryParams={params} realQueryParams={params}
startingFragmentQueryParams={fragParams} startingFragmentQueryParams={fragParams}

View file

@ -85,7 +85,7 @@ const supportedBrowser = checkBrowserFeatures();
// try in react but fallback to an `alert` // try in react but fallback to an `alert`
// We start loading stuff but don't block on it until as late as possible to allow // We start loading stuff but don't block on it until as late as possible to allow
// the browser to use as much parallelism as it can. // the browser to use as much parallelism as it can.
// Load parallelism is based on research in https://github.com/vector-im/riot-web/issues/12253 // Load parallelism is based on research in https://github.com/vector-im/element-web/issues/12253
async function start() { async function start() {
// load init.ts async so that its code is not executed immediately and we can catch any exceptions // load init.ts async so that its code is not executed immediately and we can catch any exceptions
const { const {
@ -114,7 +114,7 @@ async function start() {
// don't try to redirect to the native apps if we're // don't try to redirect to the native apps if we're
// verifying a 3pid (but after we've loaded the config) // verifying a 3pid (but after we've loaded the config)
// or if the user is following a deep link // or if the user is following a deep link
// (https://github.com/vector-im/riot-web/issues/7378) // (https://github.com/vector-im/element-web/issues/7378)
const preventRedirect = fragparts.params.client_secret || fragparts.location.length > 0; const preventRedirect = fragparts.params.client_secret || fragparts.location.length > 0;
if (!preventRedirect) { if (!preventRedirect) {

View file

@ -9,6 +9,7 @@
<div id="joinButtonContainer"> <div id="joinButtonContainer">
<div class="joinConferenceFloating"> <div class="joinConferenceFloating">
<div class="joinConferencePrompt"> <div class="joinConferencePrompt">
<span class="icon"><!-- managed by CSS --></span>
<!-- TODO: i18n --> <!-- TODO: i18n -->
<h2>Jitsi Video Conference</h2> <h2>Jitsi Video Conference</h2>
<div id="widgetActionContainer"> <div id="widgetActionContainer">

View file

@ -23,10 +23,11 @@ limitations under the License.
src: url('~matrix-react-sdk/res/fonts/Nunito/Nunito-Regular.ttf') format('truetype'); src: url('~matrix-react-sdk/res/fonts/Nunito/Nunito-Regular.ttf') format('truetype');
} }
$fg-color: #edf3ff;
body { body {
font-family: Nunito, Arial, Helvetica, sans-serif; font-family: Nunito, Arial, Helvetica, sans-serif;
background-color: #181b21; background-color: #181b21;
color: #edf3ff; color: $fg-color;
} }
body, html { body, html {
@ -73,3 +74,22 @@ body, html {
background-color: #03b381; background-color: #03b381;
border: 0; border: 0;
} }
.icon {
$icon-size: 42px;
margin-top: -$icon-size; // to visually center the form
&::before {
content: '';
background-size: contain;
background-color: $fg-color;
mask-repeat: no-repeat;
mask-position: center;
mask-image: url("~matrix-react-sdk/res/img/element-icons/call/video-call.svg");
mask-size: $icon-size;
display: block;
width: $icon-size;
height: $icon-size;
margin: 0 auto; // center
}
}

View file

@ -18,8 +18,14 @@ limitations under the License.
require("./index.scss"); require("./index.scss");
import * as qs from 'querystring'; import * as qs from 'querystring';
import {Capability, WidgetApi} from 'matrix-react-sdk/src/widgets/WidgetApi';
import {KJUR} from 'jsrsasign'; import {KJUR} from 'jsrsasign';
import {
IOpenIDCredentials,
IWidgetApiRequest,
VideoConferenceCapabilities,
WidgetApi,
} from "matrix-widget-api";
import { ElementWidgetActions } from "matrix-react-sdk/src/stores/widgets/ElementWidgetActions";
const JITSI_OPENIDTOKEN_JWT_AUTH = 'openidtoken-jwt'; const JITSI_OPENIDTOKEN_JWT_AUTH = 'openidtoken-jwt';
@ -38,8 +44,10 @@ let avatarUrl: string;
let userId: string; let userId: string;
let jitsiAuth: string; let jitsiAuth: string;
let roomId: string; let roomId: string;
let openIdToken: IOpenIDCredentials;
let widgetApi: WidgetApi; let widgetApi: WidgetApi;
let meetApi: any; // JitsiMeetExternalAPI
(async function() { (async function() {
try { try {
@ -61,11 +69,26 @@ let widgetApi: WidgetApi;
const widgetId = qsParam('widgetId', true); const widgetId = qsParam('widgetId', true);
// Set this up as early as possible because Element will be hitting it almost immediately. // Set this up as early as possible because Element will be hitting it almost immediately.
let readyPromise: Promise<[void, void]>;
if (parentUrl && widgetId) { if (parentUrl && widgetId) {
widgetApi = new WidgetApi(qsParam('parentUrl'), qsParam('widgetId'), [ const parentOrigin = new URL(qsParam('parentUrl')).origin;
Capability.AlwaysOnScreen, widgetApi = new WidgetApi(qsParam("widgetId"), parentOrigin);
widgetApi.requestCapabilities(VideoConferenceCapabilities);
readyPromise = Promise.all([
new Promise<void>(resolve => {
widgetApi.once<CustomEvent<IWidgetApiRequest>>(`action:${ElementWidgetActions.ClientReady}`, ev => {
ev.preventDefault();
widgetApi.transport.reply(ev.detail, {});
resolve();
});
}),
new Promise<void>(resolve => {
widgetApi.once("ready", () => resolve());
}),
]); ]);
widgetApi.expectingExplicitReady = true; widgetApi.start();
} else {
throw new Error("No parent URL or no widget ID");
} }
// Populate the Jitsi params now // Populate the Jitsi params now
@ -78,39 +101,33 @@ let widgetApi: WidgetApi;
roomId = qsParam('roomId', true); roomId = qsParam('roomId', true);
if (widgetApi) { if (widgetApi) {
await widgetApi.waitReady(); await readyPromise;
await widgetApi.setAlwaysOnScreen(false); // start off as detachable from the screen await widgetApi.setAlwaysOnScreen(false); // start off as detachable from the screen
// See https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification // See https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) { if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) {
// Request credentials, give callback to continue when received // Request credentials, give callback to continue when received
widgetApi.requestOpenIDCredentials(credentialsResponseCallback); openIdToken = await widgetApi.requestOpenIDConnectToken();
} else { console.log("Got OpenID Connect token");
enableJoinButton();
} }
// TODO: register widgetApi listeners for PTT controls (https://github.com/vector-im/riot-web/issues/12795) // TODO: register widgetApi listeners for PTT controls (https://github.com/vector-im/riot-web/issues/12795)
} else {
enableJoinButton(); widgetApi.addEventListener(`action:${ElementWidgetActions.HangupCall}`,
(ev: CustomEvent<IWidgetApiRequest>) => {
if (meetApi) meetApi.executeCommand('hangup');
widgetApi.transport.reply(ev.detail, {}); // ack
},
);
} }
enableJoinButton(); // always enable the button
} catch (e) { } catch (e) {
console.error("Error setting up Jitsi widget", e); console.error("Error setting up Jitsi widget", e);
document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget"; document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
} }
})(); })();
/**
* Enable or show error depending on what the credentials response is.
*/
function credentialsResponseCallback() {
if (widgetApi.openIDCredentials) {
console.info('Successfully got OpenID credentials.');
enableJoinButton();
} else {
console.warn('OpenID credentials request was blocked by user.');
document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
}
}
function enableJoinButton() { function enableJoinButton() {
document.getElementById("joinButton").onclick = () => joinConference(); document.getElementById("joinButton").onclick = () => joinConference();
} }
@ -140,7 +157,7 @@ function createJWTToken() {
room: "*", room: "*",
context: { context: {
matrix: { matrix: {
token: widgetApi.openIDCredentials.accessToken, token: openIdToken.access_token,
room_id: roomId, room_id: roomId,
}, },
user: { user: {
@ -163,7 +180,7 @@ function createJWTToken() {
function joinConference() { // event handler bound in HTML function joinConference() { // event handler bound in HTML
let jwt; let jwt;
if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) { if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) {
if (!widgetApi.openIDCredentials || !widgetApi.openIDCredentials.accessToken) { if (!openIdToken?.access_token) { // eslint-disable-line camelcase
// We've failing to get a token, don't try to init conference // We've failing to get a token, don't try to init conference
console.warn('Expected to have an OpenID credential, cannot initialize widget.'); console.warn('Expected to have an OpenID credential, cannot initialize widget.');
document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget"; document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
@ -199,7 +216,7 @@ function joinConference() { // event handler bound in HTML
jwt: jwt, jwt: jwt,
}; };
const meetApi = new JitsiMeetExternalAPI(jitsiDomain, options); meetApi = new JitsiMeetExternalAPI(jitsiDomain, options);
if (displayName) meetApi.executeCommand("displayName", displayName); if (displayName) meetApi.executeCommand("displayName", displayName);
if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl); if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl);
if (userId) meetApi.executeCommand("email", userId); if (userId) meetApi.executeCommand("email", userId);
@ -214,5 +231,6 @@ function joinConference() { // event handler bound in HTML
} }
document.getElementById("jitsiContainer").innerHTML = ""; document.getElementById("jitsiContainer").innerHTML = "";
meetApi = null;
}); });
} }

1974
yarn.lock

File diff suppressed because it is too large Load diff