/// /** * Text Swapper * * Simple pattern with two text labels and a swap button between them. * Click on either label to rename it via modal. */ import { Default, handler, pattern, UI, Writable } from "commontools"; // ============ TYPES ============ type EditingSide = "left" | "right" | null; interface Input { leftText: Writable>; rightText: Writable>; } interface Output { leftText: string; rightText: string; } // ============ HANDLERS ============ const swapTexts = handler< unknown, { leftText: Writable; rightText: Writable } >((_event, { leftText, rightText }) => { const left = leftText.get(); const right = rightText.get(); console.log("swapTexts", { left, right }); leftText.set(right); rightText.set(left); }); const openEditLeft = handler< unknown, { leftText: Writable; editingSide: Writable; editValue: Writable; showModal: Writable; } >((_event, { leftText, editingSide, editValue, showModal }) => { console.log("openEditLeft"); editingSide.set("left"); editValue.set(leftText.get()); showModal.set(true); }); const openEditRight = handler< unknown, { rightText: Writable; editingSide: Writable; editValue: Writable; showModal: Writable; } >((_event, { rightText, editingSide, editValue, showModal }) => { console.log("openEditRight"); editingSide.set("right"); editValue.set(rightText.get()); showModal.set(true); }); const saveEdit = handler< unknown, { leftText: Writable; rightText: Writable; editingSide: Writable; editValue: Writable; showModal: Writable; } >((_event, { leftText, rightText, editingSide, editValue, showModal }) => { const side = editingSide.get(); const value = editValue.get(); console.log("saveEdit", { side, value }); if (side === "left") { leftText.set(value); } else if (side === "right") { rightText.set(value); } showModal.set(false); editingSide.set(null); editValue.set(""); }); const closeModal = handler< unknown, { editingSide: Writable; editValue: Writable; showModal: Writable; } >((_event, { editingSide, editValue, showModal }) => { console.log("closeModal"); showModal.set(false); editingSide.set(null); editValue.set(""); }); // ============ PATTERN ============ export default pattern(({ leftText, rightText }) => { // Modal state const showModal = Writable.of(false); const editingSide = Writable.of(null); const editValue = Writable.of(""); const labelStyle = { padding: "12px 24px", backgroundColor: "#f3f4f6", borderRadius: "8px", fontSize: "1.25rem", minWidth: "100px", textAlign: "center", cursor: "pointer", }; return { leftText, rightText, [UI]: (
{leftText}
⇄ Swap
{rightText}
{/* Edit Modal */} Edit {editingSide.get() === "left" ? "Left" : "Right"} Text
), }; });