Code-Along 2 - Temperature Converter
Temperature Conversion Formulas
// Temperature Conversion Functions
function celsiusToFahrenheit(celsius) {
return (celsius * 9/5) + 32;
}
function fahrenheitToCelsius(fahrenheit) {
return (fahrenheit - 32) * 5/9;
}
function celsiusToKelvin(celsius) {
return celsius + 273.15;
}
function kelvinToCelsius(kelvin) {
return kelvin - 273.15;
}
Building the Converter Component
// Temperature Converter Component
import React, { useState } from 'react';
function TemperatureConverter() {
const [temperature, setTemperature] = useState('');
const [fromUnit, setFromUnit] = useState('celsius');
const [toUnit, setToUnit] = useState('fahrenheit');
const [result, setResult] = useState('');
const handleTemperatureChange = (e) => {
setTemperature(e.target.value);
};
const handleFromUnitChange = (e) => {
setFromUnit(e.target.value);
};
const handleToUnitChange = (e) => {
setToUnit(e.target.value);
};
const handleConvert = () => {
const convertedResult = convert();
setResult(convertedResult);
};
const convert = () => {
const num = parseFloat(temperature);
if (isNaN(num)) return '';
let celsius;
switch (fromUnit) {
case 'celsius':
celsius = num;
break;
case 'fahrenheit':
celsius = fahrenheitToCelsius(num);
break;
case 'kelvin':
celsius = kelvinToCelsius(num);
break;
default:
celsius = 0;
}
switch (toUnit) {
case 'celsius':
return celsius.toFixed(2);
case 'fahrenheit':
return celsiusToFahrenheit(celsius).toFixed(2);
case 'kelvin':
return celsiusToKelvin(celsius).toFixed(2);
default:
return '';
}
};
return (
<div className="converter-container">
<h2>Temperature Converter</h2>
<div className="input-group">
<label htmlFor="temperature">Temperature:</label>
<input
type="number"
id="temperature"
value={temperature}
onChange={handleTemperatureChange}
placeholder="Enter temperature"
/>
</div>
<div className="input-group">
<label htmlFor="fromUnit">From:</label>
<select id="fromUnit" value={fromUnit} onChange={handleFromUnitChange}>
<option value="celsius">Celsius (°C)</option>
<option value="fahrenheit">Fahrenheit (°F)</option>
<option value="kelvin">Kelvin (K)</option>
</select>
</div>
<div className="input-group">
<label htmlFor="toUnit">To:</label>
<select id="toUnit" value={toUnit} onChange={handleToUnitChange}>
<option value="celsius">Celsius (°C)</option>
<option value="fahrenheit">Fahrenheit (°F)</option>
<option value="kelvin">Kelvin (K)</option>
</select>
</div>
<button onClick={handleConvert} className="convert-button">Convert</button>
{result && (
<div className="result">
<h3>Result:</h3>
<p>
{temperature} {fromUnit === 'celsius' ? '°C' : fromUnit === 'fahrenheit' ? '°F' : 'K'} =
{' '}{result} {toUnit === 'celsius' ? '°C' : toUnit === 'fahrenheit' ? '°F' : 'K'}
</p>
</div>
)}
</div>
);
}
export default TemperatureConverter;
Adding Styling and Validation
Let's enhance our temperature converter with some styling and validation to ensure a better user experience.
// CSS Styles for the Temperature Converter
.converter-container {
max-width: 400px;
margin: 0 auto;
padding: 20px;
background-color: var(--section-bg);
border-radius: var(--border-radius);
box-shadow: var(--box-shadow);
border: 1px solid var(--border-color);
}
.input-group {
margin-bottom: 15px;
}
.input-group label {
display: block;
margin-bottom: 5px;
font-weight: 500;
}
.input-group input,
.input-group select {
width: 100%;
padding: 8px;
border: 1px solid var(--border-color);
border-radius: 4px;
background-color: var(--container-bg);
color: var(--text-color);
}
.convert-button {
background-color: var(--primary-color);
color: white;
border: none;
padding: 10px 15px;
border-radius: 4px;
cursor: pointer;
font-weight: 600;
transition: background-color 0.2s;
}
.convert-button:hover {
background-color: var(--secondary-color);
}
.result {
margin-top: 20px;
padding: 10px;
background-color: rgba(255, 87, 34, 0.1);
border-left: 3px solid var(--primary-color);
border-radius: 4px;
}
.error {
color: var(--danger-color);
font-size: 0.9rem;
margin-top: 5px;
}
Adding Input Validation
Let's improve our converter by adding validation to ensure that users enter valid numerical values.
// Enhanced handleTemperatureChange function with validation
const handleTemperatureChange = (e) => {
const value = e.target.value;
setTemperature(value);
// Clear error when input changes
if (error) setError('');
};
// Add state for error message
const [error, setError] = useState('');
// Enhanced handleConvert function with validation
const handleConvert = () => {
// Validate the input before converting
if (!temperature) {
setError('Please enter a temperature value');
return;
}
const num = parseFloat(temperature);
if (isNaN(num)) {
setError('Please enter a valid number');
return;
}
// Additional validation for specific units
if (fromUnit === 'kelvin' && num < 0) {
setError('Kelvin cannot be negative');
return;
}
// If validation passes, clear any errors and convert
setError('');
const convertedResult = convert();
setResult(convertedResult);
};
Project: Build a Temperature Converter App
Now that we've learned the basics, let's apply what we've learned by building a complete temperature converter application.
Project Repository React Forms Documentation