Skip to content

Deadlines ​

Understanding how to work with deadlines is crucial for effective use of VanisherJS. This guide covers all deadline formats, handling edge cases, and best practices.

Deadline Formats ​

Date Objects ​

The most reliable way to specify deadlines:

javascript
import { createVanisher } from "vanisher";

// Using Date constructor
const vanisher = createVanisher({
  deadline: new Date("2024-12-31T23:59:59"),
  targetElement: "#content",
});

// Using Date methods
const deadline = new Date();
deadline.setFullYear(2024);
deadline.setMonth(11); // December (0-indexed)
deadline.setDate(31);
deadline.setHours(23, 59, 59, 999);

const vanisher = createVanisher({
  deadline: deadline,
  targetElement: "#content",
});

ISO Strings ​

Standard ISO 8601 format for dates:

javascript
// Full ISO string
deadline: "2024-12-31T23:59:59.999Z";

// ISO string without timezone
deadline: "2024-12-31T23:59:59";

// ISO date only
deadline: "2024-12-31";

// ISO with time only
deadline: "T23:59:59";

Date Strings ​

Human-readable date formats:

javascript
// Various date string formats
deadline: "December 31, 2024";
deadline: "Dec 31, 2024";
deadline: "31/12/2024";
deadline: "12/31/2024";
deadline: "2024-12-31";
deadline: "31-12-2024";

Timestamps ​

Unix timestamps in milliseconds:

javascript
// Current timestamp
deadline: Date.now();

// Specific timestamp
deadline: 1704067199000;

// Future timestamp (1 hour from now)
deadline: Date.now() + 1000 * 60 * 60;

// Past timestamp (for testing)
deadline: Date.now() - 1000 * 60 * 60;

Deadline Calculations ​

Relative Deadlines ​

Calculate deadlines relative to current time:

javascript
// 30 days from now
const thirtyDaysFromNow = new Date();
thirtyDaysFromNow.setDate(thirtyDaysFromNow.getDate() + 30);

const vanisher = createVanisher({
  deadline: thirtyDaysFromNow,
  targetElement: "#content",
});

// 2 weeks from now
const twoWeeksFromNow = new Date();
twoWeeksFromNow.setDate(twoWeeksFromNow.getDate() + 14);

// 6 hours from now
const sixHoursFromNow = new Date();
sixHoursFromNow.setHours(sixHoursFromNow.getHours() + 6);

Business Logic Deadlines ​

Calculate deadlines based on business rules:

javascript
// Invoice due in 30 days
function createInvoiceDeadline(invoiceDate) {
  const dueDate = new Date(invoiceDate);
  dueDate.setDate(dueDate.getDate() + 30);
  return dueDate;
}

// Trial period (14 days)
function createTrialDeadline(startDate) {
  const trialEnd = new Date(startDate);
  trialEnd.setDate(trialEnd.getDate() + 14);
  return trialEnd;
}

// Seasonal content (until end of month)
function createMonthlyDeadline() {
  const now = new Date();
  const endOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);
  endOfMonth.setHours(23, 59, 59, 999);
  return endOfMonth;
}

Timezone Handling ​

Local vs UTC ​

VanisherJS handles timezones automatically:

javascript
// Local time (user's timezone)
deadline: "2024-12-31T23:59:59";

// UTC time
deadline: "2024-12-31T23:59:59Z";

// Specific timezone
deadline: "2024-12-31T23:59:59-05:00"; // EST
deadline: "2024-12-31T23:59:59+01:00"; // CET

Best Practices for Timezones ​

javascript
// Always use explicit timezone for global applications
const globalDeadline = "2024-12-31T23:59:59Z";

// Use local time for user-specific content
const localDeadline = "2024-12-31T23:59:59";

// Convert between timezones if needed
function convertToUserTimezone(utcDate, userTimezone) {
  const date = new Date(utcDate);
  return date.toLocaleString("en-US", { timeZone: userTimezone });
}

Edge Cases and Validation ​

Invalid Dates ​

Handle invalid date inputs:

javascript
function validateDeadline(deadline) {
  const date = new Date(deadline);

  if (isNaN(date.getTime())) {
    throw new Error("Invalid deadline date provided");
  }

  if (date <= new Date()) {
    throw new Error("Deadline must be in the future");
  }

  return date;
}

try {
  const vanisher = createVanisher({
    deadline: validateDeadline("invalid-date"),
    targetElement: "#content",
  });
} catch (error) {
  console.error("Deadline validation failed:", error.message);
}

Past Deadlines ​

Handle deadlines that have already passed:

javascript
function createVanisherWithValidation(options) {
  const deadline = new Date(options.deadline);
  const now = new Date();

  if (deadline <= now) {
    // Deadline has passed, show expired content immediately
    return {
      getStatus: () => ({
        opacity: 0,
        daysRemaining: 0,
        hoursRemaining: 0,
        isActive: false,
      }),
    };
  }

  return createVanisher(options);
}

Dynamic Deadlines ​

Update deadlines based on user actions:

javascript
const vanisher = createVanisher({
  deadline: "2024-12-31T23:59:59",
  targetElement: "#content",
});

// Extend deadline when user makes payment
function extendDeadline(additionalDays) {
  const currentDeadline = vanisher.getDeadlineDate();
  const newDeadline = new Date(currentDeadline);
  newDeadline.setDate(newDeadline.getDate() + additionalDays);

  vanisher.updateOptions({
    deadline: newDeadline,
  });
}

// Usage
extendDeadline(7); // Extend by 7 days

Deadline Monitoring ​

Status Checking ​

Monitor deadline progress:

javascript
const vanisher = createVanisher({
  deadline: "2024-12-31T23:59:59",
  targetElement: "#content",
});

// Check status periodically
setInterval(
  () => {
    const status = vanisher.getStatus();

    if (status.daysRemaining <= 7) {
      showUrgencyWarning(status.daysRemaining);
    }

    if (status.daysRemaining <= 1) {
      showLastDayWarning();
    }
  },
  1000 * 60 * 60,
); // Check every hour

Progress Indicators ​

Show visual progress to users:

javascript
function updateProgressBar(vanisher) {
  const status = vanisher.getStatus();
  const progressBar = document.querySelector("#progress-bar");

  if (progressBar) {
    const percentage = Math.round(status.opacity * 100);
    progressBar.style.width = `${percentage}%`;
    progressBar.textContent = `${percentage}% remaining`;
  }
}

// Update progress every minute
setInterval(() => updateProgressBar(vanisher), 1000 * 60);

Common Deadline Patterns ​

Invoice Deadlines ​

javascript
function createInvoiceVanisher(invoiceData) {
  const dueDate = new Date(invoiceData.issueDate);
  dueDate.setDate(dueDate.getDate() + invoiceData.paymentTerms);

  return createVanisher({
    deadline: dueDate,
    targetElement: `#invoice-${invoiceData.id}`,
    onDeadlineReached: () => {
      sendOverdueNotification(invoiceData.id);
      applyLateFees(invoiceData.id);
    },
  });
}

Subscription Deadlines ​

javascript
function createSubscriptionVanisher(subscription) {
  const renewalDate = new Date(subscription.startDate);
  renewalDate.setMonth(renewalDate.getMonth() + subscription.duration);

  return createVanisher({
    deadline: renewalDate,
    targetElement: `#subscription-${subscription.id}`,
    onDeadlineReached: () => {
      showRenewalModal(subscription.id);
      sendRenewalReminder(subscription.id);
    },
  });
}

Event Deadlines ​

javascript
function createEventVanisher(event) {
  const eventDate = new Date(event.date);
  const registrationDeadline = new Date(eventDate);
  registrationDeadline.setDate(registrationDeadline.getDate() - 7); // 7 days before

  return createVanisher({
    deadline: registrationDeadline,
    targetElement: `#event-${event.id}`,
    onDeadlineReached: () => {
      closeRegistration(event.id);
      showWaitlistOption(event.id);
    },
  });
}

Next Steps ​

Released under the MIT License.