// keyboard.js
import React, { useState } from 'react';
import './Keyboard.css';
export default function Keyboard() {
const [inputText, setInputText] = useState('');
const [isCaps, setIsCaps] = useState(false);
const [isShift, setIsShift] = useState(false);
const handleKeyClick = (key) => {
if (key === 'Enter') {
handleEnterKey();
}
else if(key === "Ctrl" || key === "Alt" || key === '<' || key === '>')
{
}else if (key === ' ') {
handleSpaceKey();
} else if (key === 'Caps Lock') {
handleCapsLock();
} else if (key === '<i className="fa-solid fa-delete-left"></i>') {
handleDeleteKey();
} else if (key === 'Shift') {
handleShiftKey();
} else if (key === 'Tab') {
handleTabKey();
} else {
handleRegularKey(key);
}
};
const handleSpaceKey = () => {
const newContent = inputText + '\u00A0';
setInputText(newContent);
};
const handleEnterKey = () => {
const newContent = inputText + '\n';
setInputText(newContent);
};
const handleCapsLock = () => {
const updatedCaps = !isCaps;
setIsCaps(updatedCaps);
const keys = document.querySelectorAll('.key');
keys.forEach((key) => {
const firstSpanElement = key.querySelector('span:first-child');
if (firstSpanElement) {
const keyText = firstSpanElement.innerText.toLowerCase();
if (!['shift', 'alt', 'ctrl', 'enter', 'caps lock', 'tab']
.includes(keyText)) {
firstSpanElement.innerText =
((updatedCaps && isShift) || (!updatedCaps && !isShift))
? keyText.toLowerCase() : keyText.toUpperCase();
}
if (keyText === 'caps lock') {
firstSpanElement.parentElement.style.backgroundColor =
(updatedCaps) ? 'blue' : '#445760';
}
}
});
};
const handleTabKey = () => {
const newContent = inputText + ' ';
setInputText(newContent);
};
const handleDeleteKey = () => {
if (inputText.length === 0) {
return;
}
const newContent = inputText.slice(0, inputText.length - 1);
setInputText(newContent);
};
const handleShiftKey = () => {
const updatedShift = !isShift;
setIsShift(updatedShift);
const keys = document.querySelectorAll('.key');
keys.forEach((key) => {
const firstSpanElement = key.querySelector('span:first-child');
if (firstSpanElement) {
const keyText = firstSpanElement.innerText.toLowerCase();
if (!['shift', 'alt', 'ctrl', 'enter', 'caps lock', 'tab'].
includes(keyText)) {
firstSpanElement.innerText =
((updatedShift && isCaps) || (!updatedShift && !isCaps))
? keyText.toLowerCase() : keyText.toUpperCase();
}
if (keyText === 'shift') {
firstSpanElement.parentElement.style.backgroundColor =
(updatedShift) ? 'blue' : '#445760';
}
}
});
}
const handleRegularKey = (key) => {
const keys = key.split(/[._]/);
let newContent;
if (keys.length > 1) {
if (isShift) {
if (keys.length === 3) {
if (keys[0] === '>') newContent = inputText + '>';
else newContent = inputText + '_';
}
else newContent = inputText + keys[0];
} else {
if (keys.length === 3) {
if (keys[0] === '>') newContent = inputText + '.';
else newContent = inputText + '-';
}
else newContent = inputText + keys[1];
}
} else {
let character = ((isShift && isCaps) || (!isShift && !isCaps))
? key.toLowerCase() : key.toUpperCase();
newContent = inputText + character;
}
setInputText(newContent);
};
return (
<div className='keyboard'>
<div className="textcontainer">
<pre>{inputText}</pre>
</div>
<div className="keyboardcontainer">
<div className="container">
<div className="row">
{['~.`', '!.1', '@.2', '#.3', '$.4', '%.5',
'^.6', '&.7', '*.8', '(.9', ').0', '_.-', '+.=',
'<i className="fa-solid fa-delete-left"></i>']
.map((keyvalue) =>
(
<div key={keyvalue} className='key'
onClick={() => handleKeyClick(keyvalue)}>
{keyvalue.includes('.') ? (
keyvalue.split('.').map((part, index) => (
<span key={index}>{part}</span>
))
) : (
keyvalue ===
'<i className="fa-solid fa-delete-left"></i>'
? (
<i className="fa-solid fa-delete-left"></i>
) : (
<span>{keyvalue}</span>
)
)}
</div>
))}
</div>
<div className="row">
{['Tab', 'q', 'w', 'e', 'r', 't', 'y',
'u', 'i', 'o', 'p', '{_[', '}_]', '|_\\']
.map((keyvalue) => (
<div key={keyvalue} className='key'
onClick={() => handleKeyClick(keyvalue)}>
{keyvalue.includes('_') ? (
keyvalue.split('_').map((part, index) => (
<span key={index}>{part}</span>
))
) : (
<span>{keyvalue}</span>
)}
</div>
))}
</div>
<div className="row">
{['Caps Lock', 'a', 's', 'd', 'f', 'g', 'h',
'j', 'k', 'l', ':_;', `"_'`, 'Enter']
.map((keyvalue) => (
<div key={keyvalue} className='key'
onClick={() => handleKeyClick(keyvalue)}>
{keyvalue.includes('_') ? (
keyvalue.split('_').map((part, index) => (
<span key={index}>{part}</span>
))
) : (
<span>{keyvalue}</span>
)}
</div>
))}
</div>
<div className="row">
{['Shift', 'z', 'x', 'c', 'v', 'b', 'n', 'm',
'<_,', '>_.', '?_/', 'Shift'].map((keyvalue, index) => (
<div key={index} className='key'
onClick={() => handleKeyClick(keyvalue)}>
{keyvalue.includes('_') ? (
keyvalue.split('_').map((part, index) => (
<span key={index}>{part}</span>
))
) : (
<span>{keyvalue}</span>
)}
</div>
))}
</div>
<div className="row">
{['Ctrl', 'Alt', ' ', 'Ctrl', 'Alt', '<', '>']
.map((keyvalue, index) => (
<div key={index} className='key'
onClick={() => handleKeyClick(keyvalue)}>
<span>{keyvalue}</span>
</div>
))}
</div>
</div>
</div>
</div>
)
}