@capgo/camera-preview 7.4.0-alpha.3 → 7.4.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sources":["esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["export var DeviceType;\n(function (DeviceType) {\n DeviceType[\"ULTRA_WIDE\"] = \"ultraWide\";\n DeviceType[\"WIDE_ANGLE\"] = \"wideAngle\";\n DeviceType[\"TELEPHOTO\"] = \"telephoto\";\n DeviceType[\"TRUE_DEPTH\"] = \"trueDepth\";\n DeviceType[\"DUAL\"] = \"dual\";\n DeviceType[\"DUAL_WIDE\"] = \"dualWide\";\n DeviceType[\"TRIPLE\"] = \"triple\";\n})(DeviceType || (DeviceType = {}));\n//# sourceMappingURL=definitions.js.map","import { registerPlugin } from \"@capacitor/core\";\nconst CameraPreview = registerPlugin(\"CameraPreview\", {\n web: () => import(\"./web\").then((m) => new m.CameraPreviewWeb()),\n});\nexport * from \"./definitions\";\nexport { CameraPreview };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nimport { DeviceType } from \"./definitions\";\nconst DEFAULT_VIDEO_ID = \"capgo_video\";\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n /**\n * track which camera is used based on start options\n * used in capture\n */\n this.isBackCamera = false;\n this.currentDeviceId = null;\n this.videoElement = null;\n this.isStarted = false;\n }\n async getSupportedPictureSizes() {\n throw new Error(\"getSupportedPictureSizes not supported under the web platform\");\n }\n async start(options) {\n if (options.aspectRatio && (options.width || options.height)) {\n throw new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\");\n }\n if (this.isStarted) {\n throw new Error(\"camera already started\");\n }\n this.isBackCamera = true;\n this.isStarted = false;\n const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || \"\");\n const gridMode = (options === null || options === void 0 ? void 0 : options.gridMode) || \"none\";\n const positioning = (options === null || options === void 0 ? void 0 : options.positioning) || \"top\";\n if (options.position) {\n this.isBackCamera = options.position === \"rear\";\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.remove();\n }\n const container = options.parent\n ? document.getElementById(options.parent)\n : document.body;\n if (!container) {\n throw new Error(\"container not found\");\n }\n this.videoElement = document.createElement(\"video\");\n this.videoElement.id = DEFAULT_VIDEO_ID;\n this.videoElement.className = options.className || \"\";\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.autoplay = true;\n // Remove objectFit as we'll match camera's native aspect ratio\n this.videoElement.style.backgroundColor = \"transparent\";\n // Reset any default margins that might interfere\n this.videoElement.style.margin = \"0\";\n this.videoElement.style.padding = \"0\";\n container.appendChild(this.videoElement);\n if (options.toBack) {\n this.videoElement.style.zIndex = \"-1\";\n }\n // Default to 16:9 vertical (9:16 for portrait) if no aspect ratio or size specified\n const useDefaultAspectRatio = !options.aspectRatio && !options.width && !options.height;\n const effectiveAspectRatio = options.aspectRatio || (useDefaultAspectRatio ? \"16:9\" : null);\n if (options.width) {\n this.videoElement.width = options.width;\n this.videoElement.style.width = `${options.width}px`;\n }\n if (options.height) {\n this.videoElement.height = options.height;\n this.videoElement.style.height = `${options.height}px`;\n }\n // Handle positioning - center if x or y not provided\n const centerX = options.x === undefined;\n const centerY = options.y === undefined;\n // Always set position to absolute for proper positioning\n this.videoElement.style.position = \"absolute\";\n console.log(\"Initial positioning flags:\", {\n centerX,\n centerY,\n x: options.x,\n y: options.y,\n });\n if (options.x !== undefined) {\n this.videoElement.style.left = `${options.x}px`;\n }\n if (options.y !== undefined) {\n this.videoElement.style.top = `${options.y}px`;\n }\n // Create and add grid overlay if needed\n if (gridMode !== \"none\") {\n const gridOverlay = this.createGridOverlay(gridMode);\n gridOverlay.id = \"camera-grid-overlay\";\n parent === null || parent === void 0 ? void 0 : parent.appendChild(gridOverlay);\n }\n // Aspect ratio handling is now done after getting camera stream\n // Store centering flags for later use\n const needsCenterX = centerX;\n const needsCenterY = centerY;\n console.log(\"Centering flags stored:\", { needsCenterX, needsCenterY });\n // First get the camera stream with basic constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n },\n };\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (!stream) {\n throw new Error(\"could not acquire stream\");\n }\n if (!this.videoElement) {\n throw new Error(\"video element not found\");\n }\n // Get the actual camera dimensions from the video track\n const videoTrack = stream.getVideoTracks()[0];\n const settings = videoTrack.getSettings();\n const cameraWidth = settings.width || 640;\n const cameraHeight = settings.height || 480;\n const cameraAspectRatio = cameraWidth / cameraHeight;\n console.log(\"Camera native dimensions:\", {\n width: cameraWidth,\n height: cameraHeight,\n aspectRatio: cameraAspectRatio,\n });\n console.log(\"Container dimensions:\", {\n width: container.offsetWidth,\n height: container.offsetHeight,\n id: container.id,\n });\n // Now adjust video element size based on camera's native aspect ratio\n if (!options.width && !options.height && !options.aspectRatio) {\n // No size specified, fit camera view within container bounds\n const containerWidth = container.offsetWidth || window.innerWidth;\n const containerHeight = container.offsetHeight || window.innerHeight;\n // Calculate dimensions that fit within container while maintaining camera aspect ratio\n let targetWidth, targetHeight;\n // Try fitting to container width first\n targetWidth = containerWidth;\n targetHeight = targetWidth / cameraAspectRatio;\n // If height exceeds container, fit to height instead\n if (targetHeight > containerHeight) {\n targetHeight = containerHeight;\n targetWidth = targetHeight * cameraAspectRatio;\n }\n console.log(\"Video element dimensions:\", {\n width: targetWidth,\n height: targetHeight,\n container: { width: containerWidth, height: containerHeight },\n });\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const x = Math.round((containerWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n // Force a style recalculation\n this.videoElement.offsetHeight;\n console.log(\"Positioning video:\", {\n positioning,\n viewportHeight: window.innerHeight,\n targetHeight,\n calculatedY: y,\n actualTop: this.videoElement.style.top,\n position: this.videoElement.style.position,\n });\n }\n }\n else if (effectiveAspectRatio && !options.width && !options.height) {\n // Aspect ratio specified but no size\n const [widthRatio, heightRatio] = effectiveAspectRatio\n .split(\":\")\n .map(Number);\n const targetRatio = widthRatio / heightRatio;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n let targetWidth, targetHeight;\n // Try fitting to viewport width first\n targetWidth = viewportWidth;\n targetHeight = targetWidth / targetRatio;\n // If height exceeds viewport, fit to height instead\n if (targetHeight > viewportHeight) {\n targetHeight = viewportHeight;\n targetWidth = targetHeight * targetRatio;\n }\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const parentWidth = container.offsetWidth || viewportWidth;\n const x = Math.round((parentWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n const parentHeight = container.offsetHeight || viewportHeight;\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = parentHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((parentHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.top = `${y}px`;\n }\n }\n this.videoElement.srcObject = stream;\n if (!this.isBackCamera) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n // Set initial zoom level if specified and supported\n if (options.initialZoomLevel && options.initialZoomLevel !== 1.0) {\n // videoTrack already declared above\n if (videoTrack) {\n const capabilities = videoTrack.getCapabilities();\n if (capabilities.zoom) {\n const zoomLevel = options.initialZoomLevel;\n const minZoom = capabilities.zoom.min || 1;\n const maxZoom = capabilities.zoom.max || 1;\n if (zoomLevel < minZoom || zoomLevel > maxZoom) {\n stream.getTracks().forEach((track) => track.stop());\n throw new Error(`Initial zoom level ${zoomLevel} is not available. Valid range is ${minZoom} to ${maxZoom}`);\n }\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n console.warn(`Failed to set initial zoom level: ${error}`);\n // Don't throw, just continue without zoom\n }\n }\n }\n }\n this.isStarted = true;\n // Wait for video to be ready and get actual dimensions\n await new Promise((resolve) => {\n if (this.videoElement.readyState >= 2) {\n resolve();\n }\n else {\n this.videoElement.addEventListener(\"loadeddata\", () => resolve(), {\n once: true,\n });\n }\n });\n // Ensure centering is applied after DOM updates\n await new Promise((resolve) => requestAnimationFrame(resolve));\n console.log(\"About to re-center, flags:\", { needsCenterX, needsCenterY });\n // Re-apply centering with correct parent dimensions\n if (needsCenterX) {\n const parentWidth = container.offsetWidth;\n const x = Math.round((parentWidth - this.videoElement.offsetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n console.log(\"Re-centering X:\", {\n parentWidth,\n videoWidth: this.videoElement.offsetWidth,\n x,\n });\n }\n if (needsCenterY) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - this.videoElement.offsetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - this.videoElement.offsetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n console.log(\"Re-positioning Y:\", {\n positioning,\n viewportHeight: window.innerHeight,\n videoHeight: this.videoElement.offsetHeight,\n y,\n position: this.videoElement.style.position,\n top: this.videoElement.style.top,\n });\n }\n // Get the actual rendered dimensions after video is loaded\n const rect = this.videoElement.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(this.videoElement);\n console.log(\"Final video element state:\", {\n rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n style: {\n position: computedStyle.position,\n left: computedStyle.left,\n top: computedStyle.top,\n width: computedStyle.width,\n height: computedStyle.height,\n },\n });\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n };\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n this.isStarted = false;\n }\n // Remove grid overlay if it exists\n const gridOverlay = document.getElementById(\"camera-grid-overlay\");\n gridOverlay === null || gridOverlay === void 0 ? void 0 : gridOverlay.remove();\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n // Calculate capture dimensions\n let captureWidth = video.videoWidth;\n let captureHeight = video.videoHeight;\n let sourceX = 0;\n let sourceY = 0;\n // Check for conflicting parameters\n if (options.aspectRatio && (options.width || options.height)) {\n reject(new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\"));\n return;\n }\n // Handle aspect ratio if no width/height specified\n if (!options.width && !options.height && options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n if (widthRatio && heightRatio) {\n // For capture in portrait orientation, swap the aspect ratio (16:9 becomes 9:16)\n const isPortrait = video.videoHeight > video.videoWidth;\n const targetAspectRatio = isPortrait\n ? heightRatio / widthRatio\n : widthRatio / heightRatio;\n const videoAspectRatio = video.videoWidth / video.videoHeight;\n if (videoAspectRatio > targetAspectRatio) {\n // Video is wider than target - crop sides\n captureWidth = video.videoHeight * targetAspectRatio;\n captureHeight = video.videoHeight;\n sourceX = (video.videoWidth - captureWidth) / 2;\n }\n else {\n // Video is taller than target - crop top/bottom\n captureWidth = video.videoWidth;\n captureHeight = video.videoWidth / targetAspectRatio;\n sourceY = (video.videoHeight - captureHeight) / 2;\n }\n }\n }\n else if (options.width || options.height) {\n // If width or height is specified, use them\n if (options.width)\n captureWidth = options.width;\n if (options.height)\n captureHeight = options.height;\n }\n canvas.width = captureWidth;\n canvas.height = captureHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context === null || context === void 0 ? void 0 : context.translate(captureWidth, 0);\n context === null || context === void 0 ? void 0 : context.scale(-1, 1);\n }\n context === null || context === void 0 ? void 0 : context.drawImage(video, sourceX, sourceY, captureWidth, captureHeight, 0, 0, captureWidth, captureHeight);\n if (options.saveToGallery) {\n // saveToGallery is not supported on web\n }\n if (options.withExifLocation) {\n // withExifLocation is not supported on web\n }\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n }\n else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n resolve({\n value: base64EncodedImage,\n exif: {},\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n async startRecordVideo(_options) {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n async getSupportedFlashModes() {\n throw new Error(\"getSupportedFlashModes not supported under the web platform\");\n }\n async getHorizontalFov() {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Toggle camera position\n this.isBackCamera = !this.isBackCamera;\n // Get new constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update current device ID from the new stream\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n this.currentDeviceId = videoTrack.getSettings().deviceId || null;\n }\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to flip camera: ${error}`);\n }\n }\n async setOpacity(_options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n async isRunning() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n return { isRunning: !!video && !!video.srcObject };\n }\n async getAvailableDevices() {\n var _a;\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.enumerateDevices)) {\n throw new Error(\"getAvailableDevices not supported under the web platform\");\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n // Group devices by position (front/back)\n const frontDevices = [];\n const backDevices = [];\n videoDevices.forEach((device, index) => {\n const label = device.label || `Camera ${index + 1}`;\n const labelLower = label.toLowerCase();\n // Determine device type based on label\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n const lensInfo = {\n deviceId: device.deviceId,\n label,\n deviceType,\n focalLength: 4.25,\n baseZoomRatio,\n minZoom: 1.0,\n maxZoom: 1.0,\n };\n // Determine position and add to appropriate array\n if (labelLower.includes(\"back\") || labelLower.includes(\"rear\")) {\n backDevices.push(lensInfo);\n }\n else {\n frontDevices.push(lensInfo);\n }\n });\n const result = [];\n if (frontDevices.length > 0) {\n result.push({\n deviceId: frontDevices[0].deviceId,\n label: \"Front Camera\",\n position: \"front\",\n lenses: frontDevices,\n isLogical: false,\n minZoom: Math.min(...frontDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...frontDevices.map((d) => d.maxZoom)),\n });\n }\n if (backDevices.length > 0) {\n result.push({\n deviceId: backDevices[0].deviceId,\n label: \"Back Camera\",\n position: \"rear\",\n lenses: backDevices,\n isLogical: false,\n minZoom: Math.min(...backDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...backDevices.map((d) => d.maxZoom)),\n });\n }\n return { devices: result };\n }\n async getZoom() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n const settings = videoTrack.getSettings();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n // Get current device info to determine lens type\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (this.currentDeviceId) {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === this.currentDeviceId);\n if (device) {\n const labelLower = device.label.toLowerCase();\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n }\n }\n const currentZoom = settings.zoom || 1;\n const lensInfo = {\n focalLength: 4.25,\n deviceType,\n baseZoomRatio,\n digitalZoom: currentZoom / baseZoomRatio,\n };\n return {\n min: capabilities.zoom.min || 1,\n max: capabilities.zoom.max || 1,\n current: currentZoom,\n lens: lensInfo,\n };\n }\n async setZoom(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n const zoomLevel = Math.max(capabilities.zoom.min || 1, Math.min(capabilities.zoom.max || 1, options.level));\n // Note: autoFocus is not supported on web platform\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n throw new Error(`Failed to set zoom: ${error}`);\n }\n }\n async getFlashMode() {\n throw new Error(\"getFlashMode not supported under the web platform\");\n }\n async getDeviceId() {\n return { deviceId: this.currentDeviceId || \"\" };\n }\n async setDeviceId(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Update current device ID\n this.currentDeviceId = options.deviceId;\n // Get new constraints with specific device ID\n const constraints = {\n video: {\n deviceId: { exact: options.deviceId },\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n // Try to determine camera position from device\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === options.deviceId);\n this.isBackCamera =\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"back\")) ||\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"rear\")) ||\n false;\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to swap to device ${options.deviceId}: ${error}`);\n }\n }\n async getAspectRatio() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const width = video.offsetWidth;\n const height = video.offsetHeight;\n if (width && height) {\n const ratio = width / height;\n // Check for portrait camera ratios: 4:3 -> 3:4, 16:9 -> 9:16\n if (Math.abs(ratio - 3 / 4) < 0.01) {\n return { aspectRatio: \"4:3\" };\n }\n if (Math.abs(ratio - 9 / 16) < 0.01) {\n return { aspectRatio: \"16:9\" };\n }\n }\n // Default to 4:3 if no specific aspect ratio is matched\n return { aspectRatio: \"4:3\" };\n }\n async setAspectRatio(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n if (options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n // For camera, use portrait orientation: 4:3 becomes 3:4, 16:9 becomes 9:16\n const ratio = heightRatio / widthRatio;\n // Get current position and size\n const rect = video.getBoundingClientRect();\n const currentWidth = rect.width;\n const currentHeight = rect.height;\n const currentRatio = currentWidth / currentHeight;\n let newWidth;\n let newHeight;\n if (currentRatio > ratio) {\n // Width is larger, fit by height and center horizontally\n newWidth = currentHeight * ratio;\n newHeight = currentHeight;\n }\n else {\n // Height is larger, fit by width and center vertically\n newWidth = currentWidth;\n newHeight = currentWidth / ratio;\n }\n // Calculate position\n let x, y;\n if (options.x !== undefined && options.y !== undefined) {\n // Use provided coordinates, ensuring they stay within screen boundaries\n x = Math.max(0, Math.min(options.x, window.innerWidth - newWidth));\n y = Math.max(0, Math.min(options.y, window.innerHeight - newHeight));\n }\n else {\n // Auto-center the view\n x = (window.innerWidth - newWidth) / 2;\n y = (window.innerHeight - newHeight) / 2;\n }\n video.style.width = `${newWidth}px`;\n video.style.height = `${newHeight}px`;\n video.style.left = `${x}px`;\n video.style.top = `${y}px`;\n video.style.position = \"absolute\";\n const offsetX = newWidth / 8;\n const offsetY = newHeight / 8;\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight),\n x: Math.round(x + offsetX),\n y: Math.round(y + offsetY),\n };\n }\n else {\n video.style.objectFit = \"cover\";\n const rect = video.getBoundingClientRect();\n const offsetX = rect.width / 8;\n const offsetY = rect.height / 8;\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.left + offsetX),\n y: Math.round(rect.top + offsetY),\n };\n }\n }\n createGridOverlay(gridMode) {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"10\";\n const divisions = gridMode === \"3x3\" ? 3 : 4;\n // Create SVG for grid lines\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.style.width = \"100%\";\n svg.style.height = \"100%\";\n svg.style.position = \"absolute\";\n svg.style.top = \"0\";\n svg.style.left = \"0\";\n // Create grid lines\n for (let i = 1; i < divisions; i++) {\n // Vertical lines\n const verticalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n verticalLine.setAttribute(\"x1\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y1\", \"0%\");\n verticalLine.setAttribute(\"x2\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y2\", \"100%\");\n verticalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n verticalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(verticalLine);\n // Horizontal lines\n const horizontalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n horizontalLine.setAttribute(\"x1\", \"0%\");\n horizontalLine.setAttribute(\"y1\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"x2\", \"100%\");\n horizontalLine.setAttribute(\"y2\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n horizontalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(horizontalLine);\n }\n overlay.appendChild(svg);\n return overlay;\n }\n async setGridMode(options) {\n // Web implementation of grid mode would need to be implemented\n // For now, just resolve as a no-op\n console.warn(`Grid mode '${options.gridMode}' is not yet implemented for web platform`);\n }\n async getGridMode() {\n // Web implementation - default to none\n return { gridMode: \"none\" };\n }\n async getPreviewSize() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const offsetX = video.width / 8;\n const offsetY = video.height / 8;\n return {\n x: video.offsetLeft + offsetX,\n y: video.offsetTop + offsetY,\n width: video.width,\n height: video.height,\n };\n }\n async setPreviewSize(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n video.style.left = `${options.x}px`;\n video.style.top = `${options.y}px`;\n video.width = options.width;\n video.height = options.height;\n const offsetX = options.width / 8;\n const offsetY = options.height / 8;\n return {\n width: options.width,\n height: options.height,\n x: options.x + offsetX,\n y: options.y + offsetY,\n };\n }\n async setFocus(options) {\n // Reject if values are outside 0-1 range\n if (options.x < 0 || options.x > 1 || options.y < 0 || options.y > 1) {\n throw new Error(\"Focus coordinates must be between 0 and 1\");\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n // Check if focusing is supported\n if (capabilities.focusMode) {\n try {\n // Web API supports focus mode settings but not coordinate-based focus\n // Setting to manual mode allows for coordinate focus if supported\n await videoTrack.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n focusDistance: 0.5, // Mid-range focus as fallback\n },\n ],\n });\n }\n catch (error) {\n console.warn(`setFocus is not fully supported on this device: ${error}. Focus coordinates (${options.x}, ${options.y}) were provided but cannot be applied.`);\n }\n }\n else {\n console.warn(\"Focus control is not supported on this device. Focus coordinates were provided but cannot be applied.\");\n }\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["DeviceType","registerPlugin","WebPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sources":["esm/definitions.js","esm/index.js","esm/web.js"],"sourcesContent":["export var DeviceType;\n(function (DeviceType) {\n DeviceType[\"ULTRA_WIDE\"] = \"ultraWide\";\n DeviceType[\"WIDE_ANGLE\"] = \"wideAngle\";\n DeviceType[\"TELEPHOTO\"] = \"telephoto\";\n DeviceType[\"TRUE_DEPTH\"] = \"trueDepth\";\n DeviceType[\"DUAL\"] = \"dual\";\n DeviceType[\"DUAL_WIDE\"] = \"dualWide\";\n DeviceType[\"TRIPLE\"] = \"triple\";\n})(DeviceType || (DeviceType = {}));\n//# sourceMappingURL=definitions.js.map","import { Capacitor, registerPlugin } from \"@capacitor/core\";\nconst CameraPreview = registerPlugin(\"CameraPreview\", {\n web: () => import(\"./web\").then((m) => new m.CameraPreviewWeb()),\n});\nexport * from \"./definitions\";\nexport { CameraPreview };\nexport async function getBase64FromFilePath(filePath) {\n const url = Capacitor.convertFileSrc(filePath);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to read file at path: ${filePath} (status ${response.status})`);\n }\n const blob = await response.blob();\n return await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const dataUrl = reader.result;\n const commaIndex = dataUrl.indexOf(\",\");\n resolve(commaIndex >= 0 ? dataUrl.substring(commaIndex + 1) : dataUrl);\n };\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(blob);\n });\n}\nexport async function deleteFile(path) {\n // Use native bridge to delete file to handle platform-specific permissions/URIs\n const { success } = await CameraPreview.deleteFile({ path });\n return !!success;\n}\n//# sourceMappingURL=index.js.map","import { WebPlugin } from \"@capacitor/core\";\nimport { DeviceType } from \"./definitions\";\nconst DEFAULT_VIDEO_ID = \"capgo_video\";\nexport class CameraPreviewWeb extends WebPlugin {\n constructor() {\n super();\n /**\n * track which camera is used based on start options\n * used in capture\n */\n this.isBackCamera = false;\n this.currentDeviceId = null;\n this.videoElement = null;\n this.isStarted = false;\n }\n async getSupportedPictureSizes() {\n throw new Error(\"getSupportedPictureSizes not supported under the web platform\");\n }\n async start(options) {\n if (options.aspectRatio && (options.width || options.height)) {\n throw new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\");\n }\n if (this.isStarted) {\n throw new Error(\"camera already started\");\n }\n this.isBackCamera = true;\n this.isStarted = false;\n const parent = document.getElementById((options === null || options === void 0 ? void 0 : options.parent) || \"\");\n const gridMode = (options === null || options === void 0 ? void 0 : options.gridMode) || \"none\";\n const positioning = (options === null || options === void 0 ? void 0 : options.positioning) || \"top\";\n if (options.position) {\n this.isBackCamera = options.position === \"rear\";\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.remove();\n }\n const container = options.parent\n ? document.getElementById(options.parent)\n : document.body;\n if (!container) {\n throw new Error(\"container not found\");\n }\n this.videoElement = document.createElement(\"video\");\n this.videoElement.id = DEFAULT_VIDEO_ID;\n this.videoElement.className = options.className || \"\";\n this.videoElement.playsInline = true;\n this.videoElement.muted = true;\n this.videoElement.autoplay = true;\n // Remove objectFit as we'll match camera's native aspect ratio\n this.videoElement.style.backgroundColor = \"transparent\";\n // Reset any default margins that might interfere\n this.videoElement.style.margin = \"0\";\n this.videoElement.style.padding = \"0\";\n container.appendChild(this.videoElement);\n if (options.toBack) {\n this.videoElement.style.zIndex = \"-1\";\n }\n // Default to 16:9 vertical (9:16 for portrait) if no aspect ratio or size specified\n const useDefaultAspectRatio = !options.aspectRatio && !options.width && !options.height;\n const effectiveAspectRatio = options.aspectRatio || (useDefaultAspectRatio ? \"16:9\" : null);\n if (options.width) {\n this.videoElement.width = options.width;\n this.videoElement.style.width = `${options.width}px`;\n }\n if (options.height) {\n this.videoElement.height = options.height;\n this.videoElement.style.height = `${options.height}px`;\n }\n // Handle positioning - center if x or y not provided\n const centerX = options.x === undefined;\n const centerY = options.y === undefined;\n // Always set position to absolute for proper positioning\n this.videoElement.style.position = \"absolute\";\n console.log(\"Initial positioning flags:\", {\n centerX,\n centerY,\n x: options.x,\n y: options.y,\n });\n if (options.x !== undefined) {\n this.videoElement.style.left = `${options.x}px`;\n }\n if (options.y !== undefined) {\n this.videoElement.style.top = `${options.y}px`;\n }\n // Create and add grid overlay if needed\n if (gridMode !== \"none\") {\n const gridOverlay = this.createGridOverlay(gridMode);\n gridOverlay.id = \"camera-grid-overlay\";\n parent === null || parent === void 0 ? void 0 : parent.appendChild(gridOverlay);\n }\n // Aspect ratio handling is now done after getting camera stream\n // Store centering flags for later use\n const needsCenterX = centerX;\n const needsCenterY = centerY;\n console.log(\"Centering flags stored:\", { needsCenterX, needsCenterY });\n // First get the camera stream with basic constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n },\n };\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n if (!stream) {\n throw new Error(\"could not acquire stream\");\n }\n if (!this.videoElement) {\n throw new Error(\"video element not found\");\n }\n // Get the actual camera dimensions from the video track\n const videoTrack = stream.getVideoTracks()[0];\n const settings = videoTrack.getSettings();\n const cameraWidth = settings.width || 640;\n const cameraHeight = settings.height || 480;\n const cameraAspectRatio = cameraWidth / cameraHeight;\n console.log(\"Camera native dimensions:\", {\n width: cameraWidth,\n height: cameraHeight,\n aspectRatio: cameraAspectRatio,\n });\n console.log(\"Container dimensions:\", {\n width: container.offsetWidth,\n height: container.offsetHeight,\n id: container.id,\n });\n // Now adjust video element size based on camera's native aspect ratio\n if (!options.width && !options.height && !options.aspectRatio) {\n // No size specified, fit camera view within container bounds\n const containerWidth = container.offsetWidth || window.innerWidth;\n const containerHeight = container.offsetHeight || window.innerHeight;\n // Calculate dimensions that fit within container while maintaining camera aspect ratio\n let targetWidth, targetHeight;\n // Try fitting to container width first\n targetWidth = containerWidth;\n targetHeight = targetWidth / cameraAspectRatio;\n // If height exceeds container, fit to height instead\n if (targetHeight > containerHeight) {\n targetHeight = containerHeight;\n targetWidth = targetHeight * cameraAspectRatio;\n }\n console.log(\"Video element dimensions:\", {\n width: targetWidth,\n height: targetHeight,\n container: { width: containerWidth, height: containerHeight },\n });\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const x = Math.round((containerWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n // Force a style recalculation\n this.videoElement.offsetHeight;\n console.log(\"Positioning video:\", {\n positioning,\n viewportHeight: window.innerHeight,\n targetHeight,\n calculatedY: y,\n actualTop: this.videoElement.style.top,\n position: this.videoElement.style.position,\n });\n }\n }\n else if (effectiveAspectRatio && !options.width && !options.height) {\n // Aspect ratio specified but no size\n const [widthRatio, heightRatio] = effectiveAspectRatio\n .split(\":\")\n .map(Number);\n const targetRatio = widthRatio / heightRatio;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n let targetWidth, targetHeight;\n // Try fitting to viewport width first\n targetWidth = viewportWidth;\n targetHeight = targetWidth / targetRatio;\n // If height exceeds viewport, fit to height instead\n if (targetHeight > viewportHeight) {\n targetHeight = viewportHeight;\n targetWidth = targetHeight * targetRatio;\n }\n this.videoElement.width = targetWidth;\n this.videoElement.height = targetHeight;\n this.videoElement.style.width = `${targetWidth}px`;\n this.videoElement.style.height = `${targetHeight}px`;\n // Center the video element within its parent container\n if (needsCenterX || options.x === undefined) {\n const parentWidth = container.offsetWidth || viewportWidth;\n const x = Math.round((parentWidth - targetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n }\n if (needsCenterY || options.y === undefined) {\n const parentHeight = container.offsetHeight || viewportHeight;\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = parentHeight - targetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((parentHeight - targetHeight) / 2);\n break;\n }\n this.videoElement.style.top = `${y}px`;\n }\n }\n this.videoElement.srcObject = stream;\n if (!this.isBackCamera) {\n this.videoElement.style.transform = \"scaleX(-1)\";\n }\n // Set initial zoom level if specified and supported\n if (options.initialZoomLevel && options.initialZoomLevel !== 1.0) {\n // videoTrack already declared above\n if (videoTrack) {\n const capabilities = videoTrack.getCapabilities();\n if (capabilities.zoom) {\n const zoomLevel = options.initialZoomLevel;\n const minZoom = capabilities.zoom.min || 1;\n const maxZoom = capabilities.zoom.max || 1;\n if (zoomLevel < minZoom || zoomLevel > maxZoom) {\n stream.getTracks().forEach((track) => track.stop());\n throw new Error(`Initial zoom level ${zoomLevel} is not available. Valid range is ${minZoom} to ${maxZoom}`);\n }\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n console.warn(`Failed to set initial zoom level: ${error}`);\n // Don't throw, just continue without zoom\n }\n }\n }\n }\n this.isStarted = true;\n // Wait for video to be ready and get actual dimensions\n await new Promise((resolve) => {\n if (this.videoElement.readyState >= 2) {\n resolve();\n }\n else {\n this.videoElement.addEventListener(\"loadeddata\", () => resolve(), {\n once: true,\n });\n }\n });\n // Ensure centering is applied after DOM updates\n await new Promise((resolve) => requestAnimationFrame(resolve));\n console.log(\"About to re-center, flags:\", { needsCenterX, needsCenterY });\n // Re-apply centering with correct parent dimensions\n if (needsCenterX) {\n const parentWidth = container.offsetWidth;\n const x = Math.round((parentWidth - this.videoElement.offsetWidth) / 2);\n this.videoElement.style.left = `${x}px`;\n console.log(\"Re-centering X:\", {\n parentWidth,\n videoWidth: this.videoElement.offsetWidth,\n x,\n });\n }\n if (needsCenterY) {\n let y;\n switch (positioning) {\n case \"top\":\n y = 0;\n break;\n case \"bottom\":\n y = window.innerHeight - this.videoElement.offsetHeight;\n break;\n case \"center\":\n default:\n y = Math.round((window.innerHeight - this.videoElement.offsetHeight) / 2);\n break;\n }\n this.videoElement.style.setProperty(\"top\", `${y}px`, \"important\");\n console.log(\"Re-positioning Y:\", {\n positioning,\n viewportHeight: window.innerHeight,\n videoHeight: this.videoElement.offsetHeight,\n y,\n position: this.videoElement.style.position,\n top: this.videoElement.style.top,\n });\n }\n // Get the actual rendered dimensions after video is loaded\n const rect = this.videoElement.getBoundingClientRect();\n const computedStyle = window.getComputedStyle(this.videoElement);\n console.log(\"Final video element state:\", {\n rect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height },\n style: {\n position: computedStyle.position,\n left: computedStyle.left,\n top: computedStyle.top,\n width: computedStyle.width,\n height: computedStyle.height,\n },\n });\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n };\n }\n stopStream(stream) {\n if (stream) {\n const tracks = stream.getTracks();\n for (const track of tracks)\n track.stop();\n }\n }\n async stop() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (video) {\n video.pause();\n this.stopStream(video.srcObject);\n video.remove();\n this.isStarted = false;\n }\n // Remove grid overlay if it exists\n const gridOverlay = document.getElementById(\"camera-grid-overlay\");\n gridOverlay === null || gridOverlay === void 0 ? void 0 : gridOverlay.remove();\n }\n async capture(options) {\n return new Promise((resolve, reject) => {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n reject(new Error(\"camera is not running\"));\n return;\n }\n // video.width = video.offsetWidth;\n let base64EncodedImage;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n const canvas = document.createElement(\"canvas\");\n const context = canvas.getContext(\"2d\");\n // Calculate capture dimensions\n let captureWidth = video.videoWidth;\n let captureHeight = video.videoHeight;\n let sourceX = 0;\n let sourceY = 0;\n // Check for conflicting parameters\n if (options.aspectRatio && (options.width || options.height)) {\n reject(new Error(\"Cannot set both aspectRatio and size (width/height). Use setPreviewSize after start.\"));\n return;\n }\n // Handle aspect ratio if no width/height specified\n if (!options.width && !options.height && options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n if (widthRatio && heightRatio) {\n // For capture in portrait orientation, swap the aspect ratio (16:9 becomes 9:16)\n const isPortrait = video.videoHeight > video.videoWidth;\n const targetAspectRatio = isPortrait\n ? heightRatio / widthRatio\n : widthRatio / heightRatio;\n const videoAspectRatio = video.videoWidth / video.videoHeight;\n if (videoAspectRatio > targetAspectRatio) {\n // Video is wider than target - crop sides\n captureWidth = video.videoHeight * targetAspectRatio;\n captureHeight = video.videoHeight;\n sourceX = (video.videoWidth - captureWidth) / 2;\n }\n else {\n // Video is taller than target - crop top/bottom\n captureWidth = video.videoWidth;\n captureHeight = video.videoWidth / targetAspectRatio;\n sourceY = (video.videoHeight - captureHeight) / 2;\n }\n }\n }\n else if (options.width || options.height) {\n // If width or height is specified, use them\n if (options.width)\n captureWidth = options.width;\n if (options.height)\n captureHeight = options.height;\n }\n canvas.width = captureWidth;\n canvas.height = captureHeight;\n // flip horizontally back camera isn't used\n if (!this.isBackCamera) {\n context === null || context === void 0 ? void 0 : context.translate(captureWidth, 0);\n context === null || context === void 0 ? void 0 : context.scale(-1, 1);\n }\n context === null || context === void 0 ? void 0 : context.drawImage(video, sourceX, sourceY, captureWidth, captureHeight, 0, 0, captureWidth, captureHeight);\n if (options.saveToGallery) {\n // saveToGallery is not supported on web\n }\n if (options.withExifLocation) {\n // withExifLocation is not supported on web\n }\n if ((options.format || \"jpeg\") === \"jpeg\") {\n base64EncodedImage = canvas\n .toDataURL(\"image/jpeg\", (options.quality || 85) / 100.0)\n .replace(\"data:image/jpeg;base64,\", \"\");\n }\n else {\n base64EncodedImage = canvas\n .toDataURL(\"image/png\")\n .replace(\"data:image/png;base64,\", \"\");\n }\n }\n resolve({\n value: base64EncodedImage,\n exif: {},\n });\n });\n }\n async captureSample(_options) {\n return this.capture(_options);\n }\n async stopRecordVideo() {\n throw new Error(\"stopRecordVideo not supported under the web platform\");\n }\n async startRecordVideo(_options) {\n console.log(\"startRecordVideo\", _options);\n throw new Error(\"startRecordVideo not supported under the web platform\");\n }\n async getSupportedFlashModes() {\n throw new Error(\"getSupportedFlashModes not supported under the web platform\");\n }\n async getHorizontalFov() {\n throw new Error(\"getHorizontalFov not supported under the web platform\");\n }\n async setFlashMode(_options) {\n throw new Error(`setFlashMode not supported under the web platform${_options}`);\n }\n async flip() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Toggle camera position\n this.isBackCamera = !this.isBackCamera;\n // Get new constraints\n const constraints = {\n video: {\n facingMode: this.isBackCamera ? \"environment\" : \"user\",\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update current device ID from the new stream\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n this.currentDeviceId = videoTrack.getSettings().deviceId || null;\n }\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to flip camera: ${error}`);\n }\n }\n async setOpacity(_options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!!video && !!_options.opacity)\n video.style.setProperty(\"opacity\", _options.opacity.toString());\n }\n async isRunning() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n return { isRunning: !!video && !!video.srcObject };\n }\n async getAvailableDevices() {\n var _a;\n if (!((_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.enumerateDevices)) {\n throw new Error(\"getAvailableDevices not supported under the web platform\");\n }\n const devices = await navigator.mediaDevices.enumerateDevices();\n const videoDevices = devices.filter((device) => device.kind === \"videoinput\");\n // Group devices by position (front/back)\n const frontDevices = [];\n const backDevices = [];\n videoDevices.forEach((device, index) => {\n const label = device.label || `Camera ${index + 1}`;\n const labelLower = label.toLowerCase();\n // Determine device type based on label\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n const lensInfo = {\n deviceId: device.deviceId,\n label,\n deviceType,\n focalLength: 4.25,\n baseZoomRatio,\n minZoom: 1.0,\n maxZoom: 1.0,\n };\n // Determine position and add to appropriate array\n if (labelLower.includes(\"back\") || labelLower.includes(\"rear\")) {\n backDevices.push(lensInfo);\n }\n else {\n frontDevices.push(lensInfo);\n }\n });\n const result = [];\n if (frontDevices.length > 0) {\n result.push({\n deviceId: frontDevices[0].deviceId,\n label: \"Front Camera\",\n position: \"front\",\n lenses: frontDevices,\n isLogical: false,\n minZoom: Math.min(...frontDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...frontDevices.map((d) => d.maxZoom)),\n });\n }\n if (backDevices.length > 0) {\n result.push({\n deviceId: backDevices[0].deviceId,\n label: \"Back Camera\",\n position: \"rear\",\n lenses: backDevices,\n isLogical: false,\n minZoom: Math.min(...backDevices.map((d) => d.minZoom)),\n maxZoom: Math.max(...backDevices.map((d) => d.maxZoom)),\n });\n }\n return { devices: result };\n }\n async getZoom() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n const settings = videoTrack.getSettings();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n // Get current device info to determine lens type\n let deviceType = DeviceType.WIDE_ANGLE;\n let baseZoomRatio = 1.0;\n if (this.currentDeviceId) {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === this.currentDeviceId);\n if (device) {\n const labelLower = device.label.toLowerCase();\n if (labelLower.includes(\"ultra\") || labelLower.includes(\"0.5\")) {\n deviceType = DeviceType.ULTRA_WIDE;\n baseZoomRatio = 0.5;\n }\n else if (labelLower.includes(\"telephoto\") ||\n labelLower.includes(\"tele\") ||\n labelLower.includes(\"2x\") ||\n labelLower.includes(\"3x\")) {\n deviceType = DeviceType.TELEPHOTO;\n baseZoomRatio = 2.0;\n }\n else if (labelLower.includes(\"depth\") ||\n labelLower.includes(\"truedepth\")) {\n deviceType = DeviceType.TRUE_DEPTH;\n baseZoomRatio = 1.0;\n }\n }\n }\n const currentZoom = settings.zoom || 1;\n const lensInfo = {\n focalLength: 4.25,\n deviceType,\n baseZoomRatio,\n digitalZoom: currentZoom / baseZoomRatio,\n };\n return {\n min: capabilities.zoom.min || 1,\n max: capabilities.zoom.max || 1,\n current: currentZoom,\n lens: lensInfo,\n };\n }\n async setZoom(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n if (!capabilities.zoom) {\n throw new Error(\"zoom not supported by this device\");\n }\n const zoomLevel = Math.max(capabilities.zoom.min || 1, Math.min(capabilities.zoom.max || 1, options.level));\n // Note: autoFocus is not supported on web platform\n try {\n await videoTrack.applyConstraints({\n advanced: [{ zoom: zoomLevel }],\n });\n }\n catch (error) {\n throw new Error(`Failed to set zoom: ${error}`);\n }\n }\n async getFlashMode() {\n throw new Error(\"getFlashMode not supported under the web platform\");\n }\n async getDeviceId() {\n return { deviceId: this.currentDeviceId || \"\" };\n }\n async setDeviceId(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n // Stop current stream\n this.stopStream(video.srcObject);\n // Update current device ID\n this.currentDeviceId = options.deviceId;\n // Get new constraints with specific device ID\n const constraints = {\n video: {\n deviceId: { exact: options.deviceId },\n width: { ideal: video.videoWidth || 640 },\n height: { ideal: video.videoHeight || 480 },\n },\n };\n try {\n // Try to determine camera position from device\n const devices = await navigator.mediaDevices.enumerateDevices();\n const device = devices.find((d) => d.deviceId === options.deviceId);\n this.isBackCamera =\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"back\")) ||\n (device === null || device === void 0 ? void 0 : device.label.toLowerCase().includes(\"rear\")) ||\n false;\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n video.srcObject = stream;\n // Update video transform based on camera\n if (this.isBackCamera) {\n video.style.transform = \"none\";\n video.style.webkitTransform = \"none\";\n }\n else {\n video.style.transform = \"scaleX(-1)\";\n video.style.webkitTransform = \"scaleX(-1)\";\n }\n await video.play();\n }\n catch (error) {\n throw new Error(`Failed to swap to device ${options.deviceId}: ${error}`);\n }\n }\n async getAspectRatio() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const width = video.offsetWidth;\n const height = video.offsetHeight;\n if (width && height) {\n const ratio = width / height;\n // Check for portrait camera ratios: 4:3 -> 3:4, 16:9 -> 9:16\n if (Math.abs(ratio - 3 / 4) < 0.01) {\n return { aspectRatio: \"4:3\" };\n }\n if (Math.abs(ratio - 9 / 16) < 0.01) {\n return { aspectRatio: \"16:9\" };\n }\n }\n // Default to 4:3 if no specific aspect ratio is matched\n return { aspectRatio: \"4:3\" };\n }\n async setAspectRatio(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n if (options.aspectRatio) {\n const [widthRatio, heightRatio] = options.aspectRatio\n .split(\":\")\n .map(Number);\n // For camera, use portrait orientation: 4:3 becomes 3:4, 16:9 becomes 9:16\n const ratio = heightRatio / widthRatio;\n // Get current position and size\n const rect = video.getBoundingClientRect();\n const currentWidth = rect.width;\n const currentHeight = rect.height;\n const currentRatio = currentWidth / currentHeight;\n let newWidth;\n let newHeight;\n if (currentRatio > ratio) {\n // Width is larger, fit by height and center horizontally\n newWidth = currentHeight * ratio;\n newHeight = currentHeight;\n }\n else {\n // Height is larger, fit by width and center vertically\n newWidth = currentWidth;\n newHeight = currentWidth / ratio;\n }\n // Calculate position\n let x, y;\n if (options.x !== undefined && options.y !== undefined) {\n // Use provided coordinates, ensuring they stay within screen boundaries\n x = Math.max(0, Math.min(options.x, window.innerWidth - newWidth));\n y = Math.max(0, Math.min(options.y, window.innerHeight - newHeight));\n }\n else {\n // Auto-center the view\n x = (window.innerWidth - newWidth) / 2;\n y = (window.innerHeight - newHeight) / 2;\n }\n video.style.width = `${newWidth}px`;\n video.style.height = `${newHeight}px`;\n video.style.left = `${x}px`;\n video.style.top = `${y}px`;\n video.style.position = \"absolute\";\n const offsetX = newWidth / 8;\n const offsetY = newHeight / 8;\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight),\n x: Math.round(x + offsetX),\n y: Math.round(y + offsetY),\n };\n }\n else {\n video.style.objectFit = \"cover\";\n const rect = video.getBoundingClientRect();\n const offsetX = rect.width / 8;\n const offsetY = rect.height / 8;\n return {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n x: Math.round(rect.left + offsetX),\n y: Math.round(rect.top + offsetY),\n };\n }\n }\n createGridOverlay(gridMode) {\n const overlay = document.createElement(\"div\");\n overlay.style.position = \"absolute\";\n overlay.style.top = \"0\";\n overlay.style.left = \"0\";\n overlay.style.width = \"100%\";\n overlay.style.height = \"100%\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"10\";\n const divisions = gridMode === \"3x3\" ? 3 : 4;\n // Create SVG for grid lines\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.style.width = \"100%\";\n svg.style.height = \"100%\";\n svg.style.position = \"absolute\";\n svg.style.top = \"0\";\n svg.style.left = \"0\";\n // Create grid lines\n for (let i = 1; i < divisions; i++) {\n // Vertical lines\n const verticalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n verticalLine.setAttribute(\"x1\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y1\", \"0%\");\n verticalLine.setAttribute(\"x2\", `${(i / divisions) * 100}%`);\n verticalLine.setAttribute(\"y2\", \"100%\");\n verticalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n verticalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(verticalLine);\n // Horizontal lines\n const horizontalLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n horizontalLine.setAttribute(\"x1\", \"0%\");\n horizontalLine.setAttribute(\"y1\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"x2\", \"100%\");\n horizontalLine.setAttribute(\"y2\", `${(i / divisions) * 100}%`);\n horizontalLine.setAttribute(\"stroke\", \"rgba(255, 255, 255, 0.5)\");\n horizontalLine.setAttribute(\"stroke-width\", \"1\");\n svg.appendChild(horizontalLine);\n }\n overlay.appendChild(svg);\n return overlay;\n }\n async setGridMode(options) {\n // Web implementation of grid mode would need to be implemented\n // For now, just resolve as a no-op\n console.warn(`Grid mode '${options.gridMode}' is not yet implemented for web platform`);\n }\n async getGridMode() {\n // Web implementation - default to none\n return { gridMode: \"none\" };\n }\n async getPreviewSize() {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n const offsetX = video.width / 8;\n const offsetY = video.height / 8;\n return {\n x: video.offsetLeft + offsetX,\n y: video.offsetTop + offsetY,\n width: video.width,\n height: video.height,\n };\n }\n async setPreviewSize(options) {\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!video) {\n throw new Error(\"camera is not running\");\n }\n video.style.left = `${options.x}px`;\n video.style.top = `${options.y}px`;\n video.width = options.width;\n video.height = options.height;\n const offsetX = options.width / 8;\n const offsetY = options.height / 8;\n return {\n width: options.width,\n height: options.height,\n x: options.x + offsetX,\n y: options.y + offsetY,\n };\n }\n async setFocus(options) {\n // Reject if values are outside 0-1 range\n if (options.x < 0 || options.x > 1 || options.y < 0 || options.y > 1) {\n throw new Error(\"Focus coordinates must be between 0 and 1\");\n }\n const video = document.getElementById(DEFAULT_VIDEO_ID);\n if (!(video === null || video === void 0 ? void 0 : video.srcObject)) {\n throw new Error(\"camera is not running\");\n }\n const stream = video.srcObject;\n const videoTrack = stream.getVideoTracks()[0];\n if (!videoTrack) {\n throw new Error(\"no video track found\");\n }\n const capabilities = videoTrack.getCapabilities();\n // Check if focusing is supported\n if (capabilities.focusMode) {\n try {\n // Web API supports focus mode settings but not coordinate-based focus\n // Setting to manual mode allows for coordinate focus if supported\n await videoTrack.applyConstraints({\n advanced: [\n {\n focusMode: \"manual\",\n focusDistance: 0.5, // Mid-range focus as fallback\n },\n ],\n });\n }\n catch (error) {\n console.warn(`setFocus is not fully supported on this device: ${error}. Focus coordinates (${options.x}, ${options.y}) were provided but cannot be applied.`);\n }\n }\n else {\n console.warn(\"Focus control is not supported on this device. Focus coordinates were provided but cannot be applied.\");\n }\n }\n async deleteFile(_options) {\n throw new Error(\"deleteFile not supported under the web platform\");\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["DeviceType","registerPlugin","Capacitor","WebPlugin"],"mappings":"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"}
@@ -25,7 +25,7 @@ class CameraController: NSObject {
25
25
  var focusIndicatorView: UIView?
26
26
 
27
27
  var flashMode = AVCaptureDevice.FlashMode.off
28
- var photoCaptureCompletionBlock: ((UIImage?, Error?) -> Void)?
28
+ var photoCaptureCompletionBlock: ((UIImage?, Data?, [AnyHashable: Any]?, Error?) -> Void)?
29
29
 
30
30
  var sampleBufferCaptureCompletionBlock: ((UIImage?, Error?) -> Void)?
31
31
 
@@ -555,11 +555,11 @@ extension CameraController {
555
555
  self.updateVideoOrientation()
556
556
  }
557
557
 
558
- func captureImage(width: Int?, height: Int?, aspectRatio: String?, quality: Float, gpsLocation: CLLocation?, completion: @escaping (UIImage?, Error?) -> Void) {
558
+ func captureImage(width: Int?, height: Int?, aspectRatio: String?, quality: Float, gpsLocation: CLLocation?, completion: @escaping (UIImage?, Data?, [AnyHashable: Any]?, Error?) -> Void) {
559
559
  print("[CameraPreview] captureImage called - width: \(width ?? -1), height: \(height ?? -1), aspectRatio: \(aspectRatio ?? "nil")")
560
560
 
561
561
  guard let photoOutput = self.photoOutput else {
562
- completion(nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Photo output is not available"]))
562
+ completion(nil, nil, nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Photo output is not available"]))
563
563
  return
564
564
  }
565
565
 
@@ -585,14 +585,14 @@ extension CameraController {
585
585
  }
586
586
  }
587
587
 
588
- self.photoCaptureCompletionBlock = { (image, error) in
588
+ self.photoCaptureCompletionBlock = { (image, photoData, metadata, error) in
589
589
  if let error = error {
590
- completion(nil, error)
590
+ completion(nil, nil, nil, error)
591
591
  return
592
592
  }
593
593
 
594
594
  guard let image = image else {
595
- completion(nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to capture image"]))
595
+ completion(nil, nil, nil, NSError(domain: "Camera", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to capture image"]))
596
596
  return
597
597
  }
598
598
 
@@ -646,7 +646,7 @@ extension CameraController {
646
646
  }
647
647
  }
648
648
 
649
- completion(finalImage, nil)
649
+ completion(finalImage, photoData, metadata, nil)
650
650
  }
651
651
 
652
652
  photoOutput.capturePhoto(with: settings, delegate: self)
@@ -1460,22 +1460,23 @@ extension CameraController: UIGestureRecognizerDelegate {
1460
1460
  extension CameraController: AVCapturePhotoCaptureDelegate {
1461
1461
  public func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
1462
1462
  if let error = error {
1463
- self.photoCaptureCompletionBlock?(nil, error)
1463
+ self.photoCaptureCompletionBlock?(nil, nil, nil, error)
1464
1464
  return
1465
1465
  }
1466
1466
 
1467
1467
  // Get the photo data using the modern API
1468
1468
  guard let imageData = photo.fileDataRepresentation() else {
1469
- self.photoCaptureCompletionBlock?(nil, CameraControllerError.unknown)
1469
+ self.photoCaptureCompletionBlock?(nil, nil, nil, CameraControllerError.unknown)
1470
1470
  return
1471
1471
  }
1472
1472
 
1473
1473
  guard let image = UIImage(data: imageData) else {
1474
- self.photoCaptureCompletionBlock?(nil, CameraControllerError.unknown)
1474
+ self.photoCaptureCompletionBlock?(nil, nil, nil, CameraControllerError.unknown)
1475
1475
  return
1476
1476
  }
1477
1477
 
1478
- self.photoCaptureCompletionBlock?(image.fixedOrientation(), nil)
1478
+ // Pass through original file data and metadata so callers can preserve EXIF
1479
+ self.photoCaptureCompletionBlock?(image.fixedOrientation(), imageData, photo.metadata, nil)
1479
1480
  }
1480
1481
  }
1481
1482
 
@@ -65,7 +65,8 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
65
65
  CAPPluginMethod(name: "getGridMode", returnType: CAPPluginReturnPromise),
66
66
  CAPPluginMethod(name: "getPreviewSize", returnType: CAPPluginReturnPromise),
67
67
  CAPPluginMethod(name: "setPreviewSize", returnType: CAPPluginReturnPromise),
68
- CAPPluginMethod(name: "setFocus", returnType: CAPPluginReturnPromise)
68
+ CAPPluginMethod(name: "setFocus", returnType: CAPPluginReturnPromise),
69
+ CAPPluginMethod(name: "deleteFile", returnType: CAPPluginReturnPromise)
69
70
  ]
70
71
  // Camera state tracking
71
72
  private var isInitializing: Bool = false
@@ -705,7 +706,7 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
705
706
  print("[CameraPreview] Current location: \(self.currentLocation?.description ?? "nil")")
706
707
  print("[CameraPreview] Preview dimensions: \(self.previewView.frame.width)x\(self.previewView.frame.height)")
707
708
 
708
- self.cameraController.captureImage(width: width, height: height, aspectRatio: captureAspectRatio, quality: quality, gpsLocation: self.currentLocation) { (image, error) in
709
+ self.cameraController.captureImage(width: width, height: height, aspectRatio: captureAspectRatio, quality: quality, gpsLocation: self.currentLocation) { (image, originalPhotoData, _, error) in
709
710
  print("[CameraPreview] captureImage callback received")
710
711
  DispatchQueue.main.async {
711
712
  print("[CameraPreview] Processing capture on main thread")
@@ -719,7 +720,8 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
719
720
  let imageDataWithExif = self.createImageDataWithExif(
720
721
  from: image,
721
722
  quality: Int(quality),
722
- location: withExifLocation ? self.currentLocation : nil
723
+ location: withExifLocation ? self.currentLocation : nil,
724
+ originalPhotoData: originalPhotoData
723
725
  )
724
726
  else {
725
727
  print("[CameraPreview] Failed to create image data with EXIF")
@@ -792,24 +794,29 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
792
794
  return exifData
793
795
  }
794
796
 
795
- private func createImageDataWithExif(from image: UIImage, quality: Int, location: CLLocation?) -> Data? {
796
- guard let originalImageData = image.jpegData(compressionQuality: CGFloat(Double(quality) / 100.0)) else {
797
+ private func createImageDataWithExif(from image: UIImage, quality: Int, location: CLLocation?, originalPhotoData: Data?) -> Data? {
798
+ guard let jpegDataAtQuality = image.jpegData(compressionQuality: CGFloat(Double(quality) / 100.0)) else {
797
799
  return nil
798
800
  }
799
801
 
800
- guard let imageSource = CGImageSourceCreateWithData(originalImageData as CFData, nil),
802
+ // Prefer metadata from the original AVCapturePhoto file data to preserve lens/EXIF
803
+ let sourceDataForMetadata = (originalPhotoData ?? jpegDataAtQuality) as CFData
804
+ guard let imageSource = CGImageSourceCreateWithData(sourceDataForMetadata, nil),
801
805
  let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [String: Any],
802
806
  let cgImage = image.cgImage else {
803
- return originalImageData
807
+ return jpegDataAtQuality
804
808
  }
805
809
 
806
810
  let mutableData = NSMutableData()
807
811
  guard let destination = CGImageDestinationCreateWithData(mutableData, kUTTypeJPEG, 1, nil) else {
808
- return originalImageData
812
+ return jpegDataAtQuality
809
813
  }
810
814
 
811
815
  var finalProperties = imageProperties
812
816
 
817
+ // Ensure orientation reflects the pixel data (we pass an orientation-fixed UIImage)
818
+ finalProperties[kCGImagePropertyOrientation as String] = 1
819
+
813
820
  // Add GPS location if available
814
821
  if let location = location {
815
822
  let formatter = DateFormatter()
@@ -829,10 +836,11 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
829
836
  finalProperties[kCGImagePropertyGPSDictionary as String] = gpsDict
830
837
  }
831
838
 
832
- // Create or update TIFF dictionary for device info
839
+ // Create or update TIFF dictionary for device info and set orientation to Up
833
840
  var tiffDict = finalProperties[kCGImagePropertyTIFFDictionary as String] as? [String: Any] ?? [:]
834
841
  tiffDict[kCGImagePropertyTIFFMake as String] = "Apple"
835
842
  tiffDict[kCGImagePropertyTIFFModel as String] = UIDevice.current.model
843
+ tiffDict[kCGImagePropertyTIFFOrientation as String] = 1
836
844
  finalProperties[kCGImagePropertyTIFFDictionary as String] = tiffDict
837
845
 
838
846
  CGImageDestinationAddImage(destination, cgImage, finalProperties as CFDictionary)
@@ -841,7 +849,7 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
841
849
  return mutableData as Data
842
850
  }
843
851
 
844
- return originalImageData
852
+ return jpegDataAtQuality
845
853
  }
846
854
 
847
855
  @objc func captureSample(_ call: CAPPluginCall) {
@@ -1545,4 +1553,31 @@ public class CameraPreview: CAPPlugin, CAPBridgedPlugin, CLLocationManagerDelega
1545
1553
  }
1546
1554
  }
1547
1555
  }
1556
+
1557
+ @objc func deleteFile(_ call: CAPPluginCall) {
1558
+ guard let path = call.getString("path"), !path.isEmpty else {
1559
+ call.reject("path parameter is required")
1560
+ return
1561
+ }
1562
+ let url: URL?
1563
+ if path.hasPrefix("file://") {
1564
+ url = URL(string: path)
1565
+ } else {
1566
+ url = URL(fileURLWithPath: path)
1567
+ }
1568
+ guard let fileURL = url else {
1569
+ call.reject("Invalid path")
1570
+ return
1571
+ }
1572
+ do {
1573
+ if FileManager.default.fileExists(atPath: fileURL.path) {
1574
+ try FileManager.default.removeItem(at: fileURL)
1575
+ call.resolve(["success": true])
1576
+ } else {
1577
+ call.resolve(["success": false])
1578
+ }
1579
+ } catch {
1580
+ call.reject("Failed to delete file: \(error.localizedDescription)")
1581
+ }
1582
+ }
1548
1583
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capgo/camera-preview",
3
- "version": "7.4.0-alpha.3",
3
+ "version": "7.4.0-alpha.5",
4
4
  "description": "Camera preview",
5
5
  "license": "MIT",
6
6
  "repository": {