1+ /* eslint-disable operator-assignment */
12/* eslint-disable object-shorthand */
23import { useCallback } from 'react' ;
34import { useTranslation } from 'react-i18next' ;
45import { useCamera } from '@/context/camera-context' ;
56import { useScreenCaptureContext } from '@/context/screen-capture-context' ;
67import { toaster } from "@/components/ui/toaster" ;
8+ import {
9+ IMAGE_COMPRESSION_QUALITY_KEY ,
10+ DEFAULT_IMAGE_COMPRESSION_QUALITY ,
11+ IMAGE_MAX_WIDTH_KEY ,
12+ DEFAULT_IMAGE_MAX_WIDTH ,
13+ } from '@/hooks/sidebar/setting/use-general-settings' ;
714
815// Add type definition for ImageCapture
916declare class ImageCapture {
@@ -23,6 +30,28 @@ export function useMediaCapture() {
2330 const { stream : cameraStream } = useCamera ( ) ;
2431 const { stream : screenStream } = useScreenCaptureContext ( ) ;
2532
33+ const getCompressionQuality = useCallback ( ( ) => {
34+ const storedQuality = localStorage . getItem ( IMAGE_COMPRESSION_QUALITY_KEY ) ;
35+ if ( storedQuality ) {
36+ const quality = parseFloat ( storedQuality ) ;
37+ if ( ! Number . isNaN ( quality ) && quality >= 0.1 && quality <= 1.0 ) {
38+ return quality ;
39+ }
40+ }
41+ return DEFAULT_IMAGE_COMPRESSION_QUALITY ;
42+ } , [ ] ) ;
43+
44+ const getImageMaxWidth = useCallback ( ( ) => {
45+ const storedMaxWidth = localStorage . getItem ( IMAGE_MAX_WIDTH_KEY ) ;
46+ if ( storedMaxWidth ) {
47+ const maxWidth = parseInt ( storedMaxWidth , 10 ) ;
48+ if ( ! Number . isNaN ( maxWidth ) && maxWidth > 0 ) {
49+ return maxWidth ;
50+ }
51+ }
52+ return DEFAULT_IMAGE_MAX_WIDTH ;
53+ } , [ ] ) ;
54+
2655 const captureFrame = useCallback ( async ( stream : MediaStream | null , source : 'camera' | 'screen' ) => {
2756 if ( ! stream ) {
2857 console . warn ( `No ${ source } stream available` ) ;
@@ -39,16 +68,25 @@ export function useMediaCapture() {
3968 try {
4069 const bitmap = await imageCapture . grabFrame ( ) ;
4170 const canvas = document . createElement ( 'canvas' ) ;
42- canvas . width = bitmap . width ;
43- canvas . height = bitmap . height ;
71+ let { width, height } = bitmap ;
72+
73+ const maxWidth = getImageMaxWidth ( ) ;
74+ if ( width > maxWidth ) {
75+ height = ( maxWidth / width ) * height ;
76+ width = maxWidth ;
77+ }
78+
79+ canvas . width = width ;
80+ canvas . height = height ;
4481 const ctx = canvas . getContext ( '2d' ) ;
4582 if ( ! ctx ) {
4683 console . error ( 'Failed to get canvas context' ) ;
4784 return null ;
4885 }
4986
5087 ctx . drawImage ( bitmap , 0 , 0 ) ;
51- return canvas . toDataURL ( 'image/jpeg' , 0.8 ) ;
88+ const quality = getCompressionQuality ( ) ;
89+ return canvas . toDataURL ( 'image/jpeg' , quality ) ;
5290 } catch ( error ) {
5391 console . error ( `Error capturing ${ source } frame:` , error ) ;
5492 toaster . create ( {
@@ -58,7 +96,7 @@ export function useMediaCapture() {
5896 } ) ;
5997 return null ;
6098 }
61- } , [ t ] ) ;
99+ } , [ t , getCompressionQuality , getImageMaxWidth ] ) ;
62100
63101 const captureAllMedia = useCallback ( async ( ) => {
64102 const images : ImageData [ ] = [ ] ;
0 commit comments