| 
						
						
							
								
							
						
						
					 | 
					@ -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); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  ****/ | 
					 | 
					 | 
					  ****/ | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |