__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
/**
* WordPress dependencies
*/
import { __ } from "@wordpress/i18n";
import { useEffect, useRef, memo } from "@wordpress/element";
import { applyFilters } from "@wordpress/hooks";
/**
* Internal dependencies
*/
import {
BlockProps,
BrowseTemplate,
withBlockContext
} from "@essential-blocks/controls";
import Inspector from "./inspector";
import Style from "./style";
import defaultAttributes from './attributes';
import Templates from '../../../../patterns/countdown.json'
import { ReactComponent as Icon } from "./icon.svg";
function Edit(props) {
const {
attributes,
setAttributes,
isSelected,
} = props;
const daysRef = useRef(null);
const hoursRef = useRef(null);
const minutesRef = useRef(null);
const secondsRef = useRef(null);
const {
resOption,
blockId,
blockMeta,
// deadline Date timestamp
endTimeStamp,
//
showDays,
showHours,
showMinutes,
showSeconds,
//
daysLabel,
hoursLabel,
minutesLabel,
secondsLabel,
//
preset,
classHook,
isEvergreenTimer,
evergreenTimerHours,
evergreenTimerMinutes,
recurringCountdown,
restartTime,
recurringCountdownEnd,
showBlockContent
} = attributes;
// you must declare this variable
const enhancedProps = {
...props,
blockPrefix: 'eb-countdown',
style: <Style {...props} />
};
// this useEffect is for the countdown animation effect
useEffect(() => {
const fakeElement = { current: { textContent: "3e" } };
const daysRefUe = daysRef.current ? daysRef : fakeElement;
const hoursRefUe = hoursRef.current ? hoursRef : fakeElement;
const minutesRefUe = minutesRef.current ? minutesRef : fakeElement;
const secondsRefUe = secondsRef.current ? secondsRef : fakeElement;
const MINUTE_IN_SECONDS = 60;
const HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS;
const DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS;
const WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS;
const MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS;
const YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS;
const HOUR_IN_MILISECONDS = 60 * 60 * 1000;
const timeLeft = (deadlineTimeStamp, intervalId = null) => {
const now = Date.now();
const secondsLeft = Math.round((deadlineTimeStamp - now) / 1000);
const seconds = secondsLeft % 60;
const minutes = Math.floor(secondsLeft / 60) % 60;
const hours = Math.floor(secondsLeft / 3600) % 24;
const days = Math.floor(secondsLeft / 86400);
if (secondsLeft < 0) {
clearInterval(intervalId);
daysRefUe.current.textContent = "00";
hoursRefUe.current.textContent = "00";
minutesRefUe.current.textContent = "00";
secondsRefUe.current.textContent = "00";
return;
}
daysRefUe.current.textContent = days < 10 ? `0${days}` : `${days}`;
hoursRefUe.current.textContent =
hours < 10 ? `0${hours}` : `${hours}`;
minutesRefUe.current.textContent =
minutes < 10 ? `0${minutes}` : `${minutes}`;
secondsRefUe.current.textContent =
seconds < 10 ? `0${seconds}` : `${seconds}`;
};
if (isEvergreenTimer) {
let evergreenInterval = blockId + "_evergreen_interval",
evergreenTimeKey = blockId + "_evergreen_time",
interval = localStorage.getItem(evergreenInterval),
date = localStorage.getItem(evergreenTimeKey),
hours = parseInt(evergreenTimerHours || 0) * HOUR_IN_SECONDS,
minutes =
parseInt(evergreenTimerMinutes || 0) * MINUTE_IN_SECONDS,
evergreenTime = parseInt(hours + minutes);
if (
date === null ||
interval === null ||
interval != evergreenTime
) {
date = Date.now() + parseInt(evergreenTime) * 1000;
localStorage.setItem(evergreenInterval, evergreenTime);
localStorage.setItem(evergreenTimeKey, date);
}
if (recurringCountdown) {
let recurringAfter =
parseFloat(restartTime) * HOUR_IN_MILISECONDS;
if (parseInt(date) + recurringAfter < Date.now()) {
date = Date.now() + parseInt(evergreenTime) * 1000;
localStorage.setItem(evergreenTimeKey, date);
}
if (recurringCountdownEnd < date) {
date = recurringCountdownEnd;
}
}
timeLeft(date || 0);
const intervalIdEver = setInterval(() => {
timeLeft(date || 0, intervalIdEver);
}, 1000);
return () => {
clearInterval(intervalIdEver);
};
}
if (!isEvergreenTimer) {
timeLeft(endTimeStamp || 0);
const intervalId = setInterval(() => {
timeLeft(endTimeStamp || 0, intervalId);
}, 1000);
return () => {
clearInterval(intervalId);
};
}
}, [
endTimeStamp,
showDays,
showHours,
showMinutes,
showSeconds,
isEvergreenTimer,
evergreenTimerHours,
evergreenTimerMinutes,
recurringCountdown,
restartTime,
recurringCountdownEnd,
]);
return (
<>
{isSelected && showBlockContent && (
<Inspector
attributes={attributes}
setAttributes={setAttributes}
/>
)}
<BlockProps.Edit {...enhancedProps}>
<BrowseTemplate
{...props}
Icon={Icon}
title={"Countdown"}
description={"Choose a template for the Countdown or start blank."}
patterns={applyFilters('eb_pro_templates_countdown', Templates)}
/>
{showBlockContent && (
<>
<div
className={`eb-parent-wrapper eb-parent-${blockId} ${classHook}`}
>
<div className={`${blockId} eb-cd-wrapper ${preset}`}>
<div className="eb-cd-inner">
{showDays ? (
<div className="box cd-box-day">
<span ref={daysRef} className="eb-cd-digit">
00
</span>
{daysLabel ? (
<span className="eb-cd-label">
{daysLabel}
</span>
) : null}
</div>
) : null}
{showHours ? (
<div className="box cd-box-hour">
<span
ref={hoursRef}
className="eb-cd-digit"
>
00
</span>
{hoursLabel ? (
<span className="eb-cd-label">
{hoursLabel}
</span>
) : null}
</div>
) : null}
{showMinutes ? (
<div className="box cd-box-minute">
<span
ref={minutesRef}
className="eb-cd-digit"
>
00
</span>
{minutesLabel ? (
<span className="eb-cd-label">
{minutesLabel}
</span>
) : null}
</div>
) : null}
{showSeconds ? (
<div className="box cd-box-second">
<span
ref={secondsRef}
className="eb-cd-digit"
>
00
</span>
{secondsLabel ? (
<span className="eb-cd-label">
{secondsLabel}
</span>
) : null}
</div>
) : null}
</div>
</div>
</div>
</>
)}
</BlockProps.Edit>
</>
);
}
export default memo(withBlockContext(defaultAttributes)(Edit))
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| constants | Folder | 0750 |
|
|
| attributes.js | File | 7.7 KB | 0640 |
|
| deprecated.js | File | 15.49 KB | 0640 |
|
| edit.js | File | 10.08 KB | 0640 |
|
| example.js | File | 105 B | 0640 |
|
| frontend.js | File | 4.82 KB | 0640 |
|
| icon.svg | File | 1.85 KB | 0640 |
|
| index.js | File | 774 B | 0640 |
|
| inspector.js | File | 27.04 KB | 0640 |
|
| save.js | File | 3.67 KB | 0640 |
|
| singleBoxControl.js | File | 1.8 KB | 0640 |
|
| style.css | File | 312 B | 0640 |
|
| style.js | File | 22.16 KB | 0640 |
|
| style.scss | File | 236 B | 0640 |
|