Add scheduled invoice delivery
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
const FALLBACK_TIME_ZONE = "UTC";
|
||||
|
||||
export function isValidTimeZone(value: string): boolean {
|
||||
if (!value.trim()) return false;
|
||||
try {
|
||||
new Intl.DateTimeFormat("en-US", { timeZone: value }).format(0);
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function getLocalTimeZone(): string {
|
||||
const resolved = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
||||
return resolved && isValidTimeZone(resolved) ? resolved : FALLBACK_TIME_ZONE;
|
||||
}
|
||||
|
||||
export function formatZonedDateTime(
|
||||
value: Date | string | number,
|
||||
timeZone = getLocalTimeZone(),
|
||||
options: Intl.DateTimeFormatOptions = {},
|
||||
): string {
|
||||
const date = value instanceof Date ? value : new Date(value);
|
||||
if (Number.isNaN(date.getTime())) return "Invalid date";
|
||||
|
||||
return new Intl.DateTimeFormat("en-US", {
|
||||
dateStyle: "medium",
|
||||
timeStyle: "short",
|
||||
...options,
|
||||
timeZone: isValidTimeZone(timeZone) ? timeZone : FALLBACK_TIME_ZONE,
|
||||
}).format(date);
|
||||
}
|
||||
|
||||
export function getDefaultScheduledSendAt(now = new Date()): Date {
|
||||
const result = new Date(now);
|
||||
result.setMinutes(0, 0, 0);
|
||||
result.setHours(result.getHours() + 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
export function toLocalDateTimeInputValue(value: Date): string {
|
||||
const pad = (part: number) => String(part).padStart(2, "0");
|
||||
return `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}T${pad(value.getHours())}:${pad(value.getMinutes())}`;
|
||||
}
|
||||
Reference in New Issue
Block a user