refactor: replace enabled prop with disabled in DigitalClock

This commit is contained in:
Loic Coenen
2026-06-25 09:37:20 +02:00
committed by Loic Coenen (aider)
parent a5e300d238
commit 0b3a1d4d66
4 changed files with 26 additions and 17 deletions

View File

@@ -24,21 +24,21 @@ describe("DigitalClock", () => {
}); });
}); });
it("renders nothing when disabled", () => { it("renders the input as disabled when disabled prop is true", () => {
const { container } = render( render(
<DigitalClock <DigitalClock
enabled={false} disabled={true}
currentTime={new Date(2025, 0, 1, 14, 30, 15)} currentTime={new Date(2025, 0, 1, 14, 30, 15)}
onTimeChange={onTimeChangeMock} onTimeChange={onTimeChangeMock}
/>, />,
); );
expect(container.innerHTML).toBe(""); const input = screen.getByTestId("time-input");
expect(input).toBeDisabled();
}); });
it("renders the digital time and input when enabled", () => { it("renders the digital time and input when enabled", () => {
render( render(
<DigitalClock <DigitalClock
enabled={true}
currentTime={new Date(2025, 0, 1, 14, 30, 15)} currentTime={new Date(2025, 0, 1, 14, 30, 15)}
onTimeChange={onTimeChangeMock} onTimeChange={onTimeChangeMock}
/>, />,
@@ -50,7 +50,6 @@ describe("DigitalClock", () => {
it("calls onTimeChange when a valid time is entered", () => { it("calls onTimeChange when a valid time is entered", () => {
render( render(
<DigitalClock <DigitalClock
enabled={true}
currentTime={new Date(2025, 0, 1, 14, 30, 15)} currentTime={new Date(2025, 0, 1, 14, 30, 15)}
onTimeChange={onTimeChangeMock} onTimeChange={onTimeChangeMock}
/>, />,
@@ -68,7 +67,6 @@ describe("DigitalClock", () => {
it("does not call onTimeChange when an invalid time is entered", () => { it("does not call onTimeChange when an invalid time is entered", () => {
render( render(
<DigitalClock <DigitalClock
enabled={true}
currentTime={new Date(2025, 0, 1, 14, 30, 15)} currentTime={new Date(2025, 0, 1, 14, 30, 15)}
onTimeChange={onTimeChangeMock} onTimeChange={onTimeChangeMock}
/>, />,

View File

@@ -13,13 +13,21 @@ vi.mock("../containers/DigitalClock", () => ({
enabled, enabled,
currentTime, currentTime,
onTimeChange, onTimeChange,
disabled = false,
}: { }: {
enabled: boolean; enabled: boolean;
currentTime: Date; currentTime: Date;
onTimeChange: (d: Date) => void; onTimeChange: (d: Date) => void;
disabled?: boolean;
}) => ( }) => (
<div data-testid="digital-clock-wrapper"> <div data-testid="digital-clock-wrapper">
<span data-testid="digital-clock-time">{currentTime.toISOString()}</span> <span data-testid="digital-clock-time">{currentTime.toISOString()}</span>
<input
data-testid="time-input"
disabled={disabled}
value=""
onChange={() => {}}
/>
<button <button
data-testid="set-time" data-testid="set-time"
onClick={() => onTimeChange(new Date(2025, 0, 1, 12, 0, 0))} onClick={() => onTimeChange(new Date(2025, 0, 1, 12, 0, 0))}
@@ -52,11 +60,16 @@ describe("TimeConverter", () => {
expect(screen.getByTestId("digital-clock-wrapper")).toBeInTheDocument(); expect(screen.getByTestId("digital-clock-wrapper")).toBeInTheDocument();
}); });
it("disables both clocks when checkbox is checked", () => { it("disables the digital clock input when checkbox is checked", () => {
render(<TimeConverter />); render(<TimeConverter />);
// Initially the input is enabled
expect(screen.getByTestId("time-input")).not.toBeDisabled();
// Click the checkbox
fireEvent.click(screen.getByTestId("use-system-time")); fireEvent.click(screen.getByTestId("use-system-time"));
expect(screen.getByTestId("berlin-clock")).toHaveTextContent("disabled"); // Now the input should be disabled
expect(screen.getByTestId("disabled-indicator")).toBeInTheDocument(); expect(screen.getByTestId("time-input")).toBeDisabled();
// But the BerlinClock still appears enabled (no "disabled" text)
expect(screen.getByTestId("berlin-clock")).toHaveTextContent("enabled");
}); });
it("calls setCurrentTime when DigitalClock triggers onTimeChange", () => { it("calls setCurrentTime when DigitalClock triggers onTimeChange", () => {

View File

@@ -2,15 +2,15 @@ import { useState } from "react";
import { dateToDigital, digitalToDate } from "../utils"; import { dateToDigital, digitalToDate } from "../utils";
interface DigitalClockProps { interface DigitalClockProps {
enabled: boolean;
currentTime: Date; currentTime: Date;
onTimeChange: (time: Date) => void; onTimeChange: (time: Date) => void;
disabled?: boolean;
} }
export function DigitalClock({ export function DigitalClock({
enabled,
currentTime, currentTime,
onTimeChange, onTimeChange,
disabled = false,
}: DigitalClockProps) { }: DigitalClockProps) {
const [inputValue, setInputValue] = useState(dateToDigital(currentTime)); const [inputValue, setInputValue] = useState(dateToDigital(currentTime));
@@ -23,8 +23,6 @@ export function DigitalClock({
} }
}; };
if (!enabled) return null;
return ( return (
<div> <div>
<span data-testid="digital-clock">{dateToDigital(currentTime)}</span> <span data-testid="digital-clock">{dateToDigital(currentTime)}</span>
@@ -34,6 +32,7 @@ export function DigitalClock({
value={inputValue} value={inputValue}
onChange={handleChange} onChange={handleChange}
placeholder="HH:MM:SS" placeholder="HH:MM:SS"
disabled={disabled}
/> />
</div> </div>
); );

View File

@@ -7,7 +7,6 @@ import { dateToBerlin } from "../utils";
export function TimeConverter() { export function TimeConverter() {
const { currentTime, setCurrentTime } = useCurrentTime(); const { currentTime, setCurrentTime } = useCurrentTime();
const [useSystemTime, setUseSystemTime] = useState(false); const [useSystemTime, setUseSystemTime] = useState(false);
const enabled = !useSystemTime;
const berlinClock = dateToBerlin(currentTime); const berlinClock = dateToBerlin(currentTime);
return ( return (
@@ -26,11 +25,11 @@ export function TimeConverter() {
/> />
Use system time Use system time
</label> </label>
<BerlinClock enabled={enabled} clock={berlinClock} /> <BerlinClock enabled={true} clock={berlinClock} />
<DigitalClock <DigitalClock
enabled={enabled}
currentTime={currentTime} currentTime={currentTime}
onTimeChange={setCurrentTime} onTimeChange={setCurrentTime}
disabled={useSystemTime}
/> />
</div> </div>
); );