Compare commits
1 Commits
dx/typescr
...
v1.7.24.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d8d6df724 |
35
.eslintrc.js
35
.eslintrc.js
@@ -1,30 +1,23 @@
|
||||
module.exports = {
|
||||
plugins: ["matrix-org"],
|
||||
extends: [
|
||||
"plugin:matrix-org/babel",
|
||||
"plugin:matrix-org/react",
|
||||
],
|
||||
env: {
|
||||
browser: true,
|
||||
node: true,
|
||||
"extends": ["matrix-org", "matrix-org/react"],
|
||||
"env": {
|
||||
"browser": true,
|
||||
"node": true,
|
||||
},
|
||||
rules: {
|
||||
// Things we do that break the ideal style
|
||||
"rules": {
|
||||
"quotes": "off",
|
||||
},
|
||||
overrides: [{
|
||||
files: ["src/**/*.{ts,tsx}"],
|
||||
extends: [
|
||||
"plugin:matrix-org/typescript",
|
||||
"plugin:matrix-org/react",
|
||||
],
|
||||
rules: {
|
||||
// Things we do that break the ideal style
|
||||
"prefer-promise-reject-errors": "off",
|
||||
"overrides": [{
|
||||
"files": ["src/**/*.{ts,tsx}"],
|
||||
"extends": ["matrix-org/ts", "matrix-org/react"],
|
||||
"env": {
|
||||
"browser": true,
|
||||
},
|
||||
"rules": {
|
||||
"quotes": "off",
|
||||
|
||||
// We disable this while we're transitioning
|
||||
// While converting to ts we allow this
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
"prefer-promise-reject-errors": "off",
|
||||
},
|
||||
}],
|
||||
};
|
||||
|
||||
6
.github/ISSUE_TEMPLATE.md
vendored
6
.github/ISSUE_TEMPLATE.md
vendored
@@ -12,11 +12,11 @@ that aren't relevant to your particular case.
|
||||
Text between <!-- and --> marks will be invisible in the report.
|
||||
-->
|
||||
|
||||
#### Description
|
||||
### Description
|
||||
|
||||
Describe here the problem that you are experiencing, or the feature you are requesting.
|
||||
|
||||
#### Steps to reproduce
|
||||
### Steps to reproduce
|
||||
|
||||
- For bugs, list the steps
|
||||
- that reproduce the bug
|
||||
@@ -30,7 +30,7 @@ file a bug here too! -->
|
||||
|
||||
<!-- Include screenshots if possible: you can drag and drop images below. -->
|
||||
|
||||
#### Version information
|
||||
### Version information
|
||||
|
||||
<!-- IMPORTANT: please answer the following questions, to help us narrow down the problem -->
|
||||
|
||||
|
||||
6
.github/ISSUE_TEMPLATE/bug_report.md
vendored
6
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -21,11 +21,11 @@ that aren't relevant to your particular case.
|
||||
Text between <!-- and --> marks will be invisible in the report.
|
||||
-->
|
||||
|
||||
#### Description
|
||||
### Description
|
||||
|
||||
Describe here the problem that you are experiencing, or the feature you are requesting.
|
||||
|
||||
#### Steps to reproduce
|
||||
### Steps to reproduce
|
||||
|
||||
- For bugs, list the steps
|
||||
- that reproduce the bug
|
||||
@@ -40,7 +40,7 @@ Logs being sent: yes/no
|
||||
|
||||
<!-- Include screenshots if possible: you can drag and drop images below. -->
|
||||
|
||||
#### Version information
|
||||
### Version information
|
||||
|
||||
<!-- IMPORTANT: please answer the following questions, to help us narrow down the problem -->
|
||||
|
||||
|
||||
@@ -7,14 +7,14 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Is your suggestion related to a problem? Please describe.
|
||||
**Is your suggestion related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
#### Describe the solution you'd like.
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
#### Describe alternatives you've considered.
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
#### Additional context
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
||||
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,11 +0,0 @@
|
||||
<!-- Please read https://github.com/matrix-org/matrix-js-sdk/blob/develop/CONTRIBUTING.md before submitting your pull request -->
|
||||
|
||||
<!-- Include a Sign-Off as described in https://github.com/matrix-org/matrix-js-sdk/blob/develop/CONTRIBUTING.md#sign-off -->
|
||||
|
||||
<!-- To specify text for the changelog entry (otherwise the PR title will be used):
|
||||
Notes:
|
||||
|
||||
Changelog entries will also appear in element-desktop. For PRs that *only* affect the desktop version:
|
||||
Notes: none
|
||||
element-desktop notes: <notes>
|
||||
-->
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -19,5 +19,3 @@ electron/pub
|
||||
/src/component-index.js
|
||||
/.tmp
|
||||
/webpack-stats.json
|
||||
.vscode
|
||||
.vscode/
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
{
|
||||
"minify": true,
|
||||
"enableClasses": false,
|
||||
"classPrefix": "modernizr_",
|
||||
"options": [
|
||||
"setClasses"
|
||||
],
|
||||
"feature-detects": [
|
||||
"test/css/animations",
|
||||
"test/css/displaytable",
|
||||
|
||||
294
CHANGELOG.md
294
CHANGELOG.md
@@ -1,287 +1,3 @@
|
||||
Changes in [1.7.33](https://github.com/vector-im/element-web/releases/tag/v1.7.33) (2021-07-19)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.33-rc.1...v1.7.33)
|
||||
|
||||
* No changes from rc.1
|
||||
|
||||
Changes in [1.7.33-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.33-rc.1) (2021-07-14)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.32...v1.7.33-rc.1)
|
||||
|
||||
* Translations update from Weblate
|
||||
[\#17991](https://github.com/vector-im/element-web/pull/17991)
|
||||
* Revert "Don't run nginx as root in docker"
|
||||
[\#17990](https://github.com/vector-im/element-web/pull/17990)
|
||||
* Don't run nginx as root in docker
|
||||
[\#17927](https://github.com/vector-im/element-web/pull/17927)
|
||||
* Add VS Code to gitignore
|
||||
[\#17982](https://github.com/vector-im/element-web/pull/17982)
|
||||
* Remove canvas native dependencies from Dockerfile
|
||||
[\#17973](https://github.com/vector-im/element-web/pull/17973)
|
||||
* Remove node-canvas devDependency
|
||||
[\#17967](https://github.com/vector-im/element-web/pull/17967)
|
||||
* Add `reskindex` to development steps
|
||||
[\#17926](https://github.com/vector-im/element-web/pull/17926)
|
||||
* Update Modernizr and stop it from polluting classes on the html tag
|
||||
[\#17921](https://github.com/vector-im/element-web/pull/17921)
|
||||
* Convert a few files to TS
|
||||
[\#17895](https://github.com/vector-im/element-web/pull/17895)
|
||||
* Do not generate a lockfile when running in CI
|
||||
[\#17902](https://github.com/vector-im/element-web/pull/17902)
|
||||
* Fix lockfile to match listed dependencies
|
||||
[\#17888](https://github.com/vector-im/element-web/pull/17888)
|
||||
* Remove PostCSS calc() processing
|
||||
[\#17856](https://github.com/vector-im/element-web/pull/17856)
|
||||
* Make issue template styling more consistent and improve PR template
|
||||
[\#17691](https://github.com/vector-im/element-web/pull/17691)
|
||||
* Update jsrsasign to ^10.2.0 (Includes fix for CVE-2021-30246)
|
||||
[\#17170](https://github.com/vector-im/element-web/pull/17170)
|
||||
* Migrate to `eslint-plugin-matrix-org`
|
||||
[\#17847](https://github.com/vector-im/element-web/pull/17847)
|
||||
* Remove spurious overflow: auto on #matrixchat element
|
||||
[\#17647](https://github.com/vector-im/element-web/pull/17647)
|
||||
* Enhance security by disallowing CSP object-src rule
|
||||
[\#17818](https://github.com/vector-im/element-web/pull/17818)
|
||||
|
||||
Changes in [1.7.32](https://github.com/vector-im/element-web/releases/tag/v1.7.32) (2021-07-05)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.32-rc.1...v1.7.32)
|
||||
|
||||
* No changes from rc.1
|
||||
|
||||
Changes in [1.7.32-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.32-rc.1) (2021-06-29)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.31...v1.7.32-rc.1)
|
||||
|
||||
* Update to react-sdk v3.25.0-rc.1 and js-sdk v12.0.1-rc.1
|
||||
* Translations update from Weblate
|
||||
[\#17832](https://github.com/vector-im/element-web/pull/17832)
|
||||
* Fix canvas-filter-polyfill mock path
|
||||
[\#17785](https://github.com/vector-im/element-web/pull/17785)
|
||||
* Mock context-filter-polyfill for app-tests
|
||||
[\#17774](https://github.com/vector-im/element-web/pull/17774)
|
||||
* Add libera.chat to default room directory
|
||||
[\#17772](https://github.com/vector-im/element-web/pull/17772)
|
||||
* Improve typing of Event Index Manager / Seshat
|
||||
[\#17704](https://github.com/vector-im/element-web/pull/17704)
|
||||
* Bump dns-packet from 1.3.1 to 1.3.4
|
||||
[\#17478](https://github.com/vector-im/element-web/pull/17478)
|
||||
* Update matrix-widget-api to fix build issues
|
||||
[\#17747](https://github.com/vector-im/element-web/pull/17747)
|
||||
* Fix whitespace in Dockerfile
|
||||
[\#17742](https://github.com/vector-im/element-web/pull/17742)
|
||||
* Upgrade @types/react and @types/react-dom
|
||||
[\#17723](https://github.com/vector-im/element-web/pull/17723)
|
||||
* Spaces keyboard shortcuts first cut
|
||||
[\#17457](https://github.com/vector-im/element-web/pull/17457)
|
||||
* Labs: feature_report_to_moderators
|
||||
[\#17694](https://github.com/vector-im/element-web/pull/17694)
|
||||
|
||||
Changes in [1.7.31](https://github.com/vector-im/element-web/releases/tag/v1.7.31) (2021-06-21)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.31-rc.1...v1.7.31)
|
||||
|
||||
* Upgrade to React SDK 3.24.0 and JS SDK 12.0.0
|
||||
|
||||
Changes in [1.7.31-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.31-rc.1) (2021-06-15)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.30...v1.7.31-rc.1)
|
||||
|
||||
* Upgrade to React SDK 3.24.0-rc.1 and JS SDK 12.0.0-rc.1
|
||||
* Translations update from Weblate
|
||||
[\#17655](https://github.com/vector-im/element-web/pull/17655)
|
||||
* Upgrade matrix-react-test-utils for React 17 peer deps
|
||||
[\#17653](https://github.com/vector-im/element-web/pull/17653)
|
||||
* Fix lint errors in Webpack config
|
||||
[\#17626](https://github.com/vector-im/element-web/pull/17626)
|
||||
* Preload only `woff2` fonts
|
||||
[\#17614](https://github.com/vector-im/element-web/pull/17614)
|
||||
* ⚛️ Upgrade to React@17
|
||||
[\#17601](https://github.com/vector-im/element-web/pull/17601)
|
||||
|
||||
Changes in [1.7.30](https://github.com/vector-im/element-web/releases/tag/v1.7.30) (2021-06-07)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.30-rc.1...v1.7.30)
|
||||
|
||||
* Upgrade to React SDK 3.23.0 and JS SDK 11.2.0
|
||||
|
||||
Changes in [1.7.30-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.30-rc.1) (2021-06-01)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.29...v1.7.30-rc.1)
|
||||
|
||||
* Upgrade to React SDK 3.23.0-rc.1 and JS SDK 11.2.0-rc.1
|
||||
* Translations update from Weblate
|
||||
[\#17526](https://github.com/vector-im/element-web/pull/17526)
|
||||
* Add Modernizr test for Promise.allSettled given js-sdk and react-sdk depend
|
||||
on it
|
||||
[\#17464](https://github.com/vector-im/element-web/pull/17464)
|
||||
* Bump libolm dependency, and update package name.
|
||||
[\#17433](https://github.com/vector-im/element-web/pull/17433)
|
||||
* Remove logo spinner
|
||||
[\#17423](https://github.com/vector-im/element-web/pull/17423)
|
||||
|
||||
Changes in [1.7.29](https://github.com/vector-im/element-web/releases/tag/v1.7.29) (2021-05-24)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.29-rc.1...v1.7.29)
|
||||
|
||||
## Security notice
|
||||
|
||||
Element Web 1.7.29 fixes (by upgrading to olm 3.2.3) an issue in code used for
|
||||
decrypting server-side stored secrets. The issue could potentially allow a
|
||||
malicious homeserver to cause a stack buffer overflow in the affected function
|
||||
and to control that function's local variables.
|
||||
|
||||
## All changes
|
||||
|
||||
* Upgrade to React SDK 3.22.0 and JS SDK 11.1.0
|
||||
* [Release] Bump libolm dependency, and update package name
|
||||
[\#17456](https://github.com/vector-im/element-web/pull/17456)
|
||||
|
||||
Changes in [1.7.29-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.29-rc.1) (2021-05-19)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.28...v1.7.29-rc.1)
|
||||
|
||||
* Upgrade to React SDK 3.22.0-rc.1 and JS SDK 11.1.0-rc.1
|
||||
* Translations update from Weblate
|
||||
[\#17384](https://github.com/vector-im/element-web/pull/17384)
|
||||
* Prevent minification of `.html` files
|
||||
[\#17349](https://github.com/vector-im/element-web/pull/17349)
|
||||
* Update matrix-widget-api/react-sdk dependency reference
|
||||
[\#17346](https://github.com/vector-im/element-web/pull/17346)
|
||||
* Add `yarn start:https`
|
||||
[\#16989](https://github.com/vector-im/element-web/pull/16989)
|
||||
* Translations update from Weblate
|
||||
[\#17239](https://github.com/vector-im/element-web/pull/17239)
|
||||
* Remove "in development" flag from voice messages labs documentation
|
||||
[\#17204](https://github.com/vector-im/element-web/pull/17204)
|
||||
* Add required webpack+jest config to load Safari support modules
|
||||
[\#17193](https://github.com/vector-im/element-web/pull/17193)
|
||||
|
||||
Changes in [1.7.28](https://github.com/vector-im/element-web/releases/tag/v1.7.28) (2021-05-17)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.28-rc.1...v1.7.28)
|
||||
|
||||
## Security notice
|
||||
|
||||
Element Web 1.7.28 fixes (by upgrading to matrix-react-sdk 3.21.0) a low
|
||||
severity issue (GHSA-8796-gc9j-63rv) related to file upload. When uploading a
|
||||
file, the local file preview can lead to execution of scripts embedded in the
|
||||
uploaded file, but only after several user interactions to open the preview in
|
||||
a separate tab. This only impacts the local user while in the process of
|
||||
uploading. It cannot be exploited remotely or by other users. Thanks to
|
||||
[Muhammad Zaid Ghifari](https://github.com/MR-ZHEEV) for responsibly disclosing
|
||||
this via Matrix's Security Disclosure Policy.
|
||||
|
||||
## All changes
|
||||
|
||||
* Upgrade to React SDK 3.21.0 and JS SDK 11.0.0
|
||||
|
||||
Changes in [1.7.28-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.28-rc.1) (2021-05-11)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.27...v1.7.28-rc.1)
|
||||
|
||||
* Upgrade to React SDK 3.21.0-rc.1 and JS SDK 11.0.0-rc.1
|
||||
* Switch back to release version of `sanitize-html`
|
||||
[\#17231](https://github.com/vector-im/element-web/pull/17231)
|
||||
* Bump url-parse from 1.4.7 to 1.5.1
|
||||
[\#17199](https://github.com/vector-im/element-web/pull/17199)
|
||||
* Bump lodash from 4.17.20 to 4.17.21
|
||||
[\#17205](https://github.com/vector-im/element-web/pull/17205)
|
||||
* Bump hosted-git-info from 2.8.8 to 2.8.9
|
||||
[\#17219](https://github.com/vector-im/element-web/pull/17219)
|
||||
* Disable host checking on the webpack dev server
|
||||
[\#17194](https://github.com/vector-im/element-web/pull/17194)
|
||||
* Bump ua-parser-js from 0.7.23 to 0.7.24
|
||||
[\#17190](https://github.com/vector-im/element-web/pull/17190)
|
||||
|
||||
Changes in [1.7.27](https://github.com/vector-im/element-web/releases/tag/v1.7.27) (2021-05-10)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.27-rc.1...v1.7.27)
|
||||
|
||||
* Upgrade to React SDK 3.20.0 and JS SDK 10.1.0
|
||||
|
||||
Changes in [1.7.27-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.27-rc.1) (2021-05-04)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.26...v1.7.27-rc.1)
|
||||
|
||||
* Upgrade to React SDK 3.20.0-rc.1 and JS SDK 10.1.0-rc.1
|
||||
* Translations update from Weblate
|
||||
[\#17160](https://github.com/vector-im/element-web/pull/17160)
|
||||
* Document option for obeying asserted identity
|
||||
[\#17008](https://github.com/vector-im/element-web/pull/17008)
|
||||
* Implement IPC call to Electron to set language
|
||||
[\#17052](https://github.com/vector-im/element-web/pull/17052)
|
||||
* Convert Vector skin react components to Typescript
|
||||
[\#17061](https://github.com/vector-im/element-web/pull/17061)
|
||||
* Add code quality review policy
|
||||
[\#16980](https://github.com/vector-im/element-web/pull/16980)
|
||||
* Register RecorderWorklet from react-sdk
|
||||
[\#17013](https://github.com/vector-im/element-web/pull/17013)
|
||||
* Preload Inter font to avoid FOIT on slow connections
|
||||
[\#17039](https://github.com/vector-im/element-web/pull/17039)
|
||||
* Disable `postcss-calc`'s noisy `warnWhenCannotResolve` option
|
||||
[\#17041](https://github.com/vector-im/element-web/pull/17041)
|
||||
|
||||
Changes in [1.7.26](https://github.com/vector-im/element-web/releases/tag/v1.7.26) (2021-04-26)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.26-rc.1...v1.7.26)
|
||||
|
||||
* Upgrade to React SDK 3.19.0 and JS SDK 10.0.0
|
||||
|
||||
Changes in [1.7.26-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.26-rc.1) (2021-04-21)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.25...v1.7.26-rc.1)
|
||||
|
||||
* Upgrade to React SDK 3.19.0-rc.1 and JS SDK 10.0.0-rc.1
|
||||
* Translations update from Weblate
|
||||
[\#17031](https://github.com/vector-im/element-web/pull/17031)
|
||||
* Bump ssri from 6.0.1 to 6.0.2
|
||||
[\#17010](https://github.com/vector-im/element-web/pull/17010)
|
||||
* Fix `NODE_ENV` value for CI environments
|
||||
[\#17003](https://github.com/vector-im/element-web/pull/17003)
|
||||
* Use React production mode in CI builds
|
||||
[\#16969](https://github.com/vector-im/element-web/pull/16969)
|
||||
* Labs documentation for DND mode
|
||||
[\#16962](https://github.com/vector-im/element-web/pull/16962)
|
||||
* Rename blackboxing to new option ignore list
|
||||
[\#16965](https://github.com/vector-im/element-web/pull/16965)
|
||||
* Remove velocity-animate from lockfile
|
||||
[\#16963](https://github.com/vector-im/element-web/pull/16963)
|
||||
* Add mobile download link configuration
|
||||
[\#16890](https://github.com/vector-im/element-web/pull/16890)
|
||||
* Switch develop to not-staging Scalar by default
|
||||
[\#16883](https://github.com/vector-im/element-web/pull/16883)
|
||||
* Support a config option to skip login/welcome and go to SSO
|
||||
[\#16880](https://github.com/vector-im/element-web/pull/16880)
|
||||
|
||||
Changes in [1.7.25](https://github.com/vector-im/element-web/releases/tag/v1.7.25) (2021-04-12)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.25-rc.1...v1.7.25)
|
||||
|
||||
* Upgrade to React SDK 3.18.0 and JS SDK 9.11.0
|
||||
|
||||
Changes in [1.7.25-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.25-rc.1) (2021-04-07)
|
||||
=========================================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.24...v1.7.25-rc.1)
|
||||
|
||||
* Upgrade to React SDK 3.18.0-rc.1 and JS SDK 9.11.0-rc.1
|
||||
* Translations update from Weblate
|
||||
[\#16882](https://github.com/vector-im/element-web/pull/16882)
|
||||
* Revert "Docker image: serve pre-compressed assets using gzip_static"
|
||||
[\#16838](https://github.com/vector-im/element-web/pull/16838)
|
||||
* Move native node modules documentation to element-desktop
|
||||
[\#16814](https://github.com/vector-im/element-web/pull/16814)
|
||||
* Add user settings for warn before exit
|
||||
[\#16781](https://github.com/vector-im/element-web/pull/16781)
|
||||
* Change ISSUE_TEMPLATE bold lines to proper headers
|
||||
[\#16768](https://github.com/vector-im/element-web/pull/16768)
|
||||
* Add example for deployment into Kubernetes
|
||||
[\#16447](https://github.com/vector-im/element-web/pull/16447)
|
||||
* Create bare-bones `PULL_REQUEST_TEMPLATE.md`
|
||||
[\#16770](https://github.com/vector-im/element-web/pull/16770)
|
||||
* Add webpack config and labs flag docs for voice messages
|
||||
[\#16705](https://github.com/vector-im/element-web/pull/16705)
|
||||
|
||||
Changes in [1.7.24](https://github.com/vector-im/element-web/releases/tag/v1.7.24) (2021-03-29)
|
||||
===============================================================================================
|
||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.24-rc.1...v1.7.24)
|
||||
@@ -346,12 +62,12 @@ Changes in [1.7.22](https://github.com/vector-im/element-web/releases/tag/v1.7.2
|
||||
|
||||
## Security notice
|
||||
|
||||
Element Web 1.7.22 fixes (by upgrading to matrix-react-sdk 3.15.0) a moderate
|
||||
Element Web 1.7.22 fixes (by upgrading to matrix-react-sdk 3.15.0) a low
|
||||
severity issue (CVE-2021-21320) where the user content sandbox can be abused to
|
||||
trick users into opening unexpected documents after several user interactions.
|
||||
The content can be opened with a `blob` origin from the Matrix client, so it is
|
||||
possible for a malicious document to access user messages and secrets. Thanks to
|
||||
@keerok for responsibly disclosing this via Matrix's Security Disclosure Policy.
|
||||
trick users into opening unexpected documents. The content is opened with a
|
||||
`blob` origin that cannot access Matrix user data, so messages and secrets are
|
||||
not at risk. Thanks to @keerok for responsibly disclosing this via Matrix's
|
||||
Security Disclosure Policy.
|
||||
|
||||
## All changes
|
||||
|
||||
|
||||
@@ -9,7 +9,10 @@ ARG REACT_SDK_BRANCH="master"
|
||||
ARG JS_SDK_REPO="https://github.com/matrix-org/matrix-js-sdk.git"
|
||||
ARG JS_SDK_BRANCH="master"
|
||||
|
||||
RUN apt-get update && apt-get install -y git dos2unix
|
||||
RUN apt-get update && apt-get install -y git dos2unix \
|
||||
# These packages are required for building Canvas on architectures like Arm
|
||||
# See https://www.npmjs.com/package/canvas#compiling
|
||||
build-essential libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev
|
||||
|
||||
WORKDIR /src
|
||||
|
||||
@@ -34,4 +37,4 @@ COPY --from=builder /src/webapp /app
|
||||
RUN sed -i '3i\ \ \ \ application/wasm wasm\;' /etc/nginx/mime.types
|
||||
|
||||
RUN rm -rf /usr/share/nginx/html \
|
||||
&& ln -s /app /usr/share/nginx/html
|
||||
&& ln -s /app /usr/share/nginx/html
|
||||
|
||||
11
README.md
11
README.md
@@ -202,12 +202,6 @@ docker build -t \
|
||||
.
|
||||
```
|
||||
|
||||
Running in Kubernetes
|
||||
=====================
|
||||
|
||||
The provided element-web docker image can also be run from within a Kubernetes cluster.
|
||||
See the [Kubernetes example](docs/kubernetes.md) for more details.
|
||||
|
||||
config.json
|
||||
===========
|
||||
|
||||
@@ -298,15 +292,14 @@ cd element-web
|
||||
yarn link matrix-js-sdk
|
||||
yarn link matrix-react-sdk
|
||||
yarn install
|
||||
yarn reskindex
|
||||
yarn start
|
||||
```
|
||||
|
||||
|
||||
Wait a few seconds for the initial build to finish; you should see something like:
|
||||
```
|
||||
[element-js] <s> [webpack.Progress] 100%
|
||||
[element-js]
|
||||
[element-js] <s> [webpack.Progress] 100%
|
||||
[element-js]
|
||||
[element-js] ℹ 「wdm」: 1840 modules
|
||||
[element-js] ℹ 「wdm」: Compiled successfully.
|
||||
```
|
||||
|
||||
@@ -10,6 +10,7 @@ module.exports = {
|
||||
],
|
||||
}],
|
||||
"@babel/preset-typescript",
|
||||
"@babel/preset-flow",
|
||||
"@babel/preset-react",
|
||||
],
|
||||
"plugins": [
|
||||
@@ -20,6 +21,7 @@ module.exports = {
|
||||
"@babel/plugin-proposal-object-rest-spread",
|
||||
"@babel/plugin-proposal-optional-chaining",
|
||||
"@babel/plugin-proposal-nullish-coalescing-operator",
|
||||
"@babel/plugin-transform-flow-comments",
|
||||
"@babel/plugin-syntax-dynamic-import",
|
||||
"@babel/plugin-transform-runtime",
|
||||
],
|
||||
|
||||
@@ -25,7 +25,9 @@
|
||||
"bug_report_endpoint_url": "https://element.io/bugreports/submit",
|
||||
"defaultCountryCode": "GB",
|
||||
"showLabsSettings": false,
|
||||
"features": { },
|
||||
"features": {
|
||||
"feature_new_spinner": false
|
||||
},
|
||||
"default_federate": true,
|
||||
"default_theme": "light",
|
||||
"roomDirectory": {
|
||||
|
||||
@@ -22,12 +22,9 @@ For a good example, see https://develop.element.io/config.json.
|
||||
`default_hs_url` is specified. When multiple sources are specified, it is unclear
|
||||
which should take priority and therefore the application cannot continue.
|
||||
* As of Element 1.4.0, identity servers are optional. See [Identity servers](#identity-servers) below.
|
||||
1. `sso_immediate_redirect`: When `true`, Element will assume the default server supports SSO
|
||||
and attempt to send the user there to continue (if they aren't already logged in). Default
|
||||
`false`. Note that this disables all usage of the welcome page.
|
||||
1. `features`: Lookup of optional features that may be force-enabled (`true`) or force-disabled (`false`).
|
||||
When features are not listed here, their defaults will be used, and users can turn them on/off if `showLabsSettings`
|
||||
allows them to. The available optional experimental features vary from release to release and are
|
||||
allows them to. The available optional experimental features vary from release to release and are
|
||||
[documented](labs.md). The feature flag process is [documented](feature-flags.md) as well.
|
||||
1. `showLabsSettings`: Shows the "labs" tab of user settings. Useful to allow users to turn on experimental features
|
||||
they might not otherwise have access to.
|
||||
@@ -76,7 +73,7 @@ For a good example, see https://develop.element.io/config.json.
|
||||
not selected. By default, no home page is configured. If one is set, a
|
||||
button to access it will be shown in the top left menu.
|
||||
1. `loginForWelcome`: Overrides `welcomeUrl` to make the welcome page be the
|
||||
same page as the login page when `true`. This effectively disables the
|
||||
same page as the login page when `true`. This effectively disables the
|
||||
welcome page.
|
||||
1. `defaultCountryCode`: The ISO 3166 alpha2 country code to use when showing
|
||||
country selectors, like the phone number input on the registration page.
|
||||
@@ -116,26 +113,12 @@ For a good example, see https://develop.element.io/config.json.
|
||||
1. `logo`: An HTTP URL to the avatar for the desktop build. Should be 24x24, ideally
|
||||
an SVG.
|
||||
1. `url`: An HTTP URL for where to send the user to download the desktop build.
|
||||
1. `mobileBuilds`: Used to alter promotional links to the mobile app. By default the
|
||||
builds are considered available and accessible from https://element.io. This config
|
||||
option is typically used in a context of encouraging the user to try the mobile app
|
||||
instead of a mobile/incompatible browser.
|
||||
1. `ios`: The URL to the iOS build. If `null`, it will be assumed to be not available.
|
||||
If not set, the default element.io builds will be used.
|
||||
1. `android`: The URL to the Android build. If `null`, it will be assumed to be not available.
|
||||
If not set, the default element.io builds will be used.
|
||||
1. `fdroid`: The URL to the FDroid build. If `null`, it will be assumed to be not available.
|
||||
If not set, the default element.io builds will be used.
|
||||
1. `mobileGuideToast`: Whether to show a toast a startup which nudges users on
|
||||
iOS and Android towards the native mobile apps. The toast redirects to the
|
||||
mobile guide if they accept. Defaults to false.
|
||||
1. `audioStreamUrl`: If supplied, show an option on Jitsi widgets to stream
|
||||
audio using Jitsi's live streaming feature. This option is experimental and
|
||||
may be removed at any time without notice.
|
||||
1. `voip`: Behaviour related to calls
|
||||
1. `obeyAssertedIdentity`: If set, MSC3086 asserted identity messages sent
|
||||
on VoIP calls will cause the call to appear in the room corresponding to the
|
||||
asserted identity. This *must* only be set in trusted environments.
|
||||
|
||||
Note that `index.html` also has an og:image meta tag that is set to an image
|
||||
hosted on riot.im. This is the image used if links to your copy of Element
|
||||
|
||||
@@ -1,187 +0,0 @@
|
||||
Running in Kubernetes
|
||||
=====================
|
||||
|
||||
In case you would like to deploy element-web in a kubernetes cluster you can use
|
||||
the provided Kubernetes example below as a starting point. Note that this example assumes the
|
||||
Nginx ingress to be installed.
|
||||
|
||||
Note that the content of the required `config.json` is defined inside this yaml because it needs
|
||||
to be put in your Kubernetes cluster as a `ConfigMap`.
|
||||
|
||||
So to use it you must create a file with this content as a starting point and modify it so it meets
|
||||
the requirements of your environment.
|
||||
|
||||
Then you can deploy it to your cluster with something like `kubectl apply -f my-element-web.yaml`.
|
||||
|
||||
# This is an example of a POSSIBLE config for deploying a single element-web instance in Kubernetes
|
||||
|
||||
# Use the element-web namespace to put it all in.
|
||||
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: element-web
|
||||
|
||||
---
|
||||
|
||||
# The config.json file is to be put into Kubernetes as a config file in such a way that
|
||||
# the element web instance can read it.
|
||||
# The code below shows how this can be done with the config.sample.json content.
|
||||
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: element-config
|
||||
namespace: element-web
|
||||
data:
|
||||
config.json: |
|
||||
{
|
||||
"default_server_config": {
|
||||
"m.homeserver": {
|
||||
"base_url": "https://matrix-client.matrix.org",
|
||||
"server_name": "matrix.org"
|
||||
},
|
||||
"m.identity_server": {
|
||||
"base_url": "https://vector.im"
|
||||
}
|
||||
},
|
||||
"disable_custom_urls": false,
|
||||
"disable_guests": false,
|
||||
"disable_login_language_selector": false,
|
||||
"disable_3pid_login": false,
|
||||
"brand": "Element",
|
||||
"integrations_ui_url": "https://scalar.vector.im/",
|
||||
"integrations_rest_url": "https://scalar.vector.im/api",
|
||||
"integrations_widgets_urls": [
|
||||
"https://scalar.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar.vector.im/api",
|
||||
"https://scalar-staging.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar-staging.vector.im/api",
|
||||
"https://scalar-staging.riot.im/scalar/api"
|
||||
],
|
||||
"bug_report_endpoint_url": "https://element.io/bugreports/submit",
|
||||
"defaultCountryCode": "GB",
|
||||
"showLabsSettings": false,
|
||||
"features": { },
|
||||
"default_federate": true,
|
||||
"default_theme": "light",
|
||||
"roomDirectory": {
|
||||
"servers": [
|
||||
"matrix.org"
|
||||
]
|
||||
},
|
||||
"piwik": {
|
||||
"url": "https://piwik.riot.im/",
|
||||
"whitelistedHSUrls": ["https://matrix.org"],
|
||||
"whitelistedISUrls": ["https://vector.im", "https://matrix.org"],
|
||||
"siteId": 1
|
||||
},
|
||||
"enable_presence_by_hs_url": {
|
||||
"https://matrix.org": false,
|
||||
"https://matrix-client.matrix.org": false
|
||||
},
|
||||
"settingDefaults": {
|
||||
"breadcrumbs": true
|
||||
},
|
||||
"jitsi": {
|
||||
"preferredDomain": "jitsi.riot.im"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
---
|
||||
|
||||
# A deployment of the element-web for a single instance
|
||||
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: element
|
||||
namespace: element-web
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: element
|
||||
replicas: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: element
|
||||
spec:
|
||||
containers:
|
||||
- name: element
|
||||
image: vectorim/element-web:latest
|
||||
volumeMounts:
|
||||
- name: config-volume
|
||||
mountPath: /app/config.json
|
||||
subPath: config.json
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: element
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: element
|
||||
initialDelaySeconds: 2
|
||||
periodSeconds: 3
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: element
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
volumes:
|
||||
- name: config-volume
|
||||
configMap:
|
||||
name: element-config
|
||||
|
||||
---
|
||||
|
||||
# Wrap it all in a Service
|
||||
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: element
|
||||
namespace: element-web
|
||||
spec:
|
||||
selector:
|
||||
app: element
|
||||
ports:
|
||||
- name: default
|
||||
protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
|
||||
---
|
||||
|
||||
# An ingress definition to expose the service via a hostname
|
||||
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: element
|
||||
namespace: element-web
|
||||
annotations:
|
||||
kubernetes.io/ingress.class: nginx
|
||||
nginx.ingress.kubernetes.io/configuration-snippet: |
|
||||
add_header X-Frame-Options SAMEORIGIN;
|
||||
add_header X-Content-Type-Options nosniff;
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
add_header Content-Security-Policy "frame-ancestors 'none'";
|
||||
spec:
|
||||
rules:
|
||||
- host: element.example.nl
|
||||
http:
|
||||
paths:
|
||||
- pathType: Prefix
|
||||
path: /
|
||||
backend:
|
||||
service:
|
||||
name: element
|
||||
port:
|
||||
number: 80
|
||||
|
||||
---
|
||||
|
||||
22
docs/labs.md
22
docs/labs.md
@@ -7,11 +7,6 @@ to `Settings->Labs`. This list is non-exhaustive and subject to change, chat in
|
||||
**Be warned! Labs features are not finalised, they may be fragile, they may change, they may be
|
||||
dropped. Ask in the room if you are unclear about any details here.**
|
||||
|
||||
## Submit Abuse Report to Moderators [MSC3215](https://github.com/matrix-org/matrix-doc/pull/3215) support (`feature_report_to_moderators`)
|
||||
|
||||
A new version of the "Report" dialog that lets users send abuse reports directly to room moderators,
|
||||
if the room supports it.
|
||||
|
||||
## Matrix Spaces [MSC1772](https://github.com/matrix-org/matrix-doc/pull/1772) support (`feature_spaces`)
|
||||
|
||||
Enables showing, using, creating, and managing spaces. Create Spaces from the all new Space Panel (to left of Room List).
|
||||
@@ -24,6 +19,10 @@ Still in heavy development.
|
||||
|
||||
Enables rendering of LaTeX maths in messages using [KaTeX](https://katex.org/). LaTeX between single dollar-signs is interpreted as inline maths and double dollar-signs as display maths (i.e. centred on its own line).
|
||||
|
||||
## New spinner design (`feature_new_spinner`)
|
||||
|
||||
Replaces the old spinner image with a new, svg-based one featuring a sleeker design.
|
||||
|
||||
## Message pinning (`feature_pinning`)
|
||||
|
||||
Allows you to pin messages in the room. To pin a message, use the 3 dots to the right of the message
|
||||
@@ -124,16 +123,3 @@ or feedback for this functionality at this time.
|
||||
|
||||
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).
|
||||
|
||||
## Voice messages (`feature_voice_messages`)
|
||||
|
||||
Offers a way to send more time-sensitive information through the power of voice. When enabled, use the microphone
|
||||
icon on the lower right to start recording your message. You will have a chance to review after you're done recording,
|
||||
and if it sounds fine then send it off for the rest of the room to hear.
|
||||
|
||||
Voice messages are automatically downloaded to ensure they are ready for playback as soon as possible.
|
||||
|
||||
## Do not disturb (`feature_dnd`)
|
||||
|
||||
Enables UI for turning on "do not disturb" mode for the current device. When DND mode is engaged, popups
|
||||
and notification noises are suppressed. Not perfect, but can help reduce noise.
|
||||
|
||||
@@ -1,3 +1,60 @@
|
||||
# Native Node Modules
|
||||
|
||||
This documentation moved to the [`element-desktop`](https://github.com/vector-im/element-desktop/blob/develop/docs/native-node-modules.md) repository.
|
||||
For some features, the desktop version of Element can make use of native Node
|
||||
modules. These allow Riot to integrate with the desktop in ways that a browser
|
||||
cannot.
|
||||
|
||||
While native modules enable powerful new features, they must be complied for
|
||||
each operating system. For official Element releases, we will always build these
|
||||
modules from source to ensure we can trust the compiled output. In the future,
|
||||
we may offer a pre-compiled path for those who want to use these features in a
|
||||
custom build of Element without installing the various build tools required.
|
||||
|
||||
Do note that compiling a module for a particular operating system
|
||||
(Linux/macOS/Windows) will need to be done on that operating system.
|
||||
Cross-compiling from a host OS for a different target OS may be possible, but
|
||||
we don't support this flow with Element dependencies at this time.
|
||||
|
||||
At the moment, we need to make some changes to the Element release process before
|
||||
we can support native Node modules at release time, so these features are
|
||||
currently disabled by default until that is resolved. The following sections
|
||||
explain the manual steps you can use with a custom build of Element to enable
|
||||
these features if you'd like to try them out.
|
||||
|
||||
## Adding Seshat for search in E2E encrypted rooms
|
||||
|
||||
Seshat is a native Node module that adds support for local event indexing and
|
||||
full text search in E2E encrypted rooms.
|
||||
|
||||
Since Seshat is written in Rust, the Rust compiler and related tools need to be
|
||||
installed before installing Seshat itself. To install Rust please consult the
|
||||
official Rust [documentation](https://www.rust-lang.org/tools/install).
|
||||
|
||||
Seshat also depends on the SQLCipher library to store its data in encrypted form
|
||||
on disk. You'll need to install it via your OS package manager.
|
||||
|
||||
After installing the Rust compiler and SQLCipher, Seshat support can be added
|
||||
using yarn inside the `electron_app/` directory:
|
||||
|
||||
yarn add matrix-seshat
|
||||
|
||||
You will have to rebuild the native libraries against electron's version of
|
||||
of node rather than your system node, using the `electron-build-env` tool.
|
||||
This is also needed to when pulling in changes to Seshat using `yarn link`.
|
||||
Again from the `electron_app/` directory:
|
||||
|
||||
yarn add electron-build-env
|
||||
|
||||
Recompiling Seshat itself can be done like so:
|
||||
|
||||
yarn run electron-build-env -- --electron 6.1.1 -- neon build matrix-seshat --release
|
||||
|
||||
Please make sure to include all the `--` as well as the `--release` command line
|
||||
switch at the end. Modify your electron version accordingly depending on the
|
||||
version that is installed on your system.
|
||||
|
||||
After this is done the Electron version of Element can be run from the main folder
|
||||
as usual using:
|
||||
|
||||
yarn electron
|
||||
|
||||
|
||||
@@ -58,43 +58,6 @@ When reviewing code, here are some things we look for and also things we avoid:
|
||||
* Assign issues only when in progress to indicate to others what can be picked
|
||||
up
|
||||
|
||||
## Code Quality
|
||||
|
||||
In the past, we have occasionally written different kinds of tests for
|
||||
Element and the SDKs, but it hasn't been a consistent focus. Going forward, we'd
|
||||
like to change that.
|
||||
|
||||
* For new features, code reviewers will expect some form of automated testing to
|
||||
be included by default
|
||||
* For bug fixes, regression tests are of course great to have, but we don't want
|
||||
to block fixes on this, so we won't require them at this time
|
||||
|
||||
The above policy is not a strict rule, but instead it's meant to be a
|
||||
conversation between the author and reviewer. As an author, try to think about
|
||||
writing a test when making your next change. As a reviewer, try to think about
|
||||
how you might test the area of code you are reviewing. If the reviewer agrees
|
||||
it would be quite difficult to test some new feature, then it's okay for them to
|
||||
accept the change without tests for now, but we'd eventually like to be more
|
||||
strict about this further down the road.
|
||||
|
||||
If you do spot areas that are quite hard to test today, please let us know in
|
||||
[#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org). We can
|
||||
work on improving the app architecture and testing helpers so that future tests
|
||||
are easier for everyone to write, but we won't know which parts are difficult
|
||||
unless people shout when stumbling through them.
|
||||
|
||||
We recognise that this testing policy will slow things down a bit, but overall
|
||||
it should encourage better long-term health of the app and give everyone more
|
||||
confidence when making changes as coverage increases over time.
|
||||
|
||||
For changes guarded by a feature flag, we currently lean towards prioritising
|
||||
our ability to evolve quickly using such flags and thus we will not currently
|
||||
require tests to appear at the same time as the initial landing of features
|
||||
guarded by flags, as long as (for new flagged features going forward) the
|
||||
feature author understands that they are effectively deferring part of their
|
||||
work (adding tests) until later and tests are expected to appear before the
|
||||
feature can be enabled by default.
|
||||
|
||||
## Design and Product Review
|
||||
|
||||
We want to ensure that all changes to Element fit with our design and product
|
||||
@@ -116,5 +79,5 @@ easily.
|
||||
|
||||
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
|
||||
[#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org) before
|
||||
you start so we can ensure it's something we'd be willing to merge.
|
||||
[#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org) before you
|
||||
start so we can ensure it's something we'd be willing to merge.
|
||||
|
||||
@@ -8,9 +8,8 @@
|
||||
|
||||
## Step 0: Join #element-translations:matrix.org
|
||||
|
||||
1. Come and join https://matrix.to/#/#element-translations:matrix.org for general discussion
|
||||
2. Join https://matrix.to/#/#element-translators:matrix.org for language-specific rooms
|
||||
3. Read scrollback and/or ask if anyone else is working on your language, and co-ordinate if needed. In general little-or-no coordination is needed though :)
|
||||
1. Come and join https://matrix.to/#/#element-translations:matrix.org
|
||||
2. Read scrollback and/or ask if anyone else is working on your language, and co-ordinate if needed. In general little-or-no coordination is needed though :)
|
||||
|
||||
## Step 1: Preparing your Weblate Profile
|
||||
|
||||
|
||||
@@ -21,8 +21,7 @@
|
||||
"roomDirectory": {
|
||||
"servers": [
|
||||
"matrix.org",
|
||||
"gitter.im",
|
||||
"libera.chat"
|
||||
"gitter.im"
|
||||
]
|
||||
},
|
||||
"enable_presence_by_hs_url": {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"default_server_name": "matrix.org",
|
||||
"brand": "Element",
|
||||
"integrations_ui_url": "https://scalar.vector.im/",
|
||||
"integrations_rest_url": "https://scalar.vector.im/api",
|
||||
"integrations_ui_url": "https://scalar-staging.vector.im/",
|
||||
"integrations_rest_url": "https://scalar-staging.vector.im/api",
|
||||
"integrations_widgets_urls": [
|
||||
"https://scalar.vector.im/_matrix/integrations/v1",
|
||||
"https://scalar.vector.im/api",
|
||||
@@ -21,8 +21,7 @@
|
||||
"roomDirectory": {
|
||||
"servers": [
|
||||
"matrix.org",
|
||||
"gitter.im",
|
||||
"libera.chat"
|
||||
"gitter.im"
|
||||
]
|
||||
},
|
||||
"enable_presence_by_hs_url": {
|
||||
|
||||
74
package.json
74
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "element-web",
|
||||
"version": "1.7.33",
|
||||
"version": "1.7.24",
|
||||
"description": "A feature-rich client for Matrix.org",
|
||||
"author": "New Vector Ltd.",
|
||||
"repository": {
|
||||
@@ -29,7 +29,7 @@
|
||||
"scripts": {
|
||||
"i18n": "matrix-gen-i18n",
|
||||
"prunei18n": "matrix-prune-i18n",
|
||||
"diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && matrix-gen-i18n && matrix-compare-i18n-files src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json",
|
||||
"diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && yarn i18n && node scripts/compare-file.js src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json",
|
||||
"reskindex": "reskindex -h src/header",
|
||||
"reskindex:watch": "reskindex -h src/header -w",
|
||||
"reskindex:watch-react": "node scripts/yarn-sub.js matrix-react-sdk reskindex:watch",
|
||||
@@ -44,36 +44,32 @@
|
||||
"build:bundle-stats": "webpack --progress --bail --mode production --json > webpack-stats.json",
|
||||
"dist": "scripts/package.sh",
|
||||
"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:https": "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 --https\"",
|
||||
"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 --disable-host-check",
|
||||
"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:js": "eslint --max-warnings 0 src",
|
||||
"lint:js-fix": "eslint --fix src",
|
||||
"lint:js": "eslint src",
|
||||
"lint:types": "tsc --noEmit --jsx react",
|
||||
"lint:style": "stylelint 'res/css/**/*.scss'",
|
||||
"test": "jest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
||||
"browser-request": "^0.3.3",
|
||||
"gfm.css": "^1.1.2",
|
||||
"highlight.js": "^10.5.0",
|
||||
"jsrsasign": "^10.2.0",
|
||||
"jsrsasign": "^10.1.5",
|
||||
"katex": "^0.12.0",
|
||||
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
|
||||
"matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop",
|
||||
"matrix-widget-api": "^0.1.0-beta.15",
|
||||
"matrix-js-sdk": "9.10.0",
|
||||
"matrix-react-sdk": "3.17.0",
|
||||
"matrix-widget-api": "^0.1.0-beta.13",
|
||||
"olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz",
|
||||
"prop-types": "^15.7.2",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"sanitize-html": "^2.3.2",
|
||||
"ua-parser-js": "^0.7.24"
|
||||
"react": "^16.14.0",
|
||||
"react-dom": "^16.14.0",
|
||||
"sanitize-html": "github:apostrophecms/sanitize-html#3c7f93f2058f696f5359e3e58d464161647226db",
|
||||
"ua-parser-js": "^0.7.23"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.12.10",
|
||||
"@babel/eslint-parser": "^7.12.10",
|
||||
"@babel/eslint-plugin": "^7.12.10",
|
||||
"@babel/plugin-proposal-class-properties": "^7.12.1",
|
||||
"@babel/plugin-proposal-decorators": "^7.12.12",
|
||||
"@babel/plugin-proposal-export-default-from": "^7.12.1",
|
||||
@@ -82,51 +78,53 @@
|
||||
"@babel/plugin-proposal-object-rest-spread": "^7.12.1",
|
||||
"@babel/plugin-proposal-optional-chaining": "^7.12.7",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@babel/plugin-transform-flow-comments": "^7.12.1",
|
||||
"@babel/plugin-transform-runtime": "^7.12.10",
|
||||
"@babel/preset-env": "^7.12.11",
|
||||
"@babel/preset-flow": "^7.12.1",
|
||||
"@babel/preset-react": "^7.12.10",
|
||||
"@babel/preset-typescript": "^7.12.7",
|
||||
"@babel/register": "^7.12.10",
|
||||
"@babel/runtime": "^7.12.5",
|
||||
"@principalstudio/html-webpack-inject-preload": "^1.2.7",
|
||||
"@types/flux": "^3.1.9",
|
||||
"@types/modernizr": "^3.5.3",
|
||||
"@types/node": "^14.14.22",
|
||||
"@types/react": "^17.0.2",
|
||||
"@types/react-dom": "^17.0.2",
|
||||
"@types/sanitize-html": "^2.3.1",
|
||||
"@typescript-eslint/eslint-plugin": "^4.17.0",
|
||||
"@typescript-eslint/parser": "^4.17.0",
|
||||
"@types/react": "^16.9",
|
||||
"@types/react-dom": "^16.9.10",
|
||||
"@types/sanitize-html": "^1.27.1",
|
||||
"autoprefixer": "^9.8.6",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"babel-jest": "^26.6.3",
|
||||
"babel-loader": "^8.2.2",
|
||||
"canvas": "^2.6.1",
|
||||
"chokidar": "^3.5.1",
|
||||
"concurrently": "^5.3.0",
|
||||
"cpx": "^1.5.0",
|
||||
"css-loader": "^3.6.0",
|
||||
"eslint": "7.18.0",
|
||||
"eslint-config-google": "^0.14.0",
|
||||
"eslint-plugin-matrix-org": "github:matrix-org/eslint-plugin-matrix-org#main",
|
||||
"eslint-config-matrix-org": "^0.2.0",
|
||||
"eslint-plugin-babel": "^5.3.1",
|
||||
"eslint-plugin-flowtype": "^5.2.0",
|
||||
"eslint-plugin-react": "^7.22.0",
|
||||
"eslint-plugin-react-hooks": "^4.2.0",
|
||||
"extract-text-webpack-plugin": "^4.0.0-beta.0",
|
||||
"fake-indexeddb": "^3.1.2",
|
||||
"file-loader": "^5.1.0",
|
||||
"fs-extra": "^0.30.0",
|
||||
"html-webpack-plugin": "^4.5.2",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"jest": "^26.6.3",
|
||||
"jest-environment-jsdom-sixteen": "^1.0.3",
|
||||
"json-loader": "^0.5.7",
|
||||
"loader-utils": "^1.4.0",
|
||||
"matrix-mock-request": "^1.2.3",
|
||||
"matrix-react-test-utils": "^0.2.3",
|
||||
"matrix-web-i18n": "github:matrix-org/matrix-web-i18n",
|
||||
"matrix-react-test-utils": "^0.2.2",
|
||||
"mini-css-extract-plugin": "^0.12.0",
|
||||
"minimist": "^1.2.5",
|
||||
"mkdirp": "^1.0.4",
|
||||
"modernizr": "^3.11.7",
|
||||
"modernizr": "^3.11.4",
|
||||
"node-fetch": "^2.6.1",
|
||||
"optimize-css-assets-webpack-plugin": "^5.0.4",
|
||||
"postcss-calc": "^7.0.5",
|
||||
"postcss-easings": "^2.0.0",
|
||||
"postcss-extend": "^1.0.5",
|
||||
"postcss-hexrgba": "^2.0.1",
|
||||
@@ -142,19 +140,19 @@
|
||||
"shell-escape": "^0.2.0",
|
||||
"simple-proxy-agent": "^1.1.0",
|
||||
"stylelint": "^13.9.0",
|
||||
"stylelint-config-standard": "^20.0.0",
|
||||
"stylelint-scss": "^3.18.0",
|
||||
"terser-webpack-plugin": "^2.3.8",
|
||||
"typescript": "^4.1.3",
|
||||
"webpack": "^4.46.0",
|
||||
"webpack-cli": "^3.3.12",
|
||||
"webpack-dev-server": "^3.11.2",
|
||||
"worker-loader": "^2.0.0"
|
||||
"webpack-dev-server": "^3.11.2"
|
||||
},
|
||||
"resolutions": {
|
||||
"**/@types/react": "^16.14"
|
||||
},
|
||||
"jest": {
|
||||
"testEnvironment": "jest-environment-jsdom-sixteen",
|
||||
"testMatch": [
|
||||
"<rootDir>/test/**/*-test.[tj]s"
|
||||
"<rootDir>/test/**/*-test.js"
|
||||
],
|
||||
"setupFilesAfterEnv": [
|
||||
"<rootDir>/node_modules/matrix-react-sdk/test/setupTests.js"
|
||||
@@ -167,13 +165,7 @@
|
||||
"^react$": "<rootDir>/node_modules/react",
|
||||
"^react-dom$": "<rootDir>/node_modules/react-dom",
|
||||
"^matrix-js-sdk$": "<rootDir>/node_modules/matrix-js-sdk/src",
|
||||
"^matrix-react-sdk$": "<rootDir>/node_modules/matrix-react-sdk/src",
|
||||
"decoderWorker\\.min\\.js": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/empty.js",
|
||||
"decoderWorker\\.min\\.wasm": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/empty.js",
|
||||
"waveWorker\\.min\\.js": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/empty.js",
|
||||
"context-filter-polyfill": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/empty.js",
|
||||
"FontManager.ts": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/FontManager.js",
|
||||
"workers/(.+)\\.worker\\.ts": "<rootDir>/node_modules/matrix-react-sdk/__mocks__/workerMock.js"
|
||||
"^matrix-react-sdk$": "<rootDir>/node_modules/matrix-react-sdk/src"
|
||||
},
|
||||
"transformIgnorePatterns": [
|
||||
"/node_modules/(?!matrix-js-sdk).+$",
|
||||
|
||||
@@ -14,4 +14,4 @@ JSSDK_SHA=$(cd node_modules/matrix-js-sdk; git rev-parse --short=12 HEAD)
|
||||
|
||||
VECTOR_SHA=$(git rev-parse --short=12 HEAD) # use the ACTUAL SHA rather than assume develop
|
||||
|
||||
CI_PACKAGE=true DIST_VERSION=$VECTOR_SHA-react-$REACT_SHA-js-$JSSDK_SHA scripts/package.sh
|
||||
CI_PACKAGE=true DIST_VERSION=$VECTOR_SHA-react-$REACT_SHA-js-$JSSDK_SHA scripts/package.sh -d
|
||||
|
||||
10
scripts/compare-file.js
Normal file
10
scripts/compare-file.js
Normal file
@@ -0,0 +1,10 @@
|
||||
const fs = require("fs");
|
||||
|
||||
if (process.argv.length < 4) throw new Error("Missing source and target file arguments");
|
||||
|
||||
const sourceFile = fs.readFileSync(process.argv[2], 'utf8');
|
||||
const targetFile = fs.readFileSync(process.argv[3], 'utf8');
|
||||
|
||||
if (sourceFile !== targetFile) {
|
||||
throw new Error("Files do not match");
|
||||
}
|
||||
@@ -69,7 +69,7 @@ const COPY_LIST = [
|
||||
["res/vector-icons/**", "webapp/vector-icons"],
|
||||
["res/decoder-ring/**", "webapp/decoder-ring"],
|
||||
["node_modules/matrix-react-sdk/res/media/**", "webapp/media"],
|
||||
["node_modules/@matrix-org/olm/olm_legacy.js", "webapp", { directwatch: 1 }],
|
||||
["node_modules/olm/olm_legacy.js", "webapp", { directwatch: 1 }],
|
||||
["./config.json", "webapp", { directwatch: 1 }],
|
||||
["contribute.json", "webapp"],
|
||||
];
|
||||
|
||||
@@ -76,7 +76,7 @@ dodep matrix-org matrix-js-sdk
|
||||
|
||||
pushd matrix-js-sdk
|
||||
yarn link
|
||||
yarn install --pure-lockfile
|
||||
yarn install
|
||||
popd
|
||||
|
||||
yarn link matrix-js-sdk
|
||||
@@ -90,7 +90,7 @@ dodep matrix-org matrix-react-sdk
|
||||
pushd matrix-react-sdk
|
||||
yarn link
|
||||
yarn link matrix-js-sdk
|
||||
yarn install --pure-lockfile
|
||||
yarn install
|
||||
yarn reskindex
|
||||
popd
|
||||
|
||||
|
||||
2
src/@types/global.d.ts
vendored
2
src/@types/global.d.ts
vendored
@@ -15,7 +15,7 @@ limitations under the License.
|
||||
*/
|
||||
|
||||
import "matrix-react-sdk/src/@types/global"; // load matrix-react-sdk's type extensions first
|
||||
import type { Renderer } from "react-dom";
|
||||
import type {Renderer} from "react-dom";
|
||||
|
||||
type ElectronChannel =
|
||||
"app_onAction" |
|
||||
|
||||
@@ -27,55 +27,7 @@ interface IProps {
|
||||
}
|
||||
|
||||
const CompatibilityView: React.FC<IProps> = ({ onAccept }) => {
|
||||
const { brand, mobileBuilds } = SdkConfig.get();
|
||||
|
||||
let ios = null;
|
||||
const iosCustomUrl = mobileBuilds?.ios;
|
||||
if (iosCustomUrl !== null) { // could be undefined or a string
|
||||
ios = <>
|
||||
<p><strong>iOS</strong> (iPhone or iPad)</p>
|
||||
<a
|
||||
href={iosCustomUrl || "https://apps.apple.com/app/vector/id1083446067"}
|
||||
target="_blank"
|
||||
className="mx_ClearDecoration"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/apple.svg" alt="Apple App Store" />
|
||||
</a>
|
||||
</>;
|
||||
}
|
||||
|
||||
let android = [<p className="mx_Spacer" key="header"><strong>Android</strong></p>];
|
||||
const andCustomUrl = mobileBuilds?.android;
|
||||
const fdroidCustomUrl = mobileBuilds?.fdroid;
|
||||
if (andCustomUrl !== null) { // undefined or string
|
||||
android.push(<a
|
||||
href={andCustomUrl || "https://play.google.com/store/apps/details?id=im.vector.app"}
|
||||
target="_blank"
|
||||
className="mx_ClearDecoration"
|
||||
key="android"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/google.svg" alt="Google Play Store" />
|
||||
</a>);
|
||||
}
|
||||
if (fdroidCustomUrl !== null) { // undefined or string
|
||||
android.push(<a
|
||||
href={fdroidCustomUrl || "https://f-droid.org/repository/browse/?fdid=im.vector.app"}
|
||||
target="_blank"
|
||||
className="mx_ClearDecoration"
|
||||
key="fdroid"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/fdroid.svg" alt="F-Droid" />
|
||||
</a>);
|
||||
}
|
||||
if (android.length === 1) { // just a header, meaning no links
|
||||
android = [];
|
||||
}
|
||||
|
||||
let mobileHeader = <h2 id="step2_heading">{ _t("Use %(brand)s on mobile", { brand }) }</h2>;
|
||||
if (!android.length && !ios) {
|
||||
mobileHeader = null;
|
||||
}
|
||||
|
||||
const brand = SdkConfig.get().brand;
|
||||
return <div className="mx_ErrorView">
|
||||
<div className="mx_ErrorView_container">
|
||||
<div className="mx_HomePage_header">
|
||||
@@ -102,11 +54,11 @@ const CompatibilityView: React.FC<IProps> = ({ onAccept }) => {
|
||||
'or <safariLink>Safari</safariLink> for the best experience.',
|
||||
{},
|
||||
{
|
||||
'chromeLink': (sub) => <a href="https://www.google.com/chrome">{ sub }</a>,
|
||||
'firefoxLink': (sub) => <a href="https://firefox.com">{ sub }</a>,
|
||||
'safariLink': (sub) => <a href="https://apple.com/safari">{ sub }</a>,
|
||||
'chromeLink': (sub) => <a href="https://www.google.com/chrome">{sub}</a>,
|
||||
'firefoxLink': (sub) => <a href="https://firefox.com">{sub}</a>,
|
||||
'safariLink': (sub) => <a href="https://apple.com/safari">{sub}</a>,
|
||||
},
|
||||
) }
|
||||
)}
|
||||
</p>
|
||||
<p>
|
||||
{ _t(
|
||||
@@ -124,9 +76,30 @@ const CompatibilityView: React.FC<IProps> = ({ onAccept }) => {
|
||||
<div className="mx_HomePage_col">
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
{ mobileHeader }
|
||||
{ ios }
|
||||
{ android }
|
||||
<h2 id="step2_heading">Use Element on mobile</h2>
|
||||
<p><strong>iOS</strong> (iPhone or iPad)</p>
|
||||
<a
|
||||
href="https://apps.apple.com/app/vector/id1083446067"
|
||||
target="_blank"
|
||||
className="mx_ClearDecoration"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/apple.svg" alt="Apple App Store" />
|
||||
</a>
|
||||
<p className="mx_Spacer"><strong>Android</strong></p>
|
||||
<a
|
||||
href="https://play.google.com/store/apps/details?id=im.vector.app"
|
||||
target="_blank"
|
||||
className="mx_ClearDecoration"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/google.svg" alt="Google Play Store" />
|
||||
</a>
|
||||
<a
|
||||
href="https://f-droid.org/repository/browse/?fdid=im.vector.app"
|
||||
target="_blank"
|
||||
className="mx_ClearDecoration"
|
||||
>
|
||||
<img height="48" src="themes/element/img/download/fdroid.svg" alt="F-Droid" />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -27,7 +27,7 @@ interface IProps {
|
||||
messages?: string[];
|
||||
}
|
||||
|
||||
const ErrorView: React.FC<IProps> = ({ title, messages }) => {
|
||||
const ErrorView: React.FC<IProps> = ({title, messages}) => {
|
||||
return <div className="mx_ErrorView">
|
||||
<div className="mx_ErrorView_container">
|
||||
<div className="mx_HomePage_header">
|
||||
@@ -40,9 +40,9 @@ const ErrorView: React.FC<IProps> = ({ title, messages }) => {
|
||||
<div className="mx_HomePage_row">
|
||||
<div>
|
||||
<h2 id="step1_heading">{ title }</h2>
|
||||
{ messages && messages.map(msg => <p key={msg}>
|
||||
{messages && messages.map(msg => <p key={msg}>
|
||||
{ msg }
|
||||
</p>) }
|
||||
</p>)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -24,7 +24,7 @@ export default class VectorEmbeddedPage extends EmbeddedPage {
|
||||
static replaces = 'EmbeddedPage';
|
||||
|
||||
// we're overriding the base component here, for Element-specific tweaks
|
||||
translate(s: string) {
|
||||
translate(s) {
|
||||
s = sanitizeHtml(_t(s));
|
||||
// ugly fix for https://github.com/vector-im/element-web/issues/4243
|
||||
// eslint-disable-next-line max-len
|
||||
@@ -22,9 +22,9 @@ import { _t } from 'matrix-react-sdk/src/languageHandler';
|
||||
const VectorAuthFooter = () => {
|
||||
const brandingConfig = SdkConfig.get().branding;
|
||||
let links = [
|
||||
{ "text": "Blog", "url": "https://element.io/blog" },
|
||||
{ "text": "Twitter", "url": "https://twitter.com/element_hq" },
|
||||
{ "text": "GitHub", "url": "https://github.com/vector-im/element-web" },
|
||||
{"text": "Blog", "url": "https://element.io/blog"},
|
||||
{"text": "Twitter", "url": "https://twitter.com/element_hq"},
|
||||
{"text": "GitHub", "url": "https://github.com/vector-im/element-web"},
|
||||
];
|
||||
|
||||
if (brandingConfig && brandingConfig.authFooterLinks) {
|
||||
@@ -35,14 +35,14 @@ const VectorAuthFooter = () => {
|
||||
for (const linkEntry of links) {
|
||||
authFooterLinks.push(
|
||||
<a href={linkEntry.url} key={linkEntry.text} target="_blank" rel="noreferrer noopener">
|
||||
{ linkEntry.text }
|
||||
{linkEntry.text}
|
||||
</a>,
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="mx_AuthFooter">
|
||||
{ authFooterLinks }
|
||||
{authFooterLinks}
|
||||
<a href="https://matrix.org" target="_blank" rel="noreferrer noopener">{ _t('Powered by Matrix') }</a>
|
||||
</div>
|
||||
);
|
||||
@@ -16,10 +16,15 @@ limitations under the License.
|
||||
*/
|
||||
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import SdkConfig from 'matrix-react-sdk/src/SdkConfig';
|
||||
|
||||
export default class VectorAuthHeaderLogo extends React.PureComponent {
|
||||
static replaces = 'AuthHeaderLogo';
|
||||
static replaces = 'AuthHeaderLogo'
|
||||
|
||||
static propTypes = {
|
||||
icon: PropTypes.string,
|
||||
}
|
||||
|
||||
render() {
|
||||
const brandingConfig = SdkConfig.get().branding;
|
||||
@@ -14,12 +14,12 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import React, { CSSProperties } from 'react';
|
||||
import React from 'react';
|
||||
import * as sdk from 'matrix-react-sdk/src/index';
|
||||
import SdkConfig from 'matrix-react-sdk/src/SdkConfig';
|
||||
|
||||
export default class VectorAuthPage extends React.PureComponent {
|
||||
static replaces = 'AuthPage';
|
||||
static replaces = 'AuthPage'
|
||||
|
||||
static welcomeBackgroundUrl;
|
||||
|
||||
@@ -48,12 +48,12 @@ export default class VectorAuthPage extends React.PureComponent {
|
||||
background: `center/cover fixed url(${VectorAuthPage.getWelcomeBackgroundUrl()})`,
|
||||
};
|
||||
|
||||
const modalStyle: CSSProperties = {
|
||||
const modalStyle = {
|
||||
position: 'relative',
|
||||
background: 'initial',
|
||||
};
|
||||
|
||||
const blurStyle: CSSProperties = {
|
||||
const blurStyle = {
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
right: 0,
|
||||
@@ -63,7 +63,7 @@ export default class VectorAuthPage extends React.PureComponent {
|
||||
background: pageStyle.background,
|
||||
};
|
||||
|
||||
const modalContentStyle: CSSProperties = {
|
||||
const modalContentStyle = {
|
||||
display: 'flex',
|
||||
zIndex: 1,
|
||||
background: 'rgba(255, 255, 255, 0.59)',
|
||||
@@ -57,7 +57,7 @@ export default class Favicon {
|
||||
private readyCb = () => {};
|
||||
|
||||
constructor(params: Partial<IParams> = {}) {
|
||||
this.params = { ...defaults, ...params };
|
||||
this.params = {...defaults, ...params};
|
||||
|
||||
this.icons = Favicon.getIcons();
|
||||
// create work canvas
|
||||
@@ -125,7 +125,7 @@ export default class Favicon {
|
||||
}
|
||||
|
||||
private circle(n: number | string, opts?: Partial<IParams>) {
|
||||
const params = { ...this.params, ...opts };
|
||||
const params = {...this.params, ...opts};
|
||||
const opt = this.options(n, params);
|
||||
|
||||
let more = false;
|
||||
@@ -214,7 +214,7 @@ export default class Favicon {
|
||||
if (!this.isReady) {
|
||||
this.readyCb = () => {
|
||||
this.badge(content, opts);
|
||||
};
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,5 @@
|
||||
"Open": "Отвори",
|
||||
"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 използва модерни функции на браузъра, които не се поддържат от Вашия.",
|
||||
"Powered by Matrix": "Базирано на Matrix",
|
||||
"Use %(brand)s on mobile": "Използвайте %(brand)s на мобилен телефон"
|
||||
"Powered by Matrix": "Базирано на Matrix"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"I understand the risks and wish to continue": "Entenc els riscos i vull continuar",
|
||||
"Go to element.io": "Vés a element.io",
|
||||
"Failed to start": "Ha fallat l'inici",
|
||||
"Missing indexeddb worker script!": "Falta l'script del treballador indexeddb!",
|
||||
"Use %(brand)s on mobile": "Utilitza %(brand)s al mòbil",
|
||||
"Switch to space by number": "Canvia d'espai per número"
|
||||
"Missing indexeddb worker script!": "Falta l'script del treballador indexeddb!"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Failed to start": "Nepovedlo se nastartovat",
|
||||
"Powered by Matrix": "Běží na Matrixu",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s pro desktopový počítač (%(platformName)s)",
|
||||
"Missing indexeddb worker script!": "Nenačetl se skript spravující indexdb!",
|
||||
"Use %(brand)s on mobile": "Používání %(brand)s v mobilních zařízeních",
|
||||
"Switch to space by number": "Přepnout na prostor podle čísla"
|
||||
"Missing indexeddb worker script!": "Nenačetl se skript spravující indexdb!"
|
||||
}
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
"powered by Matrix": "betrieben mit Matrix",
|
||||
"Dismiss": "Ausblenden",
|
||||
"Unknown device": "Unbekanntes Gerät",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Du musst HTTPS nutzen, um einen Anruf mit Bildschirmfreigabe durchzuführen.",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Du musst HTTPS nutzen um einen Anruf mit Bildschirmfreigabe durchzuführen.",
|
||||
"Welcome to Element": "Willkommen bei Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Dezentrale, verschlüsselte Chat- & Kollaborationslösung basierend auf [matrix]",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Dezentrale, verschlüsselte Chat- & Kollaborationslösung mittels [matrix]",
|
||||
"Sign In": "Anmelden",
|
||||
"Create Account": "Konto erstellen",
|
||||
"Explore rooms": "Räume erkunden",
|
||||
@@ -16,7 +16,7 @@
|
||||
"Go to your browser to complete Sign In": "Gehe zu deinem Browser, um die Anmeldung abzuschließen",
|
||||
"Open user settings": "Benutzereinstellungen öffnen",
|
||||
"Unable to load config file: please refresh the page to try again.": "Konfigurationsdatei kann nicht geladen werden: Bitte aktualisiere die Seite, um es erneut zu versuchen.",
|
||||
"Missing indexeddb worker script!": "Fehlendes indexeddb-Arbeitsskript!",
|
||||
"Missing indexeddb worker script!": "Fehlendes indexeddb Worker-Skript!",
|
||||
"Previous/next recently visited room or community": "Vorheriger/nächster kürzlich besuchter Raum oder Community",
|
||||
"Unsupported browser": "Nicht unterstützter Browser",
|
||||
"Go to element.io": "Gehe zu element.io",
|
||||
@@ -24,15 +24,13 @@
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Bitte installiere <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink> oder <safariLink>Safari</safariLink> für das beste Erlebnis.",
|
||||
"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.": "Du kannst deinen aktuellen Browser weiterhin verwenden. Es ist aber möglich, dass nicht alles richtig funktioniert oder das Aussehen der App inkorrekt ist.",
|
||||
"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.": "Du kannst deinen aktuellen Browser weiterhin verwenden, es kann aber sein, dass einige oder alle Funktionen nicht verfügbar sind oder dass Aussehen und Bedienung der Anwendung nicht korrekt ist.",
|
||||
"I understand the risks and wish to continue": "Ich verstehe die Risiken und möchte fortfahren",
|
||||
"Your Element is misconfigured": "Dein Element ist falsch konfiguriert",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Deine Elementkonfiguration enthält ungültiges JSON. Bitte korrigiere das Problem und lade die Seite neu.",
|
||||
"Download Completed": "Herunterladen fertiggestellt",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Deine Element-Konfiguration enthält ungültiges JSON. Bitte korrigiere das Problem und lade die Seite neu.",
|
||||
"Download Completed": "Download fertiggestellt",
|
||||
"Open": "Öffnen",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s verwendet erweiterte Browserfunktionen, die von deinem Browser nicht unterstützt werden.",
|
||||
"Your browser can't run %(brand)s": "Dein Browser kann %(brand)s nicht ausführen",
|
||||
"Powered by Matrix": "Betrieben mit Matrix",
|
||||
"Use %(brand)s on mobile": "Verwende %(brand)s am Handy",
|
||||
"Switch to space by number": "Zum n-ten Space wechseln"
|
||||
"Powered by Matrix": "Betrieben mit Matrix"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"Missing indexeddb worker script!": "Missing indexeddb worker script!",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.",
|
||||
"Invalid configuration: no default server specified.": "Invalid configuration: no default server specified.",
|
||||
"Your Element is misconfigured": "Your Element is misconfigured",
|
||||
@@ -10,7 +11,6 @@
|
||||
"Download Completed": "Download Completed",
|
||||
"Open": "Open",
|
||||
"Dismiss": "Dismiss",
|
||||
"Switch to space by number": "Switch to space by number",
|
||||
"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 Desktop (%(platformName)s)",
|
||||
@@ -19,7 +19,6 @@
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "You need to be using HTTPS to place a screen-sharing call.",
|
||||
"Powered by Matrix": "Powered by Matrix",
|
||||
"Use %(brand)s on mobile": "Use %(brand)s on mobile",
|
||||
"Unsupported browser": "Unsupported browser",
|
||||
"Your browser can't run %(brand)s": "Your browser can't run %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s uses advanced browser features which aren't supported by your current browser.",
|
||||
|
||||
@@ -32,6 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Via agordaro de Elemento enhavas nevalidajn datumojn de JSON. Bonvolu korekti la problemon kaj aktualigi la paĝon.",
|
||||
"Your browser can't run %(brand)s": "Via foliumilo ne povas ruli %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s uzas specialajn funkciojn de foliumilo, kiujn via nuna foliumilo ne subtenas.",
|
||||
"Powered by Matrix": "Povigata de Matrix",
|
||||
"Use %(brand)s on mobile": "Uzi %(brand)s telefone"
|
||||
"Powered by Matrix": "Povigata de Matrix"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Open": "Abrir",
|
||||
"Your browser can't run %(brand)s": "Tu navegador no es compatible con %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa funciones avanzadas que su navegador actual no soporta.",
|
||||
"Powered by Matrix": "Funciona con Matrix",
|
||||
"Use %(brand)s on mobile": "Usar %(brand)s en modo móvil",
|
||||
"Switch to space by number": "Cambiar a espacio por número"
|
||||
"Powered by Matrix": "Funciona con Matrix"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Sinu Element'i seadistustes on vigased JSON-vormingus andmed. Palun paranda see viga ja laadi leht uuesti.",
|
||||
"Your browser can't run %(brand)s": "%(brand)s ei toimi sinu brauseris",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s kasutab mitmeid uusi brauseri-põhiseid tehnoloogiaid, mis ei ole veel sinu veebibrauseris toetatud.",
|
||||
"Powered by Matrix": "Põhineb Matrix'il",
|
||||
"Use %(brand)s on mobile": "Kasuta %(brand)s rakendust nutiseadmes",
|
||||
"Switch to space by number": "Vaata kogukonnakeskust tema numbri alusel"
|
||||
"Powered by Matrix": "Põhineb Matrix'il"
|
||||
}
|
||||
|
||||
@@ -26,13 +26,11 @@
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s%(browserName)s، %(osName)s",
|
||||
"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 از ویژگی های پیشرفته مرورگر استفاده میکند که در مرورگر فعلی شما پشتیبانی نمیشوند.",
|
||||
"%(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>کروم</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.": "شما میتوانید با مرورگر فعلی خود ادامه دهید، اما ممکن است برخی یا کل ویژگی ها کار نکنند و نگاه و احساس از برنامه ممکن است درست نباشد.",
|
||||
"I understand the risks and wish to continue": "از خطرات این کار آگاهم و مایلم که ادامه بدهم",
|
||||
"Go to element.io": "برو به element.io",
|
||||
"Failed to start": "مشکل در آغاز",
|
||||
"Powered by Matrix": "قدرتگرفته از ماتریکس",
|
||||
"Use %(brand)s on mobile": "استفاده از %(brand)s روی گوشی",
|
||||
"Switch to space by number": "تغییر به فضا با شماره"
|
||||
"Powered by Matrix": "قدرتگرفته از ماتریکس"
|
||||
}
|
||||
|
||||
@@ -32,6 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "La configuration de votre Element contient du JSON invalide. Veuillez corriger le problème et recharger la page.",
|
||||
"Your browser can't run %(brand)s": "Votre navigateur ne peut pas exécuter %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s nécessite des fonctionnalités avancées que votre navigateur actuel ne prend pas en charge.",
|
||||
"Powered by Matrix": "Propulsé par Matrix",
|
||||
"Use %(brand)s on mobile": "Utiliser %(brand)s sur téléphone"
|
||||
"Powered by Matrix": "Propulsé par Matrix"
|
||||
}
|
||||
|
||||
@@ -32,6 +32,5 @@
|
||||
"Powered by Matrix": "Cumhachtaithe ag Matrix",
|
||||
"Go to element.io": "Téigh go element.io",
|
||||
"Open user settings": "Oscail socruithe úsáideora",
|
||||
"Open": "Oscail",
|
||||
"Use %(brand)s on mobile": "Úsáid %(brand)s ar guthán póca"
|
||||
"Open": "Oscail"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "A configuración de Element contén JSON non válido. Corrixe o problema e recarga a páxina.",
|
||||
"Your browser can't run %(brand)s": "O teu navegador non pode executar %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s utiliza características avanzadas do navegador que non están dispoñibles no teu navegador.",
|
||||
"Powered by Matrix": "Funciona grazas a Matrix",
|
||||
"Use %(brand)s on mobile": "Utiliza %(brand)s no móbil",
|
||||
"Switch to space by number": "Cambiar a espazo polo número"
|
||||
"Powered by Matrix": "Funciona grazas a Matrix"
|
||||
}
|
||||
|
||||
@@ -4,20 +4,20 @@
|
||||
"Unknown device": "מכשיר לא ידוע",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "עליך להשתמש ב HTTPS בכדי לבצע שיחת ווידאו משותפת.",
|
||||
"Welcome to Element": "ברוכים הבאים ל Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "צא'ט וכלי שיתוף פעולה מבוזר ומוצפן & מופעל באמצעות [matrix]",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "צ'ט מוצפן & ושת\"פ נעשה ע\"י ה [matrix]",
|
||||
"Invalid JSON": "JSON לא חוקי",
|
||||
"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.": "תצורה שגויה: לא צוין שרת ברירת מחדל.",
|
||||
"Open user settings": "פתח הגדרות משתמש",
|
||||
"Go to your browser to complete Sign In": "עבור לדפדפן להמשך ההתחברות",
|
||||
"Explore rooms": "גלה חדרים",
|
||||
"Explore rooms": "שיטוט בחדרים",
|
||||
"Create Account": "יצירת חשבון",
|
||||
"Sign In": "כניסה",
|
||||
"Previous/next recently visited room or community": "הבא\\קודם חדרים וקהילות שביקרתם לאחרונה",
|
||||
"Open": "פתח",
|
||||
"Download Completed": "ההורדה הושלמה",
|
||||
"Unexpected error preparing the app. See console for details.": "שגיאה לא צפויה במהלך טעינת האפליקציה. ראו קונסול לפרטים נוספים.",
|
||||
"Unable to load config file: please refresh the page to try again.": "לא ניתן לטעון את קובץ ההגדרות: יש לרענן את הדף כדי לנסות שנית.",
|
||||
"Unexpected error preparing the app. See console for details.": "שגיאה לא צפויה במהלך הכנת האפליקציה. ראו קונסול לפרטים נוספים.",
|
||||
"Unable to load config file: please refresh the page to try again.": "לא יכול לקרוא את קובץ ההגדרות: אנא אתחלו את הדף לנסות שנית.",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "האלמנט מכיל הגדרת JSON שגויה, אנא תקנו את הבעיה ואתחלו את הדף.",
|
||||
"Your Element is misconfigured": "האלמנט מוגדר באופן שגוי",
|
||||
"Go to element.io": "חזור לאתר הראשי: element.io",
|
||||
@@ -31,7 +31,6 @@
|
||||
"Powered by Matrix": "מופעל על ידי מטריקס",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s שולחן עבודה %(platformName)s",
|
||||
"The message from the parser is: %(message)s": "ההודעה מהמנתח היא: %(message)s",
|
||||
"Missing indexeddb worker script!": "סקריפט indexeddb worker חסר!",
|
||||
"Switch to space by number": "עבור אל 'Space' על פי מספרו"
|
||||
"The message from the parser is: %(message)s": "ההודעה מהניתוח היא: %(message)s",
|
||||
"Missing indexeddb worker script!": "סקריפט indexeddb worker חסר!"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Az Element érvénytelen JSON-t tartalmazó konfigurációval rendelkezik. Javítsa és töltse újra az oldalt.",
|
||||
"Your browser can't run %(brand)s": "A böngészője nem tudja futtatni ezt: %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s speciális böngészőfunkciókat használ, amelyeket a jelenlegi böngészője nem támogat.",
|
||||
"Powered by Matrix": "A gépházban: Matrix",
|
||||
"Use %(brand)s on mobile": "Mobilon használd ezt: %(brand)s",
|
||||
"Switch to space by number": "Tér váltás számmal"
|
||||
"Powered by Matrix": "A gépházban: Matrix"
|
||||
}
|
||||
|
||||
@@ -4,35 +4,5 @@
|
||||
"Unknown device": "Perangkat Tidak Diketahui",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Anda perlu menggunakan HTTPS untuk melakukan panggilan berbagi-layar.",
|
||||
"Welcome to Element": "Selamat datang di Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Obrolan terenkripsi, terdesentralisasi & kolaborasi didukung oleh [matrix]",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Konfigurasi Element Anda mengandung JSON yang tidak valid. Mohon perbaiki masalahnya dan muat ulang halaman nya.",
|
||||
"Invalid configuration: no default server specified.": "Konfigurasi tidak valid: server default belum ditentukan.",
|
||||
"Missing indexeddb worker script!": "Tidak ada script worker indexeddb!",
|
||||
"Explore rooms": "Jelajahi ruang",
|
||||
"Create Account": "Buat Akun",
|
||||
"Switch to space by number": "Beralih ke ruang dengan nomor",
|
||||
"Go to your browser to complete Sign In": "Buka browser Anda untuk menyelesaikan Masuk",
|
||||
"Sign In": "Masuk",
|
||||
"Failed to start": "Gagal untuk memulai",
|
||||
"Go to element.io": "Buka element.io",
|
||||
"I understand the risks and wish to continue": "Saya memahami risikonya dan ingin melanjutkan",
|
||||
"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.": "Anda dapat lanjut menggunakan browser Anda saat ini, tetapi beberapa atau semua fitur mungkin tidak berfungsi dan tampilan serta nuansa aplikasi mungkin salah.",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Mohon instal <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, atau <safariLink>Safari</safariLink> untuk pengalaman terbaik.",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s menggunakan fitur browser lanjutan yang tidak didukung oleh browser Anda saat ini.",
|
||||
"Your browser can't run %(brand)s": "Browser Anda tidak bisa menjalankan %(brand)s",
|
||||
"Unsupported browser": "Browser tidak didukung",
|
||||
"Use %(brand)s on mobile": "Gunakan %(brand)s di ponsel",
|
||||
"Powered by Matrix": "Didukung oleh Matrix",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)",
|
||||
"Previous/next recently visited room or community": "Ruangan atau komunitas yang baru saja dikunjungi sebelum/berikutnya",
|
||||
"Open user settings": "Buka pengaturan pengguna",
|
||||
"Open": "Buka",
|
||||
"Download Completed": "Unduh Selesai",
|
||||
"Unexpected error preparing the app. See console for details.": "Kesalahan tak terduga saat menyiapkan aplikasi. Lihat konsol untuk detail.",
|
||||
"Unable to load config file: please refresh the page to try again.": "Tidak bisa muat file konfigurasi: mohon segarkan halaman untuk mencoba lagi.",
|
||||
"Invalid JSON": "JSON tidak valid",
|
||||
"The message from the parser is: %(message)s": "Pesan dari pengurai adalah: %(message)s",
|
||||
"Your Element is misconfigured": "Element Anda salah dikonfigurasi",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Konfigurasi tidak valid: hanya bisa menentukan satu dari default_server_config, default_server_name, atau default_hs_url."
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Obrolan terenkripsi, terdesentralisasi & kolaborasi didukung oleh [matrix]"
|
||||
}
|
||||
|
||||
@@ -32,6 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Element stillingar þínar innihalda ógilda JSON. Vinsamlegast leiðréttu vandamálið og endurhladdu síðuna.",
|
||||
"Your Element is misconfigured": "Element þitt er rangt stillt",
|
||||
"Invalid configuration: no default server specified.": "Ógild stilling: enginn sjálfgefinn þjónn tilgreindur.",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Ógild stilling: getur aðeins tilgreint einn af default_server_config, default_server_name eða default_hs_url.",
|
||||
"Use %(brand)s on mobile": "Nota %(brand)s í síma"
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Ógild stilling: getur aðeins tilgreint einn af default_server_config, default_server_name eða default_hs_url."
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "La configurazione del tuo elemento contiene un JSON non valido. Correggi il problema e ricarica la pagina.",
|
||||
"Your browser can't run %(brand)s": "Il tuo browser non può eseguire %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa funzionalità avanzate del browser che non sono supportate dal tuo browser attuale.",
|
||||
"Powered by Matrix": "Offerto da Matrix",
|
||||
"Use %(brand)s on mobile": "Usa %(brand)s su mobile",
|
||||
"Switch to space by number": "Passa allo spazio per numero"
|
||||
"Powered by Matrix": "Offerto da Matrix"
|
||||
}
|
||||
|
||||
@@ -4,28 +4,5 @@
|
||||
"Dismiss": "უარის თქმა",
|
||||
"powered by Matrix": "Matrix-ზე დაფუძნებული",
|
||||
"Welcome to Element": "კეთილი იყოს თქვენი მობრძანება Element-ზე",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "დეცენტრალიზებული, დაშიფრული ჩატი & კოლაბორაცია, დაფუძნებული [matrix]-ზე",
|
||||
"Explore rooms": "ოთახების დათავლიერება",
|
||||
"Failed to start": "ჩართვა ვერ მოხერხდა",
|
||||
"Use %(brand)s on mobile": "გამოიყენე %(brand)s-ი მობილურზე",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s დესკტოპი (%(platformName)s)",
|
||||
"Unexpected error preparing the app. See console for details.": "მოულოდნელი ერორი აპლიკაციის შემზადებისას. იხილეთ კონსოლი დეტალებისთვის.",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "თქვენი Element-ის კონფიგურაცია შეიცავს მიუღებელ JSON-ს. გთხოვთ გადაჭრათ პრობლემა და დაარაფრეშოთ გვერდი.",
|
||||
"Sign In": "შესვლა",
|
||||
"Invalid configuration: no default server specified.": "არასწორი კონფიგურაცია: მთავარი სერვერი არ არის მითითებული.",
|
||||
"Create Account": "ანგარიშის შექმნა",
|
||||
"Go to element.io": "გადადი element.io-ზე",
|
||||
"I understand the risks and wish to continue": "მესმის რისკები და მსურს გაგრძელება",
|
||||
"Unsupported browser": "ბრაუზერი არ არის მხარდაჭერილი",
|
||||
"Your browser can't run %(brand)s": "შენ ბრაუზერს არ შეუძლია გაუშვას %(brand)s-ი",
|
||||
"Unable to load config file: please refresh the page to try again.": "კონფიგურაციის ფაილის ჩატვირთვა ვერ მოხერხდა: დაარეფრეშე გვერდი თავიდან საცდელად",
|
||||
"Invalid JSON": "მიუღებელი JSON-ი",
|
||||
"Your Element is misconfigured": "შენი Element-ი არასწორადაა კონფიგურირებული",
|
||||
"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> საუკეთესო გამოცდილებისთვის.",
|
||||
"Powered by Matrix": "მუშაობს Matrix-ის მეშვეობით",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"Go to your browser to complete Sign In": "გახსენი ბრაუზერი Sign In-ის დასასრულებლად",
|
||||
"Open user settings": "მომხმარებლების პარამეტრების გახსნა",
|
||||
"Open": "გახსნა",
|
||||
"Download Completed": "გადმოწერა დასრულებულია"
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "დეცენტრალიზებული, დაშიფრული ჩატი & კოლაბორაცია, დაფუძნებული [matrix]-ზე"
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"Open": "ເປີດ"
|
||||
}
|
||||
@@ -32,6 +32,5 @@
|
||||
"Your browser can't run %(brand)s": "Jūsų naršyklė negali paleisti %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s naudoja išplėstines naršyklės funkcijas, kurių jūsų dabartinė naršyklė nepalaiko.",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Geriausiam veikimui suinstaliuokite <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, arba <safariLink>Safari</safariLink>.",
|
||||
"Powered by Matrix": "Veikia su Matrix",
|
||||
"Use %(brand)s on mobile": "Naudoti %(brand)s mobiliajame telefone"
|
||||
"Powered by Matrix": "Veikia su Matrix"
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"Dismiss": "Sluiten",
|
||||
"Dismiss": "Afwijzen",
|
||||
"powered by Matrix": "draait op Matrix",
|
||||
"Unknown device": "Onbekend apparaat",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Oproepen met schermdelen vergen HTTPS.",
|
||||
"Welcome to Element": "Welkom bij Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Gedecentraliseerd en versleuteld chatten & samenwerken dankzij [matrix]",
|
||||
"Sign In": "Inloggen",
|
||||
"Create Account": "Registreren",
|
||||
"Sign In": "Aanmelden",
|
||||
"Create Account": "Account aanmaken",
|
||||
"Explore rooms": "Gesprekken ontdekken",
|
||||
"Unexpected error preparing the app. See console for details.": "Er is een onverwachte fout opgetreden bij het voorbereiden van de app. Zie de console voor details.",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuratiefout: kan slechts één van default_server_config, default_server_name, of default_hs_url opgeven.",
|
||||
@@ -22,17 +22,15 @@
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"Unsupported browser": "Niet-ondersteunde browser",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Installeer <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, of <safariLink>Safari</safariLink> voor de beste gebruikservaring.",
|
||||
"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.": "U kunt uw huidige browser blijven gebruiken, maar sommige of alle functies zouden niet kunnen werken en de weergave van het programma kan verkeerd zijn.",
|
||||
"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.": "Je kunt je huidige browser blijven gebruiken, maar sommige of alle functies zouden niet kunnen werken en de uitstraling van het programma kan verkeerd zijn.",
|
||||
"I understand the risks and wish to continue": "Ik begrijp de risico's en wil verder gaan",
|
||||
"Go to element.io": "Ga naar element.io",
|
||||
"Failed to start": "Opstarten mislukt",
|
||||
"Open": "Openen",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Uw Element configuratie bevat ongeldige JSON. Gelieve het probleem te corrigeren daarna de pagina te herladen.",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Je Element configuratie bevat ongeldige JSON. Gelieve het probleem te corrigeren daarna de pagina te herladen.",
|
||||
"Download Completed": "Download voltooid",
|
||||
"Your Element is misconfigured": "Uw Element is verkeerd geconfigureerd",
|
||||
"Your browser can't run %(brand)s": "Uw browser kan %(brand)s niet starten",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s gebruikt geavanceerde functies die niet ondersteund worden in uw huidige browser.",
|
||||
"Powered by Matrix": "Mogelijk gemaakt door Matrix",
|
||||
"Use %(brand)s on mobile": "Gebruik %(brand)s op uw mobiel",
|
||||
"Switch to space by number": "Wissel naar space per nummer"
|
||||
"Your Element is misconfigured": "Je Element is verkeerd geconfigureerd",
|
||||
"Your browser can't run %(brand)s": "Je browser kan %(brand)s niet draaien",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s gebruikt geavanceerde functies die niet ondersteund worden in je huidige browser.",
|
||||
"Powered by Matrix": "Gebruikt Matrix technologie"
|
||||
}
|
||||
|
||||
@@ -10,27 +10,5 @@
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Messatjariá chifrada, descentralizada e collaborativa propulsada per [matrix]",
|
||||
"Sign In": "Se connectar",
|
||||
"Create Account": "Crear un compte",
|
||||
"Explore rooms": "Percórrer las salas",
|
||||
"Missing indexeddb worker script!": "Lo worker script IndexedDB manca !",
|
||||
"Invalid configuration: no default server specified.": "Configuracion invalida : pas de servidor per defauta especificat.",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuracion invalida : podètz unicament especificar un camp entre default_server_config, default_server_name, o default_hs_url.",
|
||||
"Failed to start": "Non se pòt pas lançar",
|
||||
"Go to element.io": "Anar a element.io",
|
||||
"I understand the risks and wish to continue": "Compréni los risques e vòli contunhar",
|
||||
"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.": "Podètz contunhar a utilizar lo vòstre navigator actual, mas qualques o totes las foncionalitats o/e l'apparéncia poirián mal foncionar .",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Si vos plai installatz <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, o <safariLink>Safari</safariLink> per una melhora experiéncia.",
|
||||
"Your browser can't run %(brand)s": "Lo vòstre navigator non pòt pas executar %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s utiliza de foncions avançadas que lo vòstre navigator non suporta pas.",
|
||||
"Unsupported browser": "Navigator incompatible",
|
||||
"Powered by Matrix": "Fonciona ambé Matrix",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Devetz utilizar HTTPS per apelar ambé partatge d'ecran.",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s de burèu (%(platformName)s)",
|
||||
"Previous/next recently visited room or community": "Sala o comunautat recentament visitada precedenta/seguenta",
|
||||
"Open user settings": "Dobrir los paramètres utilizaire",
|
||||
"Open": "Dobrir",
|
||||
"Download Completed": "Descargament acabat",
|
||||
"Unable to load config file: please refresh the page to try again.": "Se pòt pas cargar lo fichièr de configuracion : si vos plai actualizatz la pagina per tornar ensajar.",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "La configuracion d'Element conténe de JSON invalid. Si vos plai corregitz lo problème e actualizatz la pagina.",
|
||||
"Your Element is misconfigured": "Lo vòstre Element es mal configurat"
|
||||
"Explore rooms": "Percórrer las salas"
|
||||
}
|
||||
|
||||
@@ -32,6 +32,5 @@
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s używa zaawansowanych funkcji przeglądarki, które nie są dostępne w twojej przeglądarce.",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Konfiguracja Elementa zawiera niepoprawny JSON. Popraw konfiguracje i odśwież stronę.",
|
||||
"Your Element is misconfigured": "Element jest nieprawidłowo skonfigurowany",
|
||||
"Powered by Matrix": "Zasilane przez Matrix",
|
||||
"Use %(brand)s on mobile": "Użyj %(brand)s w telefonie"
|
||||
"Powered by Matrix": "Zasilane przez Matrix"
|
||||
}
|
||||
|
||||
@@ -1,38 +1,36 @@
|
||||
{
|
||||
"Dismiss": "Dispensar",
|
||||
"Dismiss": "Descartar",
|
||||
"powered by Matrix": "oferecido por Matrix",
|
||||
"Unknown device": "Dispositivo desconhecido",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Você precisa estar usando HTTPS para começar uma chamada de compartilhamento de tela.",
|
||||
"Welcome to Element": "Boas-vindas a Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Chat & colaboração descentralizados e encriptados powered by [matrix]",
|
||||
"Sign In": "Fazer signin",
|
||||
"Unknown device": "Aparelho desconhecido",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Você precisa usar HTTPS para compartilhar a tela durante uma chamada.",
|
||||
"Welcome to Element": "Boas-vindas ao Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Chat descentralizado, criptografado e colaborativo construído com [matrix]",
|
||||
"Sign In": "Entrar",
|
||||
"Create Account": "Criar Conta",
|
||||
"Explore rooms": "Explorar salas",
|
||||
"The message from the parser is: %(message)s": "A mensagem do parser é: %(message)s",
|
||||
"Invalid JSON": "JSON inválido",
|
||||
"Unexpected error preparing the app. See console for details.": "Erro inesperado preparando o app. Veja console para detalhes.",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuração inválida: só pode especificar um de default_server_config, default_server_name, ou default_hs_url.",
|
||||
"Invalid configuration: no default server specified.": "Configuração inválida: nenhum servidor default especificado.",
|
||||
"Unable to load config file: please refresh the page to try again.": "Incapaz de carregar arquivo de config: por favor atualize a página para tentar de novo.",
|
||||
"Download Completed": "Download Completado",
|
||||
"Open user settings": "Abrir configurações de usuária(o)",
|
||||
"Unexpected error preparing the app. See console for details.": "Erro inesperado preparando o aplicativo. Veja o console para mais detalhes.",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuração inválida: você só pode especificar um valor dentre default_server_config, default_server_name, ou default_hs_url.",
|
||||
"Invalid configuration: no default server specified.": "Configuração inválida: servidor padrão não especificado.",
|
||||
"Unable to load config file: please refresh the page to try again.": "Não foi possível carregar o arquivo de configuração: por favor, atualize a página para tentar novamente.",
|
||||
"Download Completed": "Download concluído",
|
||||
"Open user settings": "Abrir configurações do usuário",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"Unsupported browser": "Browser insuportado",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Por favor instale <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, ou <safariLink>Safari</safariLink> para a melhor 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.": "Você pode continuar usando seu browser atual, mas alguma ou toda funcionalidade pode não funcionar e a aparência e sensação do aplicativo pode estar incorretas.",
|
||||
"I understand the risks and wish to continue": "Eu entendo os riscos e desejo continuar",
|
||||
"Go to element.io": "Ir para element.io",
|
||||
"Failed to start": "Falha para iniciar",
|
||||
"Missing indexeddb worker script!": "Worker script indexeddb faltando!",
|
||||
"Unsupported browser": "Navegador não suportado",
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Por favor, instale o <chromeLink>Chrome</chromeLink>, o <firefoxLink>Firefox</firefoxLink> ou o <safariLink>Safari</safariLink> para obter a melhor experiência de uso.",
|
||||
"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.": "Você pode continuar usando o navegador atual, mas alguns dos recursos podem não funcionar e a aparência do aplicativo pode estar incorreta.",
|
||||
"I understand the risks and wish to continue": "Entendo os riscos e desejo continuar",
|
||||
"Go to element.io": "Vá para element.io",
|
||||
"Failed to start": "Falha ao iniciar",
|
||||
"Missing indexeddb worker script!": "O script indexeddb não foi encontrado!",
|
||||
"Open": "Abrir",
|
||||
"Previous/next recently visited room or community": "Anterior/próxima sala ou comunidade visitada recentemente",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)",
|
||||
"Go to your browser to complete Sign In": "Vá para seu browser para completar Sign In",
|
||||
"Your Element is misconfigured": "Seu Element está malconfigurado",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Sua configuração de Element contém JSON inválido. Por favor corrija o problema e recarregue a página.",
|
||||
"Your browser can't run %(brand)s": "Seu browser não consegue rodar %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa funcionalidade de browser avançada que não é suportada por seu browser atual.",
|
||||
"Powered by Matrix": "Powered by Matrix",
|
||||
"Use %(brand)s on mobile": "Usar %(brand)s em celular",
|
||||
"Switch to space by number": "Trocar para espaço por número"
|
||||
"Previous/next recently visited room or community": "Anterior/Próxima sala ou comunidade visitada recentemente",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s para Computador (%(platformName)s)",
|
||||
"Go to your browser to complete Sign In": "Vá para o seu navegador para concluir o login",
|
||||
"Your Element is misconfigured": "Seu Element está desconfigurado",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Sua configuração do Element contém JSON inválido. Por favor, corrija o problema e recarregue a página.",
|
||||
"Your browser can't run %(brand)s": "Seu navegador não consegue rodar o %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s usa recursos avançados que não são suportados pelo seu navegador de internet atual.",
|
||||
"Powered by Matrix": "Construído com tecnologia Matrix"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Chat decentralizat, criptat & colaborare propulsata de [matrix]",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "Trebuie să folosești HTTPS pentru a plasa un apel de tip screen-sharing.",
|
||||
"Sign In": "Autentificare",
|
||||
"Create Account": "Crează un cont",
|
||||
"Create Account": "Înregistare",
|
||||
"Explore rooms": "Explorează camerele",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Configuratie invalida: se poate specifica doar una dintre default_server_config, default_server_name, or default_hs_url.",
|
||||
"Invalid JSON": "JSON invalid",
|
||||
@@ -16,23 +16,5 @@
|
||||
"Please install <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> for the best experience.": "Instalati va rog <chromeLink>Chrome</chromeLink>, <firefoxLink>Firefox</firefoxLink>, or <safariLink>Safari</safariLink> pentru o experienta mai buna.",
|
||||
"I understand the risks and wish to continue": "Inteleg riscul si doresc sa continui",
|
||||
"Go to element.io": "Acceseaza element.io",
|
||||
"Failed to start": "Nu reuseste sa porneasca",
|
||||
"Your Element is misconfigured": "Element-ul tău este configurat necorespunzător",
|
||||
"Missing indexeddb worker script!": "Scriptul de lucru indexddb lipsește!",
|
||||
"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.": "Poți continua să folosești browser-ul curent, însă aspectul și experiența câtorva sau tuturor funcțiilor poate fi incorectă.",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s folosește funcții avansate de browser ce nu sunt suportate de browser-ul dumneavoastră.",
|
||||
"Your browser can't run %(brand)s": "Browserul tău nu poate rula %(brand)s",
|
||||
"Use %(brand)s on mobile": "Folosește %(brand)s pe mobil",
|
||||
"Powered by Matrix": "Bazat pe Matrix",
|
||||
"Go to your browser to complete Sign In": "Du-te la browser pentru a finaliza Autentificarea",
|
||||
"Previous/next recently visited room or community": "Precedenta/următoarea cameră sau comunitate vizitată recent",
|
||||
"Open user settings": "Deschide setările de utilizator",
|
||||
"Open": "Deschide",
|
||||
"Download Completed": "Descărcare Completă",
|
||||
"Unexpected error preparing the app. See console for details.": "Eroare neașteptată în aplicație. Vezi consola pentru detalii.",
|
||||
"Unable to load config file: please refresh the page to try again.": "Nu se poate încărca fișierul de configurație: vă rugăm sa reîncărcați pagina și să încercați din nou.",
|
||||
"The message from the parser is: %(message)s": "Mesajul de la parser este: %(message)s",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Configurația ta Element conține JSON invalid. Vă rugăm sa corectați problema și să reîncărcați pagina.",
|
||||
"Invalid configuration: no default server specified.": "Configurație invalidă: niciun server implicit specificat.",
|
||||
"Switch to space by number": "Comută spațiul folosind un număr"
|
||||
"Failed to start": "Nu reuseste sa porneasca"
|
||||
}
|
||||
|
||||
@@ -32,6 +32,5 @@
|
||||
"Open": "Открыть",
|
||||
"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 использует расширенные возможности, которые не поддерживаются вашим браузером.",
|
||||
"Powered by Matrix": "На технологии Matrix",
|
||||
"Use %(brand)s on mobile": "Воспользуйтесь %(brand)s на мобильном телефоне"
|
||||
"Powered by Matrix": "На технологии Matrix"
|
||||
}
|
||||
|
||||
@@ -4,15 +4,5 @@
|
||||
"Welcome to Element": "ඉලමන්ට් වෙත සාදරයෙන් පිළිගනිමු",
|
||||
"Open": "විවෘත කරන්න",
|
||||
"Powered by Matrix": "මැට්රික්ස් මඟින් බලගන්වා ඇත",
|
||||
"Sign In": "පිවිසෙන්න",
|
||||
"Dismiss": "ඉවතලන්න",
|
||||
"Explore rooms": "කාමර බලන්න",
|
||||
"Create Account": "ගිණුමක් සාදන්න",
|
||||
"Failed to start": "ඇරඹීමට අපොහොසත් විය",
|
||||
"Go to element.io": "element.io වෙත යන්න",
|
||||
"Your browser can't run %(brand)s": "ඔබගේ අතිරික්සුවට %(brand)s ධාවනය කළ නොහැකිය",
|
||||
"Unsupported browser": "සහය නොදක්වන අතිරික්සුව කි",
|
||||
"Go to your browser to complete Sign In": "පිවිසීම සම්පූර්ණ කිරීමට ඔබගේ අතිරික්සුව වෙත යන්න",
|
||||
"Download Completed": "බාගැනීම සම්පූර්ණයි",
|
||||
"Open user settings": "පරිශීලක සැකසුම් විවෘත කරන්න"
|
||||
"Sign In": "පිවිසෙන්න"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Formësimi juaj i Element-it përmban JSON të pavlefshëm. Ju lutemi, ndreqeni problemin dhe ringarkoni faqen.",
|
||||
"Your browser can't run %(brand)s": "Shfletuesi juaj s’mund të xhirojë %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s përdor veçori të thelluara të shfletuesit, të cilat shfletuesi juaj i tanishëm s’i mbulon.",
|
||||
"Powered by Matrix": "Bazuar në Matrix",
|
||||
"Use %(brand)s on mobile": "Përdor %(brand)s në celular",
|
||||
"Switch to space by number": "Kalo te hapësira me numrin"
|
||||
"Powered by Matrix": "Bazuar në Matrix"
|
||||
}
|
||||
|
||||
@@ -32,7 +32,5 @@
|
||||
"Open": "Öppna",
|
||||
"Powered by Matrix": "Drivs av Matrix",
|
||||
"Your browser can't run %(brand)s": "Din webbläsare kan inte köra %(brand)s",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s använder avancerade webbläsarfunktioner som inte stöds av din aktuella webbläsare.",
|
||||
"Use %(brand)s on mobile": "Använd %(brand)s på mobilen",
|
||||
"Switch to space by number": "Byt till utrymme med nummer"
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s använder avancerade webbläsarfunktioner som inte stöds av din aktuella webbläsare."
|
||||
}
|
||||
|
||||
@@ -1,37 +1,16 @@
|
||||
{
|
||||
"Dismiss": "நீக்கு",
|
||||
"powered by Matrix": "Matrix-ஆல் ஆனது",
|
||||
"Unknown device": "அறியப்படாத சாதனம்",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "நீங்கள் திரைபகிர்வு அழைப்பை மேற்க்கொள்ள HTTPS ஐ பயன்படுத்த வேண்டும்.",
|
||||
"Welcome to Element": "எலிமெண்டிற்க்கு வரவேற்க்கிறோம்",
|
||||
"Unknown device": "தெரியாத கருவி",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "நீங்கள் திரைபகிர்வு அழைப்பை மேற்க்கொள்ள HTTPS-ஐ பயன்படுத்த வேண்டும்.",
|
||||
"Welcome to Element": "Element -ற்க்கு வரவேற்க்கிறோம்",
|
||||
"The message from the parser is: %(message)s": "பாகுபடுத்தி அனுப்பிய செய்தி: %(message)s",
|
||||
"Invalid JSON": "தவறான JSON",
|
||||
"Unexpected error preparing the app. See console for details.": "பயன்பாட்டைத் தயார் செய்வதில் எதிர்பாராத பிழை. விவரங்களுக்கு console ஐப் பார்க்கவும்.",
|
||||
"Unexpected error preparing the app. See console for details.": "பயன்பாட்டைத் தயாரிப்பதில் எதிர்பாராத பிழை. விவரங்களுக்கு console ஐப் பார்க்கவும்.",
|
||||
"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.": "தவறான உள்ளமைவு: இயல்புநிலை சேவையகம் குறிப்பிடப்படவில்லை.",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "[matrix] மூலம் இயக்கப்படும் பரவலாக்கப்பட்ட, மறைகுறியாக்கப்பட்ட அரட்டை பயன்பாட்டு",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "[matrix] ஆல் இயக்கப்படும் பரவலாக்கப்பட்ட, மறைகுறியாக்கப்பட்ட அரட்டை & ஒத்துழைப்பு",
|
||||
"Sign In": "உள்நுழைக",
|
||||
"Create Account": "உங்கள் கணக்கை துவங்குங்கள்",
|
||||
"Explore rooms": "அறைகளை ஆராயுங்கள்",
|
||||
"Missing indexeddb worker script!": "indexeddb வேலையாளி குறியீட்டை காணவில்லை!",
|
||||
"Powered by Matrix": "மேட்ரிக்ஸ் மூலம் இயக்கப்படுகிறது",
|
||||
"Previous/next recently visited room or community": "முந்தைய/அடுத்த சமீபத்தில் பார்வையிட்ட அறை அல்லது சமூகம்",
|
||||
"Failed to start": "துவங்குவதில் தோல்வி",
|
||||
"Go to element.io": "element.io க்குச் செல்லவும்",
|
||||
"I understand the risks and wish to continue": "நான் அபாயங்களைப் புரிந்துகொண்டு தொடர விரும்புகிறேன்",
|
||||
"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.": "உங்கள் தற்போதைய உலாவியை நீங்கள் தொடர்ந்து பயன்படுத்தலாம், ஆனால் சில அல்லது அனைத்து அம்சங்களும் செயல்படாமல் போகலாம் மற்றும் பயன்பாட்டின் தோற்றமும் உணர்வும் தவறாக இருக்கலாம்.",
|
||||
"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> ஐ நிறுவவும்.",
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s உங்கள் தற்போதைய உலாவியால் ஆதரிக்கப்படாத மேம்பட்ட உலாவி அம்சங்களைப் பயன்படுத்துகிறது.",
|
||||
"Your browser can't run %(brand)s": "உங்கள் உலாவியில் %(brand)s ஐ இயக்க முடியாது",
|
||||
"Unsupported browser": "ஆதரிக்கப்படாத உலாவி",
|
||||
"Use %(brand)s on mobile": "%(brand)s ஐ திறன்பேசியில் பயன்படுத்தவும்",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"Go to your browser to complete Sign In": "உள்நுழைவை முடிவுசெய்ய உங்கள் உலாவிக்குச் செல்லவும்",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s திரைமுகப்பு (%(platformName)s)",
|
||||
"Open user settings": "பயனர் அமைப்புகளைத் திறக்கவும்",
|
||||
"Open": "திற",
|
||||
"Download Completed": "பதிவிறக்கம் முடிவடைந்தது",
|
||||
"Unable to load config file: please refresh the page to try again.": "கட்டமைப்பு கோப்பை ஏற்ற முடியவில்லை: மீண்டும் முயற்சிக்க பக்கத்தைப் புதுப்பிக்கவும்.",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "உங்கள் எலிமெண்ட் உள்ளமைவில் தவறான JSON உள்ளது. தயவுசெய்து இதை சரிசெய்து பக்கத்தை மீண்டும் ஏற்றவும்.",
|
||||
"Your Element is misconfigured": "உங்கள் எலிமெண்ட் தவறாக உள்ளமைக்கப்பட்டுள்ளது"
|
||||
"Explore rooms": "அறைகளை ஆராயுங்கள்"
|
||||
}
|
||||
|
||||
@@ -1,19 +1,13 @@
|
||||
{
|
||||
"powered by Matrix": "ใช้เทคโนโลยี Matrix",
|
||||
"Dismiss": "ปิด",
|
||||
"Dismiss": "ไม่สนใจ",
|
||||
"Unknown device": "อุปกรณ์ที่ไม่รู้จัก",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "คุณต้องใช้ HTTPS เพื่อเริ่มติดต่อแบบแบ่งปันหน้าจอ",
|
||||
"Welcome to Element": "ยินดีต้อนรับสู่ Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "ระบบแชทและประสานงาน ไร้ศูนย์กลางและเข้ารหัสได้ โดยใช้เทคโนโลยีจาก [matrix]",
|
||||
"The message from the parser is: %(message)s": "ข้อความจากตัวแยกวิเคราะห์คือ: %(message)s",
|
||||
"The message from the parser is: %(message)s": "ข้อความจากparserคือ:%(message)s",
|
||||
"Invalid JSON": "JSON ไม่ถูกต้อง",
|
||||
"Sign In": "ลงชื่อเข้า",
|
||||
"Sign In": "เข้าสู่ระบบ",
|
||||
"Create Account": "สร้างบัญชี",
|
||||
"Explore rooms": "สำรวจห้อง",
|
||||
"Download Completed": "การดาวน์โหลดเสร็จสมบูรณ์",
|
||||
"Open user settings": "เปิดการตั้งค่าผู้ใช้",
|
||||
"Go to element.io": "ไปยัง element.io",
|
||||
"Failed to start": "ไม่สามารถเริ่ม",
|
||||
"Open": "เปิด",
|
||||
"Powered by Matrix": "ขับเคลื่อนโดย Matrix"
|
||||
"Explore rooms": "สำรวจห้อง"
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
"Sign In": "Giriş Yap",
|
||||
"Create Account": "Hesap Oluştur",
|
||||
"Explore rooms": "Odaları keşfet",
|
||||
"Invalid JSON": "JSON geçersiz",
|
||||
"Invalid JSON": "Geçersiz JSON",
|
||||
"Unexpected error preparing the app. See console for details.": "Uygulama hazırlanırken beklenmeyen bir hata oldu. Detaylar için konsola bakın.",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Hatalı ayarlar: default_server_config, default_server_name ve default_hs_url ayarlarından en fazla biri girilebilir.",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Geçersiz yapılandırma: default_server_config, default_server_name, yada default_hs_url den sadece birisi seçilebilir.",
|
||||
"Invalid configuration: no default server specified.": "Geçersiz yapılandırma: varsayılan sunucu seçilmemiş.",
|
||||
"The message from the parser is: %(message)s": "Ayrıştırıcıdan gelen mesaj: %(message)s",
|
||||
"Go to your browser to complete Sign In": "Oturum açmayı tamamlamak için tarayıcınıza gidin",
|
||||
@@ -28,11 +28,9 @@
|
||||
"Go to element.io": "element.io adresine git",
|
||||
"Failed to start": "Başlatılamadı",
|
||||
"Previous/next recently visited room or community": "Yakında ziyaret edilen önceki/sonraki oda veya topluluk",
|
||||
"Powered by Matrix": "Gücünü Matrix'ten alır",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName) (%(browserName), %(osName))",
|
||||
"Powered by Matrix": "Matrix tarafından güçlendirildi",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Masaüstü (%(platformName)s)",
|
||||
"Open": "Aç",
|
||||
"Missing indexeddb worker script!": "Indexeddb worker kodu eksik!",
|
||||
"Use %(brand)s on mobile": "Mobilde %(brand)s kullan",
|
||||
"Switch to space by number": "Sayı ile belirtilen alana geç"
|
||||
"Missing indexeddb worker script!": "Indexeddb worker kodu eksik!"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"Create Account": "senflul amiḍan",
|
||||
"Create Account": "Ssenflul amiḍan",
|
||||
"Download Completed": "Ittusmed wagam",
|
||||
"Powered by Matrix": "Ittusker s Matrix",
|
||||
"Sign In": "Kcem",
|
||||
@@ -10,7 +10,5 @@
|
||||
"Unknown device": "Allal arussin",
|
||||
"Open user settings": "Ṛẓem tisɣal n unessemres",
|
||||
"Dismiss": "Nexxel",
|
||||
"Open": "Ṛẓem",
|
||||
"The message from the parser is: %(message)s": "Tuzint n umeslad: %(message)s",
|
||||
"Use %(brand)s on mobile": "Semres %(brand)s g utilifun"
|
||||
"Open": "Ṛẓem"
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"Failed to start": "Запуск не вдався",
|
||||
"Download Completed": "Завантаження завершено",
|
||||
"Missing indexeddb worker script!": "Відсутній робочий сценарій IndexedDB!",
|
||||
"Your Element is misconfigured": "Ваш Element налаштовано неправильно",
|
||||
"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.": "Неможливо завантажити файл конфігурації. Оновіть, будь ласка, сторінку, щоб спробувати знову.",
|
||||
"Open": "Відкрити",
|
||||
@@ -32,7 +32,5 @@
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"Powered by Matrix": "Працює на Matrix",
|
||||
"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 використовує передові властивості, які ваш браузер не підтримує.",
|
||||
"Use %(brand)s on mobile": "Користуйтеся %(brand)s на мобільному",
|
||||
"Switch to space by number": "Перейдіть до простору за номером"
|
||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s використовує передові властивості, які ваш браузер не підтримує."
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"Welcome to Element": "Chào mừng tới Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Chat phân tán, mã hóa & giao tiếp được tài trợ bởi [matrix]",
|
||||
"Unexpected error preparing the app. See console for details.": "Lỗi xảy ra trong lúc chuẩn bị app. Xem console log để biết chi tiết.",
|
||||
"The message from the parser is: %(message)s": "Thông báo của trình xử lý là: %(message)s",
|
||||
"The message from the parser is: %(message)s": "Nội dung tin là: %(message)s",
|
||||
"Invalid JSON": "JSON không hợp lệ",
|
||||
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Thiết lập không hợp lệ: chỉ có thể điền một trong số default_server_config, default_server_name, hoặc default_hs_url.",
|
||||
"Invalid configuration: no default server specified.": "Cấu hình không hợp lệ: máy chủ mặc định không được thiết lập.",
|
||||
@@ -23,15 +23,8 @@
|
||||
"Unsupported browser": "Trình duyệt không được hỗ trợ",
|
||||
"Go to your browser to complete Sign In": "Mở trình duyệt web để hoàn thành đăng nhập",
|
||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Máy tính để bàn (%(platformName)s)",
|
||||
"Previous/next recently visited room or community": "Phòng chat hoặc cộng đồng đã đi đến gần đây trước/tiếp theo",
|
||||
"Previous/next recently visited room or community": "Phòng chat hoặc cộng đồng gần đây trước/tiếp theo",
|
||||
"Open user settings": "Mở cài đặt người dùng",
|
||||
"Open": "Mở",
|
||||
"Unable to load config file: please refresh the page to try again.": "Không thể tải tệp cấu hình: hãy làm mới trang để thử lại.",
|
||||
"Failed to start": "Khởi động thất bại",
|
||||
"Use %(brand)s on mobile": "Sử dụng %(brand)s trên di động",
|
||||
"Powered by Matrix": "Được chạy bởi công nghệ Matrix",
|
||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||
"Missing indexeddb worker script!": "Thiếu tệp lệnh làm việc của indexeddb!",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Thiết lập Element của bạn chứa JSON không hợp lệ. Vui lòng sửa vấn đề và tải lại trang.",
|
||||
"Your Element is misconfigured": "Element của bạn bị thiết lập sai"
|
||||
"Unable to load config file: please refresh the page to try again.": "Không thể tải tệp cấu hình: hãy làm mới trang để thử lại."
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"Dismiss": "忽略",
|
||||
"Dismiss": "标记为已读",
|
||||
"powered by Matrix": "由 Matrix 驱动",
|
||||
"Unknown device": "未知设备",
|
||||
"You need to be using HTTPS to place a screen-sharing call.": "您需要使用 HTTPS 以进行共享屏幕通话。",
|
||||
"Welcome to Element": "欢迎来到 Element",
|
||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "去中心化、加密聊天与协作,由 [matrix] 驱动",
|
||||
"Sign In": "登录",
|
||||
"Create Account": "创建账号",
|
||||
"Create Account": "创建账户",
|
||||
"Explore rooms": "探索聊天室",
|
||||
"The message from the parser is: %(message)s": "语法分析器的信息:%(message)s",
|
||||
"Invalid JSON": "无效的 JSON",
|
||||
"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.": "无效的配置:没有设置默认服务器。",
|
||||
"Missing indexeddb worker script!": "缺少 IndexedDB 辅助脚本!",
|
||||
"Unable to load config file: please refresh the page to try again.": "无法加载配置文件:请再次刷新页面。",
|
||||
@@ -32,7 +32,5 @@
|
||||
"Open": "打开",
|
||||
"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 所需的高级浏览器特性。",
|
||||
"Powered by Matrix": "由 Matrix 驱动",
|
||||
"Use %(brand)s on mobile": "在移动设备上使用 %(brand)s",
|
||||
"Switch to space by number": "按数字切换空间"
|
||||
"Powered by Matrix": "由 Matrix 驱动"
|
||||
}
|
||||
|
||||
@@ -30,9 +30,7 @@
|
||||
"Open": "開啟",
|
||||
"Your Element is misconfigured": "Element 配置錯誤",
|
||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Element 的配置中包含無效JSON,請更正錯誤並重新加載網頁。",
|
||||
"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 使用了您目前的瀏覽器不支援的進階瀏覽器功能。",
|
||||
"Powered by Matrix": "由 Matrix 提供",
|
||||
"Use %(brand)s on mobile": "在行動裝置上使用 %(brand)s",
|
||||
"Switch to space by number": "依數字切換至空間"
|
||||
"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使用的高級特性。",
|
||||
"Powered by Matrix": "由 Matrix 提供"
|
||||
}
|
||||
|
||||
@@ -25,16 +25,16 @@ window.React = React;
|
||||
|
||||
import * as sdk from 'matrix-react-sdk';
|
||||
import PlatformPeg from 'matrix-react-sdk/src/PlatformPeg';
|
||||
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 { AutoDiscovery } from "matrix-js-sdk/src/autodiscovery";
|
||||
import {AutoDiscovery} from "matrix-js-sdk/src/autodiscovery";
|
||||
import * as Lifecycle from "matrix-react-sdk/src/Lifecycle";
|
||||
import type MatrixChatType from "matrix-react-sdk/src/components/structures/MatrixChat";
|
||||
import {MatrixClientPeg} from 'matrix-react-sdk/src/MatrixClientPeg';
|
||||
import SdkConfig from "matrix-react-sdk/src/SdkConfig";
|
||||
|
||||
import { parseQs, parseQsFromFragment } from './url_utils';
|
||||
import {parseQs, parseQsFromFragment} from './url_utils';
|
||||
import VectorBasePlatform from "./platform/VectorBasePlatform";
|
||||
import { createClient } from "matrix-js-sdk/src/matrix";
|
||||
|
||||
let lastLocationHashSet: string = null;
|
||||
|
||||
@@ -73,14 +73,6 @@ function onNewScreen(screen: string, replaceLast = false) {
|
||||
const hash = '#/' + screen;
|
||||
lastLocationHashSet = hash;
|
||||
|
||||
// if the new hash is a substring of the old one then we are stripping fields e.g `via` so replace history
|
||||
if (screen.startsWith("room/") &&
|
||||
window.location.hash.includes("/$") === hash.includes("/$") && // only if both did or didn't contain event link
|
||||
window.location.hash.startsWith(hash)
|
||||
) {
|
||||
replaceLast = true;
|
||||
}
|
||||
|
||||
if (replaceLast) {
|
||||
window.location.replace(hash);
|
||||
} else {
|
||||
@@ -136,6 +128,18 @@ function onTokenLoginCompleted() {
|
||||
}
|
||||
|
||||
export async function loadApp(fragParams: {}) {
|
||||
// XXX: the way we pass the path to the worker script from webpack via html in body's dataset is a hack
|
||||
// but alternatives seem to require changing the interface to passing Workers to js-sdk
|
||||
const vectorIndexeddbWorkerScript = document.body.dataset.vectorIndexeddbWorkerScript;
|
||||
if (!vectorIndexeddbWorkerScript) {
|
||||
// If this is missing, something has probably gone wrong with
|
||||
// the bundling. The js-sdk will just fall back to accessing
|
||||
// indexeddb directly with no worker script, but we want to
|
||||
// make sure the indexeddb script is present, so fail hard.
|
||||
throw newTranslatableError(_td("Missing indexeddb worker script!"));
|
||||
}
|
||||
MatrixClientPeg.setIndexedDbWorkerScript(vectorIndexeddbWorkerScript);
|
||||
|
||||
window.addEventListener('hashchange', onHashChange);
|
||||
|
||||
const platform = PlatformPeg.get();
|
||||
@@ -149,26 +153,6 @@ export async function loadApp(fragParams: {}) {
|
||||
|
||||
// Don't bother loading the app until the config is verified
|
||||
const config = await verifyServerConfig();
|
||||
|
||||
// Before we continue, let's see if we're supposed to do an SSO redirect
|
||||
const [userId] = await Lifecycle.getStoredSessionOwner();
|
||||
const hasPossibleToken = !!userId;
|
||||
const isReturningFromSso = !!params.loginToken;
|
||||
const autoRedirect = config['sso_immediate_redirect'] === true;
|
||||
if (!hasPossibleToken && !isReturningFromSso && autoRedirect) {
|
||||
console.log("Bypassing app load to redirect to SSO");
|
||||
const tempCli = createClient({
|
||||
baseUrl: config['validated_server_config'].hsUrl,
|
||||
idBaseUrl: config['validated_server_config'].isUrl,
|
||||
});
|
||||
PlatformPeg.get().startSingleSignOn(tempCli, "sso", `/${getScreenFromLocation(window.location).screen}`);
|
||||
|
||||
// We return here because startSingleSignOn() will asynchronously redirect us. We don't
|
||||
// care to wait for it, and don't want to show any UI while we wait (not even half a welcome
|
||||
// page). As such, just don't even bother loading the MatrixChat component.
|
||||
return;
|
||||
}
|
||||
|
||||
const MatrixChat = sdk.getComponent('structures.MatrixChat');
|
||||
return <MatrixChat
|
||||
onNewScreen={onNewScreen}
|
||||
@@ -252,12 +236,12 @@ async function verifyServerConfig() {
|
||||
|
||||
validatedConfig = AutoDiscoveryUtils.buildValidatedConfigFromDiscovery(serverName, discoveryResult, true);
|
||||
} catch (e) {
|
||||
const { hsUrl, isUrl, userId } = await Lifecycle.getStoredSessionVars();
|
||||
const {hsUrl, isUrl, userId} = await Lifecycle.getStoredSessionVars();
|
||||
if (hsUrl && userId) {
|
||||
console.error(e);
|
||||
console.warn("A session was found - suppressing config error and using the session's homeserver");
|
||||
|
||||
console.log("Using pre-existing hsUrl and isUrl: ", { hsUrl, isUrl });
|
||||
console.log("Using pre-existing hsUrl and isUrl: ", {hsUrl, isUrl});
|
||||
validatedConfig = await AutoDiscoveryUtils.validateServerConfigWithStaticUrls(hsUrl, isUrl, true);
|
||||
} else {
|
||||
// the user is not logged in, so scream
|
||||
@@ -272,7 +256,7 @@ async function verifyServerConfig() {
|
||||
|
||||
// Add the newly built config to the actual config for use by the app
|
||||
console.log("Updating SdkConfig with validated discovery information");
|
||||
SdkConfig.add({ "validated_server_config": validatedConfig });
|
||||
SdkConfig.add({"validated_server_config": validatedConfig});
|
||||
|
||||
return SdkConfig.get();
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ function getConfig(configJsonFilename: string): Promise<{}> {
|
||||
resolve({});
|
||||
}
|
||||
}
|
||||
reject({ err: err, response: response });
|
||||
reject({err: err, response: response});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ function getConfig(configJsonFilename: string): Promise<{}> {
|
||||
// loading from the filesystem (see above).
|
||||
resolve(JSON.parse(body));
|
||||
} catch (e) {
|
||||
reject({ err: e });
|
||||
reject({err: e});
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<meta name="msapplication-TileImage" content="<%= require('../../res/vector-icons/mstile-150.png') %>">
|
||||
<meta name="msapplication-config" content="<%= require('../../res/vector-icons/browserconfig.xml') %>">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
<meta property="og:image" content="<%= og_image_url %>" />
|
||||
<meta property="og:image" content="<%= htmlWebpackPlugin.options.vars.og_image_url %>" />
|
||||
<meta http-equiv="Content-Security-Policy" content="
|
||||
default-src 'none';
|
||||
style-src 'self' 'unsafe-inline';
|
||||
@@ -35,6 +35,7 @@
|
||||
worker-src 'self';
|
||||
frame-src * blob: data:;
|
||||
form-action 'self';
|
||||
object-src 'self';
|
||||
manifest-src 'self';
|
||||
">
|
||||
<% for (var i=0; i < htmlWebpackPlugin.files.css.length; i++) {
|
||||
@@ -48,23 +49,11 @@
|
||||
<link rel="stylesheet" href="<%= file %>">
|
||||
<% }
|
||||
} %>
|
||||
|
||||
<% for (var i=0; i < htmlWebpackPlugin.tags.headTags.length; i++) {
|
||||
var tag = htmlWebpackPlugin.tags.headTags[i];
|
||||
var path = tag.attributes && tag.attributes.href;
|
||||
if (path.indexOf("Inter") !== -1) { %>
|
||||
<link rel="preload" as="font" href="<%= path %>" crossorigin="anonymous"/>
|
||||
<% }
|
||||
} %>
|
||||
|
||||
</head>
|
||||
<body
|
||||
style="height: 100%; margin: 0;"
|
||||
data-vector-recorder-worklet-script="<%= htmlWebpackPlugin.files.js.find(entry => entry.includes("recorder-worklet.js")) %>"
|
||||
>
|
||||
<body style="height: 100%; margin: 0;" data-vector-indexeddb-worker-script="<%= htmlWebpackPlugin.files.chunks['indexeddb-worker'].entry %>">
|
||||
<noscript>Sorry, Element requires JavaScript to be enabled.</noscript> <!-- TODO: Translate this? -->
|
||||
<section id="matrixchat" style="height: 100%;" class="notranslate"></section>
|
||||
<script src="<%= htmlWebpackPlugin.files.js.find(entry => entry.includes("bundle.js")) %>"></script>
|
||||
<section id="matrixchat" style="height: 100%; overflow: auto;" class="notranslate"></section>
|
||||
<script src="<%= htmlWebpackPlugin.files.chunks['bundle'].entry %>"></script>
|
||||
|
||||
<!-- Legacy supporting Prefetch images -->
|
||||
<img src="<%= require('matrix-react-sdk/res/img/warning.svg') %>" width="24" height="23" style="visibility: hidden; position: absolute; top: 0px; left: 0px;"/>
|
||||
|
||||
@@ -26,7 +26,7 @@ require('highlight.js/styles/github.css');
|
||||
require('katex/dist/katex.css');
|
||||
|
||||
// These are things that can run before the skin loads - be careful not to reference the react-sdk though.
|
||||
import { parseQsFromFragment } from "./url_utils";
|
||||
import {parseQsFromFragment} from "./url_utils";
|
||||
import './modernizr';
|
||||
|
||||
async function settled(...promises: Array<Promise<any>>) {
|
||||
@@ -51,9 +51,6 @@ function checkBrowserFeatures() {
|
||||
// ES2018: http://262.ecma-international.org/9.0/#sec-promise.prototype.finally
|
||||
window.Modernizr.addTest("promiseprototypefinally", () =>
|
||||
typeof window.Promise?.prototype?.finally === "function");
|
||||
// ES2020: http://262.ecma-international.org/#sec-promise.allsettled
|
||||
window.Modernizr.addTest("promiseallsettled", () =>
|
||||
typeof window.Promise?.allSettled === "function");
|
||||
// ES2018: https://262.ecma-international.org/9.0/#sec-get-regexp.prototype.dotAll
|
||||
window.Modernizr.addTest("regexpdotall", () => (
|
||||
window.RegExp?.prototype &&
|
||||
|
||||
@@ -14,8 +14,8 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { IndexedDBStoreWorker } from 'matrix-js-sdk/src/indexeddb-worker';
|
||||
import {IndexedDBStoreWorker} from 'matrix-js-sdk/src/indexeddb-worker.js';
|
||||
|
||||
const remoteWorker = new IndexedDBStoreWorker(postMessage as InstanceType<typeof Worker>["postMessage"]);
|
||||
const remoteWorker = new IndexedDBStoreWorker(postMessage);
|
||||
|
||||
global.onmessage = remoteWorker.onMessage;
|
||||
@@ -19,8 +19,8 @@ limitations under the License.
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
import olmWasmPath from "@matrix-org/olm/olm.wasm";
|
||||
import Olm from '@matrix-org/olm';
|
||||
import olmWasmPath from "olm/olm.wasm";
|
||||
import Olm from 'olm';
|
||||
import * as ReactDOM from "react-dom";
|
||||
import * as React from "react";
|
||||
|
||||
@@ -31,9 +31,10 @@ import PWAPlatform from "./platform/PWAPlatform";
|
||||
import WebPlatform from "./platform/WebPlatform";
|
||||
import PlatformPeg from "matrix-react-sdk/src/PlatformPeg";
|
||||
import SdkConfig from "matrix-react-sdk/src/SdkConfig";
|
||||
import { setTheme } from "matrix-react-sdk/src/theme";
|
||||
import {setTheme} from "matrix-react-sdk/src/theme";
|
||||
|
||||
import {initRageshake, initRageshakeStore} from "./rageshakesetup";
|
||||
|
||||
import { initRageshake, initRageshakeStore } from "./rageshakesetup";
|
||||
|
||||
export const rageshakePromise = initRageshake();
|
||||
|
||||
|
||||
@@ -17,7 +17,8 @@ limitations under the License.
|
||||
// We have to trick webpack into loading our CSS for us.
|
||||
require("./index.scss");
|
||||
|
||||
import { KJUR } from 'jsrsasign';
|
||||
import * as qs from 'querystring';
|
||||
import {KJUR} from 'jsrsasign';
|
||||
import {
|
||||
IOpenIDCredentials,
|
||||
IWidgetApiRequest,
|
||||
@@ -51,16 +52,15 @@ let meetApi: any; // JitsiMeetExternalAPI
|
||||
|
||||
(async function() {
|
||||
try {
|
||||
// The widget's options are encoded into the fragment to avoid leaking info to the server.
|
||||
const widgetQuery = new URLSearchParams(window.location.hash.substring(1));
|
||||
// The widget spec on the other hand requires the widgetId and parentUrl to show up in the regular query string.
|
||||
const realQuery = new URLSearchParams(window.location.search.substring(1));
|
||||
// The widget's options are encoded into the fragment to avoid leaking info to the server. The widget
|
||||
// spec on the other hand requires the widgetId and parentUrl to show up in the regular query string.
|
||||
const widgetQuery = qs.parse(window.location.hash.substring(1));
|
||||
const query = Object.assign({}, qs.parse(window.location.search.substring(1)), widgetQuery);
|
||||
const qsParam = (name: string, optional = false): string => {
|
||||
const vals = widgetQuery.has(name) ? widgetQuery.getAll(name) : realQuery.getAll(name);
|
||||
if (!optional && vals.length !== 1) {
|
||||
if (!optional && (!query[name] || typeof (query[name]) !== 'string')) {
|
||||
throw new Error(`Expected singular ${name} in query string`);
|
||||
}
|
||||
return <string>vals[0];
|
||||
return <string>query[name];
|
||||
};
|
||||
|
||||
// If we have these params, expect a widget API to be available (ie. to be in an iframe
|
||||
@@ -138,7 +138,7 @@ let meetApi: any; // JitsiMeetExternalAPI
|
||||
});
|
||||
widgetApi.transport.reply(ev.detail, {}); // ack
|
||||
} else {
|
||||
widgetApi.transport.reply(ev.detail, { error: { message: "Conference not joined" } });
|
||||
widgetApi.transport.reply(ev.detail, {error: {message: "Conference not joined"}});
|
||||
}
|
||||
},
|
||||
);
|
||||
@@ -168,7 +168,7 @@ function switchVisibleContainers() {
|
||||
*/
|
||||
function createJWTToken() {
|
||||
// Header
|
||||
const header = { alg: 'HS256', typ: 'JWT' };
|
||||
const header = {alg: 'HS256', typ: 'JWT'};
|
||||
// Payload
|
||||
const payload = {
|
||||
// As per Jitsi token auth, `iss` needs to be set to something agreed between
|
||||
|
||||
@@ -152,7 +152,7 @@ body {
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.92 33.32C20.92 34.2478 20.1679 35 19.24 35C13.0544 35 8.04001 29.9856 8.04001 23.8C8.04001 22.8722 8.79217 22.12 9.72001 22.12C10.6478 22.12 11.4 22.8722 11.4 23.8C11.4 28.1299 14.9101 31.64 19.24 31.64C20.1679 31.64 20.92 32.3922 20.92 33.32Z" fill="#0DBD8B"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.68 24.9199C3.75216 24.9199 3 24.1678 3 23.2399C3 17.0543 8.01441 12.0399 14.2 12.0399C15.1278 12.0399 15.88 12.7921 15.88 13.7199C15.88 14.6478 15.1278 15.3999 14.2 15.3999C9.87009 15.3999 6.36 18.91 6.36 23.2399C6.36 24.1678 5.60784 24.9199 4.68 24.9199Z" fill="#0DBD8B"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.32 17.0801C30.2478 17.0801 31 17.8322 31 18.7601C31 24.9457 25.9856 29.9601 19.8 29.9601C18.8722 29.9601 18.12 29.2079 18.12 28.2801C18.12 27.3522 18.8722 26.6001 19.8 26.6001C24.1299 26.6001 27.64 23.09 27.64 18.7601C27.64 17.8322 28.3922 17.0801 29.32 17.0801Z" fill="#0DBD8B"/>
|
||||
</svg>
|
||||
</svg>
|
||||
</span>
|
||||
<p>Set up Element on iOS or Android</p>
|
||||
</div>
|
||||
@@ -260,7 +260,6 @@ body {
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="https://f-droid.org/repository/browse/?fdid=im.vector.app" target="_blank" class="mx_ClearDecoration">
|
||||
<svg width="164px" height="48px" viewBox="0 0 157 46" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<desc>Get it on F-Droid.</desc>
|
||||
@@ -326,7 +325,7 @@ body {
|
||||
<a class="mx_Button" id="configure_element_button" href="#">Configure</a>
|
||||
<p class="mx_Subtext mx_SubtextTop">Tap the button above, or manually enable <em>Use custom server</em> and enter:</p>
|
||||
<p class="mx_Subtext">Homeserver: <em id="hs_url"></em></p>
|
||||
<p class="mx_Subtext" id="custom_is">Identity server: <em id="is_url"></em></p>
|
||||
<p class="mx_Subtext" id="custom_is">Identity Server: <em id="is_url"></em></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
import { getVectorConfig } from '../getconfig';
|
||||
import {getVectorConfig} from '../getconfig';
|
||||
|
||||
function onBackToElementClick(): void {
|
||||
function onBackToElementClick() {
|
||||
// Cookie should expire in 4 hours
|
||||
document.cookie = 'element_mobile_redirect_to_guide=false;path=/;max-age=14400';
|
||||
window.location.href = '../';
|
||||
}
|
||||
|
||||
// NEVER pass user-controlled content to this function! Hardcoded strings only please.
|
||||
function renderConfigError(message: string): void {
|
||||
function renderConfigError(message) {
|
||||
const contactMsg = "If this is unexpected, please contact your system administrator " +
|
||||
"or technical support representative.";
|
||||
message = `<h2>Error loading Element</h2><p>${message}</p><p>${contactMsg}</p>`;
|
||||
|
||||
const toHide = document.getElementsByClassName("mx_HomePage_container");
|
||||
const errorContainers = document.getElementsByClassName(
|
||||
"mx_HomePage_errorContainer",
|
||||
) as HTMLCollectionOf<HTMLDialogElement>;
|
||||
const errorContainers = document.getElementsByClassName("mx_HomePage_errorContainer");
|
||||
|
||||
for (const e of toHide) {
|
||||
// We have to clear the content because .style.display='none'; doesn't work
|
||||
@@ -28,7 +26,7 @@ function renderConfigError(message: string): void {
|
||||
}
|
||||
}
|
||||
|
||||
async function initPage(): Promise<void> {
|
||||
async function initPage() {
|
||||
document.getElementById('back_to_element_button').onclick = onBackToElementClick;
|
||||
|
||||
const config = await getVectorConfig('..');
|
||||
@@ -94,7 +92,7 @@ async function initPage(): Promise<void> {
|
||||
if (isUrl && !isUrl.endsWith('/')) isUrl += '/';
|
||||
|
||||
if (hsUrl !== 'https://matrix.org/') {
|
||||
(document.getElementById('configure_element_button') as HTMLAnchorElement).href =
|
||||
document.getElementById('configure_element_button').href =
|
||||
"https://mobile.element.io?hs_url=" + encodeURIComponent(hsUrl) +
|
||||
"&is_url=" + encodeURIComponent(isUrl);
|
||||
document.getElementById('step1_heading').innerHTML= '1: Install the app';
|
||||
File diff suppressed because one or more lines are too long
@@ -17,43 +17,36 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { UpdateCheckStatus } from "matrix-react-sdk/src/BasePlatform";
|
||||
import VectorBasePlatform from './VectorBasePlatform';
|
||||
import {UpdateCheckStatus} from "matrix-react-sdk/src/BasePlatform";
|
||||
import BaseEventIndexManager, {
|
||||
ICrawlerCheckpoint,
|
||||
IEventAndProfile,
|
||||
IIndexStats,
|
||||
ISearchArgs,
|
||||
CrawlerCheckpoint,
|
||||
EventAndProfile,
|
||||
IndexStats,
|
||||
MatrixEvent,
|
||||
MatrixProfile,
|
||||
SearchArgs,
|
||||
SearchResult,
|
||||
} from 'matrix-react-sdk/src/indexing/BaseEventIndexManager';
|
||||
import dis from 'matrix-react-sdk/src/dispatcher/dispatcher';
|
||||
import { _t, _td } from 'matrix-react-sdk/src/languageHandler';
|
||||
import {_t, _td} from 'matrix-react-sdk/src/languageHandler';
|
||||
import SdkConfig from 'matrix-react-sdk/src/SdkConfig';
|
||||
import * as rageshake from 'matrix-react-sdk/src/rageshake/rageshake';
|
||||
import { MatrixClient } from "matrix-js-sdk/src/client";
|
||||
import { Room } from "matrix-js-sdk/src/models/room";
|
||||
import {MatrixClient} from "matrix-js-sdk/src/client";
|
||||
import {Room} from "matrix-js-sdk/src/models/room";
|
||||
import Modal from "matrix-react-sdk/src/Modal";
|
||||
import InfoDialog from "matrix-react-sdk/src/components/views/dialogs/InfoDialog";
|
||||
import Spinner from "matrix-react-sdk/src/components/views/elements/Spinner";
|
||||
import {
|
||||
Categories,
|
||||
CMD_OR_CTRL,
|
||||
DIGITS,
|
||||
Modifiers,
|
||||
registerShortcut,
|
||||
} from "matrix-react-sdk/src/accessibility/KeyboardShortcuts";
|
||||
import { isOnlyCtrlOrCmdKeyEvent, Key } from "matrix-react-sdk/src/Keyboard";
|
||||
import {Categories, Modifiers, registerShortcut} from "matrix-react-sdk/src/accessibility/KeyboardShortcuts";
|
||||
import {Key} from "matrix-react-sdk/src/Keyboard";
|
||||
import React from "react";
|
||||
import { randomString } from "matrix-js-sdk/src/randomstring";
|
||||
import { Action } from "matrix-react-sdk/src/dispatcher/actions";
|
||||
import { ActionPayload } from "matrix-react-sdk/src/dispatcher/payloads";
|
||||
import { SwitchSpacePayload } from "matrix-react-sdk/src/dispatcher/payloads/SwitchSpacePayload";
|
||||
import { showToast as showUpdateToast } from "matrix-react-sdk/src/toasts/UpdateToast";
|
||||
import { CheckUpdatesPayload } from "matrix-react-sdk/src/dispatcher/payloads/CheckUpdatesPayload";
|
||||
import {randomString} from "matrix-js-sdk/src/randomstring";
|
||||
import {Action} from "matrix-react-sdk/src/dispatcher/actions";
|
||||
import {ActionPayload} from "matrix-react-sdk/src/dispatcher/payloads";
|
||||
import {showToast as showUpdateToast} from "matrix-react-sdk/src/toasts/UpdateToast";
|
||||
import {CheckUpdatesPayload} from "matrix-react-sdk/src/dispatcher/payloads/CheckUpdatesPayload";
|
||||
import ToastStore from "matrix-react-sdk/src/stores/ToastStore";
|
||||
import GenericExpiringToast from "matrix-react-sdk/src/components/views/toasts/GenericExpiringToast";
|
||||
import SettingsStore from 'matrix-react-sdk/src/settings/SettingsStore';
|
||||
import { IMatrixProfile, IEventWithRoomId as IMatrixEvent, IResultRoomEvents } from "matrix-js-sdk/src/@types/search";
|
||||
|
||||
import VectorBasePlatform from './VectorBasePlatform';
|
||||
|
||||
const electron = window.electron;
|
||||
const isMac = navigator.platform.toUpperCase().includes('MAC');
|
||||
@@ -110,19 +103,19 @@ class SeshatIndexManager extends BaseEventIndexManager {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
electron.on('seshatReply', this.onIpcReply);
|
||||
electron.on('seshatReply', this._onIpcReply);
|
||||
}
|
||||
|
||||
private async ipcCall(name: string, ...args: any[]): Promise<any> {
|
||||
async _ipcCall(name: string, ...args: any[]): Promise<any> {
|
||||
// TODO this should be moved into the preload.js file.
|
||||
const ipcCallId = ++this.nextIpcCallId;
|
||||
return new Promise((resolve, reject) => {
|
||||
this.pendingIpcCalls[ipcCallId] = { resolve, reject };
|
||||
window.electron.send('seshat', { id: ipcCallId, name, args });
|
||||
this.pendingIpcCalls[ipcCallId] = {resolve, reject};
|
||||
window.electron.send('seshat', {id: ipcCallId, name, args});
|
||||
});
|
||||
}
|
||||
|
||||
private onIpcReply = (ev: {}, payload: IPCPayload) => {
|
||||
_onIpcReply = (ev: {}, payload: IPCPayload) => {
|
||||
if (payload.id === undefined) {
|
||||
console.warn("Ignoring IPC reply with no ID");
|
||||
return;
|
||||
@@ -143,79 +136,79 @@ class SeshatIndexManager extends BaseEventIndexManager {
|
||||
};
|
||||
|
||||
async supportsEventIndexing(): Promise<boolean> {
|
||||
return this.ipcCall('supportsEventIndexing');
|
||||
return this._ipcCall('supportsEventIndexing');
|
||||
}
|
||||
|
||||
async initEventIndex(userId: string, deviceId: string): Promise<void> {
|
||||
return this.ipcCall('initEventIndex', userId, deviceId);
|
||||
return this._ipcCall('initEventIndex', userId, deviceId);
|
||||
}
|
||||
|
||||
async addEventToIndex(ev: IMatrixEvent, profile: IMatrixProfile): Promise<void> {
|
||||
return this.ipcCall('addEventToIndex', ev, profile);
|
||||
async addEventToIndex(ev: MatrixEvent, profile: MatrixProfile): Promise<void> {
|
||||
return this._ipcCall('addEventToIndex', ev, profile);
|
||||
}
|
||||
|
||||
async deleteEvent(eventId: string): Promise<boolean> {
|
||||
return this.ipcCall('deleteEvent', eventId);
|
||||
return this._ipcCall('deleteEvent', eventId);
|
||||
}
|
||||
|
||||
async isEventIndexEmpty(): Promise<boolean> {
|
||||
return this.ipcCall('isEventIndexEmpty');
|
||||
return this._ipcCall('isEventIndexEmpty');
|
||||
}
|
||||
|
||||
async isRoomIndexed(roomId: string): Promise<boolean> {
|
||||
return this.ipcCall('isRoomIndexed', roomId);
|
||||
return this._ipcCall('isRoomIndexed', roomId);
|
||||
}
|
||||
|
||||
async commitLiveEvents(): Promise<void> {
|
||||
return this.ipcCall('commitLiveEvents');
|
||||
return this._ipcCall('commitLiveEvents');
|
||||
}
|
||||
|
||||
async searchEventIndex(searchConfig: ISearchArgs): Promise<IResultRoomEvents> {
|
||||
return this.ipcCall('searchEventIndex', searchConfig);
|
||||
async searchEventIndex(searchConfig: SearchArgs): Promise<SearchResult> {
|
||||
return this._ipcCall('searchEventIndex', searchConfig);
|
||||
}
|
||||
|
||||
async addHistoricEvents(
|
||||
events: IEventAndProfile[],
|
||||
checkpoint: ICrawlerCheckpoint | null,
|
||||
oldCheckpoint: ICrawlerCheckpoint | null,
|
||||
events: [EventAndProfile],
|
||||
checkpoint: CrawlerCheckpoint | null,
|
||||
oldCheckpoint: CrawlerCheckpoint | null,
|
||||
): Promise<boolean> {
|
||||
return this.ipcCall('addHistoricEvents', events, checkpoint, oldCheckpoint);
|
||||
return this._ipcCall('addHistoricEvents', events, checkpoint, oldCheckpoint);
|
||||
}
|
||||
|
||||
async addCrawlerCheckpoint(checkpoint: ICrawlerCheckpoint): Promise<void> {
|
||||
return this.ipcCall('addCrawlerCheckpoint', checkpoint);
|
||||
async addCrawlerCheckpoint(checkpoint: CrawlerCheckpoint): Promise<void> {
|
||||
return this._ipcCall('addCrawlerCheckpoint', checkpoint);
|
||||
}
|
||||
|
||||
async removeCrawlerCheckpoint(checkpoint: ICrawlerCheckpoint): Promise<void> {
|
||||
return this.ipcCall('removeCrawlerCheckpoint', checkpoint);
|
||||
async removeCrawlerCheckpoint(checkpoint: CrawlerCheckpoint): Promise<void> {
|
||||
return this._ipcCall('removeCrawlerCheckpoint', checkpoint);
|
||||
}
|
||||
|
||||
async loadFileEvents(args): Promise<IEventAndProfile[]> {
|
||||
return this.ipcCall('loadFileEvents', args);
|
||||
async loadFileEvents(args): Promise<[EventAndProfile]> {
|
||||
return this._ipcCall('loadFileEvents', args);
|
||||
}
|
||||
|
||||
async loadCheckpoints(): Promise<ICrawlerCheckpoint[]> {
|
||||
return this.ipcCall('loadCheckpoints');
|
||||
async loadCheckpoints(): Promise<[CrawlerCheckpoint]> {
|
||||
return this._ipcCall('loadCheckpoints');
|
||||
}
|
||||
|
||||
async closeEventIndex(): Promise<void> {
|
||||
return this.ipcCall('closeEventIndex');
|
||||
return this._ipcCall('closeEventIndex');
|
||||
}
|
||||
|
||||
async getStats(): Promise<IIndexStats> {
|
||||
return this.ipcCall('getStats');
|
||||
async getStats(): Promise<IndexStats> {
|
||||
return this._ipcCall('getStats');
|
||||
}
|
||||
|
||||
async getUserVersion(): Promise<number> {
|
||||
return this.ipcCall('getUserVersion');
|
||||
return this._ipcCall('getUserVersion');
|
||||
}
|
||||
|
||||
async setUserVersion(version: number): Promise<void> {
|
||||
return this.ipcCall('setUserVersion', version);
|
||||
return this._ipcCall('setUserVersion', version);
|
||||
}
|
||||
|
||||
async deleteEventIndex(): Promise<void> {
|
||||
return this.ipcCall('deleteEventIndex');
|
||||
return this._ipcCall('deleteEventIndex');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,16 +242,16 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
rageshake.flush();
|
||||
});
|
||||
|
||||
electron.on('ipcReply', this.onIpcReply);
|
||||
electron.on('ipcReply', this._onIpcReply);
|
||||
electron.on('update-downloaded', this.onUpdateDownloaded);
|
||||
|
||||
electron.on('preferences', () => {
|
||||
dis.fire(Action.ViewUserSettings);
|
||||
});
|
||||
|
||||
electron.on('userDownloadCompleted', (ev, { path, name }) => {
|
||||
electron.on('userDownloadCompleted', (ev, {path, name}) => {
|
||||
const onAccept = () => {
|
||||
electron.send('userDownloadOpen', { path });
|
||||
electron.send('userDownloadOpen', {path});
|
||||
};
|
||||
|
||||
ToastStore.sharedInstance().addOrReplaceToast({
|
||||
@@ -277,14 +270,6 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
});
|
||||
|
||||
// register OS-specific shortcuts
|
||||
registerShortcut(Categories.NAVIGATION, {
|
||||
keybinds: [{
|
||||
modifiers: [CMD_OR_CTRL],
|
||||
key: DIGITS,
|
||||
}],
|
||||
description: _td("Switch to space by number"),
|
||||
});
|
||||
|
||||
if (isMac) {
|
||||
registerShortcut(Categories.NAVIGATION, {
|
||||
keybinds: [{
|
||||
@@ -317,14 +302,14 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
});
|
||||
}
|
||||
|
||||
this.ipcCall("startSSOFlow", this.ssoID);
|
||||
this._ipcCall("startSSOFlow", this.ssoID);
|
||||
}
|
||||
|
||||
async getConfig(): Promise<{}> {
|
||||
return this.ipcCall('getConfig');
|
||||
return this._ipcCall('getConfig');
|
||||
}
|
||||
|
||||
onUpdateDownloaded = async (ev, { releaseNotes, releaseName }) => {
|
||||
onUpdateDownloaded = async (ev, {releaseNotes, releaseName}) => {
|
||||
dis.dispatch<CheckUpdatesPayload>({
|
||||
action: Action.CheckUpdates,
|
||||
status: UpdateCheckStatus.Ready,
|
||||
@@ -388,7 +373,7 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
room_id: room.roomId,
|
||||
});
|
||||
window.focus();
|
||||
this.ipcCall('focusWindow');
|
||||
this._ipcCall('focusWindow');
|
||||
};
|
||||
|
||||
return notification;
|
||||
@@ -399,7 +384,7 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
}
|
||||
|
||||
async getAppVersion(): Promise<string> {
|
||||
return this.ipcCall('getAppVersion');
|
||||
return this._ipcCall('getAppVersion');
|
||||
}
|
||||
|
||||
supportsAutoLaunch(): boolean {
|
||||
@@ -407,23 +392,11 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
}
|
||||
|
||||
async getAutoLaunchEnabled(): Promise<boolean> {
|
||||
return this.ipcCall('getAutoLaunchEnabled');
|
||||
return this._ipcCall('getAutoLaunchEnabled');
|
||||
}
|
||||
|
||||
async setAutoLaunchEnabled(enabled: boolean): Promise<void> {
|
||||
return this.ipcCall('setAutoLaunchEnabled', enabled);
|
||||
}
|
||||
|
||||
supportsWarnBeforeExit(): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
async shouldWarnBeforeExit(): Promise<boolean> {
|
||||
return this.ipcCall('shouldWarnBeforeExit');
|
||||
}
|
||||
|
||||
async setWarnBeforeExit(enabled: boolean): Promise<void> {
|
||||
return this.ipcCall('setWarnBeforeExit', enabled);
|
||||
return this._ipcCall('setAutoLaunchEnabled', enabled);
|
||||
}
|
||||
|
||||
supportsAutoHideMenuBar(): boolean {
|
||||
@@ -432,11 +405,11 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
}
|
||||
|
||||
async getAutoHideMenuBarEnabled(): Promise<boolean> {
|
||||
return this.ipcCall('getAutoHideMenuBarEnabled');
|
||||
return this._ipcCall('getAutoHideMenuBarEnabled');
|
||||
}
|
||||
|
||||
async setAutoHideMenuBarEnabled(enabled: boolean): Promise<void> {
|
||||
return this.ipcCall('setAutoHideMenuBarEnabled', enabled);
|
||||
return this._ipcCall('setAutoHideMenuBarEnabled', enabled);
|
||||
}
|
||||
|
||||
supportsMinimizeToTray(): boolean {
|
||||
@@ -445,15 +418,15 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
}
|
||||
|
||||
async getMinimizeToTrayEnabled(): Promise<boolean> {
|
||||
return this.ipcCall('getMinimizeToTrayEnabled');
|
||||
return this._ipcCall('getMinimizeToTrayEnabled');
|
||||
}
|
||||
|
||||
async setMinimizeToTrayEnabled(enabled: boolean): Promise<void> {
|
||||
return this.ipcCall('setMinimizeToTrayEnabled', enabled);
|
||||
return this._ipcCall('setMinimizeToTrayEnabled', enabled);
|
||||
}
|
||||
|
||||
async canSelfUpdate(): Promise<boolean> {
|
||||
const feedUrl = await this.ipcCall('getUpdateFeedUrl');
|
||||
const feedUrl = await this._ipcCall('getUpdateFeedUrl');
|
||||
return Boolean(feedUrl);
|
||||
}
|
||||
|
||||
@@ -492,16 +465,16 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
window.location.reload(false);
|
||||
}
|
||||
|
||||
private async ipcCall(name: string, ...args: any[]): Promise<any> {
|
||||
async _ipcCall(name: string, ...args: any[]): Promise<any> {
|
||||
const ipcCallId = ++this.nextIpcCallId;
|
||||
return new Promise((resolve, reject) => {
|
||||
this.pendingIpcCalls[ipcCallId] = { resolve, reject };
|
||||
window.electron.send('ipcCall', { id: ipcCallId, name, args });
|
||||
this.pendingIpcCalls[ipcCallId] = {resolve, reject};
|
||||
window.electron.send('ipcCall', {id: ipcCallId, name, args});
|
||||
// Maybe add a timeout to these? Probably not necessary.
|
||||
});
|
||||
}
|
||||
|
||||
private onIpcReply = (ev, payload) => {
|
||||
_onIpcReply = (ev, payload) => {
|
||||
if (payload.id === undefined) {
|
||||
console.warn("Ignoring IPC reply with no ID");
|
||||
return;
|
||||
@@ -525,23 +498,19 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
return this.eventIndexManager;
|
||||
}
|
||||
|
||||
async setLanguage(preferredLangs: string[]) {
|
||||
return this.ipcCall('setLanguage', preferredLangs);
|
||||
}
|
||||
|
||||
setSpellCheckLanguages(preferredLangs: string[]) {
|
||||
this.ipcCall('setSpellCheckLanguages', preferredLangs).catch(error => {
|
||||
this._ipcCall('setSpellCheckLanguages', preferredLangs).catch(error => {
|
||||
console.log("Failed to send setSpellCheckLanguages IPC to Electron");
|
||||
console.error(error);
|
||||
});
|
||||
}
|
||||
|
||||
async getSpellCheckLanguages(): Promise<string[]> {
|
||||
return this.ipcCall('getSpellCheckLanguages');
|
||||
return this._ipcCall('getSpellCheckLanguages');
|
||||
}
|
||||
|
||||
async getAvailableSpellCheckLanguages(): Promise<string[]> {
|
||||
return this.ipcCall('getAvailableSpellCheckLanguages');
|
||||
return this._ipcCall('getAvailableSpellCheckLanguages');
|
||||
}
|
||||
|
||||
getSSOCallbackUrl(fragmentAfterLogin: string): URL {
|
||||
@@ -560,14 +529,8 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
});
|
||||
}
|
||||
|
||||
private navigateForwardBack(back: boolean) {
|
||||
this.ipcCall(back ? "navigateBack" : "navigateForward");
|
||||
}
|
||||
private navigateToSpace(num: number) {
|
||||
dis.dispatch<SwitchSpacePayload>({
|
||||
action: Action.SwitchSpace,
|
||||
num,
|
||||
});
|
||||
_navigateForwardBack(back: boolean) {
|
||||
this._ipcCall(back ? "navigateBack" : "navigateForward");
|
||||
}
|
||||
|
||||
onKeyDown(ev: KeyboardEvent): boolean {
|
||||
@@ -577,7 +540,7 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
case Key.SQUARE_BRACKET_LEFT:
|
||||
case Key.SQUARE_BRACKET_RIGHT:
|
||||
if (isMac && ev.metaKey && !ev.altKey && !ev.ctrlKey && !ev.shiftKey) {
|
||||
this.navigateForwardBack(ev.key === Key.SQUARE_BRACKET_LEFT);
|
||||
this._navigateForwardBack(ev.key === Key.SQUARE_BRACKET_LEFT);
|
||||
handled = true;
|
||||
}
|
||||
break;
|
||||
@@ -585,30 +548,18 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
case Key.ARROW_LEFT:
|
||||
case Key.ARROW_RIGHT:
|
||||
if (!isMac && ev.altKey && !ev.metaKey && !ev.ctrlKey && !ev.shiftKey) {
|
||||
this.navigateForwardBack(ev.key === Key.ARROW_LEFT);
|
||||
this._navigateForwardBack(ev.key === Key.ARROW_LEFT);
|
||||
handled = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (!handled &&
|
||||
// ideally we would use SpaceStore.spacesEnabled here but importing SpaceStore in this platform
|
||||
// breaks skinning as the platform is instantiated prior to the skin being loaded
|
||||
SettingsStore.getValue("feature_spaces") &&
|
||||
ev.code.startsWith("Digit") &&
|
||||
isOnlyCtrlOrCmdKeyEvent(ev)
|
||||
) {
|
||||
const spaceNumber = ev.code.slice(5); // Cut off the first 5 characters - "Digit"
|
||||
this.navigateToSpace(parseInt(spaceNumber, 10));
|
||||
handled = true;
|
||||
}
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
async getPickleKey(userId: string, deviceId: string): Promise<string | null> {
|
||||
try {
|
||||
return await this.ipcCall('getPickleKey', userId, deviceId);
|
||||
return await this._ipcCall('getPickleKey', userId, deviceId);
|
||||
} catch (e) {
|
||||
// if we can't connect to the password storage, assume there's no
|
||||
// pickle key
|
||||
@@ -618,7 +569,7 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
|
||||
async createPickleKey(userId: string, deviceId: string): Promise<string | null> {
|
||||
try {
|
||||
return await this.ipcCall('createPickleKey', userId, deviceId);
|
||||
return await this._ipcCall('createPickleKey', userId, deviceId);
|
||||
} catch (e) {
|
||||
// if we can't connect to the password storage, assume there's no
|
||||
// pickle key
|
||||
@@ -628,7 +579,7 @@ export default class ElectronPlatform extends VectorBasePlatform {
|
||||
|
||||
async destroyPickleKey(userId: string, deviceId: string): Promise<void> {
|
||||
try {
|
||||
await this.ipcCall('destroyPickleKey', userId, deviceId);
|
||||
await this._ipcCall('destroyPickleKey', userId, deviceId);
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,8 @@ limitations under the License.
|
||||
*/
|
||||
|
||||
import BasePlatform from 'matrix-react-sdk/src/BasePlatform';
|
||||
import { _t } from 'matrix-react-sdk/src/languageHandler';
|
||||
import { getVectorConfig } from "../getconfig";
|
||||
import {_t} from 'matrix-react-sdk/src/languageHandler';
|
||||
import {getVectorConfig} from "../getconfig";
|
||||
|
||||
import Favicon from "../../favicon";
|
||||
|
||||
@@ -49,7 +49,7 @@ export default abstract class VectorBasePlatform extends BasePlatform {
|
||||
return this._favicon = new Favicon();
|
||||
}
|
||||
|
||||
private updateFavicon() {
|
||||
_updateFavicon() {
|
||||
let bgColor = "#d00";
|
||||
let notif: string | number = this.notificationCount;
|
||||
|
||||
@@ -64,13 +64,13 @@ export default abstract class VectorBasePlatform extends BasePlatform {
|
||||
setNotificationCount(count: number) {
|
||||
if (this.notificationCount === count) return;
|
||||
super.setNotificationCount(count);
|
||||
this.updateFavicon();
|
||||
this._updateFavicon();
|
||||
}
|
||||
|
||||
setErrorStatus(errorDidOccur: boolean) {
|
||||
if (this.errorDidOccur === errorDidOccur) return;
|
||||
super.setErrorStatus(errorDidOccur);
|
||||
this.updateFavicon();
|
||||
this._updateFavicon();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,13 +17,13 @@ limitations under the License.
|
||||
*/
|
||||
|
||||
import VectorBasePlatform from './VectorBasePlatform';
|
||||
import { UpdateCheckStatus } from "matrix-react-sdk/src/BasePlatform";
|
||||
import {UpdateCheckStatus} from "matrix-react-sdk/src/BasePlatform";
|
||||
import request from 'browser-request';
|
||||
import dis from 'matrix-react-sdk/src/dispatcher/dispatcher';
|
||||
import { _t } from 'matrix-react-sdk/src/languageHandler';
|
||||
import { Room } from "matrix-js-sdk/src/models/room";
|
||||
import { hideToast as hideUpdateToast, showToast as showUpdateToast } from "matrix-react-sdk/src/toasts/UpdateToast";
|
||||
import { Action } from "matrix-react-sdk/src/dispatcher/actions";
|
||||
import {_t} from 'matrix-react-sdk/src/languageHandler';
|
||||
import {Room} from "matrix-js-sdk/src/models/room";
|
||||
import {hideToast as hideUpdateToast, showToast as showUpdateToast} from "matrix-react-sdk/src/toasts/UpdateToast";
|
||||
import {Action} from "matrix-react-sdk/src/dispatcher/actions";
|
||||
import { CheckUpdatesPayload } from 'matrix-react-sdk/src/dispatcher/payloads/CheckUpdatesPayload';
|
||||
|
||||
import UAParser from 'ua-parser-js';
|
||||
@@ -100,7 +100,7 @@ export default class WebPlatform extends VectorBasePlatform {
|
||||
return notification;
|
||||
}
|
||||
|
||||
private getVersion(): Promise<string> {
|
||||
_getVersion(): Promise<string> {
|
||||
// We add a cachebuster to the request to make sure that we know about
|
||||
// the most recent version on the origin server. That might not
|
||||
// actually be the version we'd get on a reload (particularly in the
|
||||
@@ -132,7 +132,7 @@ export default class WebPlatform extends VectorBasePlatform {
|
||||
if (this.runningVersion !== null) {
|
||||
return Promise.resolve(this.runningVersion);
|
||||
}
|
||||
return this.getVersion();
|
||||
return this._getVersion();
|
||||
}
|
||||
|
||||
startUpdater() {
|
||||
@@ -145,7 +145,7 @@ export default class WebPlatform extends VectorBasePlatform {
|
||||
}
|
||||
|
||||
pollForUpdate = () => {
|
||||
return this.getVersion().then((ver) => {
|
||||
return this._getVersion().then((ver) => {
|
||||
if (this.runningVersion === null) {
|
||||
this.runningVersion = ver;
|
||||
} else if (this.runningVersion !== ver) {
|
||||
|
||||
@@ -36,7 +36,7 @@ export function initRageshake() {
|
||||
prom.then(() => {
|
||||
console.log("Initialised rageshake.");
|
||||
console.log("To fix line numbers in Chrome: " +
|
||||
"Meatball menu → Settings → Ignore list → Add /rageshake\\.js$");
|
||||
"Meatball menu → Settings → Blackboxing → Add /rageshake\\.js$");
|
||||
|
||||
window.addEventListener('beforeunload', (e) => {
|
||||
console.log('element-web closing');
|
||||
|
||||
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
import { QueryDict, decodeParams } from "matrix-js-sdk/src/utils";
|
||||
import * as qs from 'querystring';
|
||||
|
||||
// We want to support some name / value pairs in the fragment
|
||||
// so we're re-using query string like format
|
||||
@@ -32,15 +32,15 @@ export function parseQsFromFragment(location: Location) {
|
||||
|
||||
const result = {
|
||||
location: decodeURIComponent(hashparts[0]),
|
||||
params: <QueryDict>{},
|
||||
params: <qs.ParsedUrlQuery>{},
|
||||
};
|
||||
|
||||
if (hashparts.length > 1) {
|
||||
result.params = decodeParams(hashparts[1]);
|
||||
result.params = qs.parse(hashparts[1]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export function parseQs(location: Location): QueryDict {
|
||||
return decodeParams(location.search.substring(1));
|
||||
export function parseQs(location: Location) {
|
||||
return qs.parse(location.search.substring(1));
|
||||
}
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
Copyright 2020 New Vector Ltd
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
import { parseQsFromFragment, parseQs } from "../../src/vector/url_utils";
|
||||
|
||||
describe("url_utils.ts", function() {
|
||||
// @ts-ignore
|
||||
const location: Location = {
|
||||
hash: "",
|
||||
search: "",
|
||||
};
|
||||
|
||||
it("parseQsFromFragment", function() {
|
||||
location.hash = "/home?foo=bar";
|
||||
expect(parseQsFromFragment(location)).toEqual({
|
||||
location: "home",
|
||||
params: {
|
||||
"foo": "bar",
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseQs", function() {
|
||||
location.search = "?foo=bar";
|
||||
expect(parseQs(location)).toEqual({
|
||||
"foo": "bar",
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseQs with arrays", function() {
|
||||
location.search = "?via=s1&via=s2&via=s2&foo=bar";
|
||||
expect(parseQs(location)).toEqual({
|
||||
"via": ["s1", "s2", "s2"],
|
||||
"foo": "bar",
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -12,7 +12,6 @@
|
||||
"outDir": "./lib",
|
||||
"declaration": true,
|
||||
"jsx": "react",
|
||||
"strictNullChecks": true,
|
||||
"types": [
|
||||
"node",
|
||||
"react",
|
||||
|
||||
@@ -1,33 +1,23 @@
|
||||
/* eslint-disable quote-props */
|
||||
|
||||
const path = require('path');
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||
const TerserPlugin = require('terser-webpack-plugin');
|
||||
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
|
||||
const HtmlWebpackInjectPreload = require('@principalstudio/html-webpack-inject-preload');
|
||||
const webpack = require("webpack");
|
||||
|
||||
let ogImageUrl = process.env.RIOT_OG_IMAGE_URL;
|
||||
if (!ogImageUrl) ogImageUrl = 'https://app.element.io/themes/element/img/logos/opengraph.png';
|
||||
let og_image_url = process.env.RIOT_OG_IMAGE_URL;
|
||||
if (!og_image_url) og_image_url = 'https://app.element.io/themes/element/img/logos/opengraph.png';
|
||||
|
||||
const additionalPlugins = [
|
||||
// This is where you can put your customisation replacements.
|
||||
];
|
||||
|
||||
module.exports = (env, argv) => {
|
||||
let nodeEnv = argv.mode;
|
||||
if (process.env.CI_PACKAGE) {
|
||||
// Don't run minification for CI builds (this is only set for runs on develop)
|
||||
// We override this via environment variable to avoid duplicating the scripts
|
||||
// in `package.json` just for a different mode.
|
||||
argv.mode = "development";
|
||||
|
||||
// More and more people are using nightly build as their main client
|
||||
// Libraries like React have a development build that is useful
|
||||
// when working on the app but adds significant runtime overhead
|
||||
// We want to use the React production build but not compile the whole
|
||||
// application to productions standards
|
||||
nodeEnv = "production";
|
||||
}
|
||||
|
||||
const development = {};
|
||||
@@ -48,17 +38,12 @@ module.exports = (env, argv) => {
|
||||
return {
|
||||
...development,
|
||||
|
||||
node: {
|
||||
// Mock out the NodeFS module: The opus decoder imports this wrongly.
|
||||
fs: 'empty',
|
||||
},
|
||||
|
||||
entry: {
|
||||
"bundle": "./src/vector/index.ts",
|
||||
"mobileguide": "./src/vector/mobile_guide/index.ts",
|
||||
"indexeddb-worker": "./src/vector/indexeddb-worker.js",
|
||||
"mobileguide": "./src/vector/mobile_guide/index.js",
|
||||
"jitsi": "./src/vector/jitsi/index.ts",
|
||||
"usercontent": "./node_modules/matrix-react-sdk/src/usercontent/index.js",
|
||||
"recorder-worklet": "./node_modules/matrix-react-sdk/src/audio/RecorderWorklet.ts",
|
||||
|
||||
// CSS themes
|
||||
"theme-legacy": "./node_modules/matrix-react-sdk/res/themes/legacy-light/css/legacy-light.scss",
|
||||
@@ -95,10 +80,6 @@ module.exports = (env, argv) => {
|
||||
// we use a CSS optimizer too and need to manage it ourselves.
|
||||
minimize: argv.mode === 'production',
|
||||
minimizer: argv.mode === 'production' ? [new TerserPlugin({}), new OptimizeCSSAssetsPlugin({})] : [],
|
||||
|
||||
// Set the value of `process.env.NODE_ENV` for libraries like React
|
||||
// See also https://v4.webpack.js.org/configuration/optimization/#optimizationnodeenv
|
||||
nodeEnv,
|
||||
},
|
||||
|
||||
resolve: {
|
||||
@@ -143,17 +124,13 @@ module.exports = (env, argv) => {
|
||||
// overflows (https://github.com/webpack/webpack/issues/1721), and
|
||||
// there is no need for webpack to parse them - they can just be
|
||||
// included as-is.
|
||||
/highlight\.js[\\/]lib[\\/]languages/,
|
||||
/highlight\.js[\\\/]lib[\\\/]languages/,
|
||||
|
||||
// olm takes ages for webpack to process, and it's already heavily
|
||||
// optimised, so there is little to gain by us uglifying it.
|
||||
/olm[\\/](javascript[\\/])?olm\.js$/,
|
||||
/olm[\\\/](javascript[\\\/])?olm\.js$/,
|
||||
],
|
||||
rules: [
|
||||
{
|
||||
test: /\.worker\.ts$/,
|
||||
loader: "worker-loader",
|
||||
},
|
||||
{
|
||||
test: /\.(ts|js)x?$/,
|
||||
include: (f) => {
|
||||
@@ -175,8 +152,8 @@ module.exports = (env, argv) => {
|
||||
},
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
cacheDirectory: true,
|
||||
},
|
||||
cacheDirectory: true
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
@@ -187,7 +164,7 @@ module.exports = (env, argv) => {
|
||||
options: {
|
||||
importLoaders: 1,
|
||||
sourceMap: true,
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
loader: 'postcss-loader',
|
||||
@@ -225,7 +202,7 @@ module.exports = (env, argv) => {
|
||||
"local-plugins": true,
|
||||
},
|
||||
},
|
||||
],
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.scss$/,
|
||||
@@ -236,7 +213,7 @@ module.exports = (env, argv) => {
|
||||
options: {
|
||||
importLoaders: 1,
|
||||
sourceMap: true,
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
loader: 'postcss-loader',
|
||||
@@ -254,6 +231,7 @@ module.exports = (env, argv) => {
|
||||
require("postcss-easings")(),
|
||||
require("postcss-strip-inline-comments")(),
|
||||
require("postcss-hexrgba")(),
|
||||
require("postcss-calc")({warnWhenCannotResolve: true}),
|
||||
|
||||
// It's important that this plugin is last otherwise we end
|
||||
// up with broken CSS.
|
||||
@@ -263,7 +241,7 @@ module.exports = (env, argv) => {
|
||||
"local-plugins": true,
|
||||
},
|
||||
},
|
||||
],
|
||||
]
|
||||
},
|
||||
{
|
||||
test: /\.wasm$/,
|
||||
@@ -274,55 +252,6 @@ module.exports = (env, argv) => {
|
||||
outputPath: '.',
|
||||
},
|
||||
},
|
||||
{
|
||||
// Fix up the name of the opus-recorder worker (react-sdk dependency).
|
||||
// We more or less just want it to be clear it's for opus and not something else.
|
||||
test: /encoderWorker\.min\.js$/,
|
||||
loader: "file-loader",
|
||||
type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725
|
||||
options: {
|
||||
// We deliberately override the name so it makes sense in debugging
|
||||
name: 'opus-encoderWorker.min.[hash:7].[ext]',
|
||||
outputPath: '.',
|
||||
},
|
||||
},
|
||||
{
|
||||
// This is from the same place as the encoderWorker above, but only needed
|
||||
// for Safari support.
|
||||
test: /decoderWorker\.min\.js$/,
|
||||
loader: "file-loader",
|
||||
type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725
|
||||
options: {
|
||||
// We deliberately override the name so it makes sense in debugging
|
||||
name: 'opus-decoderWorker.min.[hash:7].[ext]',
|
||||
outputPath: '.',
|
||||
},
|
||||
},
|
||||
{
|
||||
// This is from the same place as the encoderWorker above, but only needed
|
||||
// for Safari support.
|
||||
test: /decoderWorker\.min\.wasm$/,
|
||||
loader: "file-loader",
|
||||
type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725
|
||||
options: {
|
||||
// We deliberately don't change the name because the decoderWorker has this
|
||||
// hardcoded. This is here to avoid the default wasm rule from adding a hash.
|
||||
name: 'decoderWorker.min.wasm',
|
||||
outputPath: '.',
|
||||
},
|
||||
},
|
||||
{
|
||||
// This is from the same place as the encoderWorker above, but only needed
|
||||
// for Safari support.
|
||||
test: /waveWorker\.min\.js$/,
|
||||
loader: "file-loader",
|
||||
type: "javascript/auto", // https://github.com/webpack/webpack/issues/6725
|
||||
options: {
|
||||
// We deliberately override the name so it makes sense in debugging
|
||||
name: 'wave-encoderWorker.min.[hash:7].[ext]',
|
||||
outputPath: '.',
|
||||
},
|
||||
},
|
||||
{
|
||||
// cache-bust languages.json file placed in
|
||||
// element-web/webapp/i18n during build by copy-res.js
|
||||
@@ -370,7 +299,7 @@ module.exports = (env, argv) => {
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
]
|
||||
},
|
||||
|
||||
plugins: [
|
||||
@@ -389,9 +318,9 @@ module.exports = (env, argv) => {
|
||||
// of the themes and which chunks we actually care about.
|
||||
inject: false,
|
||||
excludeChunks: ['mobileguide', 'usercontent', 'jitsi'],
|
||||
minify: false,
|
||||
templateParameters: {
|
||||
og_image_url: ogImageUrl,
|
||||
minify: argv.mode === 'production',
|
||||
vars: {
|
||||
og_image_url: og_image_url,
|
||||
},
|
||||
}),
|
||||
|
||||
@@ -399,7 +328,7 @@ module.exports = (env, argv) => {
|
||||
new HtmlWebpackPlugin({
|
||||
template: './src/vector/jitsi/index.html',
|
||||
filename: 'jitsi.html',
|
||||
minify: false,
|
||||
minify: argv.mode === 'production',
|
||||
chunks: ['jitsi'],
|
||||
}),
|
||||
|
||||
@@ -407,7 +336,7 @@ module.exports = (env, argv) => {
|
||||
new HtmlWebpackPlugin({
|
||||
template: './src/vector/mobile_guide/index.html',
|
||||
filename: 'mobile_guide/index.html',
|
||||
minify: false,
|
||||
minify: argv.mode === 'production',
|
||||
chunks: ['mobileguide'],
|
||||
}),
|
||||
|
||||
@@ -415,13 +344,13 @@ module.exports = (env, argv) => {
|
||||
new HtmlWebpackPlugin({
|
||||
template: './src/vector/static/unable-to-load.html',
|
||||
filename: 'static/unable-to-load.html',
|
||||
minify: false,
|
||||
minify: argv.mode === 'production',
|
||||
chunks: [],
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
template: './src/vector/static/incompatible-browser.html',
|
||||
filename: 'static/incompatible-browser.html',
|
||||
minify: false,
|
||||
minify: argv.mode === 'production',
|
||||
chunks: [],
|
||||
}),
|
||||
|
||||
@@ -429,14 +358,10 @@ module.exports = (env, argv) => {
|
||||
new HtmlWebpackPlugin({
|
||||
template: './node_modules/matrix-react-sdk/src/usercontent/index.html',
|
||||
filename: 'usercontent/index.html',
|
||||
minify: false,
|
||||
minify: argv.mode === 'production',
|
||||
chunks: ['usercontent'],
|
||||
}),
|
||||
|
||||
new HtmlWebpackInjectPreload({
|
||||
files: [{ match: /.*Inter.*\.woff2$/ }],
|
||||
}),
|
||||
|
||||
...additionalPlugins,
|
||||
],
|
||||
|
||||
@@ -501,7 +426,6 @@ function getAssetOutputPath(url, resourcePath) {
|
||||
* be placed directly into things like CSS files.
|
||||
*
|
||||
* @param {string} path Some path to a file.
|
||||
* @returns {string} converted path
|
||||
*/
|
||||
function toPublicPath(path) {
|
||||
return path.replace(/\\/g, '/');
|
||||
|
||||
Reference in New Issue
Block a user