FEAT: Enhance authentication session management with configurable cookie domain and improved token refresh logic
This commit is contained in:
139
utils/dateUtils.ts
Normal file
139
utils/dateUtils.ts
Normal file
@@ -0,0 +1,139 @@
|
||||
/**
|
||||
* Unified date formatting utilities for consistent date display across the application
|
||||
*/
|
||||
|
||||
/**
|
||||
* Format date string to display format (DD/MM/YYYY HH:mm or DD/MM/YYYY)
|
||||
* Handles multiple input formats: ISO, DD-MM-YYYY, YYYY-MM-DD, DD/MM/YYYY
|
||||
*/
|
||||
export const formatDate = (dateString: string | null | undefined): string => {
|
||||
if (!dateString) return "-";
|
||||
|
||||
try {
|
||||
let date: Date;
|
||||
|
||||
// Check if it's an ISO date string (e.g., "2025-06-09T22:58:47.731Z")
|
||||
if (dateString.includes('T') || dateString.includes('Z')) {
|
||||
date = new Date(dateString);
|
||||
}
|
||||
// Handle DD-MM-YYYY format
|
||||
else if (dateString.match(/^\d{1,2}-\d{1,2}-\d{4}$/)) {
|
||||
const [day, month, year] = dateString.split("-");
|
||||
date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
|
||||
}
|
||||
// Handle DD/MM/YYYY format
|
||||
else if (dateString.match(/^\d{1,2}\/\d{1,2}\/\d{4}$/)) {
|
||||
const [day, month, year] = dateString.split("/");
|
||||
date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
|
||||
}
|
||||
// Handle YYYY-MM-DD format
|
||||
else if (dateString.match(/^\d{4}-\d{1,2}-\d{1,2}$/)) {
|
||||
date = new Date(dateString);
|
||||
}
|
||||
// Fallback to direct parsing
|
||||
else {
|
||||
date = new Date(dateString);
|
||||
}
|
||||
|
||||
// Check if date is valid
|
||||
if (isNaN(date.getTime())) {
|
||||
console.warn("Invalid date format:", dateString);
|
||||
return dateString;
|
||||
}
|
||||
|
||||
// Format date in DD/MM/YYYY HH:mm format
|
||||
const day = date.getDate().toString().padStart(2, '0');
|
||||
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
||||
const year = date.getFullYear();
|
||||
const hours = date.getHours().toString().padStart(2, '0');
|
||||
const minutes = date.getMinutes().toString().padStart(2, '0');
|
||||
|
||||
// Include time if it's not midnight
|
||||
if (hours !== '00' || minutes !== '00') {
|
||||
return `${day}/${month}/${year} ${hours}:${minutes}`;
|
||||
}
|
||||
|
||||
return `${day}/${month}/${year}`;
|
||||
} catch (error) {
|
||||
console.error('Date formatting error:', error, dateString);
|
||||
return dateString;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get relative time description (e.g., "2 days ago", "Yesterday", "Today")
|
||||
*/
|
||||
export const getRelativeTime = (dateString: string | null | undefined): string => {
|
||||
if (!dateString) return '';
|
||||
|
||||
try {
|
||||
let date: Date;
|
||||
|
||||
// Handle DD-MM-YYYY format
|
||||
if (dateString.includes('-') && dateString.match(/^\d{1,2}-\d{1,2}-\d{4}$/)) {
|
||||
const parts = dateString.split('-');
|
||||
if (parts.length === 3) {
|
||||
const [day, month, year] = parts;
|
||||
date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
|
||||
} else {
|
||||
date = new Date(dateString);
|
||||
}
|
||||
} else {
|
||||
date = new Date(dateString);
|
||||
}
|
||||
|
||||
if (isNaN(date.getTime())) return '';
|
||||
|
||||
const now = new Date();
|
||||
const diffTime = Math.abs(now.getTime() - date.getTime());
|
||||
const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
|
||||
|
||||
if (diffDays === 0) return 'Today';
|
||||
if (diffDays === 1) return 'Yesterday';
|
||||
if (diffDays < 7) return `${diffDays} days ago`;
|
||||
if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;
|
||||
if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;
|
||||
return `${Math.floor(diffDays / 365)} years ago`;
|
||||
} catch (error) {
|
||||
console.error('Relative time calculation error:', error, dateString);
|
||||
return '';
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Format date for display in US locale (Month DD, YYYY)
|
||||
*/
|
||||
export const formatDateUS = (dateString: string | null | undefined): string => {
|
||||
if (!dateString) return "-";
|
||||
|
||||
try {
|
||||
let date: Date;
|
||||
|
||||
// Handle DD-MM-YYYY format
|
||||
if (dateString.includes('-') && dateString.match(/^\d{1,2}-\d{1,2}-\d{4}$/)) {
|
||||
const parts = dateString.split('-');
|
||||
if (parts.length === 3) {
|
||||
const [day, month, year] = parts;
|
||||
date = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));
|
||||
} else {
|
||||
date = new Date(dateString);
|
||||
}
|
||||
} else {
|
||||
date = new Date(dateString);
|
||||
}
|
||||
|
||||
if (isNaN(date.getTime())) {
|
||||
console.warn("Invalid date format:", dateString);
|
||||
return "-";
|
||||
}
|
||||
|
||||
return date.toLocaleDateString("en-US", {
|
||||
year: "numeric",
|
||||
month: "short",
|
||||
day: "numeric",
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Error formatting date:", dateString, error);
|
||||
return "-";
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user