Video chat application is started

This commit is contained in:
venbatechnologies@gmail.com 2020-05-07 17:18:31 +05:30
parent 4ea478f042
commit b7faee5618
18 changed files with 1041 additions and 38 deletions

View File

@ -1551,7 +1551,6 @@
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"dev": true,
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
@ -1590,8 +1589,7 @@
"after": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
"dev": true
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
},
"agent-base": {
"version": "4.3.0",
@ -1938,6 +1936,11 @@
"resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
"integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
},
"async-limiter": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@ -2151,8 +2154,7 @@
"backo2": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
"integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
"dev": true
"integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
},
"balanced-match": {
"version": "1.0.0",
@ -2217,8 +2219,7 @@
"base64-arraybuffer": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
"integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
"dev": true
"integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
},
"base64-js": {
"version": "1.3.1",
@ -2249,7 +2250,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
"integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
"dev": true,
"requires": {
"callsite": "1.0.0"
}
@ -2642,8 +2642,7 @@
"callsite": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
"dev": true
"integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
},
"callsites": {
"version": "2.0.0",
@ -2975,8 +2974,7 @@
"component-bind": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
"dev": true
"integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
},
"component-emitter": {
"version": "1.3.0",
@ -2987,8 +2985,7 @@
"component-inherit": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
"dev": true
"integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
},
"compressible": {
"version": "2.0.18",
@ -6342,11 +6339,25 @@
}
}
},
"has-binary2": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
"integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
"requires": {
"isarray": "2.0.1"
},
"dependencies": {
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
}
}
},
"has-cors": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
"dev": true
"integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
},
"has-flag": {
"version": "3.0.0",
@ -6758,8 +6769,7 @@
"indexof": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
"dev": true
"integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
},
"inflight": {
"version": "1.0.6",
@ -8552,8 +8562,7 @@
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
"dev": true
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"neo-async": {
"version": "2.6.1",
@ -8651,6 +8660,213 @@
}
}
},
"ngx-socket-io": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ngx-socket-io/-/ngx-socket-io-3.0.1.tgz",
"integrity": "sha512-6+99AULDEcdrsFSd9FVo5mUSpQMa2KL6twPbteoEv3qWO0Hh2kdrzTjvPdsC2jeTuEuqa8R9l5/3eGYdiLZyWQ==",
"requires": {
"core-js": "^3.0.0",
"reflect-metadata": "^0.1.10",
"socket.io": "^2.2.0",
"socket.io-client": "^2.2.0",
"tslib": "^1.9.0",
"zone.js": "^0.10.1"
},
"dependencies": {
"arraybuffer.slice": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
"integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
},
"base64id": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
},
"blob": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
"integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
},
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
},
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
},
"core-js": {
"version": "3.6.5",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
"integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
},
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"requires": {
"ms": "^2.1.1"
}
},
"engine.io": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.1.tgz",
"integrity": "sha512-8MfIfF1/IIfxuc2gv5K+XlFZczw/BpTvqBdl0E2fBLkYQp4miv4LuDTVtYt4yMyaIFLEr4vtaSgV4mjvll8Crw==",
"requires": {
"accepts": "~1.3.4",
"base64id": "2.0.0",
"cookie": "0.3.1",
"debug": "~4.1.0",
"engine.io-parser": "~2.2.0",
"ws": "^7.1.2"
}
},
"engine.io-client": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz",
"integrity": "sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==",
"requires": {
"component-emitter": "1.2.1",
"component-inherit": "0.0.3",
"debug": "~4.1.0",
"engine.io-parser": "~2.2.0",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"ws": "~6.1.0",
"xmlhttprequest-ssl": "~1.5.4",
"yeast": "0.1.2"
},
"dependencies": {
"ws": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
"integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
"requires": {
"async-limiter": "~1.0.0"
}
}
}
},
"engine.io-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
"integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
"requires": {
"after": "0.8.2",
"arraybuffer.slice": "~0.0.7",
"base64-arraybuffer": "0.1.5",
"blob": "0.0.5",
"has-binary2": "~1.0.2"
}
},
"isarray": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
"integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"socket.io": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
"integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
"requires": {
"debug": "~4.1.0",
"engine.io": "~3.4.0",
"has-binary2": "~1.0.2",
"socket.io-adapter": "~1.1.0",
"socket.io-client": "2.3.0",
"socket.io-parser": "~3.4.0"
}
},
"socket.io-adapter": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
"integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
},
"socket.io-client": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
"integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
"requires": {
"backo2": "1.0.2",
"base64-arraybuffer": "0.1.5",
"component-bind": "1.0.0",
"component-emitter": "1.2.1",
"debug": "~4.1.0",
"engine.io-client": "~3.4.0",
"has-binary2": "~1.0.2",
"has-cors": "1.1.0",
"indexof": "0.0.1",
"object-component": "0.0.3",
"parseqs": "0.0.5",
"parseuri": "0.0.5",
"socket.io-parser": "~3.3.0",
"to-array": "0.1.4"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"socket.io-parser": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
"integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
"requires": {
"component-emitter": "1.2.1",
"debug": "~3.1.0",
"isarray": "2.0.1"
},
"dependencies": {
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
}
}
}
}
},
"socket.io-parser": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz",
"integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==",
"requires": {
"component-emitter": "1.2.1",
"debug": "~4.1.0",
"isarray": "2.0.1"
}
},
"ws": {
"version": "7.2.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz",
"integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA=="
},
"xmlhttprequest-ssl": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
"integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
},
"zone.js": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz",
"integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg=="
}
}
},
"ngx-viewer": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/ngx-viewer/-/ngx-viewer-1.0.5.tgz",
@ -9011,8 +9227,7 @@
"object-component": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
"dev": true
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
},
"object-copy": {
"version": "0.1.0",
@ -9522,7 +9737,6 @@
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
"integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
"dev": true,
"requires": {
"better-assert": "~1.0.0"
}
@ -9531,7 +9745,6 @@
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
"integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
"dev": true,
"requires": {
"better-assert": "~1.0.0"
}
@ -10253,6 +10466,11 @@
"readable-stream": "^2.0.2"
}
},
"recordrtc": {
"version": "5.5.9",
"resolved": "https://registry.npmjs.org/recordrtc/-/recordrtc-5.5.9.tgz",
"integrity": "sha512-6T1tn80nRfsXrAoYWINwz+hBKk+pB5Im4I0BS52Og1ruQvrEdV3IUcm+AKwLMHNyBAhJ2DaVa+9pukTRxMF/uA=="
},
"redent": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
@ -10265,8 +10483,7 @@
"reflect-metadata": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
"integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==",
"dev": true
"integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
},
"regenerate": {
"version": "1.4.0",
@ -12071,8 +12288,7 @@
"to-array": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
"dev": true
"integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
},
"to-arraybuffer": {
"version": "1.0.1",
@ -13311,8 +13527,7 @@
"yeast": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
"dev": true
"integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
},
"yn": {
"version": "2.0.0",

View File

@ -67,10 +67,12 @@
"ngx-mat-daterange-picker": "^1.1.4",
"ngx-mat-select-search": "^1.8.0",
"ngx-perfect-scrollbar": "5.0.0-7",
"ngx-socket-io": "^3.0.1",
"ngx-viewer": "^1.0.5",
"node-sass": "^4.13.0",
"perfect-scrollbar": "^1.3.0",
"quill": "^1.3.7",
"recordrtc": "^5.5.9",
"rxjs": "^6.5.4",
"rxjs-compat": "^6.5.4",
"screenfull": "^3.2.2",

View File

@ -34,7 +34,7 @@ import {MatSelectModule} from '@angular/material/select';
import {MatCardModule} from '@angular/material/card';
import {MatBadgeModule} from '@angular/material/badge';
import {ChangePasswordDialog} from './settings/users/user-profile/user-profile.component';
import { MatFormFieldModule,MatProgressSpinnerModule } from '@angular/material';
import { MatFormFieldModule,MatProgressSpinnerModule, MatDialogModule, MatTooltipModule, MatButtonModule } from '@angular/material';
import { AppRoutes } from './app.routing';
import { AppComponent } from './app.component';
import { AdminLayoutComponent } from './layouts/admin/admin-layout.component';
@ -58,7 +58,9 @@ import { AsyncPipe } from '../../node_modules/@angular/common';
import { PdTrigerService } from './personal-discussion/pd-service/pd-triger.service';
import { HttpLoaderComponent } from './layouts/http-loader/http-loader.component';
import { LoaderService } from './shared/loaderService/loader.service';
import {SocketIoConfig, SocketIoModule} from 'ngx-socket-io';
import { IncomingCallComponent } from './video-chat/incoming-call/incoming-call.component';
import { VideoChatComponent } from './video-chat/video-chat.component'
export function HttpLoaderFactory(http: HttpClient) {
return new TranslateHttpLoader(http);
@ -72,14 +74,17 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
suppressScrollX: true
};
const socketConfig: SocketIoConfig = { url: environment.socketServerUrl, options: {} };
@NgModule({
declarations: [
AppComponent,
AdminLayoutComponent,
AuthLayoutComponent,
NewPasswordDialog,ForgotPass,ChangePasswordDialog, RoleMenuItemsPipe, HttpLoaderComponent
NewPasswordDialog,ForgotPass,ChangePasswordDialog, RoleMenuItemsPipe, HttpLoaderComponent, IncomingCallComponent, VideoChatComponent
],
imports: [
MatDialogModule,
BrowserModule,
BrowserAnimationsModule,
SharedModule,
@ -89,12 +94,15 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
MatSidenavModule,
MatInputModule,
MatIconModule,
MatButtonModule,
MatListModule,
MatMenuModule,
MatToolbarModule,
MatTabsModule,
MatCheckboxModule,
MatProgressBarModule,MatProgressSpinnerModule,
MatTooltipModule,
MatSelectModule,
MatCardModule,
MatBadgeModule,
@ -114,6 +122,7 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
AngularFireAuthModule,
AngularFireMessagingModule,
AngularFireModule.initializeApp(environment.firebase),
SocketIoModule.forRoot(socketConfig)
],
providers: [
{
@ -134,7 +143,7 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
},
MessagingService, AsyncPipe,LoaderService
],
entryComponents: [NewPasswordDialog,ForgotPass,ChangePasswordDialog],
entryComponents: [NewPasswordDialog,ForgotPass,ChangePasswordDialog,IncomingCallComponent,VideoChatComponent],
bootstrap: [AppComponent]
})
export class AppModule { }

View File

@ -15,6 +15,10 @@ import { AwsService } from '../../AwsService/aws.service';
import { RoleMenuItemsPipe } from './../role-menu-items.pipe';
import 'rxjs/add/observable/interval';
import { MessagingService } from 'app/shared/messaging.service';
import { IncomingCallComponent } from '../../video-chat/incoming-call/incoming-call.component';
import { Socket } from 'ngx-socket-io';
import { MatDialog } from '@angular/material';
import { VideoChatComponent } from 'app/video-chat/video-chat.component';
@ -59,8 +63,8 @@ export class AdminLayoutComponent implements OnInit, OnDestroy {
permissionDeined : boolean = true;
alertTAT: any;
countTAT: number;
constructor(private router: Router, public menuItems: MenuItems, public horizontalMenuItems : HorizontalMenuItems, public translate: TranslateService,public aws:AwsService,public users:UserService,private _dashboardService: DashboardService,private messagingService:MessagingService) {
incomingDialogOpened:boolean = false
constructor(private router: Router, public menuItems: MenuItems, public horizontalMenuItems : HorizontalMenuItems, public translate: TranslateService,public aws:AwsService,public users:UserService,private _dashboardService: DashboardService,private messagingService:MessagingService,private socket:Socket,private matDialog:MatDialog) {
const browserLang: string = translate.getBrowserLang();
translate.use(browserLang.match(/en|fr/) ? browserLang : 'en');
@ -138,7 +142,8 @@ export class AdminLayoutComponent implements OnInit, OnDestroy {
// Ps.update(elemContent);
}
});
this.listenForCalls()
this.openIncomingDialog();
}
@HostListener('click', ['$event'])
@ -311,4 +316,51 @@ export class AdminLayoutComponent implements OnInit, OnDestroy {
break;
}
}
// FOR LISTENING TO RECIEVE CALLS FROM CALLER
listenForCalls() {
// this.socket.on('BackOffer', this.connectPeer)
this.socket.fromEvent('BackOffer').subscribe(res=>{
console.log(res)
this.connectPeer(res);
})
}
connectPeer(offer) {
console.log(offer)
// alert("Offer is listened");
this.openIncomingDialog(offer);
}
openIncomingDialog(offer?) {
if(this.incomingDialogOpened == true) {
return;
}
this.incomingDialogOpened = true
const dialogRef = this.matDialog.open(IncomingCallComponent,{
// minWidth:'25%',
// maxWidth:'30%',
disableClose: true,
backdropClass: 'incoming-call-background' ,
panelClass:'incoming-call-background'
})
dialogRef.afterClosed().subscribe(data=>{
console.log(data)
if(data == 'decline'){
this.incomingDialogOpened = false
}
else {
this.incomingDialogOpened = false
this.openVideoChatDialog(offer)
}
})
}
openVideoChatDialog(offer) {
let dialogRef = this.matDialog.open(VideoChatComponent,{
data:{chat_info:'call_recieving',JSON_to_connect:offer},
maxWidth: '100vw',
maxHeight: '100vh',
height: '100%',
width: '100%',
disableClose: true,
panelClass:'video-chat'
})
}
}

View File

@ -0,0 +1,25 @@
<div fxLayout="column" fxLayoutGap="50px">
<div class="label" fxLayoutAlign="center center">
Incoming Call
</div>
<div class="call-animation">
<div fxFlex="135px" fxLayout.xs ="100%">
<img class="img-circle" src="../../assets/spinner/notfound_blue.png" alt="Image"/>
</div>
</div>
<div fxLayout="row" class="user-name" fxLayoutAlign="center center">
<!-- <div > -->
<h6>User Name</h6>
<!-- </div> -->
</div>
<div fxLayout="row" fxLayoutAlign="center center" fxLayoutGap="30px" fxLayoutGap.xs="5px">
<div fxLayout="column">
<button mat-raised-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Answer" matTooltipPosition="above" (click)="answer_call()"><mat-icon>call</mat-icon>
Answer</button>
</div>
<div fxLayout="column">
<button mat-raised-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Decline" matTooltipPosition="above" (click)="closeDialog()"><mat-icon>call_end</mat-icon>
Decline</button>
</div>
</div>
</div>

View File

@ -0,0 +1,56 @@
::ng-deep { .incoming-call-background > mat-dialog-container {
background: #71AFFF;
padding: 15px;
}
}
.label{
margin-bottom: 5% !important;
color: white
}
.user-name {
margin: 8% !important;
h6{
font-weight: bold;
}
color: white
}
.call-animation {
background: #fff;
width: 135px;
height: 135px;
position: relative;
margin: 0px auto !important;
border-radius: 100%;
border: solid 5px #fff;
animation: play 2s ease infinite;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
}
img {
width: 135px;
height: 135px;
border-radius: 100%;
position: absolute;
left: 0px;
top: 0px;
}
@keyframes play {
0% {
transform: scale(1);
}
15% {
box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.4);
}
25% {
box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.4), 0 0 0 20px rgba(255, 255, 255, 0.2);
}
25% {
box-shadow: 0 0 0 15px rgba(255, 255, 255, 0.4), 0 0 0 30px rgba(255, 255, 255, 0.2);
}
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IncomingCallComponent } from './incoming-call.component';
describe('IncomingCallComponent', () => {
let component: IncomingCallComponent;
let fixture: ComponentFixture<IncomingCallComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ IncomingCallComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(IncomingCallComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,21 @@
import { Component, OnInit } from '@angular/core';
import { MatDialogRef } from '@angular/material';
@Component({
selector: 'app-incoming-call',
templateUrl: './incoming-call.component.html',
styleUrls: ['./incoming-call.component.scss']
})
export class IncomingCallComponent implements OnInit {
constructor(private dialogRef:MatDialogRef<IncomingCallComponent>) { }
ngOnInit() {
}
closeDialog(){
this.dialogRef.close('decline');
}
answer_call(){
this.dialogRef.close('answered');
}
}

View File

@ -0,0 +1,71 @@
<div fxLayout="column">
<div align="end" style="float:right;padding: 10px !important;" fxLayoutAlign="flex-end">
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Close"
matTooltipPosition="right" (click)="close_all()">
<mat-icon>close</mat-icon>
</button>
</div>
<!-- <mat-dialog-content> -->
<!-- <div fxLayout="row"> -->
<div [style.visibility] ="is_video_enable? 'visible' : 'hidden'">
<!-- <div class="my_video"> -->
<video #myvideo id="myvideo" [style.visibility]="myVideoEnable? 'visible' : 'hidden'" muted></video>
<!-- </div> -->
<div class="peer_video" fxLayoutAlign="center" >
<video id="peervideo" #peervideo [style.visibility]="peerVideoEnable? 'visible' : 'hidden'"></video>
</div>
<!-- <input type="text" ><br/> -->
<!-- {{peerVideoEnable}} -->
<!-- <div class="peer_message" *ngIf="peerVideoEnable == false">
<p> Waiting for Connection</p>
</div> -->
<!-- <div class="input-group mb-3">
<label>Paste the JSON String</label>
<input type="text" class="form-control" [(ngModel)]="targetpeer" placeholder="JSON String" aria-label="Username" aria-describedby="basic-addon1">
</div> -->
<!-- <button type="button" class="btn btn-primary" (click)="connect()" >Connect</button> -->
<!-- <button type="button" (click)="message()">Send Message</button> -->
<div style="text-align: center;float:center" fxLayout="row" fxLayoutAlign="center" fxLayoutGap = "25px">
<!-- <button type="button" style="width: 90px" (click)="switch_camera()" class="btn btn-primary btn-lg" disabled #camera_switch>Switch</button> -->
<!-- <button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Switch Camera"
matTooltipPosition="above" (click)="switch_camera()" disabled #camera_switch >
<mat-icon>switch_camera</mat-icon>
</button> -->
<!-- <button type="button" style="width: 90px" (click)="start_Calling('init')" class="btn btn-primary btn-lg" *ngIf="!peerVideoEnable">Call</button><br/> -->
<!-- <button type="button" style="width: 90px" (click)="start_Calling('notinit')" class="btn btn-primary btn-lg" *ngIf="!peerVideoEnable">Recieve</button><br/> -->
<!-- <button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Disconnect"
matTooltipPosition="above" *ngIf="peerVideoEnable"><mat-icon>call_end</mat-icon></button><br/> -->
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Video Off / On"
matTooltipPosition="above" (click)="videoHandling()" *ngIf="peerVideoEnable">
<mat-icon *ngIf="video_mute">videocam_off</mat-icon>
<mat-icon *ngIf="!video_mute">videocam</mat-icon>
</button>
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Mic Off / On"
matTooltipPosition="above" (click)="micMuteHandling()" *ngIf="peerVideoEnable">
<mat-icon *ngIf="mic_mute">mic_off</mat-icon>
<mat-icon *ngIf="!mic_mute">mic</mat-icon>
</button>
<button mat-raised-button mat-icon-button class="mr-1 mb-1 hover-icon" type="button" matTooltip="Disconnect"
matTooltipPosition="above" (click)="disconnect()" *ngIf="peerVideoEnable">
<mat-icon>call_end</mat-icon>
</button>
</div>
</div>
<div fxLayoutAlign="center center" style="margin-top:10%" *ngIf="!is_video_enable">
<div fxLayout="column" fxLayoutAlign="center center">
<div fxLayout="row">
<button mat-raised-button type="button" matTooltip="Start Video Chat" matTooltipPosition = "above">
<mat-icon>videocam</mat-icon>
Start Video Chat
</button>
</div>
<!-- </div> -->
<!-- <div fxLayout="column"> -->
<div class="note-label">
<p>Note : Make sure the Reciever is waiting for your call before start Calling</p>
</div>
<!-- </div> -->
</div>
</div>
<!-- </div> -->
<!-- </mat-dialog-content> -->

View File

@ -0,0 +1,73 @@
::ng-deep { .video-chat > mat-dialog-container {
background: #71AFFF;
padding: 0;
}
}
@media(max-width:500px) {
video#myvideo {
max-width: 32%;
// min-width: 150px;
position: absolute;
border: 2px solid #9E9E9E;
top:0;
left: 0;
// /* top: 20px;
}
video#peervideo {
/* height: 498px; */
// position: relative;
// margin-top: 126px;
width: 100%;
}
.peer_message{
font-size: 20px;
position: absolute;
top: 11%;
float: right;
padding: 57px;
/* border: 2px solid lavender; */
left: 8%;
p{
text-align: center;
}
}
}
@media(min-width:500px) {
.peer_video{
max-height: 80vh;
}
video#myvideo {
max-width: 22%;
// min-width: 150px;
position: absolute;
border: 2px solid #9E9E9E;
top:0;
left: 0;
// max-width: 45%;
// text-align: center;
// margin-left:3%;
// margin-top:1%;
// min-width: 150px;
// position: absolute;
// border: 2px solid #9E9E9E;
// /* top: 20px;
}
video#peervideo {
/* height: 498px; */
max-width: 100%;
text-align: center;
margin-left:3%;
margin-top:1%;
// position: relative;
// margin-top: 126px;
// width: 100%;
}
}
body{
margin:10px !important;
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { VideoChatComponent } from './video-chat.component';
describe('VideoChatComponent', () => {
let component: VideoChatComponent;
let fixture: ComponentFixture<VideoChatComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ VideoChatComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(VideoChatComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,421 @@
import { Component, OnInit, ChangeDetectorRef, ViewChild, Inject } from '@angular/core';
import { Observable } from 'rxjs';
import { PushNotifyService } from 'app/shared/push-notify.service';
import { Socket } from 'ngx-socket-io';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
@Component({
selector: 'app-video-chat',
templateUrl: './video-chat.component.html',
styleUrls: ['./video-chat.component.scss']
})
export class VideoChatComponent implements OnInit {
MediaStream
title = 'simple-peer-video-chat';
peer:any;
targetpeer: string;
enableBtn: boolean;
@ViewChild('myvideo') myVideo: any;
@ViewChild('peervideo') peervideo: any;
@ViewChild('camera_switch') camereSwitchBtn: any;
// @ViewChild('textToCopy',{static:true}) textCopyElement: any;
n = <any>navigator.mediaDevices;
// public textToCopy:any;
myVideoEnable: boolean = false;
peerVideoEnable: boolean = false;
shouldFaceUser: boolean = true;
userCallType: any;
is_video_enable:boolean = false;
mic_mute: boolean = true;
video_mute: boolean = true;
constructor(private _notificationService:PushNotifyService,
private cdRef: ChangeDetectorRef,private socket: Socket,
private dialogRef: MatDialogRef<VideoChatComponent>,
@Inject(MAT_DIALOG_DATA) public chat_info:any) {
this._notificationService.requestPermission();
// this.notify('Approval','This is First Alert -- By Debasis Saha')
console.log("Version #8")
}
notify(title,approval) {
let data: Array < any >= [];
data.push({
'title': title,
'body': approval
});
this._notificationService.generateNotification(data);
}
// ngOnInit() {
// setTimeout(()=>{
// console.log("ngOninti")
// this.peer = new SimplePeer({
// initiator: location.hash === '#init',
// trickle: false
// })
// console.log(this.peer)
// this.peer.on('signal', function(data) {
// console.log(JSON.stringify(data));
// this.targetpeer = data;
// })
// this.peer.on('error', err => console.log('error', err))
// this.peer.on('data', function(data) {
// console.log('Recieved message:' + data);
// this.notify('notify',data)
// })
// this.peer.on('connect', () => {
// console.log('CONNECT')
// this.peer.send('whatever' + Math.random())
// })
// setTimeout(()=>{
// console.log("updated")
// this.enableBtn=true
// this.notify('notify','enabled')
// },1000)
// },3000)
// }
ngOnInit() {
console.log(this.chat_info);
if(this.chat_info) {
if(this.chat_info.chat_info == 'call_recieving' && this.chat_info.hasOwnProperty('JSON_to_connect') && this.chat_info.JSON_to_connect) {
this.is_video_enable = true;
this.start_Calling('receive')
}
}
// this.start_Calling('receive')
}
start_Calling(option) {
this.userCallType = option
// let texk=this.textCopyElement.nativeElement
let video = this.myVideo.nativeElement;
let peerVideo = this.peervideo.nativeElement
let peerx: any;
let copyMessageText
this.n.getUserMedia = (this.n.getUserMedia || this.n.webkitGetUserMedia || this.n.mozGetUserMedia || this.n.msGetUserMedia);
if(this.n.getUserMedia == undefined || this.n.getUserMedia == null, this.n.getUserMedia == ''){
alert("unable to get the camera access. please close the browser and come back again")
}
console.log(this.n)
let defaultsOpts = { audio: true, video: {
facingMode: this.shouldFaceUser ? 'user' : 'environment'
}
}
this.n.getUserMedia(defaultsOpts).then(stream=> {
this.socket.emit('NewClient')
video.load();
video.muted = true;
this.fetchVideoAndPlay(stream,video);
this.myVideoEnable = true
this.MediaStream = stream
// let switchCameraBtn= this.camereSwitchBtn.nativeElement
let supports = navigator.mediaDevices.getSupportedConstraints();
console.log(supports)
if( supports['facingMode'] === true ) {
// switchCameraBtn.disabled = false;
}
console.log("entered",stream);
peerx = new SimplePeer ({
initiator: option === 'init',
stream: stream,
reconnectTimer: 1000,
iceTransportPolicy: 'relay',
trickle: false,
config: {
iceServers: [
{
"urls": "stun:numb.viagenie.ca",
"username": 'fairojm@gmail.com',
"credential": 'fairojfai00'
},
{
"urls": "turn:numb.viagenie.ca",
"username": "fairojm@gmail.com",
"credential": "fairojfai00"
}
]
}
})
// function InitPeer(type) {
peerx.on('signal',(data)=> {
console.log(JSON.stringify(data));
if(data.hasOwnProperty('type') && data.type == 'offer'){
console.log("entered!!!!!!!!!!!!!!!!1");
this.socket.emit('Offer', data)
}
else if(data.type == 'answer'){
this.socket.emit('Answer', data)
}
// copyMessage(JSON.stringify(data))
copyMessageText = JSON.stringify(data);
// update()
this.copyMessage(copyMessageText,data.type)
// this.targetpeer = data;
})
// }
peerx.on('data', function(data) {
console.log('Recieved message:' + data);
})
peerx.on('close', (data) => {
console.log("Peer Connection is closed ",data);
this.disconnect();
// alert("Peer Connection is closed " +JSON.stringify(data))
this.notify("Connection Closed",'Peer Connection Closed'+JSON.stringify(data))
})
peerx.on('error', (err) => {
console.log("Fatal Error ",err);
alert("Fatal Error" +JSON.stringify(err))
})
peerx.on('stream', (stream)=> {
console.log("@##################33",stream)
if ('srcObject' in peerVideo) {
peerVideo.srcObject = stream
} else {
peerVideo.src = window.URL.createObjectURL(stream) // for older browsers
}
// video.play();
// console.log(this.peerVideoEnable);
peerVideo.load();
this. fetchVideoAndPlay(stream,peerVideo,true);
// setTimeout(()=>{
// // this.peerVideoEnable = true;
// // console.log(this.peerVideoEnable)
// },2000)
// CreateVideo(stream)
})
// fetchVideoAndPlay(stream,videotype) {
// fetch('')
// .then(response => response.blob())
// .then(blob => {
// videotype.srcObject = stream;
// return videotype.play();
// })
// .then(_ => {
// // Video playback started ;)
// })
// .catch(e => {
// // Video playback failed ;(
// })
// }
// function CreateVideo(stream) {
// // CreateDiv()
// let video = document.createElement('video')
// video.id = 'peerVideo'
// video.srcObject = stream
// video.setAttribute('class', 'embed-responsive-item')
// document.querySelector('#peervideo').appendChild(video)
// video.play()
// //wait for 1 sec
// }
function connectPeer(answer) {
console.log("$$$$$$$$$$$$$$44");
console.log(answer);
peerx.signal(answer);
}
function getPeer(){
return JSON.stringify(copyMessageText)
}
// if(JSON.parse(copyMessageText).hasOwnProperty('type') && JSON.parse(copyMessageText).type == 'offer')
// {
// setTimeout(()=>{
// this.socket.on('BackOffer', getPeer)
// },2000)
// }
if(this.chat_info.chat_info == 'call_recieving' && this.chat_info.JSON_to_connect && this.chat_info.JSON_to_connect != undefined) {
connectPeer(this.chat_info.JSON_to_connect)
}
let tt = this.socket.on('BackOffer', connectPeer)
console.log(tt);
this.socket.on('BackAnswer', connectPeer)
}, err=>{
console.log('Failed to get stream', err);
alert('Failed to get stream '+err);
});
// function update(){
// console.log(copyMessageText)
// setTimeout(()=>{
// // texk.value = copyMessageText
// },2000)
// }
setTimeout(() => {
this.peer = peerx;
// this.copyMessage(JSON.stringify(this.targetpeer))
console.log(this.peer);
// console.log(copyMessageText)
// this.targetpeer = copyMessageText
// this.textToCopy = copyMessageText
// this.copyMessage(copyMessageText)
}, 5000);
// socket.on('SessionActive', SessionActive)
// socket.on('CreatePeer', MakePeer)
// socket.on('Disconnect', RemovePeer)
}
fetchVideoAndPlay(stream,videotype,enablePeerVideo?) {
console.log("12@@@@@@@@@2",enablePeerVideo)
if(enablePeerVideo) {
this.peerVideoEnable = enablePeerVideo
// this.camereSwitchBtn.nativeElement.disabled = true;
console.log(this.peerVideoEnable);
this.cdRef.detectChanges();
// this.startRecording(stream)
}
fetch('')
.then(response => response.blob())
.then(blob => {
videotype.srcObject = stream;
return videotype.play();
})
.then(_ => {
// Video playback started ;)
})
.catch(e => {
// Video playback failed ;(
})
}
startRecording(stream) {
let recorder = new RecordRTCPromisesHandler(stream, {
type: 'video',
mimeType: 'video/webm', // or video/webm\;codecs=h264 or video/webm\;codecs=vp9
audioBitsPerSecond: 128000,
videoBitsPerSecond: 128000,
bitsPerSecond: 128000 // if this line is provided, skip above
});
recorder.startRecording();
const sleep = m => new Promise(r => setTimeout(r, m));
sleep(3000);
setTimeout(()=>{
recorder.stopRecording();
console.log(recorder);
let blob = recorder.getBlob();
recorder.getDataURL().then(dataURL=>{
console.log("@@@@@",dataURL)
});
// var file = new File([blob], 'video.mp4', {
// type: 'video/mp4'
// });
// console.log(file)
// const fileURL = window.URL.createObjectURL(file);
// window.open(fileURL);
// videotype.srcObject = null;
// videotype.muted = false;
// videotype.volume = 1;
// videotype.srcObject = file;
// recorder.camera.stop();
// recorder.destroy();
// recorder = null;
// let recorder = RecordRTC(stream, {
// type: 'video'
// });
// recorder.startRecording();
// const sleep = m => new Promise(r => setTimeout(r, m));
// sleep(10000);
// recorder.stopRecording(function() {
// let blob = recorder.getBlob();
// // invokeSaveAsDialog(blob);
// console.log(blob);
// });
// blob.then(resul=>{
// console.log(resul);
// })
// const fileURL = window.URL.createObjectURL(blob);
// console.log(fileURL);
// window.open(fileURL);
},10000)
// invokeSaveAsDialog(blob);
}
connect() {
this.peer.signal(JSON.parse(this.targetpeer));
}
RemovePeer() {
document.getElementById("peerVideo").remove();
// document.getElementById("muteText").remove();
// if (client.peer) {
// client.peer.destroy()
// }
}
message() {
this.peer.send('Hello world');
}
disconnect() {
console.log(this.peer)
this.peer.destroy();
this.peerVideoEnable = false
this.targetpeer = ''
this.cdRef.detectChanges();
this.peervideo.nativeElement.pause();
console.log(this.MediaStream.getTracks())
// this.MediaStream.stop()
// var track = this.MediaStream.getTracks()[0]; // if only one media track
// ...
// track.stop();
this.MediaStream.getTracks().forEach(function(track) {
track.stop();
});
console.log(this.peervideo);
// this.peervideo.nativeElement.videoWidth = 0
// this.peervideo.nativeElement.videoHeight = 0
this.is_video_enable = false
this.cdRef.detectChanges();
}
copyMessage(val: string,message?){
const selBox = document.createElement('textarea');
selBox.style.position = 'fixed';
selBox.style.left = '0';
selBox.style.top = '0';
selBox.style.opacity = '0';
selBox.value = val;
document.body.appendChild(selBox);
selBox.focus();
selBox.select();
document.execCommand('copy');
document.body.removeChild(selBox);
// alert(message+ " JSON is copied to clipboard. Paste the JSON to another window")
this.notify("JSON copied to clipboard",message+ ' JSON');
}
switch_camera() {
this.shouldFaceUser = !this.shouldFaceUser;
console.log(this.userCallType);
this.peer.destroy();
this.start_Calling(this.userCallType)
}
close_all() {
if(this.peer) {
this.disconnect();
}
if(this.MediaStream && this.MediaStream.active) {
console.log(this.MediaStream.getTracks())
// this.MediaStream.stop()
// var track = this.MediaStream.getTracks()[0]; // if only one media track
// ...
// track.stop();
this.MediaStream.getTracks().forEach(function(track) {
track.stop();
});
}
this.dialogRef.close();
}
micMuteHandling(){
this.mic_mute = !this.mic_mute
this.cdRef.detectChanges();
this.MediaStream.getAudioTracks()[0].enabled = this.mic_mute;
}
videoHandling(){
this.video_mute = !this.video_mute
this.cdRef.detectChanges();
this.MediaStream.getVideoTracks()[0].enabled = this.video_mute;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -14,6 +14,7 @@ export const environment = {
// apiEndpoint: 'https://demo.pdgenie.com/sparqapi/api/',
apiEndpoint:'https://apitest.pdgenie.com/sparqtest/api/',
// apiEndpoint:'http://localhost/sineEdge/sparqapi/api/',
socketServerUrl:'https://morning-garden-90282.herokuapp.com',
authorization: 'sparqvenba2018',

View File

@ -9,6 +9,10 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="manifest" href="/manifest.json">
<!-- For Video chat -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/simple-peer/9.7.0/simplepeer.min.js"></script>
<!-- <script src="node_modules/recordrtc/RecordRTC.js"></script> -->
<script src="https://www.WebRTC-Experiment.com/RecordRTC.js"></script>
<!-- <title>Optima - Angular 6 Material Admin Template</title> -->
<title> PD Genie </title>

View File

@ -6,4 +6,7 @@ interface NodeModule {
declare module 'quill';
declare module 'leaflet';
declare module 'perfect-scrollbar';
declare module 'screenfull';
declare module 'screenfull';
declare var SimplePeer: any;
declare var RecordRTCPromisesHandler:any;
declare var RecordRTC:any;