///
/**
* 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
),
};
});