on-codemerge
Version:
A WYSIWYG editor for on-codemerge is a user-friendly interface that allows users to edit and view their code in real time, exactly as it will appear in the final product
194 lines (186 loc) • 7.89 kB
JavaScript
/*! on-codemerge v1.3.1 @author Pavel Kuzmin @license MIT @homepage https://s00d.github.io/on-codemerge/ @repository git+https://github.com/s00d/on-codemerge.git Copyright (c) 2026 Pavel Kuzmin - Built on 2026-07-02T13:39:17.947Z */
var c = Object.defineProperty;
var m = (d, e, r) => e in d ? c(d, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : d[e] = r;
var a = (d, e, r) => m(d, typeof e != "symbol" ? e + "" : e, r);
class l {
constructor(e) {
a(this, "remindersKey", "html-editor-calendar-reminders");
a(this, "checkInterval", null);
a(this, "calendarManager", null);
this.calendarManager = e || null, this.startReminderCheck();
}
// Установка ссылки на CalendarManager
setCalendarManager(e) {
this.calendarManager = e;
}
// Создание напоминания
createReminder(e, r) {
if (!e.reminder)
throw new Error("Event has no reminder set");
const i = (/* @__PURE__ */ new Date(`${e.date}T${e.time}`)).getTime() - e.reminder * 60 * 1e3, t = {
id: crypto.randomUUID(),
eventId: e.id,
calendarId: r,
triggerTime: i,
message: `Reminder: ${e.title} starts in ${e.reminder} minutes`,
isShown: !1,
createdAt: Date.now()
}, s = this.getReminders();
return s.push(t), localStorage.setItem(this.remindersKey, JSON.stringify(s)), t;
}
// Получение всех напоминаний
getReminders() {
const e = localStorage.getItem(this.remindersKey);
return e ? JSON.parse(e) : [];
}
// Получение напоминаний для события
getEventReminders(e) {
return this.getReminders().filter((r) => r.eventId === e);
}
// Удаление напоминания
deleteReminder(e) {
const r = this.getReminders().filter((n) => n.id !== e);
localStorage.setItem(this.remindersKey, JSON.stringify(r));
}
// Удаление всех напоминаний события
deleteEventReminders(e) {
const r = this.getReminders().filter((n) => n.eventId !== e);
localStorage.setItem(this.remindersKey, JSON.stringify(r));
}
// Проверка напоминаний
startReminderCheck() {
this.checkInterval && clearInterval(this.checkInterval), this.checkInterval = window.setInterval(() => {
this.checkReminders();
}, 6e4);
}
checkReminders() {
const e = Date.now();
this.getReminders().filter(
(i) => i.triggerTime <= e && !i.isShown
).forEach((i) => {
this.showReminder(i);
});
}
// Показать напоминание
showReminder(e) {
const r = this.getReminders(), n = r.findIndex((t) => t.id === e.id);
n !== -1 && (r[n].isShown = !0, localStorage.setItem(this.remindersKey, JSON.stringify(r)));
const i = this.generateReminderHTML(e);
this.insertReminderHTML(i, e.id);
}
// Генерация HTML кода для напоминания
generateReminderHTML(e) {
const r = this.getEventById(e.eventId);
if (!r) return "";
const n = r.priority || "medium", i = r.color || "#3b82f6", t = r.tags && r.tags.length > 0 ? `<div class="event-tags">${r.tags.map((s) => `<span class="event-tag">${s}</span>`).join("")}</div>` : "";
return `
<div class="calendar-reminder" data-reminder-id="${e.id}" data-event-id="${e.eventId}">
<div class="reminder-header">
<div class="reminder-icon">⏰</div>
<div class="reminder-title">Event Reminder</div>
<button class="reminder-close" onclick="this.closest('.calendar-reminder').remove()">×</button>
</div>
<div class="reminder-content">
<div class="reminder-event-title">${r.title}</div>
<div class="reminder-event-time">${r.date} at ${r.time}</div>
${r.location ? `<div class="reminder-event-location">📍 ${r.location}</div>` : ""}
${r.description ? `<div class="reminder-event-description">${r.description}</div>` : ""}
${t}
</div>
<div class="reminder-footer">
<div class="reminder-priority priority-${n}">${n.toUpperCase()}</div>
<div class="reminder-category" style="background-color: ${i}">${r.category || "General"}</div>
</div>
</div>
`;
}
// Вставка HTML напоминания в DOM
insertReminderHTML(e, r) {
let n = document.querySelector(".calendar-reminders-container");
n || (n = document.createElement("div"), n.className = "calendar-reminders-container", n.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
z-index: 10000;
max-width: 400px;
pointer-events: none;
`, document.body.appendChild(n));
const i = document.createElement("div");
i.innerHTML = e;
const t = i.firstElementChild;
t && (n.appendChild(t), setTimeout(() => {
t.parentNode && t.parentNode.removeChild(t);
}, 3e4));
}
// Генерация JavaScript кода для клиента
generateReminderScript(e) {
const r = this.getReminders().filter((i) => i.calendarId === e);
if (r.length === 0) return "";
const n = r.map((i) => ({
id: i.id,
eventId: i.eventId,
triggerTime: i.triggerTime,
message: i.message
}));
return `
<script>
(function() {
const reminderData = ${JSON.stringify(n)};
const now = Date.now();
function showReminder(reminder) {
const reminderHtml = \`
<div class="calendar-reminder" data-reminder-id="\${reminder.id}">
<div class="reminder-header">
<div class="reminder-icon">⏰</div>
<div class="reminder-title">Event Reminder</div>
<button class="reminder-close" onclick="this.closest('.calendar-reminder').remove()">×</button>
</div>
<div class="reminder-content">
<div class="reminder-message">\${reminder.message}</div>
</div>
</div>
\`;
let container = document.querySelector('.calendar-reminders-container');
if (!container) {
container = document.createElement('div');
container.className = 'calendar-reminders-container';
container.style.cssText = 'position: fixed; top: 20px; right: 20px; z-index: 10000; max-width: 400px;';
document.body.appendChild(container);
}
const reminderElement = document.createElement('div');
reminderElement.innerHTML = reminderHtml;
container.appendChild(reminderElement.firstElementChild);
setTimeout(() => {
const reminder = document.querySelector(\`[data-reminder-id="\${reminder.id}"]\`);
if (reminder && reminder.parentNode) {
reminder.parentNode.removeChild(reminder);
}
}, 30000);
}
function checkReminders() {
reminderData.forEach(reminder => {
if (reminder.triggerTime <= now) {
showReminder(reminder);
}
});
}
// Проверяем сразу
checkReminders();
// Проверяем каждую минуту
setInterval(checkReminders, 60000);
})();
<\/script>
`;
}
// Получение события по ID из CalendarManager
getEventById(e) {
return this.calendarManager ? this.calendarManager.getEvent(e) : (console.warn("CalendarManager not set in ReminderService"), null);
}
// Очистка ресурсов
destroy() {
this.checkInterval && (clearInterval(this.checkInterval), this.checkInterval = null);
}
}
export {
l as ReminderService
};