sb.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. var countdown = {
  2. _timeout: null,
  3. _stepCb: null,
  4. _timeoutCb: null,
  5. running: false,
  6. seconds: 5,
  7. _initial_seconds: 5,
  8. start: function(seconds, timeoutCb, stepCb) {
  9. countdown.stop();
  10. countdown.seconds = countdown._initial_seconds = seconds || 5;
  11. countdown._timeoutCb = timeoutCb || countdown._timeoutCb;
  12. countdown._stepCb = stepCb || countdown._stepCb;
  13. countdown.running = true;
  14. countdown._step();
  15. },
  16. stop: function() {
  17. if (countdown._timeout) {
  18. window.clearTimeout(countdown._timeout);
  19. }
  20. countdown.running = false;
  21. },
  22. restart: function() {
  23. countdown.start(countdown._initial_seconds);
  24. },
  25. _step: function() {
  26. if (countdown._stepCb) {
  27. countdown._stepCb();
  28. }
  29. if (countdown.seconds === 0) {
  30. if (countdown._timeoutCb) {
  31. countdown._timeoutCb();
  32. }
  33. countdown.stop();
  34. } else {
  35. countdown._decrement();
  36. }
  37. },
  38. _decrement: function() {
  39. countdown.seconds = countdown.seconds - 1;
  40. countdown._timeout = window.setTimeout(function() {
  41. countdown._step();
  42. }, 1000);
  43. }
  44. };
  45. function runCamera(stream) {
  46. console.log("initialize the camera");
  47. var video = document.querySelector("#sb-video");
  48. var container = document.querySelector("#canvas-container");
  49. container.width = video.videoWidth;
  50. video.onloadedmetadata = function() {
  51. video.play();
  52. };
  53. video.srcObject = stream;
  54. }
  55. function sendData(data) {
  56. var xhr = new XMLHttpRequest();
  57. var boundary = "youarenotsupposedtolookatthis";
  58. var formData = new FormData();
  59. var msg = "";
  60. formData.append("selfie", new Blob([data]), "selfie.jpeg");
  61. fetch("/publish/", {
  62. method: "POST",
  63. body: formData
  64. }).then(function(response) {
  65. if (response.status !== 200) {
  66. msg = "something went wrong sending the data: " + response.status;
  67. console.log(msg);
  68. M.toast({"html": msg});
  69. }
  70. cancelPhoto();
  71. return response.json();
  72. }).then(function(json) {
  73. json = json || {};
  74. console.log(json);
  75. if (json && json.success) {
  76. msg = "❤ ❤ ❤ photo sent successfully! ❤ ❤ ❤";
  77. console.log(msg);
  78. M.toast({"html": msg});
  79. } else {
  80. msg = "😭 😭 😭 something wrong on the backend 😭 😭 😭";
  81. console.log(msg);
  82. M.toast({"html": msg});
  83. msg = "the server says: " + json.message;
  84. console.log(msg);
  85. M.toast({"html": msg});
  86. }
  87. }).catch(function(err) {
  88. msg = "something went wrong connecting to server: " + err;
  89. console.log(msg);
  90. M.toast({"html": msg});
  91. cancelPhoto();
  92. });
  93. }
  94. function cancelPhoto() {
  95. console.log("cancel photo");
  96. document.querySelector("#sb-message").style.visibility = "hidden";
  97. document.querySelector("#send-photo-btn").classList.add("disabled");
  98. document.querySelector("#cancel-photo-btn").classList.add("disabled");
  99. var canvas = document.querySelector("#sb-canvas");
  100. var context = canvas.getContext("2d");
  101. context.clearRect(0, 0, canvas.width, canvas.height);
  102. countdown.stop();
  103. }
  104. function updateSendCountdown() {
  105. document.querySelector("#sb-countdown").innerText = "" + countdown.seconds;
  106. console.log("deleting photo in " + countdown.seconds + " seconds");
  107. }
  108. function isBlank(canvas) {
  109. var blank = document.createElement("canvas");
  110. blank.width = canvas.width;
  111. blank.height = canvas.height;
  112. return canvas.toDataURL() == blank.toDataURL();
  113. }
  114. function sendPhoto() {
  115. console.log("send photo");
  116. countdown.stop();
  117. document.querySelector("#sb-message").style.visibility = "hidden";
  118. var canvas = document.querySelector("#sb-canvas");
  119. if (isBlank(canvas)) {
  120. var msg = "I cowardly refuse to send a blank image.";
  121. console.log(msg)
  122. M.toast({"html": msg});
  123. return;
  124. }
  125. return sendData(canvas.toDataURL("image/jpeg"));
  126. }
  127. function takePhoto() {
  128. console.log("take photo");
  129. document.querySelector("#sb-message").style.visibility = "visible";
  130. var video = document.querySelector("#sb-video");
  131. var canvas = document.querySelector("#sb-canvas");
  132. var context = canvas.getContext("2d");
  133. canvas.width = video.offsetWidth;
  134. canvas.height = video.offsetHeight;
  135. /*
  136. var tmpCanvas = document.createElement("canvas");
  137. tmpCanvas.width = video.offsetWidth;
  138. tmpCanvas.height = video.offsetHeight;
  139. var tmpContext = tmpCanvas.getContext("2d");
  140. var tmpRatio = (tmpCanvas.height / tmpCanvas.width);
  141. tmpContext.drawImage(video, 0, 0, video.offsetWidth, video.offsetHeight);
  142. canvas.width = canvas.offsetWidth;
  143. canvas.height = canvas.offsetHeight;
  144. canvas.style.height = parseInt(canvas.offsetWidth * tmpRatio);
  145. var scale = canvas.width / tmpCanvas.width;
  146. context.scale(scale, scale);
  147. context.drawImage(tmpCanvas, 0, 0);
  148. */
  149. context.drawImage(video, 0, 0, video.offsetWidth, video.offsetHeight);
  150. document.querySelector("#send-photo-btn").classList.remove("disabled");
  151. document.querySelector("#cancel-photo-btn").classList.remove("disabled");
  152. countdown.start(5, cancelPhoto, updateSendCountdown);
  153. }
  154. function initCamera() {
  155. console.log("request camera permission");
  156. document.querySelector("#canvas-container").style.display = "block";
  157. var videoObj = {
  158. "video": {
  159. width: 800,
  160. height: 600
  161. },
  162. "audio": false
  163. };
  164. navigator.mediaDevices.getUserMedia(videoObj).then(function(stream) {
  165. runCamera(stream);
  166. document.querySelector("#init-btn").style.display = "none";
  167. document.querySelector("#take-photo-btn").classList.remove("disabled");
  168. }).catch(function(err) {
  169. console.log("unable to open camera");
  170. console.log(err);
  171. M.toast({"html": "unable to open camera; please reload this page: " + err});
  172. });
  173. }