@@ -10,8 +10,9 @@ import 'prismjs/components/prism-java';
1010import 'prismjs/components/prism-c' ;
1111import 'prismjs/components/prism-cpp' ;
1212import 'prismjs/components/prism-jsx' ;
13+ import confetti from 'canvas-confetti' ;
1314
14- function CodeMode ( { fragmentRandom, resetFragment, progLanguage, inputCode, setInputCode } ) {
15+ function CodeMode ( { fragmentRandom, resetFragment, progLanguage, inputCode, setInputCode, tabuladoSetting } ) {
1516 const containerRef = useRef ( null )
1617
1718 const resetGame = ( ) => {
@@ -27,20 +28,36 @@ function CodeMode({ fragmentRandom, resetFragment, progLanguage, inputCode, setI
2728 if ( inputCode . endsWith ( '\n' ) ) {
2829 const container = containerRef . current ;
2930 const maxScroll = container . scrollHeight - container . clientHeight ;
30- const nextScrollTop = container . scrollTop + 20 ;
31+ const nextScrollTop = container . scrollTop + 17 ;
3132
3233 container . scrollTop = nextScrollTop > maxScroll ? maxScroll : nextScrollTop ;
3334 }
3435 }
3536 } , [ inputCode ] )
3637
38+ useEffect ( ( ) => {
39+ const handleBeforeInput = ( e ) => {
40+ e . preventDefault ( ) ;
41+ const char = e . data ; // Esto será "^" directamente si es lo que el usuario escribe
42+ const expectedChar = fragmentRandom . charAt ( inputCode . length ) ;
43+ if ( char === expectedChar ) {
44+ setInputCode ( prev => prev + char ) ;
45+ }
46+ } ;
47+ document . addEventListener ( "beforeinput" , handleBeforeInput ) ;
48+ return ( ) => document . removeEventListener ( "beforeinput" , handleBeforeInput ) ;
49+ } , [ fragmentRandom , inputCode ] ) ;
50+
51+
3752 const handleKeyDown = ( e ) => {
3853 e . preventDefault ( )
3954
4055 const expectedChar = fragmentRandom . charAt ( inputCode . length )
4156
4257 let key = e . key
4358
59+ console . log ( "key" , key )
60+
4461 // Controlar el reinicio del juego
4562 const isCtrl = e . ctrlKey || e . metaKey
4663 if ( isCtrl && e . key . toLowerCase ( ) === 'r' ) {
@@ -49,9 +66,30 @@ function CodeMode({ fragmentRandom, resetFragment, progLanguage, inputCode, setI
4966 return
5067 }
5168
69+ // Evitar que el usuario meta espacios donde va un tab
70+ if ( e . key === ' ' && fragmentRandom . slice ( inputCode . length , inputCode . length + 4 ) === ' ' ) {
71+ e . preventDefault ( )
72+ return
73+ }
74+
5275 if ( key === 'Enter' && '\n' === expectedChar ) {
5376 key = '\n'
5477 setInputCode ( ( prev ) => prev + key ) ;
78+
79+ if ( tabuladoSetting ) {
80+
81+ let newCode = inputCode + "\n"
82+
83+ let index = newCode . length
84+
85+ while ( fragmentRandom . slice ( index , index + 4 ) === " " ) {
86+ newCode += " "
87+ index += 4
88+ }
89+
90+ setInputCode ( newCode )
91+ }
92+
5593 return
5694 }
5795
@@ -68,10 +106,11 @@ function CodeMode({ fragmentRandom, resetFragment, progLanguage, inputCode, setI
68106 return
69107 }
70108
71- if ( e . key === 'Backspace' ) {
72- setInputCode ( ( prev ) => prev . slice ( 0 , - 1 ) )
73- return
74- }
109+ // Opción de borrar deshabilitada de forma experimental
110+ //if (e.key === 'Backspace') {
111+ // setInputCode((prev) => prev.slice(0, -1))
112+ // return
113+ //}
75114
76115 if ( key === expectedChar ) {
77116 setInputCode ( ( prev ) => prev + key )
@@ -125,6 +164,12 @@ function CodeMode({ fragmentRandom, resetFragment, progLanguage, inputCode, setI
125164 return ( ) => document . removeEventListener ( 'keydown' , handleKeyDown )
126165 } )
127166
167+ if ( inputCode . length === fragmentRandom . length ) {
168+ confetti ( )
169+ //resetGame()
170+ resetFragment ( )
171+ }
172+
128173 return (
129174 < >
130175 < div className = "gameCodeContainer" >
0 commit comments