1+ let isPickerEnabled = false ;
2+ let hoveredElement = null ;
3+
4+ // The main listener for messages from the popup
5+ chrome . runtime . onMessage . addListener ( ( message , sender , sendResponse ) => {
6+ if ( message . type === "ENABLE_PICKER" ) {
7+ if ( ! isPickerEnabled ) enablePicker ( ) ;
8+ }
9+ } ) ;
10+
11+ function enablePicker ( ) {
12+ isPickerEnabled = true ;
13+ document . body . style . cursor = 'crosshair' ;
14+ document . addEventListener ( 'mouseover' , onMouseOver ) ;
15+ document . addEventListener ( 'mouseout' , onMouseOut ) ;
16+ document . addEventListener ( 'click' , onClick , true ) ;
17+ }
18+
19+ function disablePicker ( ) {
20+ isPickerEnabled = false ;
21+ document . body . style . cursor = 'default' ;
22+ if ( hoveredElement ) hoveredElement . classList . remove ( 'translator-highlight' ) ;
23+ document . removeEventListener ( 'mouseover' , onMouseOver ) ;
24+ document . removeEventListener ( 'mouseout' , onMouseOut ) ;
25+ document . removeEventListener ( 'click' , onClick , true ) ;
26+ }
27+
28+ function onMouseOver ( e ) {
29+ hoveredElement = e . target ;
30+ hoveredElement . classList . add ( 'translator-highlight' ) ;
31+ }
32+
33+ function onMouseOut ( e ) {
34+ e . target . classList . remove ( 'translator-highlight' ) ;
35+ hoveredElement = null ;
36+ }
37+
38+ function onClick ( e ) {
39+ e . preventDefault ( ) ;
40+ e . stopPropagation ( ) ;
41+
42+ const clickedElement = e . target ;
43+ const selectedCode = clickedElement . textContent ;
44+ disablePicker ( ) ;
45+
46+ const loadingDiv = document . createElement ( 'div' ) ;
47+ loadingDiv . className = 'translator-loading' ;
48+ loadingDiv . textContent = 'Translating...' ;
49+ clickedElement . parentNode . insertBefore ( loadingDiv , clickedElement . nextSibling ) ;
50+
51+ chrome . runtime . sendMessage ( { type : "TRANSLATE_CODE" , code : selectedCode } , ( response ) => {
52+ loadingDiv . remove ( ) ;
53+
54+ if ( response . error ) {
55+ alert ( `Error: ${ response . error } ` ) ;
56+ } else if ( response . translation ) {
57+ injectTranslatedCode ( response . translation , clickedElement ) ;
58+ }
59+ } ) ;
60+ }
61+
62+ function injectTranslatedCode ( translatedCode , originalElement ) {
63+ const container = document . createElement ( 'div' ) ;
64+ container . className = 'translation-container' ;
65+
66+ const header = document . createElement ( 'h4' ) ;
67+ header . textContent = 'AI-Generated Translation:' ;
68+
69+ const pre = document . createElement ( 'pre' ) ;
70+ const code = document . createElement ( 'code' ) ;
71+ code . textContent = translatedCode ;
72+ pre . appendChild ( code ) ;
73+
74+ container . appendChild ( header ) ;
75+ container . appendChild ( pre ) ;
76+
77+ // Insert the container right after the original element
78+ originalElement . parentNode . insertBefore ( container , originalElement . nextSibling ) ;
79+ }
0 commit comments