meet.blade.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. sessionKey: '',
  37. selfName: '',
  38. selfToken: '',
  39. },
  40. methods: {
  41. getInitials: function(_name) {
  42. var parts = _name.split(/\s+/g);
  43. parts = parts.map(_part => _part[0]);
  44. return parts.join('');
  45. },
  46. timeDisplay: function() {
  47. var seconds = this.time / 1000,
  48. minutes = parseInt(seconds / 60, 10);
  49. seconds = parseInt(seconds % 60, 10);
  50. return minutes + " min, " + seconds + " sec";
  51. },
  52. connectToFirstPro: function() {
  53. console.log('Connecting to first pro ...');
  54. this.pros = [];
  55. this.addPro();
  56. $.post('/api/meeting/request-dial-pro', {
  57. meetingUid: this.meetingID,
  58. }, function(_data) {
  59. console.log('Response to /api/meeting/request-dial-pro');
  60. console.log(_data);
  61. }, 'json');
  62. },
  63. onProJoined: function(_data) {
  64. // TODO:
  65. },
  66. onProLeft: function(_id) {
  67. // TODO:
  68. },
  69. leaveCall: function() {
  70. // TODO:
  71. },
  72. // OT methods
  73. initOpenTok: function() {
  74. /* fake video feed (temp) */
  75. const randomColour = () => {
  76. return Math.round(Math.random() * 255);
  77. };
  78. const canvas = document.createElement('canvas');
  79. canvas.width = 640;
  80. canvas.height = 480;
  81. const ctx = canvas.getContext('2d');
  82. // Draw a random colour in the Canvas every 1 second
  83. setInterval(() => {
  84. const x = randomColour();
  85. ctx.clearRect(0, 0, canvas.width, canvas.height);
  86. ctx.fillStyle = `rgb(${x}, ${x}, ${x})`;
  87. ctx.fillRect(0, 0, canvas.width, canvas.height);
  88. }, 500);
  89. var self = this;
  90. var apiKey = '46678902';
  91. var sessionId = this.sessionKey;
  92. var token = this.selfToken;
  93. {{-- @if($guest)--}}
  94. {{-- token = 'T1==cGFydG5lcl9pZD00NTgyODA2MiZzaWc9NmE0YWU1NzIzN2I1ODUxNzY2YzMzN2VkNGNjMTI4ODdlYTBkNDYwOTpzZXNzaW9uX2lkPTFfTVg0ME5UZ3lPREEyTW41LU1UVTVNakl4TVRZMU16UTFOSDVhVW5CNGFsVnNNelpTVFdGblVFSXZVRmxxWWxGaldEUi1VSDQmY3JlYXRlX3RpbWU9MTU5MjIxMTY1NSZub25jZT0wLjgyMDAzMDEwNjk1NDk3MiZyb2xlPXB1Ymxpc2hlciZleHBpcmVfdGltZT0xNTkyMjk4MDU1';--}}
  95. {{-- @else--}}
  96. {{-- token = 'T1==cGFydG5lcl9pZD00NTgyODA2MiZzaWc9NGFjNzQ2NjgyNThjZjE4MTdiMTFmMDMwZTg5ZjFjMzhjZDJlMDFiMDpzZXNzaW9uX2lkPTFfTVg0ME5UZ3lPREEyTW41LU1UVTVNakl4TWpreE1qSTRObjUzZUhCU1dYWjRlbVF6V2pJMGN6UkRRbEp2T0RsbFduTi1VSDQmY3JlYXRlX3RpbWU9MTU5MjIxMjk0NCZub25jZT0wLjkwMjA3MTc4OTk3ODY4OTkmcm9sZT1wdWJsaXNoZXImZXhwaXJlX3RpbWU9MTU5MjI5OTM0NA==';--}}
  97. {{-- @endif--}}
  98. var session = OT.initSession(apiKey, sessionId);
  99. // TODO: Subscribe to remote stream (pro)
  100. session.on('streamCreated', function streamCreated(event) {
  101. console.log(event);
  102. var subscriberOptions = {
  103. insertMode: 'append',
  104. width: '100%',
  105. height: '100%'
  106. };
  107. session.subscribe(event.stream, 'subscriber', subscriberOptions, handleError);
  108. });
  109. session.on('sessionDisconnected', function sessionDisconnected(event) {
  110. console.log('You were disconnected from the session.', event.reason);
  111. });
  112. // initialize the publisher
  113. var publisherOptions = {
  114. videoSource: canvas.captureStream(1).getVideoTracks()[0],
  115. insertMode: 'append',
  116. width: '100%',
  117. height: '100%',
  118. };
  119. var publisher = OT.initPublisher('self-view', publisherOptions, self.handleOpenTokError);
  120. // Connect to the session
  121. session.connect(token, function callback(error) {
  122. if (error) {
  123. self.handleOpenTokError(error);
  124. } else {
  125. // If the connection is successful, publish the publisher to the session
  126. session.publish(publisher, self.handleOpenTokError);
  127. }
  128. });
  129. },
  130. handleOpenTokError: function(e) {
  131. }
  132. },
  133. mounted: function() {
  134. var self = this;
  135. this.sessionKey = localStorage.clientSessionKey;
  136. var name = [];
  137. if (localStorage.clientFirstName) name.push(localStorage.clientFirstName);
  138. if (localStorage.clientLastName) name.push(localStorage.clientLastName);
  139. this.selfName = name.join(' ');
  140. $.post('/api/openTok/getClientToken', {
  141. opentokSessionId: localStorage.clientSessionKey,
  142. name: name.join(' ')
  143. }, function (_data) {
  144. self.selfToken = _data.data;
  145. self.initOpenTok();
  146. });
  147. }
  148. });
  149. </script>
  150. @endsection