120 lines
3.3 KiB
JavaScript
120 lines
3.3 KiB
JavaScript
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
const calculator = document.querySelector('.calculator');
|
|
const screen = document.querySelector('.calculator-screen');
|
|
const keys = document.querySelector('.calculator-keys');
|
|
const chatContainer = document.getElementById('chat-container');
|
|
|
|
let displayValue = '0';
|
|
let firstOperand = null;
|
|
let operator = null;
|
|
let waitingForSecondOperand = false;
|
|
|
|
function updateDisplay() {
|
|
screen.value = displayValue;
|
|
}
|
|
|
|
updateDisplay();
|
|
|
|
keys.addEventListener('click', (e) => {
|
|
const { target } = e;
|
|
const { value } = target;
|
|
|
|
if (!target.matches('button')) {
|
|
return;
|
|
}
|
|
|
|
switch (value) {
|
|
case '+':
|
|
case '-':
|
|
case '*':
|
|
case '/':
|
|
handleOperator(value);
|
|
break;
|
|
case '=':
|
|
handleEqualSign();
|
|
break;
|
|
case '.':
|
|
inputDecimal(value);
|
|
break;
|
|
case 'all-clear':
|
|
resetCalculator();
|
|
break;
|
|
default:
|
|
if (Number.isInteger(parseInt(value))) {
|
|
inputDigit(value);
|
|
}
|
|
}
|
|
|
|
updateDisplay();
|
|
});
|
|
|
|
function handleOperator(nextOperator) {
|
|
const inputValue = parseFloat(displayValue);
|
|
|
|
if (operator && waitingForSecondOperand) {
|
|
operator = nextOperator;
|
|
return;
|
|
}
|
|
|
|
if (firstOperand === null && !isNaN(inputValue)) {
|
|
firstOperand = inputValue;
|
|
} else if (operator) {
|
|
const result = calculate(firstOperand, inputValue, operator);
|
|
displayValue = `${parseFloat(result.toFixed(7))}`;
|
|
firstOperand = result;
|
|
}
|
|
|
|
waitingForSecondOperand = true;
|
|
operator = nextOperator;
|
|
}
|
|
|
|
function handleEqualSign() {
|
|
if (screen.value === '1+1') {
|
|
calculator.style.display = 'none';
|
|
chatContainer.style.display = 'block';
|
|
return;
|
|
}
|
|
|
|
const inputValue = parseFloat(displayValue);
|
|
if (operator && !waitingForSecondOperand) {
|
|
const result = calculate(firstOperand, inputValue, operator);
|
|
displayValue = `${parseFloat(result.toFixed(7))}`;
|
|
firstOperand = null;
|
|
operator = null;
|
|
waitingForSecondOperand = false;
|
|
}
|
|
}
|
|
|
|
function calculate(first, second, op) {
|
|
if (op === '+') return first + second;
|
|
if (op === '-') return first - second;
|
|
if (op === '*') return first * second;
|
|
if (op === '/') return first / second;
|
|
return second;
|
|
}
|
|
|
|
function inputDigit(digit) {
|
|
if (waitingForSecondOperand) {
|
|
displayValue = digit;
|
|
waitingForSecondOperand = false;
|
|
} else {
|
|
displayValue = displayValue === '0' ? digit : displayValue + digit;
|
|
}
|
|
}
|
|
|
|
function inputDecimal(dot) {
|
|
if (waitingForSecondOperand) return;
|
|
if (!displayValue.includes(dot)) {
|
|
displayValue += dot;
|
|
}
|
|
}
|
|
|
|
function resetCalculator() {
|
|
displayValue = '0';
|
|
firstOperand = null;
|
|
operator = null;
|
|
waitingForSecondOperand = false;
|
|
}
|
|
});
|