anycoder-91067bff / components /Calculator.jsx
tommytracx's picture
Upload components/Calculator.jsx with huggingface_hub
e12c2f8 verified
import { useState } from 'react';
export default function Calculator() {
const [displayValue, setDisplayValue] = useState('0');
const [firstOperand, setFirstOperand] = useState(null);
const [operator, setOperator] = useState(null);
const [waitingForSecondOperand, setWaitingForSecondOperand] = useState(false);
const inputDigit = (digit) => {
if (waitingForSecondOperand) {
setDisplayValue(String(digit));
setWaitingForSecondOperand(false);
} else {
setDisplayValue(displayValue === '0' ? String(digit) : displayValue + digit);
}
};
const inputDecimal = () => {
if (waitingForSecondOperand) {
setDisplayValue('0.');
setWaitingForSecondOperand(false);
return;
}
if (!displayValue.includes('.')) {
setDisplayValue(displayValue + '.');
}
};
const clearDisplay = () => {
setDisplayValue('0');
setFirstOperand(null);
setOperator(null);
setWaitingForSecondOperand(false);
};
const performOperation = (nextOperator) => {
const inputValue = parseFloat(displayValue);
if (firstOperand === null) {
setFirstOperand(inputValue);
} else if (operator) {
const result = calculate(firstOperand, inputValue, operator);
setDisplayValue(String(result));
setFirstOperand(result);
}
setWaitingForSecondOperand(true);
setOperator(nextOperator);
};
const calculate = (firstOperand, secondOperand, operator) => {
switch (operator) {
case '+':
return firstOperand + secondOperand;
case '-':
return firstOperand - secondOperand;
case '*':
return firstOperand * secondOperand;
case '/':
return firstOperand / secondOperand;
default:
return secondOperand;
}
};
const handleEquals = () => {
if (!operator || firstOperand === null) return;
const inputValue = parseFloat(displayValue);
const result = calculate(firstOperand, inputValue, operator);
setDisplayValue(String(result));
setFirstOperand(null);
setOperator(null);
setWaitingForSecondOperand(false);
};
return (
<div className="w-full max-w-md mx-auto bg-calc-bg rounded-xl shadow-lg overflow-hidden">
<div className="p-4">
<div className="text-right mb-4">
<a
href="https://huggingface.co/spaces/akhaliq/anycoder"
target="_blank"
rel="noopener noreferrer"
className="text-sm text-gray-500 hover:text-gray-700 transition-colors"
>
Built with anycoder
</a>
</div>
<div className="bg-calc-display rounded-lg p-6 mb-4 text-right">
<div className="text-4xl font-light text-gray-800 overflow-hidden">
{displayValue}
</div>
</div>
<div className="grid grid-cols-4 gap-2">
{['7', '8', '9', '/'].map((btn) => (
<button
key={btn}
className={`p-4 rounded-lg text-xl font-medium transition-colors ${
isNaN(btn)
? 'bg-calc-btn-operator hover:bg-calc-btn-operator-hover active:bg-calc-btn-operator-active text-white'
: 'bg-calc-btn hover:bg-calc-btn-hover active:bg-calc-btn-active text-gray-800'
}`}
onClick={() => isNaN(btn) ? performOperation(btn) : inputDigit(btn)}
>
{btn}
</button>
))}
{['4', '5', '6', '*'].map((btn) => (
<button
key={btn}
className={`p-4 rounded-lg text-xl font-medium transition-colors ${
isNaN(btn)
? 'bg-calc-btn-operator hover:bg-calc-btn-operator-hover active:bg-calc-btn-operator-active text-white'
: 'bg-calc-btn hover:bg-calc-btn-hover active:bg-calc-btn-active text-gray-800'
}`}
onClick={() => isNaN(btn) ? performOperation(btn) : inputDigit(btn)}
>
{btn}
</button>
))}
{['1', '2', '3', '-'].map((btn) => (
<button
key={btn}
className={`p-4 rounded-lg text-xl font-medium transition-colors ${
isNaN(btn)
? 'bg-calc-btn-operator hover:bg-calc-btn-operator-hover active:bg-calc-btn-operator-active text-white'
: 'bg-calc-btn hover:bg-calc-btn-hover active:bg-calc-btn-active text-gray-800'
}`}
onClick={() => isNaN(btn) ? performOperation(btn) : inputDigit(btn)}
>
{btn}
</button>
))}
{['0', '.', '=', '+'].map((btn) => (
<button
key={btn}
className={`p-4 rounded-lg text-xl font-medium transition-colors ${
btn === '='
? 'bg-calc-btn-operator hover:bg-calc-btn-operator-hover active:bg-calc-btn-operator-active text-white'
: isNaN(btn)
? 'bg-calc-btn hover:bg-calc-btn-hover active:bg-calc-btn-active text-gray-800'
: 'bg-calc-btn hover:bg-calc-btn-hover active:bg-calc-btn-active text-gray-800 col-span-2'
}`}
onClick={() => {
if (btn === '=') {
handleEquals();
} else if (btn === '.') {
inputDecimal();
} else if (isNaN(btn)) {
performOperation(btn);
} else {
inputDigit(btn);
}
>
{btn}
</button>
))}
<button
className="col-span-4 p-4 rounded-lg text-xl font-medium bg-gray-400 hover:bg-gray-500 active:bg-gray-600 text-white transition-colors"
onClick={clearDisplay}
>
AC
</button>
</div>
</div>
</div>
);
}