diff --git a/.env b/.env index 5f0172c35659adcc481d0789fc843b5dcbc0552c..23d1348885df2fc4fc1c3b2ec354543e98a34a7c 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -REACT_APP_EVENTSIGNUP_SERVICE_TOKEN=eyJraWQiOiIyMDIwMDUwMSIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJORFU0WTJNNFl6UXRPV1ptTUMwMFltSXhMV0V4TkRNdE9HWXlNRFExTXpVNFlqRmkiLCJhdWQiOiJNVEl6Ok55bmphV2ViOk55bmphIiwic2NvcGUiOiJhY2Nlc3MiLCJyb2xlcyI6WyJVU0VSIl0sImlzcyI6Imh0dHBzOi8vYXV0aC5ueW5qYS5iaXovIiwiZXhwIjoxNTg5Nzk5MzMzLCJpYXQiOjE1ODg1ODk3MzN9.rSm1KAXzjT2V9B_fus3OT5XAig7iA_akbCu0rNDH8AjEcCUyAYgti8NpZbiBzR7z6OdW3FD-ISCC3_rUZ2SbfA +REACT_APP_EVENTSIGNUP_SERVICE_TOKEN=eyJraWQiOiIyMDIwMDUyMiIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJNMlF5TUdNM01XUXRPR0ZoWXkwME9UazNMV0ZqWVdZdE1qWmpNVEJpT0dVMU1HRXoiLCJhdWQiOiJNVEl6Ok55bmphV2ViOk55bmphIiwic2NvcGUiOiJhY2Nlc3MiLCJyb2xlcyI6WyJVU0VSIl0sImlzcyI6Imh0dHBzOi8vYXV0aC5ueW5qYS5iaXovIiwiZXhwIjoxNjUzMzcxMTE3LCJpYXQiOjE1OTAyOTkxMTd9.itCyvSYquIrmUNcgASF5cMhAAUPv1yxAWyN4q9vAMCMbI7N4_6G25qQVygEXLSWaAPFGOnRoaZkZTsaLTiHWeg diff --git a/Jenkinsfile b/Jenkinsfile index 26fab97c6a56611eb126f09e161c3acbd8f0e3e3..d0b34166387963378a893c2a42650fe9195cf73f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,232 +1,234 @@ -#!/usr/bin/env groovy - -@Library('nynja-common') _ - -pipeline { - environment { - SLACK_CHANNEL = "#nynja-app-web" - NAMESPACE = "nynja-app" - APP_NAME = "nynja-app-web" - IMAGE_NAME = "eu.gcr.io/nynja-ci-201610/${NAMESPACE}/${APP_NAME}" - IMAGE_BUILD_TAG = "$BRANCH_NAME-$BUILD_NUMBER" - HELM_CHART_NAME = "nynja-app-web" - DEV_BRANCH = "dev" - SLACK_CHANNEL_DESKTOP = "#nynja-app-desktop" - NAMESPACE_DESKTOP = "nynja-desktop" - APP_NAME_DESKTOP = "nynja-app-desktop" - IMAGE_NAME_DESKTOP = "eu.gcr.io/nynja-ci-201610/${NAMESPACE_DESKTOP}/${APP_NAME_DESKTOP}" - IMAGE_BUILD_TAG_DESKTOP = "$BRANCH_NAME-$BUILD_NUMBER" - HELM_CHART_NAME_DESKTOP = "nynja-app-desktop" - DESKTOP_BRANCH = "desktop-master" - } - agent { - kubernetes(builders.multi([ - "nodejs":"node:10.4.0", - "helm":"lachlanevenson/k8s-helm:v2.9.1" - ])) - } - options { - skipDefaultCheckout() - buildDiscarder(logRotator(numToKeepStr: '15')) - } - stages { - stage('Checkout') { - steps { - container('nodejs') { - script { - def vars = checkout scm - vars.each { k,v -> env.setProperty(k, v) } - } - slackSend channel: SLACK_CHANNEL, message: slackStartMsg() - slackSend channel: SLACK_CHANNEL, message: "", attachments: slackBuildInfo() - } - } - } - /* - stage('Build PR') { - when { - branch 'PR-*' - } - stages { - stage('Build') { - steps { - echo 'build & test' - dockerBuildAndPushToRegistry "${NAMESPACE}/${APP_NAME}", [IMAGE_BUILD_TAG] - } - } - stage('Deploy preview') { - steps { - echo 'build & test' - } - } - } - } - */ - stage('Build Dev') { - when { - branch env.DEV_BRANCH - } - stages { - stage('Build') { - steps { - container('nodejs') { - sh 'npm install' - sh 'npm run build:prod' - dockerBuildAndPushToRegistry "${NAMESPACE}/${APP_NAME}", [IMAGE_BUILD_TAG] - } - } - } - stage("Helm chart") { - steps { - container('helm') { - helmBuildAndPushToRegistry HELM_CHART_NAME - } - } - } - stage('Deploy preview') { - steps { - deployHelmTo "dev", NAMESPACE - } - } - } - post { - success { - container('nodejs') { slackSend channel: SLACK_CHANNEL, message: slackEndMsg(), color: 'good' } - } - failure { - container('nodejs') { slackSend channel: SLACK_CHANNEL, message: slackEndMsg(), color: 'danger' } - } - } - } - stage('Build Release') { - when { - branch 'master' - } - stages { - stage("Build") { - steps { - container('nodejs') { - sh 'npm install' - sh 'npm run build:prod' - dockerBuildAndPushToRegistry "${NAMESPACE}/${APP_NAME}", [IMAGE_BUILD_TAG] - } - } - } - stage("Helm chart") { - steps { - container('helm') { - helmBuildAndPushToRegistry HELM_CHART_NAME - } - } - } - stage("Approval: Deploy to staging ?") { - steps { - slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: build #$BUILD_NUMBER ready to deploy to `STAGING`, approval required: $BUILD_URL (24h)" - - timeout(time: 24, unit: 'HOURS') { input 'Deploy to staging ?' } - } - post { failure { echo 'Deploy aborted for build #...' }} - } - stage("Deploy to staging") { - steps { - slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: deploying build #$BUILD_NUMBER to `STAGING`" - deployHelmTo "staging", NAMESPACE - } - } - stage("Approval: Deploy to production ?") { - steps { - slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: build #$BUILD_NUMBER ready to deploy to `PRODUCTION`, approval required: $BUILD_URL (24h)" - - timeout(time: 7, unit: 'DAYS') { input 'Deploy to production ?' } - } - post { failure { echo 'Deploy aborted for build #...' }} - } - stage('Tagging release') { - steps { - container('nodejs') { - // Updating the "latest tag" - dockerTagLatestAndPushToRegistry "${NAMESPACE}/${APP_NAME}", IMAGE_BUILD_TAG - } - } - } - /* - stage('Deploy release to canary') { - steps { - slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: deploying build #$BUILD_NUMBER to `PRODUCTION` (canary)" - echo "deploy to canary" - } - } - */ - stage("Deploy to production") { - steps { - slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: deploying build #$BUILD_NUMBER to `PRODUCTION`" - - deployHelmTo "prod", NAMESPACE - } - } - } - } - stage('Build Desktop Release') { - when { - branch env.DESKTOP_BRANCH - } - stages { - stage("Build") { - steps { - container('nodejs') { - sh 'npm install' - sh 'npm run build:prod' - dockerBuildAndPushToRegistry "${NAMESPACE_DESKTOP}/${APP_NAME_DESKTOP}", [IMAGE_BUILD_TAG_DESKTOP] - } - } - } - stage("Helm chart") { - steps { - container('helm') { - helmBuildAndPushToRegistry HELM_CHART_NAME_DESKTOP - } - } - } - stage("Approval: Deploy to staging ?") { - steps { - slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: build #$BUILD_NUMBER ready to deploy to `STAGING`, approval required: $BUILD_URL (24h)" - - timeout(time: 24, unit: 'HOURS') { input 'Deploy to staging ?' } - } - post { failure { echo 'Deploy aborted for build #...' }} - } - stage("Deploy to staging") { - steps { - slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: deploying build #$BUILD_NUMBER to `STAGING`" - deployHelmTo "staging", NAMESPACE_DESKTOP - } - } - stage("Approval: Deploy to production ?") { - steps { - slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: build #$BUILD_NUMBER ready to deploy to `PRODUCTION`, approval required: $BUILD_URL (24h)" - - timeout(time: 7, unit: 'DAYS') { input 'Deploy to production ?' } - } - post { failure { echo 'Deploy aborted for build #...' }} - } - /* - stage('Tagging release') { - steps { - container('nodejs') { - // Updating the "latest tag" - dockerTagLatestAndPushToRegistry "${NAMESPACE_DESKTOP}/${APP_NAME_DESKTOP}", IMAGE_BUILD_TAG_DESKTOP - } - } - } - */ - stage("Deploy to production") { - steps { - slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: deploying build #$BUILD_NUMBER to `PRODUCTION`" - - deployHelmTo "prod", NAMESPACE_DESKTOP - } - } - } - } - } -} +#!/usr/bin/env groovy + +@Library('nynja-common') _ + +pipeline { + environment { + SLACK_CHANNEL = "#nynja-app-web" + NAMESPACE = "nynja-app" + APP_NAME = "nynja-app-web" + IMAGE_NAME = "eu.gcr.io/nynja-ci-201610/${NAMESPACE}/${APP_NAME}" + IMAGE_BUILD_TAG = "$BRANCH_NAME-$BUILD_NUMBER" + HELM_CHART_NAME = "nynja-app-web" + DEV_BRANCH = "dev" + SLACK_CHANNEL_DESKTOP = "#nynja-app-desktop" + NAMESPACE_DESKTOP = "nynja-desktop" + APP_NAME_DESKTOP = "nynja-app-desktop" + IMAGE_NAME_DESKTOP = "eu.gcr.io/nynja-ci-201610/${NAMESPACE_DESKTOP}/${APP_NAME_DESKTOP}" + IMAGE_BUILD_TAG_DESKTOP = "$BRANCH_NAME-$BUILD_NUMBER" + HELM_CHART_NAME_DESKTOP = "nynja-app-desktop" + DESKTOP_BRANCH = "desktop-master" + } + agent { + kubernetes(builders.multi([ + "nodejs":"node:10.4.0", + "helm":"lachlanevenson/k8s-helm:v2.9.1" + ])) + } + options { + skipDefaultCheckout() + buildDiscarder(logRotator(numToKeepStr: '15')) + } + stages { + stage('Checkout') { + steps { + container('nodejs') { + script { + def vars = checkout scm + vars.each { k,v -> env.setProperty(k, v) } + } + slackSend channel: SLACK_CHANNEL, message: slackStartMsg() + slackSend channel: SLACK_CHANNEL, message: "", attachments: slackBuildInfo() + } + } + } + /* + stage('Build PR') { + when { + branch 'PR-*' + } + stages { + stage('Build') { + steps { + echo 'build & test' + dockerBuildAndPushToRegistry "${NAMESPACE}/${APP_NAME}", [IMAGE_BUILD_TAG] + } + } + stage('Deploy preview') { + steps { + echo 'build & test' + } + } + } + } + */ + stage('Build Dev') { + when { + branch env.DEV_BRANCH + } + stages { + stage('Build') { + steps { + container('nodejs') { + sh 'npm install' + sh 'npm run build:prod' + dockerBuildAndPushToRegistry "${NAMESPACE}/${APP_NAME}", [IMAGE_BUILD_TAG] + } + } + } + stage("Helm chart") { + steps { + container('helm') { + helmBuildAndPushToRegistry HELM_CHART_NAME + } + } + } + stage('Deploy preview') { + steps { + deployHelmTo "dev", NAMESPACE + } + } + } + post { + success { + container('nodejs') { slackSend channel: SLACK_CHANNEL, message: slackEndMsg(), color: 'good' } + } + failure { + container('nodejs') { slackSend channel: SLACK_CHANNEL, message: slackEndMsg(), color: 'danger' } + } + } + } + stage('Build Release') { + when { + branch 'master' + } + stages { + stage("Build") { + steps { + container('nodejs') { + sh 'npm install' + sh 'npm run build:prod' + dockerBuildAndPushToRegistry "${NAMESPACE}/${APP_NAME}", [IMAGE_BUILD_TAG] + } + } + } + stage("Helm chart") { + steps { + container('helm') { + helmBuildAndPushToRegistry HELM_CHART_NAME + } + } + } + stage("Approval: Deploy to staging ?") { + steps { + slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: build #$BUILD_NUMBER ready to deploy to `STAGING`, approval required: $BUILD_URL (24h)" + + timeout(time: 24, unit: 'HOURS') { input 'Deploy to staging ?' } + } + post { failure { echo 'Deploy aborted for build #...' }} + } + stage("Deploy to staging") { + steps { + slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: deploying build #$BUILD_NUMBER to `STAGING`" + // Added release file filter based on metadata.namespace + deployHelmToNamespace "staging", NAMESPACE + } + } + stage("Approval: Deploy to production ?") { + steps { + slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: build #$BUILD_NUMBER ready to deploy to `PRODUCTION`, approval required: $BUILD_URL (24h)" + + timeout(time: 7, unit: 'DAYS') { input 'Deploy to production ?' } + } + post { failure { echo 'Deploy aborted for build #...' }} + } + stage('Tagging release') { + steps { + container('nodejs') { + // Updating the "latest tag" + dockerTagLatestAndPushToRegistry "${NAMESPACE}/${APP_NAME}", IMAGE_BUILD_TAG + } + } + } + /* + stage('Deploy release to canary') { + steps { + slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: deploying build #$BUILD_NUMBER to `PRODUCTION` (canary)" + echo "deploy to canary" + } + } + */ + stage("Deploy to production") { + steps { + slackSend channel: SLACK_CHANNEL, message: "$APP_NAME: deploying build #$BUILD_NUMBER to `PRODUCTION`" + // Added release file filter based on metadata.namespace + deployHelmToNamespace "prod", NAMESPACE + } + } + } + } + stage('Build Desktop Release') { + when { + branch env.DESKTOP_BRANCH + } + stages { + stage("Build") { + steps { + container('nodejs') { + sh 'npm install' + sh 'npm run build:prod' + dockerBuildAndPushToRegistry "${NAMESPACE_DESKTOP}/${APP_NAME_DESKTOP}", [IMAGE_BUILD_TAG_DESKTOP] + } + } + } + stage("Helm chart") { + steps { + container('helm') { + helmBuildAndPushToRegistry HELM_CHART_NAME_DESKTOP + } + } + } + stage("Approval: Deploy to staging ?") { + steps { + slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: build #$BUILD_NUMBER ready to deploy to `STAGING`, approval required: $BUILD_URL (24h)" + + timeout(time: 24, unit: 'HOURS') { input 'Deploy to staging ?' } + } + post { failure { echo 'Deploy aborted for build #...' }} + } + stage("Deploy to staging") { + steps { + slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: deploying build #$BUILD_NUMBER to `STAGING`" + // Added release file filter based on metadata.namespace + deployHelmToNamespace "staging", NAMESPACE_DESKTOP + } + } + stage("Approval: Deploy to production ?") { + steps { + slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: build #$BUILD_NUMBER ready to deploy to `PRODUCTION`, approval required: $BUILD_URL (24h)" + + timeout(time: 7, unit: 'DAYS') { input 'Deploy to production ?' } + } + post { failure { echo 'Deploy aborted for build #...' }} + } + /* + stage('Tagging release') { + steps { + container('nodejs') { + // Updating the "latest tag" + dockerTagLatestAndPushToRegistry "${NAMESPACE_DESKTOP}/${APP_NAME_DESKTOP}", IMAGE_BUILD_TAG_DESKTOP + } + } + } + */ + stage("Deploy to production") { + steps { + slackSend channel: SLACK_CHANNEL_DESKTOP, message: "$APP_NAME_DESKTOP: deploying build #$BUILD_NUMBER to `PRODUCTION`" + // Added release file filter based on metadata.namespace + deployHelmToNamespace "prod", NAMESPACE_DESKTOP + } + } + } + } + } +} diff --git a/charts/nynja-app-desktop/Chart.yaml b/charts/nynja-app-desktop/Chart.yaml index 4297728b928f61958340f0b458110483938ca4dd..343792e45fc13db6bc77039103d844f198be64dc 100644 --- a/charts/nynja-app-desktop/Chart.yaml +++ b/charts/nynja-app-desktop/Chart.yaml @@ -1,5 +1,5 @@ -apiVersion: v1 -appVersion: "1.0" -description: Deployment of the nynja desktop application -name: nynja-app-desktop -version: 0.2.5 +apiVersion: v1 +appVersion: "1.0" +description: Deployment of the nynja desktop application +name: nynja-app-desktop +version: 0.2.6 diff --git a/charts/nynja-app-desktop/templates/nginx-configmap.yaml b/charts/nynja-app-desktop/templates/nginx-configmap.yaml index ef3fca8c5c4c642418eb8e127695e7ea361c8718..00243952fb6f25b6772084688c04c15ec81d9a44 100644 --- a/charts/nynja-app-desktop/templates/nginx-configmap.yaml +++ b/charts/nynja-app-desktop/templates/nginx-configmap.yaml @@ -1,125 +1,125 @@ -kind: ConfigMap -apiVersion: v1 -metadata: - name: {{ template "nynja-app-desktop.fullname" . }}-nginx-conf - labels: - app: {{ template "nynja-app-desktop.name" . }} - chart: {{ template "nynja-app-desktop.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -data: - default.conf: |- - server { - listen 80; - server_name _; - - #sendfile on; - sendfile off; - sendfile_max_chunk 1m; - - tcp_nopush on; - tcp_nodelay off; - - charset utf-8; - access_log off; - #access_log /var/log/nginx/host.access.log main; - - # GZIP settings - gzip on; - gzip_disable "msie6"; - gzip_vary on; - gzip_proxied any; - gzip_comp_level 5; - gzip_buffers 16 4k; - gzip_min_length 256; - gzip_types - application/javascript - application/x-javascript - application/json - application/xml - application/xml+rss - text/plain - text/css - text/javascript - text/xml - image/jpeg - image/png - image/gif; - - location / { - root /usr/share/nginx/html; - index index.html; - try_files $uri /index.html; - - set $auth_type "Restricted"; - # Handle join links (ex. join.nynja.net/123) - set $join_link 0; - - if ( $host ~ ^join\.(?.+)$ ) { - set $join_link 1; - set $auth_type "off"; - } - if ($request_uri ~ ^/.well-known/.*$ ) { - set $join_link 0; - set $auth_type "off"; - } - if ($join_link = 1) { - return 302 https://web.$domain/join$request_uri; - } - - # {{ if .Values.auth.basic.enabled }} - auth_basic $auth_type; - auth_basic_user_file /usr/share/nginx/html/.htpasswd; - # {{ end }} - } - - location /status { - auth_basic off; - return 200; - } - - location /appversion { - auth_basic off; - default_type application/json; - return 200 '{"status":"success","version":"0.4.0","build":"1589451878"}'; - } - - # Webpack debug proxy (temporary) - #location /debug { - # proxy_set_header X-Forwarded-For $remote_addr; - # proxy_set_header Host $http_host; - # proxy_pass "http://127.0.0.1:8080"; - #} - - #error_page 404 /404.html; - - # redirect server error pages to the static page /50x.html - # - #error_page 500 502 503 504 /50x.html; - #location = /50x.html { - # root /usr/share/nginx/html; - #} - - # proxy the PHP scripts to Apache listening on 127.0.0.1:80 - # - #location ~ \.php$ { - # proxy_pass http://127.0.0.1; - #} - - # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 - # - #location ~ \.php$ { - # root html; - # fastcgi_pass 127.0.0.1:9000; - # fastcgi_index index.php; - # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; - # include fastcgi_params; - #} - - # deny access to .htaccess files, if Apache's document root - # concurs with nginx's one - # - location ~ /\.ht { - deny all; - } - } +kind: ConfigMap +apiVersion: v1 +metadata: + name: {{ template "nynja-app-desktop.fullname" . }}-nginx-conf + labels: + app: {{ template "nynja-app-desktop.name" . }} + chart: {{ template "nynja-app-desktop.chart" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +data: + default.conf: |- + server { + listen 80; + server_name _; + + #sendfile on; + sendfile off; + sendfile_max_chunk 1m; + + tcp_nopush on; + tcp_nodelay off; + + charset utf-8; + access_log off; + #access_log /var/log/nginx/host.access.log main; + + # GZIP settings + gzip on; + gzip_disable "msie6"; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 5; + gzip_buffers 16 4k; + gzip_min_length 256; + gzip_types + application/javascript + application/x-javascript + application/json + application/xml + application/xml+rss + text/plain + text/css + text/javascript + text/xml + image/jpeg + image/png + image/gif; + + location / { + root /usr/share/nginx/html; + index index.html; + try_files $uri /index.html; + + set $auth_type "Restricted"; + # Handle join links (ex. join.nynja.net/123) + set $join_link 0; + + if ( $host ~ ^join\.(?.+)$ ) { + set $join_link 1; + set $auth_type "off"; + } + if ($request_uri ~ ^/.well-known/.*$ ) { + set $join_link 0; + set $auth_type "off"; + } + if ($join_link = 1) { + return 302 https://desktop.$domain/join$request_uri; + } + + # {{ if .Values.auth.basic.enabled }} + auth_basic $auth_type; + auth_basic_user_file /usr/share/nginx/html/.htpasswd; + # {{ end }} + } + + location /status { + auth_basic off; + return 200; + } + + location /appversion { + auth_basic off; + default_type application/json; + return 200 '{"status":"success","version":"0.4.0","build":"1589451878","notes":["Electron Framework updated to latest version 8.0.1","Fixed select all keyboard shortcut (command + A) issue in Mac OS","Handled mic and camera permission issue on Mac OS","Handled black thumbnails in screen share popup on Windows OS","Updated spellcheck feature with stable library","Fixed cancel button issue in Print dialog of Pdf Viewer","Fullscreen and close button issue fixed in Pdf viewer","Added single process for upgrading web and native app upgrade","Seperated Codebase for native application","Fixed screen share and invite link issue for full screenshare dialog"]}'; + } + + # Webpack debug proxy (temporary) + #location /debug { + # proxy_set_header X-Forwarded-For $remote_addr; + # proxy_set_header Host $http_host; + # proxy_pass "http://127.0.0.1:8080"; + #} + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + #error_page 500 502 503 504 /50x.html; + #location = /50x.html { + # root /usr/share/nginx/html; + #} + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + location ~ /\.ht { + deny all; + } + } diff --git a/lib/desktop_updater.js b/lib/desktop_updater.js index 66cc981deb0b4719d4434a0d69e805c024fcb09f..cc361d719cff273c2ce78eb4119bd2889c8941f2 100644 --- a/lib/desktop_updater.js +++ b/lib/desktop_updater.js @@ -3,6 +3,11 @@ console.log(process.versions) var isrequestedCheckForUpdate037 = false; var releaseNotes = {}; + +var appversionObj = {}; +var isBuildUpdate = false; +var isVersionUpdate = false; + ipcRendererUpdateWeb.on('update', function (event, message) { var msgJSON = JSON.parse(message); console.log('[DTU] update event ',message); // // message = {key:'',text:''}; @@ -22,21 +27,46 @@ ipcRendererUpdateWeb.on('update', function (event, message) { console.log('[DTU] update for v0.3.7', 'startDownload') startDownloading() } + } else if(msgJSON.key==='update-check-menu') { + getAppVesrion('update-check-menu'); + // ipcRendererOnUpdateEvent(msgJSON); } else { - + ipcRendererOnUpdateEvent(msgJSON); } -}) - +}); +/** + * + * ipcRendererOnUpdateEvent + */ function ipcRendererOnUpdateEvent(msgJSON) { - + /** + * msgJSON key's + * key: 'update-check', + * upgrade: true/false, + * upgradeType: 'version' / 'build', + * version: '0.4.0', + * build: 1590208348, + * currentVersion: '0.4.0', + * currentBuild: 1590208348, + * status: 200 + */ switch (msgJSON.key) { case 'update-check-menu': //Update UI button or text document.getElementById('update-info').style = (msgJSON.upgrade ? '' : (msgJSON.version !== '' ? 'display: none;' : 'display: none;')); + document.getElementById('update-info').innerHTML = (msgJSON.upgrade ? 'Update Available' : (msgJSON.version !== '' ? '' : '')); - document.getElementById('update_latest_version').innerHTML = (msgJSON.upgrade ? 'A new release is available (' + msgJSON.version + ').' : (msgJSON.version !== '' ? 'You are using latest version of Nynja.' : 'Encountered an error while updating, try again later.')); - document.getElementById('update_current_version').innerHTML = 'version ' + msgJSON.currentVersion; + + // document.getElementById('update_latest_version').innerHTML = (msgJSON.upgrade ? 'A new release is available (' + msgJSON.version + ').' : (msgJSON.version !== '' ? 'You are using latest version of Nynja.' : 'Encountered an error while updating, try again later.')); + document.getElementById('update_latest_version').innerHTML = (msgJSON.upgrade ? + (msgJSON.upgradeType==="version"? 'A new release is available ' + msgJSON.version +' (Build: ' + msgJSON.build + ')' : + 'A new build (' + msgJSON.build + ') is available in release ' + msgJSON.version + '.'): + (msgJSON.version !== '' ? 'You are using latest version of Nynja.' : + 'Unable to update, please try again later.')); + + //document.getElementById('update_current_version').innerHTML = 'current version ' + msgJSON.currentVersion; + document.getElementById('update_current_version').innerHTML = 'current version ' + msgJSON.currentVersion+ ' (Build: ' + msgJSON.currentBuild+')'; document.getElementById('update_version_electron').innerHTML = (msgJSON.electron === undefined ? process.versions.electron : msgJSON.electron); document.getElementById('update_version_chromium').innerHTML = (msgJSON.chromium === undefined ? process.versions.chrome : msgJSON.chromium); @@ -58,9 +88,16 @@ function ipcRendererOnUpdateEvent(msgJSON) { //Update UI button or text document.getElementById('update-info').style = (msgJSON.upgrade ? '' : (msgJSON.version !== '' ? 'display: none;' : 'display: none;')); + document.getElementById('update-info').innerHTML = (msgJSON.upgrade ? 'Update Available' : (msgJSON.version !== '' ? '' : '')); - document.getElementById('update_latest_version').innerHTML = (msgJSON.upgrade ? 'A new release is available (' + msgJSON.version + ').' : (msgJSON.version !== '' ? 'You are using latest version of Nynja.' : 'Encountered an error while updating, try again later.')); - document.getElementById('update_current_version').innerHTML = 'version ' + msgJSON.currentVersion; + + document.getElementById('update_latest_version').innerHTML = (msgJSON.upgrade ? + (msgJSON.upgradeType==="version"? 'A new release is available ' + msgJSON.version +' (Build: ' + msgJSON.build + ')' : + 'A new build (' + msgJSON.build + ') is available in release ' + msgJSON.version + '.'): + (msgJSON.version !== '' ? 'You are using latest version of Nynja.' : + 'Unable to update, please try again later.')); + + document.getElementById('update_current_version').innerHTML = 'current version ' + msgJSON.currentVersion+ ' (Build: ' + msgJSON.currentBuild+')'; //document.getElementById('update_version_electron').innerHTML = msgJSON.electron; //document.getElementById('update_version_chromium').innerHTML = msgJSON.chromium; //document.getElementById('update_version_nodejs').innerHTML = msgJSON.nodejs; @@ -122,6 +159,9 @@ function showReleaseNotes(type, msgJSON) { if(msgJSON.upgrade){ releaseNotesVersions = [msgJSON.version]; console.log('[DTU]', 'msgJSON.upgrade:',msgJSON.upgrade,releaseNotesVersions) + console.log('[DTU]', 'msgJSON.upgrade:',releaseNotes[msgJSON.version],msgJSON.notes) + releaseNotes[msgJSON.version] = {}; + releaseNotes[msgJSON.version]["content"] = msgJSON.notes; }else{ releaseNotesVersions = releaseNotesVersions.slice(releaseNotesVersions.indexOf(msgJSON.currentVersion)); console.log('[DTU]', 'msgJSON.upgrade:',msgJSON.upgrade, releaseNotesVersions) @@ -171,14 +211,28 @@ function updateVersionNotesClick() { * Update Available click handler * Show update popup */ -function updateInfoClick(msgJSON) {//alert(1); +function updateInfoClick(msgJSON) { //show modal popup document.getElementById('update-desc-box').style = ''; - + console.log(msgJSON) if (msgJSON.upgrade) { - // // document.getElementById('update-install').removeEventListener('click'); - document.getElementById('update_download_install').style = ''; - document.getElementById('update_download_install').addEventListener("click", updateConfClick) + // // // document.getElementById('update-install').removeEventListener('click'); + // document.getElementById('update_download_install').style = ''; + // document.getElementById('update_download_install').addEventListener("click", updateConfClick) + if(msgJSON.upgradeType==="version"){ + // alert(1) + document.getElementById('update_download_install').innerHTML = 'Update'; + document.getElementById('update_download_install').style = ''; + document.getElementById('update_download_install').addEventListener("click", updateConfClick) + document.getElementById('releases_info_p').innerHTML = 'After finishing the download, NYNJA application will be restarted to apply new updates.'; + }else{ + // alert(2) + + document.getElementById('update_download_install').innerHTML = 'Refresh Only'; + document.getElementById('update_refresh_only').style = ''; + document.getElementById('update_refresh_only').addEventListener("click", startDownloading) + document.getElementById('releases_info_p').innerHTML = 'By clicking on Confirm button, Nynja application will refresh to apply new updates.'; + } } } @@ -187,6 +241,8 @@ function updateInfoClick(msgJSON) {//alert(1); * Show confirmation popup */ function updateConfClick(msgJSON) {//alert(1); + document.getElementById('update-desc-box').style = 'display: none;'; + //show modal popup document.getElementById('update-conf-box').style = ''; document.getElementById('update-conf-box').style = 'z-index: 1002'; @@ -203,12 +259,24 @@ function updateConfClick(msgJSON) {//alert(1); function startDownloading() { console.log('start-download') //Update confirm and notify main process - ipcRendererUpdateWeb.send('update-main', 'update-start'); + if(isVersionUpdate){ + // alert('start1') + document.getElementById('update-notify-box').style = ''; + + appversionObj.action = 'update-start'; + ipcRendererUpdateWeb.send('update-main', appversionObj); + } else if(isBuildUpdate){ + // alert('start2') + appversionObj.action = 'update-build'; + ipcRendererUpdateWeb.send('update-main', appversionObj); + } + + //ipcRendererUpdateWeb.send('update-main', 'update-start'); document.getElementById('update-info').style = 'display: none;'; document.getElementById('update-desc-box').style = 'display: none;'; document.getElementById('update-conf-box').style = 'display: none;'; document.getElementById('update-conf-yes').style = 'display: none;'; - document.getElementById('update-notify-box').style = ''; +// document.getElementById('update-notify-box').style = ''; } @@ -422,4 +490,102 @@ if (process.env.currentVersion) { }); +/******************************** Single Update Feature ********************************/ + /** + * Call api to get version(major), build(minor) + * and latest notes for release + */ + getAppVesrion(); + setInterval(function(){ + console.log('[DTU] CHECK APP VERSION AFTER 10 MINS') + getAppVesrion(); + },10*60*1000) + function getAppVesrion(type='update-check'){ + fetch('https://desktop.staging.nynja.net/appversion', { + cache: 'no-store', + method: 'GET', + headers: { + 'Cache-Control': 'no-store', + 'Pragma': 'no-cache', + }, + }) + .then(function (res) { + // console.log('[DTU]',res); + console.log('[DTU] appversion api res',res); + return res.json(); + }) + .then(function (data) { + console.log('[DTU] appversion api data',data); + appversionObj = data; + // appversionObj = {"status":"success","version":"0.4.0","build":1590208350, "notes":['notes-sample']}; + // appversionObj = { + // "status":"success", + // "version":"0.4.0", + // "build":1590208350, + // "notes":[ + // "Updated login page design.", + // "Added download guideline in app update process.", + // "Added release notes in update popup.", + // "Fixed issues in PDF viewer (close button and fullscreen)", + // "Fixed issue in Check for Update after reload application.", + // "Removed duplicate wibdow in check for update option, single popup will appear for update option.", + // "Added confirmation popup before starting upgrade.", + // "Handled application crash on force reload.", + // "Fixed Google Login issue.", + // "Improvements in upgrading application." + // ] + // }; + + console.log('[DTU] current build',process.env.currentBuild); + console.log('[DTU] appversionObj.currentBuild > process.env.currentBuild',(appversionObj.currentBuild > parseInt(process.env.currentBuild))); + if(process.env.currentBuild){ + if(appversionObj.build > parseInt(process.env.currentBuild)) { + isBuildUpdate = true; + } + } + console.log('[DTU] current version',process.env.currentVersion); + if(process.env.currentVersion){ + var api_version_split = appversionObj.version.split('.'); + var app_env_curr_ver_split = process.env.currentVersion.split('.'); + console.log('[DTU] check version major ',api_version_split[0]>app_env_curr_ver_split[0]); + console.log('[DTU] check version minor ',api_version_split[1]>app_env_curr_ver_split[1]); + console.log('[DTU] check version patch ',api_version_split[2]>app_env_curr_ver_split[2]); + // check major + if(parseInt(api_version_split[0])>parseInt(app_env_curr_ver_split[0])){ + isVersionUpdate = true; + }else{ + // check minor + if(parseInt(api_version_split[1])>parseInt(app_env_curr_ver_split[1])){ + isVersionUpdate = true; + }else{ + // check patch + if(parseInt(api_version_split[2])>parseInt(app_env_curr_ver_split[2])){ + isVersionUpdate = true; + }else{ + + isVersionUpdate = false; + } + } + } + } + console.log('[DTU] isVersionUpdate: ', isVersionUpdate); + console.log('[DTU] isBuildUpdate: ', isBuildUpdate); + + ipcRendererOnUpdateEvent({ + key: type, + upgrade: isVersionUpdate||isBuildUpdate, + upgradeType: (isVersionUpdate?'version':(isBuildUpdate?'build':'')), + version: appversionObj.version, + build: appversionObj.build, + currentVersion: process.env.currentVersion, + currentBuild: parseInt(process.env.currentBuild), + notes: appversionObj.notes, + status: 200 + }) + + }) + .catch(function(err) { + console.log('[DTU] appversion api err', err); + }); + } } diff --git a/lib/releaseNotes/releaseNotesDesktop.json b/lib/releaseNotes/releaseNotesDesktop.json index 354b6ea43a2cf0f8a05cc4b2aabcf0e7127c7a6d..b924862f06452b7fbf00eac04380991f2a57f1c4 100644 --- a/lib/releaseNotes/releaseNotesDesktop.json +++ b/lib/releaseNotes/releaseNotesDesktop.json @@ -1,9 +1,23 @@ { - "0.3.9": { + "0.4.1": { "content": [ "Stability improvements" ] }, + "0.4.0": { + "content": [ + "Electron Framework updated to latest version 8.0.1", + "Fixed select all keyboard shortcut (command + A) issue in Mac OS", + "Handled mic and camera permission issue on Mac OS", + "Handled black thumbnails in screen share popup on Windows OS", + "Updated spellcheck feature with stable library", + "Fixed cancel button issue in Print dialog of Pdf Viewer", + "Fullscreen and close button issue fixed in Pdf viewer", + "Added single process for upgrading web and native app upgrade", + "Seperated Codebase for native application", + "Fixed screen share and invite link issue for full screenshare dialog" + ] + }, "0.3.8": { "content": [ "Updated login page design.", diff --git a/package-lock.json b/package-lock.json index c15cafe9e3601cc22bc37cf2da6f4b0c17cfe910..7673d29fa6aaf7ee78fc5bafbd3bf4ecd052a45e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6640,7 +6640,8 @@ "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true }, "deep-extend": { "version": "0.5.1", @@ -7859,11 +7860,6 @@ } } }, - "exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -15715,6 +15711,11 @@ "prop-types": "^15.6.0" } }, + "react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, "react-file-drop": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/react-file-drop/-/react-file-drop-0.2.7.tgz", @@ -15749,14 +15750,14 @@ } }, "react-helmet": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.0.tgz", - "integrity": "sha1-qBgR3yExOm1VxfBYxK66XW89l6c=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.0.0.tgz", + "integrity": "sha512-My6S4sa0uHN/IuVUn0HFmasW5xj9clTkB9qmMngscVycQ5vVG51Qp44BEvLJ4lixupTwDlU9qX1/sCrMN4AEPg==", "requires": { - "deep-equal": "^1.0.1", "object-assign": "^4.1.1", - "prop-types": "^15.5.4", - "react-side-effect": "^1.1.0" + "prop-types": "^15.7.2", + "react-fast-compare": "^2.0.4", + "react-side-effect": "^2.1.0" }, "dependencies": { "object-assign": { @@ -16063,13 +16064,9 @@ } }, "react-side-effect": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.5.tgz", - "integrity": "sha512-Z2ZJE4p/jIfvUpiUMRydEVpQRf2f8GMHczT6qLcARmX7QRb28JDBTpnM2g/i5y/p7ZDEXYGHWg0RbhikE+hJRw==", - "requires": { - "exenv": "^1.2.1", - "shallowequal": "^1.0.1" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.0.tgz", + "integrity": "sha512-IgmcegOSi5SNX+2Snh1vqmF0Vg/CbkycU9XZbOHJlZ6kMzTmi3yc254oB1WCkgA7OQtIAoLmcSFuHTc/tlcqXg==" }, "react-test-renderer": { "version": "15.5.4", @@ -17134,11 +17131,6 @@ } } }, - "shallowequal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.0.2.tgz", - "integrity": "sha512-zlVXeVUKvo+HEv1e2KQF/csyeMKx2oHvatQ9l6XjCUj3agvC8XGf6R9HvIPDSmp8FNPvx7b5kaEJTRi7CqxtEw==" - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", diff --git a/package.json b/package.json index d122439fb3eda746815e58e4f84a159a4bc2a764..4cf5ada4761752ff7316aec90f5414aa842e126a 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "react-dom": "^16.9.0", "react-draggable": "^3.0.5", "react-file-drop": "^0.2.7", - "react-helmet": "5.2.0", + "react-helmet": "^6.0.0", "react-i18next": "^11.0.0", "react-input-mask": "^2.0.4", "react-lazyload": "^2.6.5", diff --git a/releases/prod/nynja-app-desktop.yaml b/releases/prod/nynja-app-desktop.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a70feb13d42176a182d26b27e1508ad0dd888a90 --- /dev/null +++ b/releases/prod/nynja-app-desktop.yaml @@ -0,0 +1,34 @@ +apiVersion: flux.weave.works/v1beta1 +kind: HelmRelease +metadata: + name: nynja-app-desktop + namespace: nynja-desktop +spec: + releaseName: nynja-app-desktop + chart: + repository: https://nynjagroup.jfrog.io/nynjagroup/helm/ + name: nynja-app-desktop + version: 0.2.6 + values: + replicaCount: 3 + auth: + basic: + enabled: false + sealedSecret: "" + image: + repository: ${IMAGE_NAME_DESKTOP} + tag: ${IMAGE_BUILD_TAG_DESKTOP} + gateway: + selector: + - api-gateway.default.svc.cluster.local + hosts: + - desktop.nynja.net + - join.nynja.net + wellKnown: + appleAppSiteAssociation: + appId: 9GKQ5AMF2B.com.nynja.mobile.communicator + mqtt: + host: messaging-service.messaging.svc.cluster.local + confcall: + service: calling-service.callconf.svc.cluster.local + historyService: calling-service-history.callconf.svc.cluster.local diff --git a/releases/staging/nynja-app-desktop.yaml b/releases/staging/nynja-app-desktop.yaml index 824cb250ebabe1e502b708e629cf22afad141a9f..c845934a33805f4bb2c1960d74058bd27fd548dc 100644 --- a/releases/staging/nynja-app-desktop.yaml +++ b/releases/staging/nynja-app-desktop.yaml @@ -1,34 +1,34 @@ -apiVersion: flux.weave.works/v1beta1 -kind: HelmRelease -metadata: - name: nynja-app-desktop - namespace: nynja-desktop -spec: - releaseName: nynja-app-desktop - chart: - repository: https://nynjagroup.jfrog.io/nynjagroup/helm/ - name: nynja-app-desktop - version: 0.2.5 - values: - replicaCount: 3 - auth: - basic: - enabled: false - sealedSecret: "" - image: - repository: ${IMAGE_NAME_DESKTOP} - tag: ${IMAGE_BUILD_TAG_DESKTOP} - gateway: - selector: - - api-gateway.default.svc.cluster.local - hosts: - - desktop.staging.nynja.net - - join.staging.nynja.net - wellKnown: - appleAppSiteAssociation: - appId: 9GKQ5AMF2B.com.nynja.rc.mobile.communicator - mqtt: - host: messaging-service.messaging.svc.cluster.local - confcall: - service: calling-service.callconf.svc.cluster.local - historyService: calling-service-history.callconf.svc.cluster.local +apiVersion: flux.weave.works/v1beta1 +kind: HelmRelease +metadata: + name: nynja-app-desktop + namespace: nynja-desktop +spec: + releaseName: nynja-app-desktop + chart: + repository: https://nynjagroup.jfrog.io/nynjagroup/helm/ + name: nynja-app-desktop + version: 0.2.6 + values: + replicaCount: 3 + auth: + basic: + enabled: false + sealedSecret: "" + image: + repository: ${IMAGE_NAME_DESKTOP} + tag: ${IMAGE_BUILD_TAG_DESKTOP} + gateway: + selector: + - api-gateway.default.svc.cluster.local + hosts: + - desktop.staging.nynja.net + - join.staging.nynja.net + wellKnown: + appleAppSiteAssociation: + appId: 9GKQ5AMF2B.com.nynja.rc.mobile.communicator + mqtt: + host: messaging-service.messaging.svc.cluster.local + confcall: + service: calling-service.callconf.svc.cluster.local + historyService: calling-service-history.callconf.svc.cluster.local diff --git a/src/assets/languages/en.json b/src/assets/languages/en.json index 08b4ebf2a1aa9b738b13418af26ddb6ab1164458..35f5069a735732efdcb9d91c4a54ce523f5d9d01 100644 --- a/src/assets/languages/en.json +++ b/src/assets/languages/en.json @@ -1,7 +1,16 @@ { + "historyRemove": { + "p2p": "Do you want to permanently delete the chat history?", + "group": "Do you want to permanently delete the chat history in this group chat?", + "noUndone": "This can not be undone!", + "sure": "ARE YOU SURE?" + }, + "newMessages": "New Messages", "upcomingMeetings": "Upcoming Meetings", "pastMeetings": "Past Meetings", "sheduledMeetings": "Scheduled Meetings", + "startAMeetingNow": "Start a meeting now", + "scheduleAMeeting": "Schedule a meeting", "support": "Help & Support", "helpSupport": { "privacyPolicy": "Privacy Policy", @@ -162,6 +171,7 @@ "unmute": "Unmute microphone", "muteSpeaker": "Toggle Speaker", "noAnswer": "No answer", + "openScreenshareView": "Open screenshare view", "permissionsWarning": "Allow access from the menu above", "permissionsWarningVideo": "Allow camera access from the menu above", "pleaseWaitConfStart": "This conference has not started yet. Please wait for the conference to be started.", @@ -228,7 +238,7 @@ }, "chats": "Messages", "clearHistory": { - "body": "Do you want to clear the chat history?", + "body": "Do you want to delete the chat history, this cannot be undone?", "cancel": "Cancel", "ok": "Clear" }, @@ -269,7 +279,7 @@ "beginning": "From the beginning", "block": "Block User", "cancel": "Cancel", - "clear": "Clear Chat History", + "clear": "Delete Chat History", "con": "Contact", "contact": "Contact", "export": "Export conversation to CSV", @@ -626,7 +636,7 @@ }, "displayClearHistoryModal": { "cancel": "Cancel", - "description": "Do you want to clear all the message history in this group chat? This cannot be undone.", + "description": "Do you want to delete the message history in this group chat? This cannot be undone.", "discard": "Clear History" }, "displayDeleteAndClearHistoryModal": { @@ -780,7 +790,7 @@ "groupOptions": "Group Options", "groupOptionsPanel": { "admins": "Admins", - "clearChatHistory": "Clear Chat History", + "clearChatHistory": "Delete Chat History", "deleteAndLeave": "Leave and Delete", "groupAlias": "My Alias in Group", "groupDescription": "Group Description", @@ -839,6 +849,13 @@ "titleWithoutParticipant": "Start Call Without Participants" }, "helmetTitles": { + "eventHistory": "Event History | NYNJA", + "eventInvite": "Event Invitation | NYNJA", + "createOrLogin": "Login/Create Account | NYNJA", + "createAcc": "Create Account | NYNJA", + "loginNumber": "Phone Number Authentication | NYNJA", + "loginEmail": "Email Authentication | NYNJA", + "codeVerification": "Code Verification | NYNJA", "about": "About | NYNJA", "calendar": "Calendar Config | NYNJA", "callHistoryPageTitle": "Call History | NYNJA", @@ -848,6 +865,7 @@ "dashboard": "Dashboard | NYNJA", "generalSettings": "General Settings | NYNJA", "joinByLink": "Join by Link | NYNJA", + "joinGroupByLink": "Join Group by Link | NYNJA", "notificationsSettings": "Notifications | NYNJA", "profile": "Profile | NYNJA", "scheduled": "Scheduled | NYNJA", @@ -1067,7 +1085,7 @@ "legalDescription": "Perfect for legal topics and other interpretation work typically done by a lawyer or paralegal.", "links": "Link", "listContextMenu": { - "clearHistory": "Clear chat history", + "clearHistory": "Delete Chat History", "delete": "Delete", "exportCsv": "Export to CSV", "leaveGroup": "Leave & Delete", @@ -1177,6 +1195,7 @@ "noPlay": "This file can not be played. You can download it and play it with a player of choice.", "notes": "Release Notes", "notifications": "Notifications", + "noUserSelected": "No user selected!", "numNotAllowed": "NUMBER NOT ALLOWED", "nynja-support": "NYNJA Support", "ok": "Ok", @@ -1404,121 +1423,6 @@ }, "timelineSettings": "Timeline Settings", "timeToShowTimelineUpdates": "Time to show timeline updates", - "timezonesList": { - "Africa/Cairo": "Cairo (GMT+02:00) Africa/Cairo ", - "Africa/Casablanca": "Casablanca (GMT) Africa/Casablanca ", - "Africa/Harare": "Harere (GMT+02:00) Africa/Harare ", - "Africa/Monrovia": "Monrovia (GMT) Africa/Monrovia ", - "Africa/Nairobi": "Nairobi (GMT+03:00) Africa/Nairobi ", - "America/Bogota": "Bogota (GMT-05:00) America/Bogota ", - "America/Buenos_Aires": "Buenos Aires (GMT-03:00) America/Buenos_Aires ", - "America/Caracas": "Caracas (GMT-04:30) America/Caracas ", - "America/Chihuahua": "Chihuahua (GMT-07:00) America/Chihuahua ", - "America/La_Paz": "La_Paz (GMT-04:00) America/La_Paz ", - "America/Lima": "Lima (GMT-05:00) America/Lima ", - "America/Mazatlan": "Mazatlan (GMT-07:00) America/Mazatlan ", - "America/Mexico_City": "Mexico City (GMT-06:00) America/Mexico_City ", - "America/Monterrey": "Monterrey (GMT-06:00) America/Monterrey ", - "America/Pacific": "US (GMT-08:00) America/Pacific ", - "America/Santiago": "Santiago (GMT-04:00) America/Santiago ", - "America/Tijuana": "Tijuana (GMT-08:00) America/Tijuana ", - "Asia/Almaty": "Almaty (GMT+06:00) Asia/Almaty ", - "Asia/Baghdad": "Baghdad (GMT+03:00) Asia/Baghdad ", - "Asia/Baku": "Baku (GMT+04:00) Asia/Baku ", - "Asia/Bangkok": "Bangkok (GMT+07:00) Asia/Bangkok ", - "Asia/Chongqing": "Chongqing (GMT+08:00) Asia/Chongqing ", - "Asia/Dhaka": "Dhaka (GMT+06:00) Asia/Dhaka ", - "Asia/Hong_Kong": "Hong Kong (GMT+08:00) Asia/Hong_Kong ", - "Asia/Irkutsk": "Irkutsk (GMT+09:00) Asia/Irkutsk ", - "Asia/Jakarta": "Jakarta (GMT+07:00) Asia/Jakarta ", - "Asia/Jerusalem": "Jerusalem (GMT+02:00) Asia/Jerusalem ", - "Asia/Kabul": "Kabul (GMT+04:30) Asia/Kabul ", - "Asia/Karachi": "Karachi (GMT+05:00) Asia/Karachi ", - "Asia/Kathmandu": "Kathmandu (GMT+05:45) Asia/Kathmandu ", - "Asia/Kolkata": "Kolkata (GMT+05:30) Asia/Kolkata ", - "Asia/Krasnoyarsk": "Krasnoyarsk (GMT+08:00) Asia/Krasnoyarsk ", - "Asia/Kuala_Lumpur": "Kuala Lumpur (GMT+08:00) Asia/Kuala_Lumpur ", - "Asia/Kuwait": "Kuwait (GMT+03:00) Asia/Kuwait ", - "Asia/Magadan": "Magadan (GMT+12:00) Asia/Magadan ", - "Asia/Muscat": "Muscat (GMT+04:00) Asia/Muscat ", - "Asia/Novosibirsk": "Novosibirsk (GMT+07:00) Asia/Novosibirsk ", - "Asia/Riyadh": "Riyadh (GMT+03:00) Asia/Riyadh ", - "Asia/Seoul": "Seoul (GMT+09:00) Asia/Seoul ", - "Asia/Singapore": "Singapore (GMT+08:00) Asia/Singapore ", - "Asia/Taipei": "Taipei (GMT+08:00) Asia/Taipei ", - "Asia/Tashkent": "Tashkent (GMT+05:00) Asia/Tashkent ", - "Asia/Tbilisi": "Tbilisi (GMT+04:00) Asia/Tbilisi ", - "Asia/Tehran": "Tehran (GMT+03:30) Asia/Tehran ", - "Asia/Tokyo": "Tokyo (GMT+09:00) Asia/Tokyo ", - "Asia/Ulaanbaatar": "Ulaan Bataar (GMT+08:00) Asia/Ulaanbaatar ", - "Asia/Urumqi": "Urumqi (GMT+08:00) Asia/Urumqi ", - "Asia/Vladivostok": "Vladivostok (GMT+11:00) Asia/Vladivostok ", - "Asia/Yakutsk": "Yakutsk (GMT+10:00) Asia/Yakutsk ", - "Asia/Yekaterinburg": "Yekaterinburg (GMT+06:00) Asia/Yekaterinburg ", - "Asia/Yerevan": "Yerevan (GMT+04:00) Asia/Yerevan ", - "Atlantic/Azores": "Azores (GMT-01:00) Atlantic/Azores ", - "Atlantic/Cape_Verde": "Cape Verde Is. (GMT-01:00) Atlantic/Cape_Verde ", - "Atlantic/Stanley": "Stanley (GMT-02:00) Atlantic/Stanley ", - "Australia/Adelaide": "Adelaide (GMT+09:30) Australia/Adelaide ", - "Australia/Brisbane": "Brisbane (GMT+10:00) Australia/Brisbane ", - "Australia/Canberra": "Canberra (GMT+10:00) Australia/Canberra ", - "Australia/Darwin": "Darwin (GMT+09:30) Australia/Darwin ", - "Australia/Hobart": "Hobart (GMT+10:00) Australia/Hobart ", - "Australia/Melbourne": "Melbourne (GMT+10:00) Australia/Melbourne ", - "Australia/Perth": "Perth (GMT+08:00) Australia/Perth ", - "Australia/Sydney": "Sydney (GMT+10:00) Australia/Sydney ", - "Canada/Atlantic": "Atlantic Time (Canada) (GMT-04:00) Canada/Atlantic ", - "Canada/Newfoundland": "Newfoundland (GMT-03:30) Canada/Newfoundland ", - "Canada/Saskatchewan": "Saskatchewan (GMT-06:00) Canada/Saskatchewan ", - "Europe/Amsterdam": "Amsterdam (GMT+01:00) Europe/Amsterdam ", - "Europe/Athens": "Athens (GMT+02:00) Europe/Athens ", - "Europe/Belgrade": "Belgrade (GMT+01:00) Europe/Belgrade ", - "Europe/Berlin": "Berlin (GMT+01:00) Europe/Berlin ", - "Europe/Bratislava": "Bratislava (GMT+01:00) Europe/Bratislava ", - "Europe/Brussels": "Brussels (GMT+01:00) Europe/Brussels ", - "Europe/Bucharest": "Bucharest (GMT+02:00) Europe/Bucharest ", - "Europe/Budapest": "Budapest (GMT+01:00) Europe/Budapest ", - "Europe/Copenhagen": "Copenhagen (GMT+01:00) Europe/Copenhagen ", - "Europe/Dublin": "Dublin (GMT) Europe/Dublin ", - "Europe/Helsinki": "Helsinki (GMT+02:00) Europe/Helsinki ", - "Europe/Istanbul": "Istanbul (GMT+02:00) Europe/Istanbul ", - "Europe/Kiev": "Kiev (GMT+02:00) Europe/Kiev ", - "Europe/Lisbon": "Libson (GMT) Europe/Lisbon ", - "Europe/Ljubljana": "Ljubljana (GMT+01:00) Europe/Ljubljana ", - "Europe/London": "London (GMT) Europe/London ", - "Europe/Madrid": "Madrid (GMT+01:00) Europe/Madrid ", - "Europe/Minsk": "Minsk (GMT+02:00) Europe/Minsk ", - "Europe/Moscow": "Moscow (GMT+04:00) Europe/Moscow ", - "Europe/Paris": "Paris (GMT+01:00) Europe/Paris ", - "Europe/Prague": "Prague (GMT+01:00) Europe/Prague ", - "Europe/Riga": "Riga (GMT+02:00) Europe/Riga ", - "Europe/Rome": "Rome (GMT+01:00) Europe/Rome ", - "Europe/Sarajevo": "Sarajevo (GMT+01:00) Europe/Sarajevo ", - "Europe/Skopje": "Skopje (GMT+01:00) Europe/Skopje ", - "Europe/Sofia": "Sofia (GMT+02:00) Europe/Sofia ", - "Europe/Stockholm": "Stockholm (GMT+01:00) Europe/Stockholm ", - "Europe/Tallinn": "Tallinn (GMT+02:00) Europe/Tallinn ", - "Europe/Vienna": "Vienna (GMT+01:00) Europe/Vienna ", - "Europe/Vilnius": "Vilnius (GMT+02:00) Europe/Vilnius ", - "Europe/Volgograd": "Volgograd (GMT+04:00) Europe/Volgograd ", - "Europe/Warsaw": "Warsaw (GMT+01:00) Europe/Warsaw ", - "Europe/Zagreb": "Zagreb (GMT+01:00) Europe/Zagreb ", - "Greenland": "Greenland (GMT-03:00) Greenland ", - "Pacific/Auckland": "Auckland (GMT+12:00) Pacific/Auckland ", - "Pacific/Fiji": "Fiji (GMT+12:00) Pacific/Fiji ", - "Pacific/Guam": "Guam (GMT+10:00) Pacific/Guam ", - "Pacific/Midway": "Midway Island (GMT-11:00) Pacific/Midway ", - "Pacific/Port_Moresby": "Port Moresby (GMT+10:00) Pacific/Port_Moresby ", - "US/Alaska": "Alaska (GMT-09:00) US/Alaska ", - "US/Arizona": "Arizona (GMT-07:00) US/Arizona ", - "US/Central": "Central Time (US & Canada) (GMT-06:00) US/Central ", - "US/East-Indiana": "Indiana (East) (GMT-05:00) US/East-Indiana ", - "US/Eastern": "Eastern Time (US & Canada) (GMT-05:00) US/Eastern ", - "US/Hawaii": "Hawaii (GMT-10:00) US/Hawaii ", - "US/Mountain": "Mountain Time (US & Canada) (GMT-07:00) US/Mountain ", - "US/Pacific": "Pacific Time (US & Canada) (GMT-08:00) US/Pacific ", - "US/Samoa": "Samoa (GMT-11:00) US/Samoa " - }, "title": "Edit Message", "Today": "Today", "totalPrice": "Total price:", @@ -1679,7 +1583,7 @@ "scheduledTimeZone": "Scheduled Time Zone", "eventTime": "Event Time", "timeSlot": "Time Slots", - "notifyOnUpdate": "Notify participents about event update", + "notifyOnUpdate": "Notify participants about event update", "deleteEventMsg": "Event has been deleted", "cancelEventMsg": "Event has been canceled", "updateInvitationErrorMsg": "Internal server error", diff --git a/src/assets/languages/es.json b/src/assets/languages/es.json index a4885e0ecb35d99abe8a3993f4091798faadbb33..5adc4a793d6a1412fc436642159acec23c077a55 100644 --- a/src/assets/languages/es.json +++ b/src/assets/languages/es.json @@ -138,7 +138,6 @@ }, "chats": "Chats", "clearHistory": { - "body": "¿Quieres borrar el historial del chat?", "cancel": "Cancelar", "ok": "Borrar" }, @@ -178,7 +177,6 @@ "beginning": "Desde el principio", "block": "Bloquear usuario", "cancel": "Cancelar", - "clear": "Borrar historial de chat", "con": "Contacto", "contact": "Contacto", "export": "Exportar conversación a CSV", @@ -288,7 +286,6 @@ }, "displayClearHistoryModal": { "cancel": "Cancelar", - "description": "¿Quieres borrar todo el historial de mensajes en este chat de grupo? Esto no se puede deshacer.", "discard": "Borrar historial" }, "displayDeleteAndClearHistoryModal": { @@ -439,7 +436,6 @@ "groupOptions": "Opciones del grupo", "groupOptionsPanel": { "admins": "Administradores", - "clearChatHistory": "Borrar historial de chat", "deleteAndLeave": "Salir y borrar", "groupAlias": "Mi alias en el grupo", "groupDescription": "Descripción del grupo", @@ -609,7 +605,6 @@ "legalDescription": "Perfecto para temas legales y otros trabajos de interpretación típicamente realizados por un abogado o asistente legal.", "links": "Enlace", "listContextMenu": { - "clearHistory": "Borrar historial de chat", "delete": "Eliminar", "exportCsv": "Exportar a CSV", "leaveGroup": "Salir y borrar", diff --git a/src/assets/languages/ko.json b/src/assets/languages/ko.json index 80950fb4b5c2e3d8e66249df577751d7d9664da1..1e4e55642974ad3292a7188cb7b48f80e0ae0122 100644 --- a/src/assets/languages/ko.json +++ b/src/assets/languages/ko.json @@ -137,7 +137,6 @@ }, "chats": "채팅", "clearHistory": { - "body": "채팅 내역을 삭제하시겠습니까?", "cancel": "취소", "ok": "삭제" }, @@ -177,7 +176,6 @@ "beginning": "시작", "block": "사용자 차단", "cancel": "취소", - "clear": "채팅 내역 삭제", "con": "연락처", "contact": "연락처", "export": "대화를 CSV로 내보내기", @@ -284,7 +282,6 @@ }, "displayClearHistoryModal": { "cancel": "취소", - "description": "이 그룹 채팅에서 모든 메시지 기록을 지우시겠습니까? 취소 할 수 없습니다.", "discard": "기록 삭제" }, "displayDeleteAndClearHistoryModal": { @@ -435,7 +432,6 @@ "groupOptions": "그룹 옵션", "groupOptionsPanel": { "admins": "관리자", - "clearChatHistory": "채팅 내역 삭제", "deleteAndLeave": "삭제하고 떠나기", "groupAlias": "그룹 별칭", "groupDescription": "그룹 설명", @@ -605,7 +601,6 @@ "legalDescription": "변호사나 법률 보조원이 일반적으로 수행하는 법적 주제 및 기타 해석 작업에 적합합니다.", "links": "링크", "listContextMenu": { - "clearHistory": "채팅 내역 삭제", "delete": "삭제", "exportCsv": "CSV로 저장", "leaveGroup": "삭제하고 떠나기", diff --git a/src/assets/languages/zh.json b/src/assets/languages/zh.json index a7fec1588c0f6d6763ad36f674613b73567cff09..c26d1f193529d67877f9e7f4847f19949759fab3 100644 --- a/src/assets/languages/zh.json +++ b/src/assets/languages/zh.json @@ -139,7 +139,6 @@ }, "chats": "聊天", "clearHistory": { - "body": "您想要清除聊天历史吗?", "cancel": "取消", "ok": "清除" }, @@ -179,7 +178,6 @@ "beginning": "从开始", "block": "将用户加入黑名单", "cancel": "取消", - "clear": "清除聊天历史", "con": "联系人", "contact": "联系人", "export": "导出对话至CSV", @@ -289,7 +287,6 @@ }, "displayClearHistoryModal": { "cancel": "取消", - "description": "您想要清除本群聊内的全部信息历史吗?此操作无法撤销。", "discard": "清除历史" }, "displayDeleteAndClearHistoryModal": { @@ -440,7 +437,6 @@ "groupOptions": "群聊选项", "groupOptionsPanel": { "admins": "管理员", - "clearChatHistory": "清除聊天历史", "deleteAndLeave": "离开并删除", "groupAlias": "我的群昵称", "groupDescription": " 群描述", @@ -610,7 +606,6 @@ "legalDescription": "完美适合法律内容的翻译,而且其他口译工作通常是由律师或律师助理完成的。", "links": "链接", "listContextMenu": { - "clearHistory": "清除聊天历史", "delete": "删除", "exportCsv": "导出至CSV", "leaveGroup": "离开并删除", diff --git a/src/componets/AudioVideo/AudioVideo.js b/src/componets/AudioVideo/AudioVideo.js index 9fd45a225efc29caff35eb898d4ec6f4fa307356..14cdac0d72f3b045550eb1f0488b7dc114ef01bd 100644 --- a/src/componets/AudioVideo/AudioVideo.js +++ b/src/componets/AudioVideo/AudioVideo.js @@ -41,6 +41,7 @@ import { isMobile, isTablet } from 'react-device-detect'; import { playSound } from 'Core/managers/soundsManager'; import soundCallingBusySingnal from '../../assets/sounds/calling-busy-signal.mp3'; import { withTranslation } from 'react-i18next'; +import { conversationSelectors } from '../../core/resource/conversations/index'; const styles = theme => (stylesFunc(theme)); @@ -68,6 +69,7 @@ const getUser = (state) => { roomsInfo: audioVideoSelectors.getRoomsInfo(state), minimized: audioVideoSelectors.isMinimized(state), getMemberById: (roomId, phoneId) => roomListSelectors.getMemberByPhoneId(state, roomId, phoneId), + isUnreadInChat: conversationSelectors.getUnreadStatusForCall(state), }), dispatch => ({ actions: bindActionCreators({ openMessageModal: notificationActions.openMessageModal, @@ -164,6 +166,10 @@ class AudioVideo extends Component { this.props.audioVideoActions.endCall( { roomId: this.props.callData.waitingRoom ? this.props.callData.waitingRoom.roomId : this.props.roomToJoin }); } else if (this.props.callData.isAdmin && this.state.callInProgress) { + if (this.state.isInFullscreen) { + this.disableFullScreenMode(); + } + this.setState({ askEnd: true }); } else { this.endCall(false); @@ -211,7 +217,7 @@ class AudioVideo extends Component { }; toggleMute = () => { - if (this.props.callData.muted && !this.props.callData.permissions) { + if (this.props.callData.muted && (this.props.callData.permissions === false)) { this.setState({ permissionsWarning: true }); } else { this.props.audioVideoActions.muteCall( @@ -292,6 +298,9 @@ class AudioVideo extends Component { actions.openMessageModalDuration({ text: t('permissionDeniedForSS'), duration: 2000 }); } else { const isStart = !callData.screenSharing; + if (isStart && this.state.isInFullscreen) { + this.disableFullScreenMode(); + } this.props.audioVideoActions.toggleScreenSharing( { conferenceId: callData.conferenceId, start: isStart, memberToStop } ); @@ -350,15 +359,14 @@ class AudioVideo extends Component { // if (this.props.conferenceToJoin) { // this.props.bindToConference() // } - + const { callData } = this.props; if (prevProps.callData.conferenceId === undefined - && this.props.callData.conferenceId !== undefined - && this.mediaLocal - ) { + && callData.conferenceId !== undefined + && this.mediaLocal) { this.props.audioVideoActions.setMemberMediaFeed({ feedContainer: this.mediaLocal, isLocal: true, - conferenceId: this.props.callData.conferenceId, + conferenceId: callData.conferenceId, }); this.mediaLocal = null; @@ -665,6 +673,9 @@ class AudioVideo extends Component { handleOnInviteByLink = () => { const linkToCopy = this.props.callLinkUrl; if (linkToCopy) { + if (this.state.isInFullscreen) { + this.disableFullScreenMode(); + } this.setState({ inviteCallLinkOpen: true }); this.setState({ inviteCallLink: linkToCopy }); } @@ -727,7 +738,7 @@ class AudioVideo extends Component { } render() { - const { personalData, classes, t, callData, anonymousUser, roomToJoinName, minimized } = this.props; + const { personalData, classes, t, callData, anonymousUser, roomToJoinName, minimized, isUnreadInChat } = this.props; const { isInFullscreen, fullScreenData } = this.state; const { members: membersAll, muted, speakerMuted, isAdmin, video, p2p, screenSharing } = callData; @@ -781,6 +792,9 @@ class AudioVideo extends Component { if (hasRemoteScreenSharing) { maxSteps += 1; } + if (!fullScreenMember && activeMembersStep === maxSteps) { + maxSteps += 1; + } const stepperSteps = Array.from(Array(maxSteps).keys()); const remoteScreenSharing = hasRemoteScreenSharing && activeMembersStep === 0; @@ -809,26 +823,25 @@ class AudioVideo extends Component {
{callState ? callState : ()}
- {callData.activeSpeakers != null && callData.activeSpeakers.length > 0 && !callData.screenSharer && - < div className={classes.infoLineSpeakersRow}> - {callData.activeSpeakers.join(', ')} +
+ {callData.activeSpeakers != null && callData.activeSpeakers.length > 0 && + + {callData.activeSpeakers.join(', ')} -
- } - {callData.screenSharer && -
- {callData.activeSpeakers != null && callData.activeSpeakers.length > 0 && - {callData.activeSpeakers.join(', ')} - - } -
- } - {callData.screenSharer && -
- {callData.screenSharer.displayName} - {t('callInProgress.screenShare')} -
+ } +
+ {callData.screenSharer && +
+ {callData.screenSharer.displayName} + + + {t('callInProgress.openScreenshareView')} + + +
+ }
{isAdmin && callData.screenSharer && @@ -901,7 +914,7 @@ class AudioVideo extends Component { goToChat={this.goToChat} addMembers={this.addMembers} makeFullScreen={this.setFullScreenMember} onInviteByLink={anonymousUser ? null : this.handleOnInviteByLink} chatDisabled={chatDisabled} p2p={callData.p2p} video={video} toggleScreenShare={this.toggleScreenShare} t={t} screenSharing={screenSharing} - connected={!callState} muteUnmuteMember={this.muteUnmuteMember} + connected={!callState} muteUnmuteMember={this.muteUnmuteMember} isUnreadInChat={isUnreadInChat} />
{!fullScreenMember && !callData.p2p && !isMobile && !isTablet && @@ -944,7 +957,7 @@ class AudioVideo extends Component { } @@ -1034,11 +1047,13 @@ class AudioVideo extends Component { btnMainText={t('copyLinkDialog.copy')} btnSecText={t('copyLinkDialog.close')} onClose={() => this.copyInviteCallLinkConfirm(false)} onBtnMainClick={() => this.copyInviteCallLinkConfirm(true)} onBtnSecClick={() => this.copyInviteCallLinkConfirm(false)} /> + {!!this.state.permissionsWarning && this.setState({ permissionsWarning: false })} - onBtnMainClick={() => this.setState({ permissionsWarning: false })} /> + text={t('callInProgress.warningPermissionsDenied')} + btnMainText={t('ok')} + onClose={() => this.setState({ permissionsWarning: false })} + onBtnMainClick={() => this.setState({ permissionsWarning: false })} /> + } + connected={!callState} isUnreadInChat={isUnreadInChat} /> } diff --git a/src/componets/AudioVideo/AudioVideo.styles.js b/src/componets/AudioVideo/AudioVideo.styles.js index e46b407522fea84af5d5a75d0316de3ae9d6cb4f..75e2e66c6b133eb5e02580e075a4c02eef186190 100644 --- a/src/componets/AudioVideo/AudioVideo.styles.js +++ b/src/componets/AudioVideo/AudioVideo.styles.js @@ -133,28 +133,33 @@ export default theme => ({ }, infoLineSpeakersRow: { display: 'flex', - height: 20, + height: 25, alignItems: 'center' }, infoSpeakerNames: { color: theme.palette.themeColors.audioVideo.infoLineSpeakersColor, display: 'flex', overflow: 'hidden', - textOverflow: 'ellipsis' + textOverflow: 'ellipsis', + alignItems: 'center' }, infoScreenSharer: { color: theme.palette.themeColors.audioVideo.infoLineLeftTimeColor, display: 'flex', overflow: 'hidden', - textOverflow: 'ellipsis' + textOverflow: 'ellipsis', + fontSize: 15, }, speakerIcon: { color: theme.palette.themeColors.audioVideo.infoLineSpeakersColor, paddingLeft: 8, paddingTop: 2 }, + screenShareButton: { + padding: 6, + marginLeft: 2 + }, screenSharingIcon: { - paddingLeft: 8, width: 24 }, bottomLine: { diff --git a/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.js b/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.js index b0d9ea62ad84e5351a4e1ed5a0bd3888ebe1b287..857e7638def977fd3cbdc3713fb5dc30f9cd4942 100644 --- a/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.js +++ b/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.js @@ -53,7 +53,7 @@ class AudioVideoControls extends Component { }; render() { - const { classes, isAdmin, muted, t, speakerMuted, cointainerRef = null, + const { classes, isAdmin, muted, t, speakerMuted, cointainerRef = null, isUnreadInChat, minimized, chatDisabled, p2p, video, screenSharing, toggleSpeakerMute, connected } = this.props; const showAddMembers = isAdmin || p2p || !chatDisabled; @@ -131,6 +131,9 @@ class AudioVideoControls extends Component { className={`${!chatDisabled ? '' : classes.disabled} ${!chatDisabled ? '' : classes.hidden}`} disabled={chatDisabled} aria-label={t('callInProgress.goToChat')}> + {isUnreadInChat && +
+ }
@@ -208,6 +211,7 @@ AudioVideoControls.propTypes = { onInviteByLink: PropTypes.func, t: PropTypes.func.isRequired, connected: PropTypes.bool, + isUnreadInChat: PropTypes.bool, }; export default withStyles(styles)(AudioVideoControls); diff --git a/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.styles.js b/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.styles.js index 9337e871e3491b2c07c3833fc980527b7e3b9246..e9004695f81fb2159040e82dc037dfc53e611d91 100644 --- a/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.styles.js +++ b/src/componets/AudioVideo/AudioVideoControls/AudioVideoControls.styles.js @@ -68,5 +68,14 @@ export default theme => ({ tooltip: { color: theme.palette.themeColors.tooltip.color, background: theme.palette.themeColors.tooltip.background, - } + }, + unreadIndicator: { + position: 'absolute', + top: 5, + right: 7, + width: 13, + height: 13, + borderRadius: '50%', + background: theme.palette.themeColors.conversations.notifBulletBackground, + }, }) diff --git a/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.js b/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.js index 67ceb93a2920eaa1f3e3487f6ab7a6efdbad2b3e..bc563a583690876c3f6e0a416912d03cf4e2806d 100644 --- a/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.js +++ b/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.js @@ -126,6 +126,7 @@ class AudioVideoFullScreenView extends Component {
{this.renderControls()} {this.renderFeeds()} + {this.renderActiveSpeekers()}
) @@ -139,6 +140,7 @@ class AudioVideoFullScreenView extends Component {
{this.renderControls()} {this.renderFeeds()} + {this.renderActiveSpeekers()}
@@ -177,6 +179,27 @@ class AudioVideoFullScreenView extends Component { ); } + renderActiveSpeekers = () => { + const { classes, callData } = this.props; + const { activeSpeakers, p2p } = callData; + const talking = activeSpeakers ? activeSpeakers.join(', ') : ''; + + if (!p2p) { + return ( + +
+
+ + {talking} +
+
+
+ ); + } + + return null; + } + render() { const { fullScreenData } = this.props; const { isVideo, isScreenSharing } = fullScreenData; diff --git a/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.styles.js b/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.styles.js index a0e2ce5c8ca2c885850a46b23bb05827e891f31b..63feb94b9eb229af6d54b707c1c508ff2d0f1478 100644 --- a/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.styles.js +++ b/src/componets/AudioVideo/AudioVideoFullScreenView/AudioVideoFullScreenView.styles.js @@ -39,4 +39,25 @@ export default theme => ({ right: 49, zIndex: 2147483647, }, + speakersWrapp: { + position: 'absolute', + top: 100, + right: 100, + zIndex: 2147483647, + background: theme.palette.themeColors.audioVideo.audioVideoMember.memberName.background, + opacity: 0.8, + cursor: 'pointer', + }, + infoSpeakerNames: { + color: theme.palette.themeColors.audioVideo.infoLineSpeakersColor, + display: 'flex', + overflow: 'hidden', + textOverflow: 'ellipsis', + alignItems: 'center', + padding: '4px 10px', + }, + speakerIcon: { + color: theme.palette.themeColors.audioVideo.infoLineSpeakersColor, + paddingRight: 8, + }, }); diff --git a/src/componets/AudioVideo/AudioVideoJoinBanner/AudioVideoJoinBanner.js b/src/componets/AudioVideo/AudioVideoJoinBanner/AudioVideoJoinBanner.js index 270f7c14b6068757721e61690fc31d0a38e77dba..051bb6a2b558f1ea3b8f7edbc396e93f72a43938 100644 --- a/src/componets/AudioVideo/AudioVideoJoinBanner/AudioVideoJoinBanner.js +++ b/src/componets/AudioVideo/AudioVideoJoinBanner/AudioVideoJoinBanner.js @@ -69,10 +69,12 @@ class AudioVideoJoinBanner extends Component { + {!!this.state.ask && this.setState({ ask: false })} onBtnMainClick={this.handleAccept} - onBtnSecClick={() => this.setState({ ask: false })} /> + btnMainText={t('callJoinBanner.yes')} btnSecText={t('callJoinBanner.no')} + onClose={() => this.setState({ask: false})} onBtnMainClick={this.handleAccept} + onBtnSecClick={() => this.setState({ask: false})}/> + } ) } diff --git a/src/componets/AudioVideo/AudioVideoMember/AudioVideoMember.styles.js b/src/componets/AudioVideo/AudioVideoMember/AudioVideoMember.styles.js index 3e2ede5a7fa5548461989424dc306bb00b50e1ae..9ae165d34a1d35782d339b965f782399c6619c81 100644 --- a/src/componets/AudioVideo/AudioVideoMember/AudioVideoMember.styles.js +++ b/src/componets/AudioVideo/AudioVideoMember/AudioVideoMember.styles.js @@ -51,7 +51,7 @@ export default theme => ({ left: 0, bottom: 0, lineHeight: '17px', - fontSize: '14px', + fontSize: 15, position: 'absolute', background: theme.palette.themeColors.audioVideo.audioVideoMember.memberName.background, color: theme.palette.themeColors.audioVideo.audioVideoMember.memberName.color, @@ -83,14 +83,12 @@ export default theme => ({ padding: '0px !important', }, memberNameMuteStatus: { - width: 14, height: 16, marginLeft: 5, display: 'inline', verticalAlign: 'bottom' }, memberNameScreenShareStatus: { - width: 16, height: 16, marginLeft: 5, display: 'inline', diff --git a/src/componets/ContactComponents/ContactItem/ContactItem.js b/src/componets/ContactComponents/ContactItem/ContactItem.js index b3c3a8bc6a513b837a401f087d221f26b4d7f313..236b31b192d157032b18cc37cbd9eab91a64bdab 100644 --- a/src/componets/ContactComponents/ContactItem/ContactItem.js +++ b/src/componets/ContactComponents/ContactItem/ContactItem.js @@ -80,7 +80,7 @@ class ContactItem extends Component { const note = notes ? notes.value ? notes.value : '' : ''; let userOnlineStatus = false; const shouldShowStatus = contactsData.status && Object.keys(contactsData.status).length > 0 ? - !contactsData.status.is_authorized && !contactsData.status.is_requested + !contactsData.status.is_authorized && !contactsData.status.is_requested && !contactsData.status.is_ignored : false; if (contactsData.status) { diff --git a/src/componets/ContextMenu/ChatsListContextMenu/ChatsListContextMenu.js b/src/componets/ContextMenu/ChatsListContextMenu/ChatsListContextMenu.js index 09bc2bcedd2b5c3ac7630c194fb7bfc42d996fb8..2b39b1eb5e72b116e705be4e708d2f4ed67076fb 100644 --- a/src/componets/ContextMenu/ChatsListContextMenu/ChatsListContextMenu.js +++ b/src/componets/ContextMenu/ChatsListContextMenu/ChatsListContextMenu.js @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; import { GenericContextMenu, Modal } from '../../index'; -import { ContactClearChatHistoryModal } from '../../Modals/ContactModals/index'; +import { ClearChatHistoryModal } from '../../Modals/index'; import RouteModes from '../../../assets/helpers/modes'; import { constructGroupLink, copyTextToClipboard } from '../../../core/resource/messages/utils/commonFunctions'; @@ -533,7 +533,7 @@ const ChatsListContextMenu = (props) => { } {/* Clear Chat History Modal */} {openClearChatHistoryModal && - setState({ ...state, diff --git a/src/componets/CreateGroupSlide/CreateGroupSlide.js b/src/componets/CreateGroupSlide/CreateGroupSlide.js index 5b13e46703377cdcb5a1a3811612b32471bbbfe8..2797ef0d377968c9fa27817078ca35831a3d157d 100644 --- a/src/componets/CreateGroupSlide/CreateGroupSlide.js +++ b/src/componets/CreateGroupSlide/CreateGroupSlide.js @@ -141,7 +141,6 @@ class CreateGroupSlide extends Component {
stylesFunc(theme); @@ -300,7 +302,7 @@ class GroupCallEdit extends Component { }; render() { - const { classes, t, roomId, isEdit, members, replaceCall } = this.props; + const { classes, t, roomId, isEdit, members, replaceCall, theme } = this.props; const { membersToAdd, searchedName, filteredContacts, hoveredMember, notifyMembersLimit, membersCountLimit } = this.state; const selectedMembersAmount = Object.keys(membersToAdd).length; const membersLength = members ? Object.keys(members).length : 0; @@ -362,26 +364,33 @@ class GroupCallEdit extends Component { selectMember={this.selectMember} selectedMembers={membersToAdd} filter={searchedName} />
-

- {`${selectedMembersAmount} ${selectedMembersAmount !== 1 - ? t('selectedMembers.membersSelected') - : t('selectedMembers.memberSelected')}` - } -

-
- {Object.keys(membersToAdd).map(key => ( - } - label={membersToAdd[key].alias || `${membersToAdd[key].names} ${membersToAdd[key].surnames}`} - onDelete={hoveredMember === key ? () => this.deSelectMember(key) : null} - deleteIcon={} - onMouseEnter={() => this.setState({ hoveredMember: key })} - onMouseLeave={() => this.setState({ hoveredMember: null })} - />)) - } -
+ renderThumbScrollbarWithColor(props, theme.palette.themeColors.colors.scrollColor)} + renderView={renderViewScrollbarAndHideDefault} + renderTrackVertical={renderTrackVertical} + renderTrackHorizontal={() =>
} + renderThumbHorizontal={() =>
}> +

+ {`${selectedMembersAmount} ${selectedMembersAmount !== 1 + ? t('selectedMembers.membersSelected') + : t('selectedMembers.memberSelected')}` + } +

+
+ {Object.keys(membersToAdd).map(key => ( + } + label={membersToAdd[key].alias || `${membersToAdd[key].names} ${membersToAdd[key].surnames}`} + onDelete={hoveredMember === key ? () => this.deSelectMember(key) : null} + deleteIcon={} + onMouseEnter={() => this.setState({ hoveredMember: key })} + onMouseLeave={() => this.setState({ hoveredMember: null })} + />)) + } +
+
@@ -401,4 +410,4 @@ GroupCallEdit.propTypes = { userDisplayName: PropTypes.string, }; -export default withStyles(styles)(withRouter(GroupCallEdit)); +export default withStyles(styles, { withTheme: true })(withRouter(GroupCallEdit)); diff --git a/src/componets/GroupCallEdit/GroupCallEdit.styles.js b/src/componets/GroupCallEdit/GroupCallEdit.styles.js index 235f02fcb43107ea0ba7455a1c4ac7f807c19976..a98d7f4c0531810bc761c7fd3e4f619e5efcadf0 100644 --- a/src/componets/GroupCallEdit/GroupCallEdit.styles.js +++ b/src/componets/GroupCallEdit/GroupCallEdit.styles.js @@ -62,6 +62,21 @@ export default (theme) => ({ mainRight: { flex: '2', backgroundColor: theme.palette.themeColors.groupCallEdit.selectedBackground, + '& .box': { + overflowX: 'hidden !important', + overflowY: 'auto !important' + }, + '& *::-webkit-scrollbar': { + WebkitAppearance: 'none', + width: 10, + }, + '& *::-webkit-scrollbar-thumb': { + borderRadius: 10, + backgroundColor: theme.palette.themeColors.colors.scrollColor, + width: 10, + minHeight: 200, + boxShadow: 'none', + }, }, amountLabel: { fontSize: '0.9rem', @@ -89,6 +104,14 @@ export default (theme) => ({ height: 24, border: '1px solid ' + theme.palette.themeColors.colors.border14, }, + chipLabel: { + color: theme.palette.themeColors.colors.text14, + textOverflow: 'ellipsis', + maxWidth: 220, + overflow: 'hidden', + whiteSpace: 'nowrap', + display: 'block', + }, chipClose: { color: theme.palette.themeColors.colors.text14, width: 16, diff --git a/src/componets/Modals/ClearChatHistoryModal/ClearChatHistoryModal.js b/src/componets/Modals/ClearChatHistoryModal/ClearChatHistoryModal.js new file mode 100644 index 0000000000000000000000000000000000000000..20869caa0cc831e6763df6469e684a639d67542f --- /dev/null +++ b/src/componets/Modals/ClearChatHistoryModal/ClearChatHistoryModal.js @@ -0,0 +1,84 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import Modal from 'react-responsive-modal'; +import { withStyles } from '@material-ui/styles'; +import stylesFunc from './ClearChatHistoryModal.styles'; +import shurikenLogo from '../../../assets/img/shuriken_logo.svg'; + +const styles = theme => (stylesFunc(theme)); + +const ClearChatHistoryModal = (props) => { + const [state, setState] = useState({ showSecondaryModal: false }); + const { showSecondaryModal } = state; + const { classes, open, onCloseClearChatHistoryModal, onConfirmClearChatHistoryModal, t } = props; + + const enableSecondaryModal = () => { + setState({ showSecondaryModal: true }); + }; + + const renderMainModal = () => { + return ( + {console.log('[EBASI-BE]'); onCloseClearChatHistoryModal()}}> + +
+

{t('historyRemove.p2p')}

+

{t('historyRemove.noUndone')}

+
+
+ + +
+
+ ) + }; + + const renderSecondaryModal = () => { + return ( + + +
+

{t('historyRemove.sure')}

+
+
+ + +
+
+ ); + }; + + if (showSecondaryModal && open) { + return renderSecondaryModal(); + } else if (!showSecondaryModal && open) { + return renderMainModal(); + } + + return null; +}; + +ClearChatHistoryModal.propTypes = { + classes: PropTypes.object.isRequired, + open: PropTypes.bool.isRequired, + t: PropTypes.func.isRequired, + onConfirmClearChatHistoryModal: PropTypes.func.isRequired, + onCloseClearChatHistoryModal: PropTypes.func.isRequired, + isGroup: PropTypes.bool.isRequired, +}; + +export default withStyles(styles)(ClearChatHistoryModal); diff --git a/src/componets/Modals/ContactModals/ContactClearChatHistoryModal/ContactClearChatHistoryModal.styles.js b/src/componets/Modals/ClearChatHistoryModal/ClearChatHistoryModal.styles.js similarity index 95% rename from src/componets/Modals/ContactModals/ContactClearChatHistoryModal/ContactClearChatHistoryModal.styles.js rename to src/componets/Modals/ClearChatHistoryModal/ClearChatHistoryModal.styles.js index 3903dba065edc08483a0ef462a1e34fe60d7d048..57f83446e742149933b27912951a3c94a11dba35 100644 --- a/src/componets/Modals/ContactModals/ContactClearChatHistoryModal/ContactClearChatHistoryModal.styles.js +++ b/src/componets/Modals/ClearChatHistoryModal/ClearChatHistoryModal.styles.js @@ -21,9 +21,9 @@ export default theme => ({ }, dscrBox: { display: 'inline-block', - marginTop: 10, maxWidth: 'calc(100% - 100px)', - verticalAlign: 'top' + verticalAlign: 'top', + margin: '10px, 0px', }, dscr: { fontSize: 14, diff --git a/src/componets/Modals/ContactModals/ContactClearChatHistoryModal/ContactClearChatHistoryModal.js b/src/componets/Modals/ContactModals/ContactClearChatHistoryModal/ContactClearChatHistoryModal.js deleted file mode 100644 index 09b5d745c9a44975899a53c4d56f68fbabcc1d1c..0000000000000000000000000000000000000000 --- a/src/componets/Modals/ContactModals/ContactClearChatHistoryModal/ContactClearChatHistoryModal.js +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import Modal from 'react-responsive-modal'; -import { withStyles } from '@material-ui/styles'; -import stylesFunc from './ContactClearChatHistoryModal.styles'; -import shurikenLogo from '../../../../assets/img/shuriken_logo.svg'; - -const styles = theme => (stylesFunc(theme)); - -const ContactClearChatHistoryModal = (props) => { - const { classes, open, onCloseClearChatHistoryModal, onConfirmClearChatHistoryModal, t } = props; - - return ( - { onCloseClearChatHistoryModal(); }}> - -
-

{t('clearHistory.body')}

-
-
- - -
-
- ); -}; - -ContactClearChatHistoryModal.propTypes = { - classes: PropTypes.object.isRequired -}; - -export default withStyles(styles)(ContactClearChatHistoryModal); diff --git a/src/componets/Modals/ContactModals/index.js b/src/componets/Modals/ContactModals/index.js index 39f3c0de745d81e3fbbd4bccf5b8baf4941c69f0..b91895eb13ddaa664c1ddd2d19026c5f205654df 100644 --- a/src/componets/Modals/ContactModals/index.js +++ b/src/componets/Modals/ContactModals/index.js @@ -1,7 +1,5 @@ import ContactBlockUserModal from './ContactBlockUserModal/ContactBlockUserModal'; -import ContactClearChatHistoryModal from './ContactClearChatHistoryModal/ContactClearChatHistoryModal'; export { ContactBlockUserModal, - ContactClearChatHistoryModal, }; \ No newline at end of file diff --git a/src/componets/Modals/index.js b/src/componets/Modals/index.js index 2b14ea7b40be23b7cce5c99954eae55aad3b6084..25171d79c17929ef8182e511e1cd63a503426722 100644 --- a/src/componets/Modals/index.js +++ b/src/componets/Modals/index.js @@ -7,6 +7,7 @@ import LocationUpload from './UploadModals/LocationUpload/LocationUpload'; import FileUpload from './UploadModals/FileUpload/FileUpload'; import MediaMultipleUpload from './UploadModals/MediaMultipleUpload/MediaMultipleUpload'; import LiveShareLocationModal from './LiveShareLocationModal/LiveShareLocationModal'; +import ClearChatHistoryModal from './ClearChatHistoryModal/ClearChatHistoryModal'; export { ChatDeleteModal, @@ -18,4 +19,5 @@ export { FileUpload, MediaMultipleUpload, LiveShareLocationModal, + ClearChatHistoryModal, }; diff --git a/src/componets/NynjaHelmet/NynjaHelmet.js b/src/componets/NynjaHelmet/NynjaHelmet.js new file mode 100644 index 0000000000000000000000000000000000000000..cbc2ab536642822f386923e19c098f4755a51519 --- /dev/null +++ b/src/componets/NynjaHelmet/NynjaHelmet.js @@ -0,0 +1,90 @@ +import React from 'react'; +import PropTypes from 'prop-types' +import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; +import { Helmet } from 'react-helmet'; +import { roomListSelectors } from '../../core/resource/roomlist/index'; +import { p2pSelectors } from '../../core/resource/messages/personal/index'; + +const NynjaHelmet = React.memo((props) => { + const { title, unreadCountP2P, unreadCountGroups, unreadCountMentions } = props; + const unreadTotal = unreadCountP2P + unreadCountMentions; + let titlePrefix = ''; + let iconPrefix = ''; + + if (unreadCountMentions > 0) { + titlePrefix = `(${unreadTotal}) `; + iconPrefix = 'mention'; + } else if (unreadTotal > 0) { + titlePrefix = `(${unreadTotal}) `; + iconPrefix = 'unread'; + } else if (unreadCountGroups > 0) { + titlePrefix = '( * ) '; + iconPrefix = 'unread-gr'; + } + + const renderTitle = () => { + return ( + + {`${titlePrefix}${title}`} + + ); + }; + + const renderFavIcon = () => { + const path = `/favicon${iconPrefix ? `-${iconPrefix}` : ''}.ico`; + return ( + + ); + }; + + const renderFav16Px = () => { + const path = `/favicon-${iconPrefix}-16x16.png`; + return ( + + ); + }; + + const renderFav32Px = () => { + const path = `/favicon-${iconPrefix}-32x32.png`; + return ( + + ); + }; + + return ( + + {renderTitle()} + {renderFavIcon()} + {renderFav16Px()} + {renderFav32Px()} + + ); +}); + +NynjaHelmet.propTypes = { + title: PropTypes.string.isRequired, + unreadCountP2P: PropTypes.number.isRequired, + unreadCountGroups: PropTypes.number.isRequired, + unreadCountMentions: PropTypes.number.isRequired, +}; + +const makeHelmetSelector = () => createSelector( + state => p2pSelectors.getTotalUnreadCount(state), + state => roomListSelectors.getTotalUnreadCountGroups(state), + state => roomListSelectors.getTotalUnreadMentionsCount(state), + (unreadCountP2P, unreadCountGroups, unreadCountMentions) => { + return { + unreadCountP2P, + unreadCountGroups, + unreadCountMentions, + }; + }, +); + +const mapStateToProps = () => { + const helmetSelector = makeHelmetSelector(); + return (state) => helmetSelector(state); +}; + +export default connect(mapStateToProps, null)(NynjaHelmet); diff --git a/src/componets/SignupEventComponents/SignupEventHistory/SignupEventHistoryRightPanel/SignupEventHistoryRightPanel.js b/src/componets/SignupEventComponents/SignupEventHistory/SignupEventHistoryRightPanel/SignupEventHistoryRightPanel.js index a7805e566131214cdd4b540185c58063566ee56a..49af1c47c8f7c9590ac036a49503efbaf76b0d26 100644 --- a/src/componets/SignupEventComponents/SignupEventHistory/SignupEventHistoryRightPanel/SignupEventHistoryRightPanel.js +++ b/src/componets/SignupEventComponents/SignupEventHistory/SignupEventHistoryRightPanel/SignupEventHistoryRightPanel.js @@ -44,7 +44,7 @@ class SignupEventHistoryRightPanel extends React.Component { } - renderParticipants = (classes, t, event, accountsData) => { + renderParticipants = (classes, t, event, accountsData, groups) => { if (event.participantList) { const participants = event.participantList.participantList; @@ -67,18 +67,21 @@ class SignupEventHistoryRightPanel extends React.Component {
  • - {participant.userType === 0 ? + {participant.userType === 0 || participant.userType === 3 ? : }
    + {participant.userType === 3 && + {groups[participant.participantId].names} + } {(participant.userType === 0 && accountsList.length > 0) && {this.getParticipantName(accountsList, participant.participantId)} } - {participant.userType !== 0 && + {(participant.userType !== 0 && participant.userType !== 3) && {participant.participantId} }
    @@ -112,7 +115,7 @@ class SignupEventHistoryRightPanel extends React.Component { } - renderResParticipants = (classes, t, event, accountsData, eventSlotDetail) => { + renderResParticipants = (classes, t, event, accountsData, eventSlotDetail, groups) => { if (event.participantsResponseList) { const participants = event.participantsResponseList.participantsResponseList; @@ -133,14 +136,19 @@ class SignupEventHistoryRightPanel extends React.Component {
  • - {participant.userType === 0 ? + {participant.userType === 0 || participant.userType === 3 ? : }
    - {(participant.participantId !== "" && accountsList.length > 0) && + + {participant.userType === 3 && + {groups[participant.participantId].names} + } + + {(participant.participantId !== "" && participant.userType !== 3 && accountsList.length > 0) && {this.getParticipantName(accountsList, participant.participantId)} } @@ -261,7 +269,7 @@ class SignupEventHistoryRightPanel extends React.Component { } render() { - const { classes, t, currentEventProfile, accountsDetailList } = this.props; + const { classes, t, currentEventProfile, accountsDetailList, groups } = this.props; const { isShowParticipants, isShowResParticipants, isShowSlotDetail, eventSlotDetail } = this.props.state; @@ -270,10 +278,10 @@ class SignupEventHistoryRightPanel extends React.Component { console.log(""); if (isShowParticipants) { - return this.renderParticipants(classes, t, currentEventProfile, accountsDetailList); + return this.renderParticipants(classes, t, currentEventProfile, accountsDetailList, groups); } else if (isShowResParticipants) { - return this.renderResParticipants(classes, t, currentEventProfile, accountsDetailList, eventSlotDetail); + return this.renderResParticipants(classes, t, currentEventProfile, accountsDetailList, eventSlotDetail, groups); } else if (isShowSlotDetail) { return this.renderSlot(classes, t, currentEventProfile); diff --git a/src/componets/Urlify/Urlify.js b/src/componets/Urlify/Urlify.js index d7b5d17342015f98b4d1313f9aace7aa4ac8001c..7d4cc46e03b5bb8dca3e60c5f811fc7b11142a6a 100644 --- a/src/componets/Urlify/Urlify.js +++ b/src/componets/Urlify/Urlify.js @@ -59,15 +59,20 @@ class Urlify extends Component { class Mention extends Tag { toReact() { + const alias = this.getContent(true); const attributes = { pathname: `/contacts/${this.params.accountId}`, + state: { + id: this.params.accountId, + alias, + } }; if (noLinkPersistent) { - return `@${this.getContent(true)}`; + return `@${alias}`; } - return @{this.getContent(true)}; + return @{alias}; } } diff --git a/src/componets/index.js b/src/componets/index.js index 7fbd73b2cc5f270e2aed1bc6d7671628ce6b57ea..7f350921fecb5425ce18616885bdc623a7954897 100644 --- a/src/componets/index.js +++ b/src/componets/index.js @@ -46,6 +46,7 @@ import SymbolsCounter from './SymbolsCounter/SymbolsCounter'; import LiveShareLocationMap from './LiveShareLocationMap/LiveShareLocationMap'; import ScheduledMeetingsList from './ScheduledMeetingsList/ScheduledMeetingsList'; import ChatsListContextMenu from './ContextMenu/ChatsListContextMenu/ChatsListContextMenu'; +import NynjaHelmet from './NynjaHelmet/NynjaHelmet'; export { AudioVideo, @@ -96,4 +97,5 @@ export { LiveShareLocationMap, ScheduledMeetingsList, ChatsListContextMenu, + NynjaHelmet, }; diff --git a/src/containers/ActionMenu/ActionMenu.js b/src/containers/ActionMenu/ActionMenu.js index a302d0dcc473128f38e1555c4ae5ec9483efc25d..eb514591fee60c3d548bfe576f2be6a07b61fbc5 100644 --- a/src/containers/ActionMenu/ActionMenu.js +++ b/src/containers/ActionMenu/ActionMenu.js @@ -64,6 +64,7 @@ class LeftMenu extends Component { openCalendarModal: false, openInvite: false, }; + this.scrollBarRef = React.createRef(); } renderMyselfChat = () => { @@ -148,6 +149,14 @@ class LeftMenu extends Component { } }; + handleChange = (panel, isExpanded) => { + if(panel === 'settings' && isExpanded){ + setTimeout(() => { + this.scrollBarRef.current.scrollToBottom(); + }, 340); + } + } + render() { const { classes, t, profile, userPhoneId, concierge, callData, requestsCount, theme } = this.props; const { openConciergeModal, openCalendarModal, openInvite } = this.state; @@ -155,6 +164,7 @@ class LeftMenu extends Component { return (
    renderThumbScrollbarWithColor(props, theme.palette.themeColors.colors.scrollColor)} renderView={renderViewScrollbar} renderTrackVertical={renderTrackVertical} @@ -178,16 +188,20 @@ class LeftMenu extends Component { to={`/chats/${userPhoneId}`} action={this.renderMyselfChat} /> - + {/**/} + + + + - {/**/} - {/* */} - {/* */} - {/* */} - {/**/} + + + + + @@ -239,7 +253,7 @@ class LeftMenu extends Component { - + diff --git a/src/containers/ActionsList/ActionsList.js b/src/containers/ActionsList/ActionsList.js index c03ac618e66667bd508800a21a6d3bfcc496360e..c64343692b9bc53366c578c0896eeeada34056c0 100644 --- a/src/containers/ActionsList/ActionsList.js +++ b/src/containers/ActionsList/ActionsList.js @@ -11,12 +11,18 @@ const ExpandIcon = () => { }; const ActionsList = (props) => { - const { classes, title, icon, children, subItem, t, isEnabled, expanded, requestsCount } = props; + const { classes, title, icon, children, subItem, t, isEnabled, expanded, requestsCount, redIcon } = props; const labelStyle = subItem ? classes.menuSubItem : null; const iconStyle = subItem ? classes.itemIcon : classes.menuIcon; + const handleOnChange = (panel) => (event, isExpanded) => { + if (props.handleChange){ + props.handleChange(panel, isExpanded) + } + } + return ( - + { expandIcon={} >