AkurAI Build
Menu

popagent

public

Latest change 6edc7e928c57dab23c0973ed3f7ee70b3ebb72d5 - Initial popagent baseline by AkurAI Build

export type ScheduleFrequency = "daily" | "weekdays" | "weekly";

export const WEEKDAYS = [
  { value: "1", label: "Monday" },
  { value: "2", label: "Tuesday" },
  { value: "3", label: "Wednesday" },
  { value: "4", label: "Thursday" },
  { value: "5", label: "Friday" },
  { value: "6", label: "Saturday" },
  { value: "0", label: "Sunday" },
] as const;

export function scheduleCron(frequency: ScheduleFrequency, time: string, weekday: string): string {
  const [hourText = "", minuteText = ""] = time.split(":");
  const hour = Number(hourText);
  const minute = Number(minuteText);
  if (!/^\d{2}$/.test(hourText) || !/^\d{2}$/.test(minuteText) || hour > 23 || minute > 59) throw new Error("Invalid schedule time");
  if (frequency === "weekdays") return `${minute} ${hour} * * 1-5`;
  if (frequency === "weekly") return `${minute} ${hour} * * ${weekday}`;
  return `${minute} ${hour} * * *`;
}

export function describeSchedule(cron: string): string {
  const [minute = "", hour = "", dayOfMonth, month, dayOfWeek] = cron.split(" ");
  if (dayOfMonth !== "*" || month !== "*" || !/^\d+$/.test(minute) || !/^\d+$/.test(hour)) return cron;
  const time = new Date(2000, 0, 1, Number(hour), Number(minute)).toLocaleTimeString([], { hour: "numeric", minute: "2-digit" });
  if (dayOfWeek === "1-5") return `Weekdays at ${time}`;
  if (dayOfWeek === "*") return `Daily at ${time}`;
  const weekday = WEEKDAYS.find((item) => item.value === dayOfWeek)?.label;
  return weekday ? `${weekday}s at ${time}` : cron;
}