Browse code

Change camera toggle from double press to long press

Robert Cranston authored on 18/07/2025 20:05:52
Showing 1 changed files
... ...
@@ -63,8 +63,9 @@ function timerSelector(first, second, initiate) {
63 63
     }
64 64
 }
65 65
 
66
-message.innerHTML = "Press video to post, double press to flip.";
67
-video.addEventListener("click", timerSelector(post, flip, true));
66
+message.innerHTML = "Press video to post, long press to flip.";
67
+video.addEventListener("pointerdown", timerSelector(flip, post, true));
68
+video.addEventListener("pointerup",   timerSelector(flip, post, false));
68 69
 camera.appendChild(message);
69 70
 camera.appendChild(video);
70 71
 getVideo();
Browse code

Add double press to toggle between "environment" and "user" camera

Robert Cranston authored on 18/07/2025 20:04:52
Showing 1 changed files
... ...
@@ -4,6 +4,7 @@ const type    = "image/jpeg";
4 4
 const quality = 0.95;
5 5
 const width   = 1920;
6 6
 const height  = 1440;
7
+const timeout = 250;
7 8
 
8 9
 const camera  = document.getElementById("camera");
9 10
 const message = document.createElement("div");
... ...
@@ -12,6 +13,7 @@ const canvas  = document.createElement("canvas")
12 13
 const ctx     = canvas.getContext("2d");
13 14
 
14 15
 let facingMode = "environment";
16
+let timer      = null;
15 17
 
16 18
 async function getVideo() {
17 19
     try {
... ...
@@ -43,8 +45,26 @@ async function post()
43 45
     }
44 46
 }
45 47
 
46
-message.innerHTML = "Press video to post.";
47
-video.addEventListener("click", post);
48
+function flip() {
49
+    facingMode = facingMode == "environment" ? "user" : "environment";
50
+    getVideo();
51
+}
52
+
53
+function timerSelector(first, second, initiate) {
54
+    return () => {
55
+        if (timer == null) {
56
+            if (initiate)
57
+                timer = setTimeout(() => { timer = null; first(); }, timeout);
58
+        } else {
59
+            clearTimeout(timer);
60
+            timer = null;
61
+            second();
62
+        }
63
+    }
64
+}
65
+
66
+message.innerHTML = "Press video to post, double press to flip.";
67
+video.addEventListener("click", timerSelector(post, flip, true));
48 68
 camera.appendChild(message);
49 69
 camera.appendChild(video);
50 70
 getVideo();
Browse code

Add posting of "environment" camera

Robert Cranston authored on 18/07/2025 19:27:33
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,50 @@
1
+"use strict";
2
+
3
+const type    = "image/jpeg";
4
+const quality = 0.95;
5
+const width   = 1920;
6
+const height  = 1440;
7
+
8
+const camera  = document.getElementById("camera");
9
+const message = document.createElement("div");
10
+const video   = document.createElement("video");
11
+const canvas  = document.createElement("canvas")
12
+const ctx     = canvas.getContext("2d");
13
+
14
+let facingMode = "environment";
15
+
16
+async function getVideo() {
17
+    try {
18
+        video.srcObject = await navigator.mediaDevices.getUserMedia({
19
+            video: { facingMode, width, height },
20
+        });
21
+        video.play();
22
+    } catch (err) {
23
+        camera.removeChild(video);
24
+        message.innerHTML = `Could not get video: ${err.name}: ${err.message}`;
25
+    }
26
+}
27
+
28
+async function post()
29
+{
30
+    try {
31
+        message.innerHTML = "Posting...";
32
+        canvas.width  = video.videoWidth;
33
+        canvas.height = video.videoHeight;
34
+        ctx.drawImage(video, 0, 0);
35
+        const blob = await new Promise((r) => canvas.toBlob(r, type, quality));
36
+        const resp = await fetch("/", {
37
+            method: "POST",
38
+            body:   blob,
39
+        });
40
+        message.innerHTML = `${resp.status}: ${resp.statusText}`;
41
+    } catch (err) {
42
+        message.innerHTML = `${err.name}: ${err.message}`;
43
+    }
44
+}
45
+
46
+message.innerHTML = "Press video to post.";
47
+video.addEventListener("click", post);
48
+camera.appendChild(message);
49
+camera.appendChild(video);
50
+getVideo();