// Rôle : rend le formulaire et la liste des comptes à rebours timer.
import { useState } from "react";
import { Icon } from "../../../components/Icon.jsx";
import { formatTargetTime } from "./timerUtils.js";
import {
AUTO_REFRESH_COUNTDOWN_TYPES,
TOGGLE_REFRESH_COUNTDOWN_TYPES,
canToggleAutoRefresh,
getAlertGuardMessage,
getCountdownMetaParts,
handleEditableKeyDown,
isAlertGuarded
} from "./timerOptions.js";
import { EditableTimerLabel, TimerAlertModeSwitch, TimerValue, TimePartsInput } from "./TimerSharedControls.jsx";
export function CountdownControls({ textContent, form, error, onChange, onSubmit }) {
return (
);
}
export function CountdownList({ countdowns, nowMs, textContent, reorder, reorderEnabled, parentId, onRename, onAlertModeChange, onReset, onAutoRefreshToggle, onDelete }) {
const [editingId, setEditingId] = useState("");
if (!countdowns.length) return {textContent.emptyCountdowns || "Aucun compte à rebours configuré."}
;
return (
{countdowns.map((countdown) => {
const remainingMs = countdown.targetMs - nowMs;
const expired = remainingMs <= 0;
const canReset = countdown.type === "duration";
const canToggleRefresh = TOGGLE_REFRESH_COUNTDOWN_TYPES.has(countdown.type);
const refreshBlocked = canToggleRefresh && !canToggleAutoRefresh(countdown);
const refreshTitle = refreshBlocked
? getAlertGuardMessage(textContent)
: textContent.autoRefreshTitle || "Répéter automatiquement";
const className = [
"timer-list-item",
expired ? "is-expired" : "",
editingId === countdown.id ? "is-editing" : "",
reorderEnabled && reorder.isItemDragging(countdown.id) ? "is-dragging" : "",
reorderEnabled && reorder.isItemDropTarget(countdown.id) ? "is-drop-target" : "",
reorderEnabled && reorder.getDropPlacement("item", countdown.id) === "after" ? "drop-after" : ""
].filter(Boolean).join(" ");
const reorderProps = reorderEnabled ? reorder.getItemProps({ itemId: countdown.id, parentId }) : {};
return (
{reorderEnabled && (
reorder.itemReorder.startDrag(event, countdown.id)}
aria-label={`${textContent.reorderTitle || "Déplacer"} ${countdown.label}`}
title={textContent.reorderTitle || "Déplacer"}
>
)}
{editingId === countdown.id ? (
onRename(countdown.id, label)}
onDone={() => setEditingId("")}
>
) : (
setEditingId(countdown.id)}
onKeyDown={(event) => handleEditableKeyDown(event, () => setEditingId(countdown.id))}
>
{countdown.label}
{canReset && (
{
event.stopPropagation();
onReset(countdown);
}}
aria-label={textContent.resetTitle || "Réinitialiser"}
title={textContent.resetTitle || "Réinitialiser"}
>
)}
{canToggleRefresh && (
{
event.stopPropagation();
onAutoRefreshToggle(countdown.id);
}}
disabled={refreshBlocked}
aria-pressed={Boolean(countdown.autoRefresh)}
aria-label={refreshTitle}
title={refreshTitle}
>
)}
onAlertModeChange(countdown.id, alertMode)}
/>
)}
onDelete(countdown.id)} aria-label={textContent.deleteTitle || "Supprimer"} title={textContent.deleteTitle || "Supprimer"}>
{getCountdownMetaParts(countdown, textContent).map((part, index) => (
{part}
))}
{expired ? textContent.finishedLabel || "Terminé" : `${textContent.targetLabel || "Prochaine occurrence"} ${formatTargetTime(countdown.targetMs)}`}
);
})}
);
}