Browse Source

add a camera-switch button

feat/vitejs-trent
Trent Larson 8 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" class="text-blue-500"
> >
More Options Photo, ...
</router-link> </router-link>
</span> </span>
</div> </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: 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 }" :resolution="{ width: 375, height: 812 }"
--> -->
<camera facingMode="environment" autoplay ref="camera"> <camera
facingMode="environment"
autoplay
ref="camera"
@started="cameraStarted"
>
<div <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" 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> <fa icon="camera" class="w-[1em]"></fa>
</button> </button>
</div> </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> </camera>
</div> </div>
</div> </div>
@ -80,12 +93,11 @@ import { accessToken } from "@/libs/crypto";
export default class GiftedPhotoDialog extends Vue { export default class GiftedPhotoDialog extends Vue {
$notify!: (notification: NotificationIface, timeout?: number) => void; $notify!: (notification: NotificationIface, timeout?: number) => void;
activeDeviceNumber = 0;
activeDid = ""; activeDid = "";
blob: Blob | null = null; blob: Blob | null = null;
numDevices = 0;
setImage: (arg: string) => void = () => {}; setImage: (arg: string) => void = () => {};
imageHeight?: number = window.innerHeight / 2;
imageWidth?: number = window.innerWidth / 2;
imageWarning = ".";
uploading = false; uploading = false;
visible = false; visible = false;
@ -129,6 +141,20 @@ export default class GiftedPhotoDialog extends Vue {
this.blob = null; 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 */) { async takeImage(/* payload: MouseEvent */) {
const cameraComponent = this.$refs.camera as InstanceType<typeof Camera>; 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> <canvas id="canvas" width="320" height="240"></canvas>
async cameraClicked() { async cameraClicked() {
console.log("camera_button clicked");
const video = document.querySelector("#video"); const video = document.querySelector("#video");
const stream = await navigator.mediaDevices.getUserMedia({ const stream = await navigator.mediaDevices.getUserMedia({
video: true, video: true,
@ -211,7 +236,6 @@ export default class GiftedPhotoDialog extends Vue {
} }
} }
photoSnapped() { photoSnapped() {
console.log("snap_photo clicked");
const video = document.querySelector("#video"); const video = document.querySelector("#video");
const canvas = document.querySelector("#canvas"); const canvas = document.querySelector("#canvas");
if ( if (
@ -232,7 +256,6 @@ export default class GiftedPhotoDialog extends Vue {
// data url of the image // data url of the image
const image_data_url = canvas?.toDataURL("image/jpeg"); const image_data_url = canvas?.toDataURL("image/jpeg");
console.log(image_data_url);
} }
} }
****/ ****/

4
src/views/HelpView.vue

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

Loading…
Cancel
Save