Merge branch 'develop' into travis/widget-api
This commit is contained in:
commit
465a2ce314
15 changed files with 234 additions and 59 deletions
26
CHANGELOG.md
26
CHANGELOG.md
|
@ -1,3 +1,29 @@
|
||||||
|
Changes in [1.7.7](https://github.com/vector-im/element-web/releases/tag/v1.7.7) (2020-09-14)
|
||||||
|
=============================================================================================
|
||||||
|
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.6...v1.7.7)
|
||||||
|
|
||||||
|
* Upgrade to React SDK 3.4.1
|
||||||
|
|
||||||
|
Changes in [1.7.6](https://github.com/vector-im/element-web/releases/tag/v1.7.6) (2020-09-14)
|
||||||
|
=============================================================================================
|
||||||
|
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.6-rc.1...v1.7.6)
|
||||||
|
|
||||||
|
* Upgrade to React SDK 3.4.0 and JS SDK 8.3.0
|
||||||
|
|
||||||
|
Changes in [1.7.6-rc.1](https://github.com/vector-im/element-web/releases/tag/v1.7.6-rc.1) (2020-09-09)
|
||||||
|
=======================================================================================================
|
||||||
|
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.5...v1.7.6-rc.1)
|
||||||
|
|
||||||
|
* Upgrade to React SDK 3.4.0-rc.1 and JS SDK 8.3.0-rc.1
|
||||||
|
* Update from Weblate
|
||||||
|
[\#15125](https://github.com/vector-im/element-web/pull/15125)
|
||||||
|
* Support usage of Jitsi widgets with "openidtoken-jwt" auth
|
||||||
|
[\#15114](https://github.com/vector-im/element-web/pull/15114)
|
||||||
|
* Fix eslint ts override tsx matching and delint
|
||||||
|
[\#15064](https://github.com/vector-im/element-web/pull/15064)
|
||||||
|
* Add testing to review guidelines
|
||||||
|
[\#15050](https://github.com/vector-im/element-web/pull/15050)
|
||||||
|
|
||||||
Changes in [1.7.5](https://github.com/vector-im/element-web/releases/tag/v1.7.5) (2020-09-01)
|
Changes in [1.7.5](https://github.com/vector-im/element-web/releases/tag/v1.7.5) (2020-09-01)
|
||||||
=============================================================================================
|
=============================================================================================
|
||||||
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.5-rc.1...v1.7.5)
|
[Full Changelog](https://github.com/vector-im/element-web/compare/v1.7.5-rc.1...v1.7.5)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Contributing code to Riot
|
Contributing code to Element
|
||||||
=========================
|
============================
|
||||||
|
|
||||||
Riot follows the same pattern as https://github.com/matrix-org/matrix-js-sdk/blob/master/CONTRIBUTING.rst.
|
Element follows the same pattern as https://github.com/matrix-org/matrix-js-sdk/blob/master/CONTRIBUTING.rst.
|
||||||
|
|
|
@ -225,7 +225,6 @@ First clone and build `matrix-js-sdk`:
|
||||||
``` bash
|
``` bash
|
||||||
git clone https://github.com/matrix-org/matrix-js-sdk.git
|
git clone https://github.com/matrix-org/matrix-js-sdk.git
|
||||||
pushd matrix-js-sdk
|
pushd matrix-js-sdk
|
||||||
git checkout develop
|
|
||||||
yarn link
|
yarn link
|
||||||
yarn install
|
yarn install
|
||||||
popd
|
popd
|
||||||
|
@ -236,7 +235,6 @@ Then similarly with `matrix-react-sdk`:
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/matrix-org/matrix-react-sdk.git
|
git clone https://github.com/matrix-org/matrix-react-sdk.git
|
||||||
pushd matrix-react-sdk
|
pushd matrix-react-sdk
|
||||||
git checkout develop
|
|
||||||
yarn link
|
yarn link
|
||||||
yarn link matrix-js-sdk
|
yarn link matrix-js-sdk
|
||||||
yarn install
|
yarn install
|
||||||
|
@ -248,7 +246,6 @@ Finally, build and start Element itself:
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/vector-im/element-web.git
|
git clone https://github.com/vector-im/element-web.git
|
||||||
cd element-web
|
cd element-web
|
||||||
git checkout develop
|
|
||||||
yarn link matrix-js-sdk
|
yarn link matrix-js-sdk
|
||||||
yarn link matrix-react-sdk
|
yarn link matrix-react-sdk
|
||||||
yarn install
|
yarn install
|
||||||
|
|
|
@ -48,7 +48,7 @@ For a good example, see https://develop.element.io/config.json.
|
||||||
1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server.
|
1. `integrations_widgets_urls`: list of URLs to the REST interface for the widget integrations server.
|
||||||
1. `bug_report_endpoint_url`: endpoint to send bug reports to (must be running a
|
1. `bug_report_endpoint_url`: endpoint to send bug reports to (must be running a
|
||||||
https://github.com/matrix-org/rageshake server). Bug reports are sent when a user clicks
|
https://github.com/matrix-org/rageshake server). Bug reports are sent when a user clicks
|
||||||
"Send Logs" within the application. Bug reports can be disabled by leaving the
|
"Send Logs" within the application. Bug reports can be disabled/hidden by leaving the
|
||||||
`bug_report_endpoint_url` out of your config file.
|
`bug_report_endpoint_url` out of your config file.
|
||||||
1. `roomDirectory`: config for the public room directory. This section is optional.
|
1. `roomDirectory`: config for the public room directory. This section is optional.
|
||||||
1. `roomDirectory.servers`: List of other homeservers' directories to include in the drop
|
1. `roomDirectory.servers`: List of other homeservers' directories to include in the drop
|
||||||
|
@ -101,6 +101,15 @@ For a good example, see https://develop.element.io/config.json.
|
||||||
Defaults to false (3rd party identity options are shown).
|
Defaults to false (3rd party identity options are shown).
|
||||||
1. `default_federate`: Default option for room federation when creating a room
|
1. `default_federate`: Default option for room federation when creating a room
|
||||||
Defaults to true (room federation enabled).
|
Defaults to true (room federation enabled).
|
||||||
|
1. `desktopBuilds`: Used to alter promotional links to the desktop app. By default
|
||||||
|
the builds are considered available and accessible from https://element.io. This
|
||||||
|
config option is typically used in the context of encouraging encrypted message
|
||||||
|
search capabilities (Seshat). All the options listed below are required if this
|
||||||
|
option is specified.
|
||||||
|
1. `available`: When false, the desktop app will not be promoted to the user.
|
||||||
|
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.
|
||||||
|
|
||||||
Note that `index.html` also has an og:image meta tag that is set to an image
|
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
|
hosted on riot.im. This is the image used if links to your copy of Element
|
||||||
|
@ -144,3 +153,42 @@ Desktop app configuration
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
See https://github.com/vector-im/riot-desktop#user-specified-configjson
|
See https://github.com/vector-im/riot-desktop#user-specified-configjson
|
||||||
|
|
||||||
|
UI Features
|
||||||
|
===========
|
||||||
|
|
||||||
|
Parts of the UI can be disabled using UI features. These are settings which appear
|
||||||
|
under `settingDefaults` and can only be `true` (default) or `false`. When `false`,
|
||||||
|
parts of the UI relating to that feature will be disabled regardless of the user's
|
||||||
|
preferences.
|
||||||
|
|
||||||
|
Currently, the following UI feature flags are supported:
|
||||||
|
|
||||||
|
* `UIFeature.urlPreviews` - Whether URL previews are enabled across the entire application.
|
||||||
|
* `UIFeature.feedback` - Whether prompts to supply feedback are shown.
|
||||||
|
* `UIFeature.voip` - Whether or not VoIP is shown readily to the user. When disabled,
|
||||||
|
Jitsi widgets will still work though they cannot easily be added.
|
||||||
|
* `UIFeature.widgets` - Whether or not widgets will be shown.
|
||||||
|
* `UIFeature.flair` - Whether or not community flair is shown in rooms.
|
||||||
|
* `UIFeature.communities` - Whether or not to show any UI related to communities. Implicitly
|
||||||
|
disables `UIFeature.flair` when disabled.
|
||||||
|
* `UIFeature.advancedSettings` - Whether or not sections titled "advanced" in room and
|
||||||
|
user settings are shown to the user.
|
||||||
|
* `UIFeature.shareQrCode` - Whether or not the QR code on the share room/event dialog
|
||||||
|
is shown.
|
||||||
|
* `UIFeature.shareSocial` - Whether or not the social icons on the share room/event dialog
|
||||||
|
are shown.
|
||||||
|
* `UIFeature.identityServer` - Whether or not functionality requiring an identity server
|
||||||
|
is shown. When disabled, the user will not be able to interact with the identity
|
||||||
|
server (sharing email addresses, 3PID invites, etc).
|
||||||
|
* `UIFeature.thirdPartyId` - Whether or not UI relating to third party identifiers (3PIDs)
|
||||||
|
is shown. Typically this is considered "contact information" on the homeserver, and is
|
||||||
|
not directly related to the identity server.
|
||||||
|
* `UIFeature.registration` - Whether or not the registration page is accessible. Typically
|
||||||
|
useful if accounts are managed externally.
|
||||||
|
* `UIFeature.passwordReset` - Whether or not the password reset page is accessible. Typically
|
||||||
|
useful if accounts are managed externally.
|
||||||
|
* `UIFeature.deactivate` - Whether or not the deactivate account button is accessible. Typically
|
||||||
|
useful if accounts are managed externally.
|
||||||
|
* `UIFeature.advancedEncryption` - Whether or not advanced encryption options are shown to the
|
||||||
|
user.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "riot-web",
|
"name": "riot-web",
|
||||||
"productName": "Riot",
|
"productName": "Riot",
|
||||||
"version": "1.7.5",
|
"version": "1.7.7",
|
||||||
"description": "A feature-rich client for Matrix.org",
|
"description": "A feature-rich client for Matrix.org",
|
||||||
"author": "New Vector Ltd.",
|
"author": "New Vector Ltd.",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -59,6 +59,7 @@
|
||||||
"browser-request": "^0.3.3",
|
"browser-request": "^0.3.3",
|
||||||
"gfm.css": "^1.1.2",
|
"gfm.css": "^1.1.2",
|
||||||
"highlight.js": "^9.13.1",
|
"highlight.js": "^9.13.1",
|
||||||
|
"jsrsasign": "^9.1.5",
|
||||||
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
|
"matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop",
|
||||||
"matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop",
|
"matrix-react-sdk": "github:matrix-org/matrix-react-sdk#develop",
|
||||||
"olm": "https://packages.matrix.org/npm/olm/olm-3.1.4.tgz",
|
"olm": "https://packages.matrix.org/npm/olm/olm-3.1.4.tgz",
|
||||||
|
|
|
@ -21,6 +21,7 @@ const INCLUDE_LANGS = [
|
||||||
{'value': 'en_US', 'label': 'English (US)'},
|
{'value': 'en_US', 'label': 'English (US)'},
|
||||||
{'value': 'eo', 'label': 'Esperanto'},
|
{'value': 'eo', 'label': 'Esperanto'},
|
||||||
{'value': 'es', 'label': 'Español'},
|
{'value': 'es', 'label': 'Español'},
|
||||||
|
{'value': 'et', 'label': 'Eesti'},
|
||||||
{'value': 'eu', 'label': 'Euskara'},
|
{'value': 'eu', 'label': 'Euskara'},
|
||||||
{'value': 'fi', 'label': 'Suomi'},
|
{'value': 'fi', 'label': 'Suomi'},
|
||||||
{'value': 'fr', 'label': 'Français'},
|
{'value': 'fr', 'label': 'Français'},
|
||||||
|
|
|
@ -70,7 +70,6 @@ function dodep() {
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
|
|
||||||
echo -en 'travis_fold:start:matrix-js-sdk\r'
|
|
||||||
echo 'Setting up matrix-js-sdk'
|
echo 'Setting up matrix-js-sdk'
|
||||||
|
|
||||||
dodep matrix-org matrix-js-sdk
|
dodep matrix-org matrix-js-sdk
|
||||||
|
@ -83,11 +82,8 @@ popd
|
||||||
|
|
||||||
yarn link matrix-js-sdk
|
yarn link matrix-js-sdk
|
||||||
|
|
||||||
echo -en 'travis_fold:end:matrix-js-sdk\r'
|
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
|
|
||||||
echo -en 'travis_fold:start:matrix-react-sdk\r'
|
|
||||||
echo 'Setting up matrix-react-sdk'
|
echo 'Setting up matrix-react-sdk'
|
||||||
|
|
||||||
dodep matrix-org matrix-react-sdk
|
dodep matrix-org matrix-react-sdk
|
||||||
|
@ -101,8 +97,6 @@ popd
|
||||||
|
|
||||||
yarn link matrix-react-sdk
|
yarn link matrix-react-sdk
|
||||||
|
|
||||||
echo -en 'travis_fold:end:matrix-react-sdk\r'
|
|
||||||
|
|
||||||
##############################
|
##############################
|
||||||
|
|
||||||
# Link the reskindex binary in place: if we used `yarn link`,
|
# Link the reskindex binary in place: if we used `yarn link`,
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
"Invalid JSON": "Ungültiges JSON",
|
"Invalid JSON": "Ungültiges JSON",
|
||||||
"Go to your browser to complete Sign In": "Gehe zu deinem Browser, um die Anmeldung abzuschließen",
|
"Go to your browser to complete Sign In": "Gehe zu deinem Browser, um die Anmeldung abzuschließen",
|
||||||
"Open user settings": "Öffne Nutzer-Einstellungen",
|
"Open user settings": "Öffne Nutzer-Einstellungen",
|
||||||
"Unable to load config file: please refresh the page to try again.": "Konfigurationsdatei kann nicht geladen werden: Bitte aktualisieren Sie die Seite, um es erneut zu versuchen.",
|
"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 Worker-Skript!",
|
"Missing indexeddb worker script!": "Fehlendes indexeddb Worker-Skript!",
|
||||||
"Previous/next recently visited room or community": "Vorheriger/nächster kürzlich besuchter Raum oder Community",
|
"Previous/next recently visited room or community": "Vorheriger/nächster kürzlich besuchter Raum oder Community",
|
||||||
"Unsupported browser": "Nicht unterstützter Browser",
|
"Unsupported browser": "Nicht unterstützter Browser",
|
||||||
|
@ -32,5 +32,5 @@
|
||||||
"Open": "Öffnen",
|
"Open": "Öffnen",
|
||||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s verwendet erweiterte Browserfunktionen, die von Ihrem aktuellen Browser nicht unterstützt werden.",
|
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s verwendet erweiterte Browserfunktionen, die von Ihrem aktuellen Browser nicht unterstützt werden.",
|
||||||
"Your browser can't run %(brand)s": "Dein Browser kann %(brand)s nicht ausführen",
|
"Your browser can't run %(brand)s": "Dein Browser kann %(brand)s nicht ausführen",
|
||||||
"Powered by Matrix": "Betrieben von Matrix"
|
"Powered by Matrix": "Betrieben mit Matrix"
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"powered by Matrix": "con el poder de Matrix",
|
"powered by Matrix": "con el poder de Matrix",
|
||||||
"You need to be using HTTPS to place a screen-sharing call.": "Debes usar HTTPS para hacer una llamada con pantalla compartida.",
|
"You need to be using HTTPS to place a screen-sharing call.": "Debes usar HTTPS para hacer una llamada con pantalla compartida.",
|
||||||
"Welcome to Element": "Bienvenido a Element",
|
"Welcome to Element": "Bienvenido a Element",
|
||||||
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Conversaciones cifradas y descentralizadas y colaboración con el poder de [matrix]",
|
"Decentralised, encrypted chat & collaboration powered by [matrix]": "Conversaciones cifradas y descentralizadas & colaboración impulsada por [matrix]",
|
||||||
"Sign In": "Iniciar sesión",
|
"Sign In": "Iniciar sesión",
|
||||||
"Create Account": "Crear cuenta",
|
"Create Account": "Crear cuenta",
|
||||||
"Explore rooms": "Explorar salas",
|
"Explore rooms": "Explorar salas",
|
||||||
|
@ -15,10 +15,10 @@
|
||||||
"Invalid JSON": "JSON inválido",
|
"Invalid JSON": "JSON inválido",
|
||||||
"Open user settings": "Abrir opciones de usuario",
|
"Open user settings": "Abrir opciones de usuario",
|
||||||
"Go to your browser to complete Sign In": "Abre tu navegador web para completar el registro",
|
"Go to your browser to complete Sign In": "Abre tu navegador web para completar el registro",
|
||||||
"Missing indexeddb worker script!": "¡Worker script “indexeddb” faltante!",
|
"Missing indexeddb worker script!": "Falta el script de trabajo indexeddb!",
|
||||||
"Unable to load config file: please refresh the page to try again.": "No se ha podido cargar el archivo de configuración. Recarga la página para intentar nuevamente.",
|
"Unable to load config file: please refresh the page to try again.": "No se ha podido cargar el archivo de configuración. Recarga la página para intentar nuevamente.",
|
||||||
"Previous/next recently visited room or community": "Anterior/siguiente sala o comunidad visitada recientemente",
|
"Previous/next recently visited room or community": "Anterior/siguiente sala o comunidad visitada recientemente",
|
||||||
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Desktop (%(platformName)s)",
|
"%(brand)s Desktop (%(platformName)s)": "%(brand)s Escritorio (%(platformName)s)",
|
||||||
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
"%(appName)s (%(browserName)s, %(osName)s)": "%(appName)s (%(browserName)s, %(osName)s)",
|
||||||
"Unsupported browser": "Navegador no soportado",
|
"Unsupported browser": "Navegador no soportado",
|
||||||
"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>, o <safariLink>Safari</safariLink> para la mejor experiencia.",
|
"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>, o <safariLink>Safari</safariLink> para la mejor experiencia.",
|
||||||
|
@ -26,10 +26,11 @@
|
||||||
"I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar",
|
"I understand the risks and wish to continue": "Entiendo los riesgos y deseo continuar",
|
||||||
"Go to element.io": "Ir a element.io",
|
"Go to element.io": "Ir a element.io",
|
||||||
"Failed to start": "Fallo al iniciar",
|
"Failed to start": "Fallo al iniciar",
|
||||||
"Your Element is misconfigured": "Su Element está mal configurado",
|
"Your Element is misconfigured": "Tu elemento está mal configurado",
|
||||||
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Su configuración de Element contiene JSON inválido. Por favor corríjalo e inténtelo de nuevo.",
|
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Su configuración de Element contiene JSON inválido. Por favor corríjalo e inténtelo de nuevo.",
|
||||||
"Download Completed": "Descarga completada",
|
"Download Completed": "Descarga completada",
|
||||||
"Open": "Abrir",
|
"Open": "Abrir",
|
||||||
"Your browser can't run %(brand)s": "Su navegador es compatible con %(brand)s",
|
"Your browser can't run %(brand)s": "Su navegador es incompatible con %(brand)s",
|
||||||
"%(brand)s uses advanced browser features which aren't supported by your current browser.": "%(brand)s utiliza funciones avanzadas no soportadas por su navegador."
|
"%(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": "Desarrollado por Matrix"
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,5 +31,6 @@
|
||||||
"Your Element is misconfigured": "Votre Element est mal configuré",
|
"Your Element is misconfigured": "Votre Element est mal configuré",
|
||||||
"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 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",
|
"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 supporte pas."
|
"%(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 supporte pas.",
|
||||||
|
"Powered by Matrix": "Propulsé par Matrix"
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,11 +71,16 @@ function onHashChange(ev: HashChangeEvent) {
|
||||||
|
|
||||||
// This will be called whenever the SDK changes screens,
|
// This will be called whenever the SDK changes screens,
|
||||||
// so a web page can update the URL bar appropriately.
|
// so a web page can update the URL bar appropriately.
|
||||||
function onNewScreen(screen: string) {
|
function onNewScreen(screen: string, replaceLast = false) {
|
||||||
console.log("newscreen " + screen);
|
console.log("newscreen " + screen);
|
||||||
const hash = '#/' + screen;
|
const hash = '#/' + screen;
|
||||||
lastLocationHashSet = hash;
|
lastLocationHashSet = hash;
|
||||||
window.location.hash = hash;
|
|
||||||
|
if (replaceLast) {
|
||||||
|
window.location.replace(hash);
|
||||||
|
} else {
|
||||||
|
window.location.assign(hash);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We use this to work out what URL the SDK should
|
// We use this to work out what URL the SDK should
|
||||||
|
|
|
@ -11,7 +11,9 @@
|
||||||
<div class="joinConferencePrompt">
|
<div class="joinConferencePrompt">
|
||||||
<!-- TODO: i18n -->
|
<!-- TODO: i18n -->
|
||||||
<h2>Jitsi Video Conference</h2>
|
<h2>Jitsi Video Conference</h2>
|
||||||
<button type="button" id="joinButton">Join Conference</button>
|
<div id="widgetActionContainer">
|
||||||
|
<button type="button" id="joinButton">Join Conference</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -18,6 +18,8 @@ limitations under the License.
|
||||||
require("./index.scss");
|
require("./index.scss");
|
||||||
|
|
||||||
import * as qs from 'querystring';
|
import * as qs from 'querystring';
|
||||||
|
import {Capability, WidgetApi} from 'matrix-react-sdk/src/widgets/WidgetApi';
|
||||||
|
import {KJUR} from 'jsrsasign';
|
||||||
import {
|
import {
|
||||||
IWidgetApiRequest,
|
IWidgetApiRequest,
|
||||||
IWidgetApiRequestEmptyData,
|
IWidgetApiRequestEmptyData,
|
||||||
|
@ -25,6 +27,8 @@ import {
|
||||||
WidgetApi
|
WidgetApi
|
||||||
} from "matrix-widget-api";
|
} from "matrix-widget-api";
|
||||||
|
|
||||||
|
const JITSI_OPENIDTOKEN_JWT_AUTH = 'openidtoken-jwt';
|
||||||
|
|
||||||
// Dev note: we use raw JS without many dependencies to reduce bundle size.
|
// Dev note: we use raw JS without many dependencies to reduce bundle size.
|
||||||
// We do not need all of React to render a Jitsi conference.
|
// We do not need all of React to render a Jitsi conference.
|
||||||
|
|
||||||
|
@ -38,6 +42,8 @@ let conferenceId: string;
|
||||||
let displayName: string;
|
let displayName: string;
|
||||||
let avatarUrl: string;
|
let avatarUrl: string;
|
||||||
let userId: string;
|
let userId: string;
|
||||||
|
let jitsiAuth: string;
|
||||||
|
let roomId: string;
|
||||||
|
|
||||||
let widgetApi: WidgetApi;
|
let widgetApi: WidgetApi;
|
||||||
|
|
||||||
|
@ -82,38 +88,118 @@ let widgetApi: WidgetApi;
|
||||||
displayName = qsParam('displayName', true);
|
displayName = qsParam('displayName', true);
|
||||||
avatarUrl = qsParam('avatarUrl', true); // http not mxc
|
avatarUrl = qsParam('avatarUrl', true); // http not mxc
|
||||||
userId = qsParam('userId');
|
userId = qsParam('userId');
|
||||||
|
jitsiAuth = qsParam('auth', true);
|
||||||
|
roomId = qsParam('roomId', true);
|
||||||
|
|
||||||
await readyPromise;
|
if (widgetApi) {
|
||||||
await widgetApi.setAlwaysOnScreen(false); // start off as detachable from the screen
|
await widgetApi.waitReady();
|
||||||
|
await widgetApi.setAlwaysOnScreen(false); // start off as detachable from the screen
|
||||||
|
|
||||||
// TODO: register widgetApi listeners for PTT controls (https://github.com/vector-im/riot-web/issues/12795)
|
// See https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
|
||||||
|
if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) {
|
||||||
document.getElementById("joinButton").onclick = () => joinConference();
|
// Request credentials, give callback to continue when received
|
||||||
|
widgetApi.requestOpenIDCredentials(credentialsResponseCallback);
|
||||||
|
} else {
|
||||||
|
enableJoinButton();
|
||||||
|
}
|
||||||
|
// TODO: register widgetApi listeners for PTT controls (https://github.com/vector-im/riot-web/issues/12795)
|
||||||
|
} else {
|
||||||
|
enableJoinButton();
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("Error setting up Jitsi widget", e);
|
console.error("Error setting up Jitsi widget", e);
|
||||||
document.getElementById("jitsiContainer").innerText = "Failed to load Jitsi widget";
|
document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
|
||||||
switchVisibleContainers();
|
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or show error depending on what the credentials response is.
|
||||||
|
*/
|
||||||
|
function credentialsResponseCallback() {
|
||||||
|
if (widgetApi.openIDCredentials) {
|
||||||
|
console.info('Successfully got OpenID credentials.');
|
||||||
|
enableJoinButton();
|
||||||
|
} else {
|
||||||
|
console.warn('OpenID credentials request was blocked by user.');
|
||||||
|
document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function enableJoinButton() {
|
||||||
|
document.getElementById("joinButton").onclick = () => joinConference();
|
||||||
|
}
|
||||||
|
|
||||||
function switchVisibleContainers() {
|
function switchVisibleContainers() {
|
||||||
inConference = !inConference;
|
inConference = !inConference;
|
||||||
document.getElementById("jitsiContainer").style.visibility = inConference ? 'unset' : 'hidden';
|
document.getElementById("jitsiContainer").style.visibility = inConference ? 'unset' : 'hidden';
|
||||||
document.getElementById("joinButtonContainer").style.visibility = inConference ? 'hidden' : 'unset';
|
document.getElementById("joinButtonContainer").style.visibility = inConference ? 'hidden' : 'unset';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a JWT token fot jitsi openidtoken-jwt auth
|
||||||
|
*
|
||||||
|
* See https://github.com/matrix-org/prosody-mod-auth-matrix-user-verification
|
||||||
|
*/
|
||||||
|
function createJWTToken() {
|
||||||
|
// Header
|
||||||
|
const header = {alg: 'HS256', typ: 'JWT'};
|
||||||
|
// Payload
|
||||||
|
const payload = {
|
||||||
|
// As per Jitsi token auth, `iss` needs to be set to something agreed between
|
||||||
|
// JWT generating side and Prosody config. Since we have no configuration for
|
||||||
|
// the widgets, we can't set one anywhere. Using the Jitsi domain here probably makes sense.
|
||||||
|
iss: jitsiDomain,
|
||||||
|
sub: jitsiDomain,
|
||||||
|
aud: `https://${jitsiDomain}`,
|
||||||
|
room: "*",
|
||||||
|
context: {
|
||||||
|
matrix: {
|
||||||
|
token: widgetApi.openIDCredentials.accessToken,
|
||||||
|
room_id: roomId,
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
avatar: avatarUrl,
|
||||||
|
name: displayName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
// Sign JWT
|
||||||
|
// The secret string here is irrelevant, we're only using the JWT
|
||||||
|
// to transport data to Prosody in the Jitsi stack.
|
||||||
|
return KJUR.jws.JWS.sign(
|
||||||
|
'HS256',
|
||||||
|
JSON.stringify(header),
|
||||||
|
JSON.stringify(payload),
|
||||||
|
'notused',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function joinConference() { // event handler bound in HTML
|
function joinConference() { // event handler bound in HTML
|
||||||
|
let jwt;
|
||||||
|
if (jitsiAuth === JITSI_OPENIDTOKEN_JWT_AUTH) {
|
||||||
|
if (!widgetApi.openIDCredentials || !widgetApi.openIDCredentials.accessToken) {
|
||||||
|
// We've failing to get a token, don't try to init conference
|
||||||
|
console.warn('Expected to have an OpenID credential, cannot initialize widget.');
|
||||||
|
document.getElementById("widgetActionContainer").innerText = "Failed to load Jitsi widget";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
jwt = createJWTToken();
|
||||||
|
}
|
||||||
|
|
||||||
switchVisibleContainers();
|
switchVisibleContainers();
|
||||||
|
|
||||||
// noinspection JSIgnoredPromiseFromCall
|
if (widgetApi) {
|
||||||
if (widgetApi) widgetApi.setAlwaysOnScreen(true); // ignored promise because we don't care if it works
|
// ignored promise because we don't care if it works
|
||||||
|
// noinspection JSIgnoredPromiseFromCall
|
||||||
|
widgetApi.setAlwaysOnScreen(true);
|
||||||
|
}
|
||||||
|
|
||||||
console.warn(
|
console.warn(
|
||||||
"[Jitsi Widget] The next few errors about failing to parse URL parameters are fine if " +
|
"[Jitsi Widget] The next few errors about failing to parse URL parameters are fine if " +
|
||||||
"they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " +
|
"they mention 'external_api' or 'jitsi' in the stack. They're just Jitsi Meet trying to parse " +
|
||||||
"our fragment values and not recognizing the options.",
|
"our fragment values and not recognizing the options.",
|
||||||
);
|
);
|
||||||
const meetApi = new JitsiMeetExternalAPI(jitsiDomain, {
|
const options = {
|
||||||
width: "100%",
|
width: "100%",
|
||||||
height: "100%",
|
height: "100%",
|
||||||
parentNode: document.querySelector("#jitsiContainer"),
|
parentNode: document.querySelector("#jitsiContainer"),
|
||||||
|
@ -124,7 +210,10 @@ function joinConference() { // event handler bound in HTML
|
||||||
MAIN_TOOLBAR_BUTTONS: [],
|
MAIN_TOOLBAR_BUTTONS: [],
|
||||||
VIDEO_LAYOUT_FIT: "height",
|
VIDEO_LAYOUT_FIT: "height",
|
||||||
},
|
},
|
||||||
});
|
jwt: jwt,
|
||||||
|
};
|
||||||
|
|
||||||
|
const meetApi = new JitsiMeetExternalAPI(jitsiDomain, options);
|
||||||
if (displayName) meetApi.executeCommand("displayName", displayName);
|
if (displayName) meetApi.executeCommand("displayName", displayName);
|
||||||
if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl);
|
if (avatarUrl) meetApi.executeCommand("avatarUrl", avatarUrl);
|
||||||
if (userId) meetApi.executeCommand("email", userId);
|
if (userId) meetApi.executeCommand("email", userId);
|
||||||
|
@ -132,8 +221,11 @@ function joinConference() { // event handler bound in HTML
|
||||||
meetApi.on("readyToClose", () => {
|
meetApi.on("readyToClose", () => {
|
||||||
switchVisibleContainers();
|
switchVisibleContainers();
|
||||||
|
|
||||||
// noinspection JSIgnoredPromiseFromCall
|
if (widgetApi) {
|
||||||
if (widgetApi) widgetApi.setAlwaysOnScreen(false); // ignored promise because we don't care if it works
|
// ignored promise because we don't care if it works
|
||||||
|
// noinspection JSIgnoredPromiseFromCall
|
||||||
|
widgetApi.setAlwaysOnScreen(false);
|
||||||
|
}
|
||||||
|
|
||||||
document.getElementById("jitsiContainer").innerHTML = "";
|
document.getElementById("jitsiContainer").innerHTML = "";
|
||||||
});
|
});
|
||||||
|
|
|
@ -51,12 +51,18 @@ export function initRageshake() {
|
||||||
}
|
}
|
||||||
|
|
||||||
window.mxSendRageshake = function(text: string, withLogs?: boolean) {
|
window.mxSendRageshake = function(text: string, withLogs?: boolean) {
|
||||||
|
const url = SdkConfig.get().bug_report_endpoint_url;
|
||||||
|
if (!url) {
|
||||||
|
console.error("Cannot send a rageshake - no bug_report_endpoint_url configured");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (withLogs === undefined) withLogs = true;
|
if (withLogs === undefined) withLogs = true;
|
||||||
if (!text || !text.trim()) {
|
if (!text || !text.trim()) {
|
||||||
console.error("Cannot send a rageshake without a message - please tell us what went wrong");
|
console.error("Cannot send a rageshake without a message - please tell us what went wrong");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sendBugReport(SdkConfig.get().bug_report_endpoint_url, {
|
sendBugReport(url, {
|
||||||
userText: text,
|
userText: text,
|
||||||
sendLogs: withLogs,
|
sendLogs: withLogs,
|
||||||
progressCallback: console.log.bind(console),
|
progressCallback: console.log.bind(console),
|
||||||
|
|
39
yarn.lock
39
yarn.lock
|
@ -3160,15 +3160,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
|
||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
sha.js "^2.4.8"
|
sha.js "^2.4.8"
|
||||||
|
|
||||||
create-react-class@^15.6.3:
|
|
||||||
version "15.6.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036"
|
|
||||||
integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==
|
|
||||||
dependencies:
|
|
||||||
fbjs "^0.8.9"
|
|
||||||
loose-envify "^1.3.1"
|
|
||||||
object-assign "^4.1.1"
|
|
||||||
|
|
||||||
cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
|
cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
|
||||||
version "6.0.5"
|
version "6.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
||||||
|
@ -4688,7 +4679,7 @@ fbjs@0.1.0-alpha.7:
|
||||||
promise "^7.0.3"
|
promise "^7.0.3"
|
||||||
whatwg-fetch "^0.9.0"
|
whatwg-fetch "^0.9.0"
|
||||||
|
|
||||||
fbjs@^0.8.4, fbjs@^0.8.9:
|
fbjs@^0.8.4:
|
||||||
version "0.8.17"
|
version "0.8.17"
|
||||||
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
|
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd"
|
||||||
integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
|
integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
|
||||||
|
@ -6914,6 +6905,11 @@ jsprim@^1.2.2:
|
||||||
json-schema "0.2.3"
|
json-schema "0.2.3"
|
||||||
verror "1.10.0"
|
verror "1.10.0"
|
||||||
|
|
||||||
|
jsrsasign@^9.1.5:
|
||||||
|
version "9.1.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/jsrsasign/-/jsrsasign-9.1.5.tgz#fe286425d2c05b2d0865d24ded53e34b12abd2ca"
|
||||||
|
integrity sha512-iJLF8FvZHlwyQudrRtQomHj1HdPAcM8QSRTt0FJo8a6iFgaGCpKUrE7lWyELpAjrFs8jUC/Azc0vfhlj3yqHPQ==
|
||||||
|
|
||||||
jsx-ast-utils@^2.2.3:
|
jsx-ast-utils@^2.2.3:
|
||||||
version "2.3.0"
|
version "2.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.3.0.tgz#edd727794ea284d7fda575015ed1b0cde0289ab6"
|
resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.3.0.tgz#edd727794ea284d7fda575015ed1b0cde0289ab6"
|
||||||
|
@ -7186,7 +7182,7 @@ longest-streak@^2.0.1:
|
||||||
resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
|
resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
|
||||||
integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
|
integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
|
||||||
|
|
||||||
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
|
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
|
||||||
version "1.4.0"
|
version "1.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
||||||
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
||||||
|
@ -7313,8 +7309,8 @@ mathml-tag-names@^2.1.1:
|
||||||
integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
|
integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
|
||||||
|
|
||||||
"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop":
|
"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop":
|
||||||
version "8.2.0"
|
version "8.3.0"
|
||||||
resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/c6992e2056901502af19e40ba0d1103c4c1f61ed"
|
resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/b9886d4f3479c041fc6d91ebc88c4a998e9d2e7c"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.8.3"
|
"@babel/runtime" "^7.8.3"
|
||||||
another-json "^0.2.0"
|
another-json "^0.2.0"
|
||||||
|
@ -7335,8 +7331,8 @@ matrix-mock-request@^1.2.3:
|
||||||
expect "^1.20.2"
|
expect "^1.20.2"
|
||||||
|
|
||||||
"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop":
|
"matrix-react-sdk@github:matrix-org/matrix-react-sdk#develop":
|
||||||
version "3.3.0"
|
version "3.4.1"
|
||||||
resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/0d290c9bd2604343610e1fc3b17bbdb941ad2ad6"
|
resolved "https://codeload.github.com/matrix-org/matrix-react-sdk/tar.gz/747126950b14ded4e09b3c0c8cc6beb04b64b052"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime" "^7.10.5"
|
"@babel/runtime" "^7.10.5"
|
||||||
await-lock "^2.0.1"
|
await-lock "^2.0.1"
|
||||||
|
@ -7346,7 +7342,6 @@ matrix-mock-request@^1.2.3:
|
||||||
classnames "^2.2.6"
|
classnames "^2.2.6"
|
||||||
commonmark "^0.29.1"
|
commonmark "^0.29.1"
|
||||||
counterpart "^0.18.6"
|
counterpart "^0.18.6"
|
||||||
create-react-class "^15.6.3"
|
|
||||||
diff-dom "^4.1.6"
|
diff-dom "^4.1.6"
|
||||||
diff-match-patch "^1.0.5"
|
diff-match-patch "^1.0.5"
|
||||||
emojibase-data "^5.0.1"
|
emojibase-data "^5.0.1"
|
||||||
|
@ -7380,6 +7375,7 @@ matrix-mock-request@^1.2.3:
|
||||||
react-focus-lock "^2.4.1"
|
react-focus-lock "^2.4.1"
|
||||||
react-transition-group "^4.4.1"
|
react-transition-group "^4.4.1"
|
||||||
resize-observer-polyfill "^1.5.1"
|
resize-observer-polyfill "^1.5.1"
|
||||||
|
rfc4648 "^1.4.0"
|
||||||
sanitize-html "^1.27.1"
|
sanitize-html "^1.27.1"
|
||||||
tar-js "^0.3.0"
|
tar-js "^0.3.0"
|
||||||
text-encoding-utf-8 "^1.0.2"
|
text-encoding-utf-8 "^1.0.2"
|
||||||
|
@ -7833,9 +7829,9 @@ node-fetch@^1.0.1:
|
||||||
is-stream "^1.0.1"
|
is-stream "^1.0.1"
|
||||||
|
|
||||||
node-fetch@^2.6.0:
|
node-fetch@^2.6.0:
|
||||||
version "2.6.0"
|
version "2.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
|
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
|
||||||
integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
|
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
|
||||||
|
|
||||||
node-forge@0.9.0:
|
node-forge@0.9.0:
|
||||||
version "0.9.0"
|
version "0.9.0"
|
||||||
|
@ -10289,6 +10285,11 @@ retry@^0.12.0:
|
||||||
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
|
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
|
||||||
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
|
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
|
||||||
|
|
||||||
|
rfc4648@^1.4.0:
|
||||||
|
version "1.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/rfc4648/-/rfc4648-1.4.0.tgz#c75b2856ad2e2d588b6ddb985d556f1f7f2a2abd"
|
||||||
|
integrity sha512-3qIzGhHlMHA6PoT6+cdPKZ+ZqtxkIvg8DZGKA5z6PQ33/uuhoJ+Ws/D/J9rXW6gXodgH8QYlz2UCl+sdUDmNIg==
|
||||||
|
|
||||||
rgb-regex@^1.0.1:
|
rgb-regex@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
|
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
|
||||||
|
|
Loading…
Add table
Reference in a new issue