Browse Source

add a camera-switch button

kb/add-usage-guide
Trent Larson 6 months ago
parent
commit
6dc0c2cd58
  1. 2
      src/components/GiftedDialog.vue
  2. 37
      src/components/GiftedPhotoDialog.vue
  3. 4
      src/views/HelpView.vue

2
src/components/GiftedDialog.vue

@ -53,7 +53,7 @@
}"
class="text-blue-500"
>
More Options
Photo, ...
</router-link>
</span>
</div>

37
src/components/GiftedPhotoDialog.vue

@ -48,7 +48,12 @@
Camera "resolution" doesn't change how it shows on screen but rather stretches the result, eg the following which just stretches it vertically:
:resolution="{ width: 375, height: 812 }"
-->
<camera facingMode="environment" autoplay ref="camera">
<camera
facingMode="environment"
autoplay
ref="camera"
@started="cameraStarted"
>
<div
class="absolute portrait:bottom-0 portrait:left-0 portrait:right-0 landscape:right-0 landscape:top-0 landscape:bottom-0 flex landscape:flex-row justify-center items-center portrait:pb-2 landscape:pr-4"
>
@ -59,6 +64,14 @@
<fa icon="camera" class="w-[1em]"></fa>
</button>
</div>
<div v-if="numDevices > 1" class="absolute bottom-2 right-4">
<button
@click="switchCamera"
class="bg-blue-500 hover:bg-blue-700 text-white font-bold p-3 rounded-full text-2xl leading-none"
>
<fa icon="rotate" class="w-[1em]"></fa>
</button>
</div>
</camera>
</div>
</div>
@ -80,12 +93,11 @@ import { accessToken } from "@/libs/crypto";
export default class GiftedPhotoDialog extends Vue {
$notify!: (notification: NotificationIface, timeout?: number) => void;
activeDeviceNumber = 0;
activeDid = "";
blob: Blob | null = null;
numDevices = 0;
setImage: (arg: string) => void = () => {};
imageHeight?: number = window.innerHeight / 2;
imageWidth?: number = window.innerWidth / 2;
imageWarning = ".";
uploading = false;
visible = false;
@ -129,6 +141,20 @@ export default class GiftedPhotoDialog extends Vue {
this.blob = null;
}
async cameraStarted() {
const cameraComponent = this.$refs.camera as InstanceType<typeof Camera>;
if (cameraComponent) {
this.numDevices = (await cameraComponent.devices(["videoinput"])).length;
}
}
async switchCamera() {
const cameraComponent = this.$refs.camera as InstanceType<typeof Camera>;
this.activeDeviceNumber = (this.activeDeviceNumber + 1) % this.numDevices;
const devices = await cameraComponent?.devices(["videoinput"]);
cameraComponent?.changeCamera(devices[this.activeDeviceNumber].deviceId);
}
async takeImage(/* payload: MouseEvent */) {
const cameraComponent = this.$refs.camera as InstanceType<typeof Camera>;
@ -200,7 +226,6 @@ export default class GiftedPhotoDialog extends Vue {
<canvas id="canvas" width="320" height="240"></canvas>
async cameraClicked() {
console.log("camera_button clicked");
const video = document.querySelector("#video");
const stream = await navigator.mediaDevices.getUserMedia({
video: true,
@ -211,7 +236,6 @@ export default class GiftedPhotoDialog extends Vue {
}
}
photoSnapped() {
console.log("snap_photo clicked");
const video = document.querySelector("#video");
const canvas = document.querySelector("#canvas");
if (
@ -232,7 +256,6 @@ export default class GiftedPhotoDialog extends Vue {
// data url of the image
const image_data_url = canvas?.toDataURL("image/jpeg");
console.log(image_data_url);
}
}
****/

4
src/views/HelpView.vue

@ -198,9 +198,7 @@
<ul>
<li class="list-disc list-outside ml-4">
Chrome:
<a href="chrome://settings/content/all" class="text-blue-500"
>clear here</a
>
Clear at chrome://settings/content/all and
also clear under dev tools Application
</li>
<li class="list-disc list-outside ml-4">

Loading…
Cancel
Save