meet.blade.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. @extends('layouts.meeting')
  2. @section('content')
  3. <div id="meetComponent">
  4. <h5 class="bg-dark font-weight-bold text-white m-0 py-3 px-4 d-flex">
  5. <span>Meeting</span>
  6. <span class="ml-auto" v-if="!started">
  7. Connecting...
  8. </span>
  9. <span class="ml-auto" v-if="started">
  10. <i class="fa fa-clock mr-1 text-light"></i>
  11. @{{ timeDisplay() }}
  12. </span>
  13. </h5>
  14. <div class="mt-4">
  15. @if($guest)
  16. <div class="py-2 text-center" v-if="!pro">
  17. <h6 class="text--black font-weight-bold">Please wait. Your doctor will be with you shortly...</h6>
  18. </div>
  19. @endif
  20. <div class="main-view mx-auto">
  21. <div id="self-view" class="full-view"></div>
  22. <div id="remote-view" class="thumb-view"></div>
  23. </div>
  24. </div>
  25. </div>
  26. <script>
  27. new Vue({
  28. el: '#meetComponent',
  29. delimiters: ['@{{', '}}'],
  30. data: {
  31. time: 0,
  32. startTime: 0,
  33. started: false,
  34. client: false,
  35. pro: false,
  36. selfName: '',
  37. selfToken: '',
  38. @if($guest)
  39. clientUid: '',
  40. checkInToken: '',
  41. @endif
  42. otSessionId: '',
  43. },
  44. methods: {
  45. getInitials: function(_name) {
  46. var parts = _name.split(/\s+/g);
  47. parts = parts.map(_part => _part[0]);
  48. return parts.join('');
  49. },
  50. timeDisplay: function() {
  51. var seconds = this.time / 1000,
  52. minutes = parseInt(seconds / 60, 10);
  53. seconds = parseInt(seconds % 60, 10);
  54. return minutes + " min, " + seconds + " sec";
  55. },
  56. connectToFirstPro: function() {
  57. console.log('Connecting to first pro ...');
  58. this.pros = [];
  59. this.addPro();
  60. $.post('/api/meeting/request-dial-pro', {
  61. meetingUid: this.meetingID,
  62. }, function(_data) {
  63. console.log('Response to /api/meeting/request-dial-pro');
  64. console.log(_data);
  65. }, 'json');
  66. },
  67. onProJoined: function(_data) {
  68. // TODO:
  69. },
  70. onProLeft: function(_id) {
  71. // TODO:
  72. },
  73. leaveCall: function() {
  74. // TODO:
  75. },
  76. // OT methods
  77. initOpenTok: function() {
  78. /* fake video feed (temp) */
  79. const randomColour = () => {
  80. return Math.round(Math.random() * 255);
  81. };
  82. const canvas = document.createElement('canvas');
  83. canvas.width = 640;
  84. canvas.height = 480;
  85. const ctx = canvas.getContext('2d');
  86. // Draw a random colour in the Canvas every 1 second
  87. setInterval(() => {
  88. const x = randomColour();
  89. ctx.clearRect(0, 0, canvas.width, canvas.height);
  90. ctx.fillStyle = `rgb(${x}, ${x}, ${x})`;
  91. ctx.fillRect(0, 0, canvas.width, canvas.height);
  92. }, 500);
  93. var self = this;
  94. var apiKey = '46678902';
  95. var sessionId = this.otSessionId;
  96. var token = this.selfToken;
  97. var session = OT.initSession(apiKey, sessionId);
  98. // TODO: Subscribe to remote stream (pro)
  99. session.on('streamCreated', function streamCreated(event) {
  100. console.log(event);
  101. var subscriberOptions = {
  102. insertMode: 'append',
  103. width: '100%',
  104. height: '100%'
  105. };
  106. session.subscribe(event.stream, 'subscriber', subscriberOptions, handleError);
  107. });
  108. session.on('sessionDisconnected', function sessionDisconnected(event) {
  109. console.log('You were disconnected from the session.', event.reason);
  110. });
  111. // initialize the publisher
  112. var publisherOptions = {
  113. videoSource: canvas.captureStream(1).getVideoTracks()[0],
  114. insertMode: 'append',
  115. width: '100%',
  116. height: '100%',
  117. };
  118. var publisher = OT.initPublisher('self-view', publisherOptions, self.handleOpenTokError);
  119. // Connect to the session
  120. session.connect(token, function callback(error) {
  121. if (error) {
  122. self.handleOpenTokError(error);
  123. } else {
  124. // If the connection is successful, publish the publisher to the session
  125. session.publish(publisher, self.handleOpenTokError);
  126. }
  127. });
  128. },
  129. handleOpenTokError: function(e) {
  130. },
  131. getClientCheckinToken: function(_done) {
  132. var self = this;
  133. $.get('/get-client-checkin-token/' + this.clientUid, function(_data) {
  134. console.log(_data);
  135. self.checkInToken = _data.data;
  136. _done();
  137. }, 'json');
  138. },
  139. getOpenTokSessionId: function(_done) {
  140. var self = this;
  141. $.ajax({
  142. type: 'post',
  143. url: '/api/clientVideoVisit/startVideoVisitAsStranger',
  144. headers: {
  145. 'sessionKey': localStorage.sessionKey
  146. },
  147. data: {checkInToken: this.checkInToken},
  148. dataType: 'json'
  149. })
  150. .done(function (_data) {
  151. console.log(_data);
  152. if(_data.success) {
  153. self.otSessionId = _data.data;
  154. _done();
  155. }
  156. else {
  157. alert(_data.message);
  158. }
  159. })
  160. .fail(function (_data) {
  161. console.log(_data);
  162. alert(_data.message);
  163. });
  164. }
  165. },
  166. mounted: function() {
  167. var self = this;
  168. @if($guest)
  169. this.clientUid = localStorage.clientUid;
  170. this.getClientCheckinToken(function() { // get client check-in token
  171. self.getOpenTokSessionId(function() { // get opentok session id
  172. var name = [];
  173. if (localStorage.clientFirstName) name.push(localStorage.clientFirstName);
  174. if (localStorage.clientLastName) name.push(localStorage.clientLastName);
  175. this.selfName = name.join(' ');
  176. $.post('/api/openTok/getClientToken', {
  177. opentokSessionId: self.otSessionId,
  178. name: name.join(' ')
  179. }, function (_data) {
  180. self.selfToken = _data.data;
  181. self.initOpenTok();
  182. });
  183. });
  184. });
  185. @endif
  186. }
  187. });
  188. </script>
  189. @endsection