import { useEffect, useRef } from "@wordpress/element";
import { useBlockProps } from "@wordpress/block-editor";
import { select, subscribe } from "@wordpress/data";
import Inspector from "./inspector";
import CountdownPreview from "./preview";
import getCountdownStyles from "./styles";
const { duplicateBlockIdFix } = window.EBControls;
const pad = (n) => String(n).padStart(2, "0");
export default function Edit(props) {
const { attributes, setAttributes, clientId } = props;
const { blockId, blockStyles, dueTime, resOption } = attributes;
// Keep resOption in sync with the editor's preview device — without relying
// on the press-bar-only `nx_style_handler` global.
const deviceRef = useRef(resOption);
useEffect(() => {
const sel = select("core/edit-post");
const read = () =>
sel && sel.__experimentalGetPreviewDeviceType
? sel.__experimentalGetPreviewDeviceType()
: "Desktop";
const initial = read();
deviceRef.current = initial;
setAttributes({ resOption: initial });
const unsubscribe = subscribe(() => {
const device = read();
if (device && device !== deviceRef.current) {
deviceRef.current = device;
setAttributes({ resOption: device });
}
});
return () => unsubscribe();
}, []);
// Unique, duplicate-safe blockId used to scope this instance's styles.
useEffect(() => {
duplicateBlockIdFix({
BLOCK_PREFIX: "nx-countdown",
blockId,
setAttributes,
select,
clientId,
});
}, []);
// Sensible default due date (now + 7 days) for new blocks.
useEffect(() => {
if (!dueTime) {
const d = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);
const local = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(
d.getDate()
)}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
setAttributes({ dueTime: local });
}
}, []);
const styleObj = blockId
? getCountdownStyles(blockId, attributes)
: { desktop: "", tab: "", mobile: "" };
// Persist computed CSS so the PHP render_callback can echo it on the frontend.
useEffect(() => {
if (!blockId) return;
if (JSON.stringify(blockStyles) !== JSON.stringify(styleObj)) {
setAttributes({ blockStyles: styleObj });
}
}, [attributes, blockId]);
return (
<>