1717
1818import { useEffect , useRef , useState , ChangeEvent , ClipboardEvent } from 'react' ;
1919import { useTranslation } from 'react-i18next' ;
20+ import { useCapsLock } from '@/hooks/keyboard' ;
2021import { Input , Checkbox , Field } from './forms' ;
2122import { alertUser } from './alert/Alert' ;
2223import style from './password.module.css' ;
2324
24- const excludeKeys = / ^ ( S h i f t | A l t | B a c k s p a c e | C a p s L o c k | T a b ) $ / i;
25-
26- const hasCaps = ( event : KeyboardEvent ) => {
27- const key = event . key ;
28- // will return null, when we cannot clearly detect if capsLock is active or not
29- if ( key . length > 1 || key . toUpperCase ( ) === key . toLowerCase ( ) || excludeKeys . test ( key ) ) {
30- return null ;
31- }
32- // ideally we return event.getModifierState('CapsLock')) but this currently does always return false in Qt
33- return key . toUpperCase ( ) === key && key . toLowerCase ( ) !== key && ! event . shiftKey ;
34- } ;
3525
3626type TPropsPasswordInput = {
3727 seePlaintext ?: boolean ;
@@ -76,9 +66,10 @@ export const PasswordSingleInput = ({
7666 onValidPassword,
7767} : TProps ) => {
7868 const { t } = useTranslation ( ) ;
69+ const capsLock = useCapsLock ( ) ;
70+
7971 const [ password , setPassword ] = useState ( '' ) ;
8072 const [ seePlaintext , setSeePlaintext ] = useState ( false ) ;
81- const [ capsLock , setCapsLock ] = useState ( false ) ;
8273
8374 const passwordRef = useRef < HTMLInputElement > ( null ) ;
8475 const regexRef = useRef < RegExp > ( ) ;
@@ -93,20 +84,6 @@ export const PasswordSingleInput = ({
9384 }
9485 } , [ pattern , autoFocus ] ) ;
9586
96- // Listen to caps lock key events
97- useEffect ( ( ) => {
98- const handleCheckCaps = ( event : KeyboardEvent ) => {
99- const result = hasCaps ( event ) ;
100- if ( result !== null ) {
101- setCapsLock ( result ) ;
102- }
103- } ;
104- window . addEventListener ( 'keydown' , handleCheckCaps ) ;
105- return ( ) => {
106- window . removeEventListener ( 'keydown' , handleCheckCaps ) ;
107- } ;
108- } , [ ] ) ;
109-
11087 const tryPaste = ( event : ClipboardEvent < HTMLInputElement > ) => {
11188 if ( event . currentTarget . type === 'password' ) {
11289 event . preventDefault ( ) ;
@@ -196,11 +173,11 @@ export const PasswordRepeatInput = ({
196173 onValidPassword,
197174} : TPasswordRepeatProps ) => {
198175 const { t } = useTranslation ( ) ;
176+ const capsLock = useCapsLock ( ) ;
199177
200178 const [ password , setPassword ] = useState ( '' ) ;
201179 const [ passwordRepeat , setPasswordRepeat ] = useState ( '' ) ;
202180 const [ seePlaintext , setSeePlaintext ] = useState ( false ) ;
203- const [ capsLock , setCapsLock ] = useState ( false ) ;
204181
205182 const passwordRef = useRef < HTMLInputElement > ( null ) ;
206183 const passwordRepeatRef = useRef < HTMLInputElement > ( null ) ;
@@ -216,20 +193,6 @@ export const PasswordRepeatInput = ({
216193 }
217194 } , [ pattern , autoFocus ] ) ;
218195
219- // Listen to caps lock key events
220- useEffect ( ( ) => {
221- const handleCheckCaps = ( event : KeyboardEvent ) => {
222- const result = hasCaps ( event ) ;
223- if ( result !== null ) {
224- setCapsLock ( result ) ;
225- }
226- } ;
227- window . addEventListener ( 'keydown' , handleCheckCaps ) ;
228- return ( ) => {
229- window . removeEventListener ( 'keydown' , handleCheckCaps ) ;
230- } ;
231- } , [ ] ) ;
232-
233196 const tryPaste = ( event : ClipboardEvent < HTMLInputElement > ) => {
234197 if ( event . currentTarget . type === 'password' ) {
235198 event . preventDefault ( ) ;
0 commit comments