diff --git a/.github/workflows/develop-deb.yml b/.github/workflows/develop-deb.yml index fa7748b7..b9435f05 100644 --- a/.github/workflows/develop-deb.yml +++ b/.github/workflows/develop-deb.yml @@ -1,8 +1,8 @@ -name: Deployer-develop +name: Debian package -on: # workflow_dispatch +on: push: - branches: [ develop ] + branches: [ develop, release-3.5.0 ] # pull_request: # branches: [ develop ] @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [14.x] + node-version: [16.x] steps: - uses: actions/checkout@v2 @@ -25,20 +25,26 @@ jobs: uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - - run: | - sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install jq npm build-essential || true + + - name: Get eduMEET version + id: get-version + run: | + echo "::set-output name=VERSION::$(cat edumeet/server/package.json | jq -r '.version')" + + - name: Build Debian package + id: build-deb + run: | cd edumeet cp server/config/config.example.js server/config/config.js + cp server/config/config.example.yaml server/config/config.yaml cp app/public/config/config.example.js app/public/config/config.js - touch server/config/config.yaml cd app - yarn install - yarn build + yarn install && yarn build cd ../server + yarn install && yarn build cat <<< $(jq '.bundleDependencies += .dependencies' package.json) > package.json - yarn install npm pack - VERSION=$(cat package.json | jq -r '.version') + VERSION=${{ steps.get-version.outputs.VERSION }} DATE=$(date) mkdir -p /home/runner/package cd /home/runner/package @@ -52,35 +58,49 @@ jobs: touch DEBIAN/md5sums touch DEBIAN/md5sums touch DEBIAN/control - find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum 1>/dev/null 2>/dev/null || true - echo """Package: edumeet-develop + #find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum 1>/dev/null 2>/dev/null || true + # + cat > DEBIAN/control <= 14), redis - """ > DEBIAN/control - echo """#!/bin/bash + Priority: optional + Description: eduMMET is multiparty web-meetings based on mediasoup and WebRTC + Packet created from ${{ github.ref_name }} branch, commit:${{ github.sha }} + Visit ${{ github.server_url }}/${{ github.repository }}/tree/${{ github.ref_name }} for details + Depends: nodejs (>= 16), redis + EOF + # + cat > DEBIAN/postinst < DEBIAN/postinst + echo "eduMEET multiparty meeting is installed.\n" + echo "\n\nClient and server configuration files are in /etc/edumeet directory\n" + echo "Please visit ${{ github.server_url }}/${{ github.repository }}/tree/${{ github.ref_name }} for configuration details.\n\n" + echo "\n\nAfter configuration, start service with 'sudo systemctl start edumeet' command.\n\n" + EOF + # chmod 775 DEBIAN/postinst cd ../ dpkg-deb -Zgzip --build package - mv /home/runner/package.deb /home/runner/edumeet-develop.deb - - name : Release Package + mv /home/runner/package.deb /home/runner/edumeet-$VERSION-beta1.deb + + - name : Upload artifact uses: actions/upload-artifact@v2 with: - name: edumeet-develop - path: "/home/runner/edumeet-develop.deb" + name: edumeet-${{ steps.get-version.outputs.VERSION }}-beta1 + path: "/home/runner/edumeet-*.deb" + + - name: Add to release assets + uses: softprops/action-gh-release@v1 + with: + tag_name: "v3.5.0-beta.1" + files: "/home/runner/edumeet-*.deb" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index f5dfbe7d..00000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Deployer - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [12.x] - - steps: - - uses: actions/checkout@v2 - with: - path: edumeet - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - run: | - sudo DEBIAN_FRONTEND=noninteractive apt-get -yq install jq npm build-essential || true - cd edumeet - cp server/config/config.example.js server/config/config.js - cp app/public/config/config.example.js app/public/config/config.js - cd app - npm install - npm run build - cd ../server - cat <<< $(jq '.bundleDependencies += .dependencies' package.json) > package.json - npm install - npm pack - VERSION=$(cat package.json | jq -r '.version') - DATE=$(date) - mkdir -p /home/runner/package - cd /home/runner/package - mkdir DEBIAN - mkdir -p usr/local/src/edumeet/server - mkdir -p etc/systemd/system/ - tar -xf /home/runner/work/***/***/***/server/***-server-$VERSION.tgz package/ 1>/dev/null 2>/dev/null || true - mv package/* usr/local/src/edumeet/server/ - mv /home/runner/work/***/***/***/*.service etc/systemd/system/ - rm -rf package - touch DEBIAN/md5sums - touch DEBIAN/md5sums - touch DEBIAN/control - find . -type f ! -regex '.*.hg.*' ! -regex '.*?debian-binary.*' ! -regex '.*?DEBIAN.*' -printf '%P ' | xargs md5sum 1>/dev/null 2>/dev/null || true - echo """Package: edumeet - Version: $VERSION - Maintainer: Mert CELEN - Section: admin - Date : $DATE - Architecture: amd64 - Priority: important - Description: Multiparty web-meetings using mediasoup and WebRTC - Depends: nodejs (>= 12), redis - """ > DEBIAN/control - echo """#!/bin/bash - mkdir -p /etc/edumeet/ - ln -s /usr/local/src/edumeet/server/config/config.js /etc/edumeet/server-config.js || true - ln -s /usr/local/src/edumeet/server/public/config/config.js /etc/edumeet/client-config.js || true - systemctl daemon-reload - systemctl enable edumeet - echo "eduMeet multiparty meeting is installed, but you need the configure the server and client with your ip adresses in configuration files under /etc/meeting/ \n" - echo "\n\nAfter the configuration, you can start service with 'sudo systemctl start edumeet' command.\n\n" - """ > DEBIAN/postinst - chmod 775 DEBIAN/postinst - cd ../ - dpkg-deb -Zgzip --build package - mv /home/runner/package.deb /home/runner/edumeet.deb - - name : Release Package - uses: actions/upload-artifact@v1 - with: - name: edumeet - path: "/home/runner/edumeet.deb" diff --git a/.gitignore b/.gitignore index d0eb5b54..30d7553a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,8 @@ node_modules/ /app/public/images/logo.* !/app/public/images/logo.edumeet.svg /server/config/ -!/server/config/config.example.js +!/server/config/config.example.* +!/server/config/README.md /server/public/ /server/certs/ /server/dist/ diff --git a/README.md b/README.md index 0b13c4c7..e32a6384 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# ![edumeet logo](/app/public/images/logo.edumeet.svg) -A WebRTC meeting service using [mediasoup](https://mediasoup.org). - +# ![edumeet logo](/app/public/images/logo.edumeet.svg) **WebRTC meeting service using [mediasoup](https://mediasoup.org).** Official website: [edumeet.org](https://edumeet.org) https://user-images.githubusercontent.com/37835902/152279867-639db9bc-bf78-430f-b96f-d17733527474.mp4 @@ -11,43 +9,45 @@ Try it online at [letsmeet.no](https://letsmeet.no) | Feature | Description | | ------------- | ------------- | -| **A/V streaming** | You can share your microphone and camera + additional video stream | -| **Video layouts** | You can choose between **Democratic** and **Filmstrip** views. More in progress. | -| **Screen sharing** | You can share your screen to make some presentation right from your desktop | -| **File sharing** | You can share your files with the peers (torrent solution under the hood) | -| **Chat messages** | You can make a text conversation with peers | +| **A/V streaming** | Share your microphone and camera + additional video stream | +| **Video layouts** | Choose between **Democratic** and **Filmstrip** views. More in progress. | +| **Screen sharing** | Share your screen to make some presentation right from your desktop | +| **File sharing** | Share your files with the peers (torrent solution under the hood) | +| **Chat messages** | Text conversation with other participants | | **Local Recording** | Record window/tab/screen content in browser supported formats with room audio and save them (**disabled by default**) | -| **Authorization** | Supported types: **OIDC**, **SAML**, **local db (text-based)** | +| **Authentication** | Supported types: **OIDC**, **SAML**, **local db (text-based)** | -**Internationalization (22 languages)** +### Internationalization (22 languages)
Help us with translations:exclamation: - ##### How to contribute? + #### How to contribute? - 1. take a certain [language file](https://github.com/edumeet/edumeet/tree/develop/app/src/intl/translations) you want to translate + 1. Continue to translate existing [language file](/app/src/intl/translations) 2. find the _null_ values > "settings.language": null, 3. replace them based on the _en.json_ file - > "settings.language": "Select language", - 4. make a Pull Request, or send us a [e-mail](mailto:community@lists.edumeet.org) with file - - Thanks so much in advance! + > "settings.language": "Select language", + 4. If your language is not listed, create a new translation _.json_ file.. + > copy en.json to [_"two letter country code"_.json](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) and translate to your languange + 5. make a Pull Request, or send us a file by [e-mail](mailto:community@lists.edumeet.org) + + Thank you in advance!
-**Local Recording** +### Local Recording
See more - * Local Recording records the browser window video and audio. From the list of media formats that your browser supports you can select your preferred media format in the settings menu advanced video menu setting. MediaRecorder makes small chucks of recording and these recorded blob chunks temporary stored in IndexedDB, if IndexedDB implemented in your browser. Otherwise it stores blobs in memory in an array of blobs. +* Local Recording records the browser window video and audio. From the list of media formats that your browser supports you can select your preferred media format in the settings menu advanced video menu setting. MediaRecorder makes small chucks of recording and these recorded blob chunks temporary stored in IndexedDB, if IndexedDB implemented in your browser. Otherwise it stores blobs in memory in an array of blobs. Local Recording creates a local IndexedDB with the name of the starting timestamp (unix timestamp format) And a storage called chunks. All chunks read in an array and created a final blob that you can download. After blobs array concatenation as a big blob, this big blob saved as file, and finally we delete the temporary local IndexedDB. -* Local recording is **disabled** by default. You can enable it by setting localRecordingEnabled to true in (./app/public/config/config.js) +* Local recording is **disabled** by default. It could be enabled by setting _localRecordingEnabled_ to true in (./app/public/config/config.js) -* **WARNINIG**: Take care that You need for local recording extra cpu, memory and disk space. - **You need to have good enough free disk space!!** +* **WARNING**: Take care that local recording will increase cpu, memory and disk space consumption. +**Enough free disk space has to be provided!!!** Keep in mind that Browsers don't allow to use all the disk free capacity! See more info about browsers storage limits: * @@ -55,21 +55,15 @@ See more info about browsers storage limits:
-## Docker +# Installation -Get docker image [here](https://hub.docker.com/r/edumeet/edumeet/) +See here for [Docker](https://github.com/edumeet/edumeet-docker/) or [Ansible](https://github.com/edumeet/edumeet-ansible/) (based on Docker) installation procedures -## Ansible (based on Docker) +## Debian & Ubuntu based operating systems (.deb package) -See [more](https://github.com/edumeet/edumeet-ansible/). - -## .deb package (for debian-based systems) - -If you want to install it on the Debian & Ubuntu based operating systems. - -* Prerequisites: [node v16.x](https://github.com/nodesource/distributions/blob/master/README.md#debinstall) (tested with v16.13.2 version) - -* Get package [here](https://github.com/edumeet/edumeet/actions?query=workflow%3ADeployer+branch%3Amaster+is%3Asuccess) (job artifact) +* Prerequisites: Installed NodeJS (v16.x) as described in [Manual installation](#manual-installation-build) section. +* See [Configuration](#configuration) section for client and server configuration details. +* Download from [releases](https://github.com/edumeet/edumeet/releases) assets, or latest job [artifact](https://github.com/edumeet/edumeet/actions?query=workflow%3ADeployer+branch%3Amaster+is%3Asuccess). ```bash # Unzip the file @@ -78,36 +72,111 @@ unzip edumeet.zip # Install the package sudo apt install edumeet/edumeet.deb -# After package installation, don't forget the configure ip address in config file. -sudo nano /etc/meeting/server-config.js +# After package installation, don't forget to edit configuration files. +sudo nano /etc/educonf/client-config.js +sudo nano /etc/educonf/server-config.js +sudo nano /etc/educonf/server-config.yaml # Finally, start the service by (it's enabled by default) sudo systemctl start edumeet ``` ## Manual installation (build) - -### install -Note: We strongly recommend to always use a _yarn_ package manager. - +Installation example is based on Debian/Ubuntu Linux operating system. +1. Install [NodeJS (v16.x)](https://github.com/nodesource/distributions) and [Yarn ](https://classic.yarnpkg.com/en/docs/install#debian-stable) package manager +- NodeJS (v16.x) [Debian/Ubuntu](https://github.com/nodesource/distributions#deb) +```bash +# Using Ubuntu +curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - +sudo apt-get install -y nodejs + +# Using Debian, as root +curl -fsSL https://deb.nodesource.com/setup_16.x | bash - +apt-get install -y nodejs +``` +- Yarn package manager: +```bash +curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - +echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list +sudo apt update && sudo apt install yarn +``` +2. Install all required dependencies ```bash -# Install all the required dependencies and NodeJS v14 (Debian/Ubuntu) and Yarn package manager: sudo apt update && sudo apt install -y curl git python python3-pip build-essential redis openssl libssl-dev pkg-config -curl -fsSL https://deb.nodesource.com/setup_14.x | sudo bash - -curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null -echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list -sudo apt update && sudo apt install -y yarn nodejs - -# get version +``` +3. Clone eduMEET git repository +```bash git clone https://github.com/edumeet/edumeet.git - cd edumeet - -# switch to the "develop" branch to get the latest version for developing +``` +(switch to the "develop" branch to get the latest features) +```bash git checkout develop ``` +### Configuration +**eduMEET** will start and run normally with just default settings. If there is no configuration files, it will automatically detect your host IP address, and listen on port 443 (https). In order to change default values (e.g. certificates), or activate features (e.g. authentication), use appropriate configuration file (see below for details). + +**:warning: Note:** There are separate configuration files for eduMEET application and eduMEET server: + +**eduMEET application (app)** for: enabling login, change logo or background, adjust A/V parameters, etc... + +Copy [example](/app/public/config/config.example.js) template and edit values (see all available parameters in [./app/public/config/README.md](/app/public/config/README.md)) +```bash +cp app/public/config/config.example.js app/public/config/config.js +``` + +**eduMEET server** require **:warning:two** configuration files: **config.js**, and **config.{_json_, _yaml_ or _toml_}** (multiple format supported) + +**1. config.js** for setting authentication methods and user roles. + +Copy example template and edit values (see additional details in [example](/server/config/config.example.js) file) +```bash +cp server/config/config.example.js server/config/config.js +``` + +**2. config.{_json_, _yaml_ or _toml_}** for configuring: server port, server certificates, [STUN/TURN](#turn-configuration) configuration, monitoring, etc... (See below examples of different configuration styles). + +[**:point_right: _config.yaml_**](/server/config/config.example.yaml) example: +```yaml + listeningPort: 443 + tls: + key: /opt/edumeet/server/certs/privkey.pem + cert: /opt/edumeet/server/certs/cert.pem +``` +[**:point_right: _config.json_**](/server/config/config.example.json) example: +```javascript + { + "listeningPort" : "443", + "tls" : { + "cert" : "/opt/edumeet/server/certs/cert.pem", + "key" : "/opt/edumeet/server/certs/privkey.pem" + } + } +``` +[**:point_right: _config.toml_**](/server/config/config.example.toml) example: +```toml + listeningPort = "443" + + [tls] + cert = "/opt/edumeet/server/certs/cert.pem" + key = "/opt/edumeet/server/certs/privkey.pem" +``` +**:red_circle: IMPORTANT:** Use **only one** type for second configuration file (`yaml` file format is highly recommended) + +Copy **only one** example template file and edit values (see all available parameters in [./server/config/README.md](/server/config/README.md)) +```bash +cp server/config/config.example.yaml server/config/config.yaml + OR!!! +cp server/config/config.example.json server/config/config.json + OR!!! +cp server/config/config.example.toml server/config/config.toml +``` + +**:warning: NOTE:** application and server components **has to be rebuild** if configuration parameter is changed ([see build steps](#manual-installation-build)). Rebuild is not necessary for Docker or Debian (.deb) version, just restart container/service. + +### Build +**Note:** It is highly recommended to use _yarn_ package manager. -### build ```bash cd app yarn && yarn build @@ -115,78 +184,32 @@ yarn && yarn build cd ../server yarn && yarn build ``` +### Run -### configure - -Note: Edumeet will start on the default settings (if you don't create your own configuration files) - -Important! You must always **rebuild** the edumeet when you change something in the configuration files. - -#### use template (example) -Just clone the example files and adjust them if required. - -```bash -cp server/config/config.example.js server/config/config.js -cp app/public/config/config.example.js app/public/config/config.js -``` - -#### To change default options, create your own server config file (yaml or json) - -Example when usingi _config.yaml_ file -```yaml -turnAPIKey: "" -turnAPIURI: "https://api.turn.geant.org/turn" -mediasoup: - webRtcTransport: - listenIps: - - ip: "" - announcedIp: "" -``` -Example when using _config.json_ file -```javascript -{ - [ - { - "urls": [ - "turn:turn.example.com:443?transport=tcp" - ], - "username": "example", - "credential": "example" - } - ] -}; -``` - -Full documentation and list of all settings: -| destination | location | -| --- | --- | -| app side | [./app/README.md](https://github.com/edumeet/edumeet/blob/develop/app/README.md) | -| srv side | [./server/README.md](https://github.com/edumeet/edumeet/blob/develop/server/README.md) | - -### Run - -#### locally (for development) - -* The newest build is always in **develop branch** if you want to make a contribution/pull request use it instead of master branch. - -```bash -# You can run a live build from app folder and running : -app$ yarn start - -# Also you need to start a server in server folder too. -server$ yarn start -``` - -#### locally +**Run on server** (as root or with sudo) ```bash # Run the Node.js server application in a terminal: cd server -yarn start +sudo yarn start ``` -Note: Do not run the server as root. Instead, do redirects on the firewall: +**Run locally** (for development) + +* The newest build is always in **develop branch** if you want to make a contribution/pull request use it instead of master branch. + ```bash +# run a live build from app folder: +app$ yarn start + +# and run server in server folder: +server$ yarn start +``` + +Note: To avoid running server as root, redirects privileged ports with firewall rules: +```bash +#adjust ports to your needs + sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443 sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -o lo -j REDIRECT --to-port 8443 sudo iptables -t nat -A PREROUTING -p tcp --dport 3443 -j REDIRECT --to-ports 8443 @@ -197,10 +220,9 @@ sudo apt install iptables-persistent sudo iptables-save > /etc/iptables/rules.v4 sudo ip6tables-save > /etc/iptables/rules.v6 ``` - * Test your service in a webRTC enabled browser: `https://yourDomainOrIPAdress:3443/roomname` -#### as a service (systemd) +**Run as a service** (systemd) ```bash # Stop your locally running server. Copy systemd-service file `edumeet.service` to `/etc/systemd/system/` and check location path settings: @@ -220,9 +242,9 @@ sudo systemctl enable edumeet ## Ports and firewall | Port | protocol | description | | ---- | ----------- | ----------- | -|443 | tcp | default https webserver and signaling - adjustable in `server/config.js`) | +| 443 | tcp | default https webserver and signaling - adjustable in `server/config/config.yaml`) | | 4443 | tcp | default `yarn start` port for developing with live browser reload, not needed in production environments - adjustable in app/package.json) | -| 40000-49999 | udp, tcp | media ports - adjustable in `server/config.js` | +| 40000-49999 | udp, tcp | media ports - adjustable in `server/config/config.yaml` | ## Load balanced installation @@ -237,7 +259,7 @@ To integrate with an LMS (e.g. Moodle), have a look at [LTI](LTI/LTI.md). If you are part of the GEANT eduGAIN, you can request your turn api key at [https://turn.geant.org/](https://turn.geant.org/) You need an additional [TURN](https://github.com/coturn/coturn)-server for clients located behind restrictive firewalls! -Add your server and credentials to `server/config/config.js` +Add your server and credentials to `server/config/config.yaml` ## Community-driven support | Type | | @@ -266,3 +288,4 @@ MIT License (see `LICENSE.md`) Contributions to this work were made on behalf of the GÉANT project, a project that has received funding from the European Union’s Horizon 2020 research and innovation programme under Grant Agreement No. 731122 (GN4-2). On behalf of GÉANT project, GÉANT Association is the sole owner of the copyright in all material which was developed by a member of the GÉANT project. GÉANT Vereniging (Association) is registered with the Chamber of Commerce in Amsterdam with registration number 40535155 and operates in the UK as a branch of GÉANT Vereniging. Registered office: Hoekenrode 3, 1102BR Amsterdam, The Netherlands. UK branch address: City House, 126-130 Hills Road, Cambridge CB2 1PQ, UK. + diff --git a/app/package.json b/app/package.json index 2c0a39a6..574cdee9 100644 --- a/app/package.json +++ b/app/package.json @@ -110,6 +110,6 @@ "eslint-webpack-plugin": "^2.5.3", "foreman": "^3.0.1", "redux-mock-store": "^1.5.3", - "ts-node": "^9.1.1" + "ts-node": "^10.5.0" } } diff --git a/app/README.md b/app/public/config/README.md similarity index 94% rename from app/README.md rename to app/public/config/README.md index d2ea88b2..2b59e31f 100644 --- a/app/README.md +++ b/app/public/config/README.md @@ -1,21 +1,4 @@ -# Edumeet App Configuration - -The app configuration file should be a valid javascript file defining a single -`config` object containing the properties that you need to modify. - -Example `public/config/config.example.js`: -```javascript -var config = -{ - developmentPort : 3443, - productionPort : 443 -}; -``` -The actual app-config of a running edumeet instance can you get on https://yourinstance:yourport/?config=true -An example configuration file with all properties set to default values -can be found here: [config.example.js](public/config/config.example.js). - -## Configuration properties +# ![edumeet logo](/app/public/images/logo.edumeet.svg) App Configuration properties list: | Name | Description | Format | Default value | | :--- | :---------- | :----- | :------------ | diff --git a/app/src/components/Controls/Help.js b/app/src/components/Controls/Help.js index de65e0b2..4e1428ec 100644 --- a/app/src/components/Controls/Help.js +++ b/app/src/components/Controls/Help.js @@ -14,23 +14,6 @@ import Paper from '@material-ui/core/Paper'; import Tabs from '@material-ui/core/Tabs'; import Tab from '@material-ui/core/Tab'; -const shortcuts=[ - { key: 'h', label: 'room.help', defaultMessage: 'Help' }, - { key: 'm', label: 'device.muteAudio', defaultMessage: 'Mute Audio' }, - { key: 'v', label: 'device.stopVideo', defaultMessage: 'Mute Video' }, - { key: '1', label: 'label.democratic', defaultMessage: 'Democratic View' }, - { key: '2', label: 'label.filmstrip', defaultMessage: 'Filmstrip View' }, - { key: 'space', label: 'me.mutedPTT', defaultMessage: 'Push SPACE to talk' }, - { key: 'a', label: 'label.advanced', defaultMessage: 'Show advanced information' } - - /* - { - key: `${String.fromCharCode(8592)} ${String.fromCharCode(8594)}`, - label: 'room.browsePeersSpotlight', - defaultMessage: 'Browse participants into Spotlight' - } - */ -]; const styles = (theme) => ({ dialogPaper : @@ -116,20 +99,70 @@ const Help = ({ } /> - {shortcuts.map((value, index) => + + {/* { - return ( -
- - {value.key} - - -
- ); - })} + key: `${String.fromCharCode(8592)} ${String.fromCharCode(8594)}`, + label: 'room.browsePeersSpotlight', + defaultMessage: 'Browse participants into Spotlight' + } + */} +
+ h + +
+ +
+ m + +
+ +
+ v + +
+ +
+ 1 + +
+ +
+ 2 + +
+ +
+ space + +
+ +
+ a + +
+