UNPKG

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

84 lines (76 loc) 6.5 kB
/*! 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 */ "use strict";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);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class o{constructor(e){a(this,"remindersKey","html-editor-calendar-reminders");a(this,"checkInterval",null);a(this,"calendarManager",null);this.calendarManager=e||null,this.startReminderCheck()}setCalendarManager(e){this.calendarManager=e}createReminder(e,r){if(!e.reminder)throw new Error("Event has no reminder set");const i=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)}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> `}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))}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> `}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)}}exports.ReminderService=o;