@cometchat/chat-uikit-react-native
Version:
Ready-to-use Chat UI Components for React Native
139 lines (126 loc) • 4.14 kB
text/typescript
import { ValueOf } from "./types";
// TODO: Fix the logics - as currently it is inefficient and non-readable
export class DateHelper {
/**
* Pattern for Date.
* one of
* 1. timeFormat: "hh:mm a".
* 2. dayDateFormat: Today, Yesterday, weekday or "d MMM, yyyy".
* 3. dayWeekDayDateTimeFormat: Today(time), weekday, Yesterday, or "dd/mm/yyyy".
*/
public static patterns = {
timeFormat: "timeFormat",
dayDateFormat: "dayDateFormat",
dayWeekDayDateFormat: "dayWeekDayDateFormat",
dayWeekDayDateTimeFormat: "dayWeekDayDateTimeFormat",
dayDateTimeFormat: "dayDateTimeFormat",
callBubble: "d MMM, hh:mm aa",
callLogs: "d MMMM, h:m aa",
} as const;
private static monthNames = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
] as const;
private static weekNames = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
] as const;
getWeekOfDay(date: Date) {
let weekDay = date.getDay();
let week = DateHelper.weekNames[weekDay];
return week.substring(0, 3);
}
getMonthOfDay(date: Date, full = false) {
let month = date.getMonth();
let mnth = DateHelper.monthNames[month];
if (full) return mnth;
return mnth.substring(0, 3);
}
getDateFormat(date: Date, pattern: ValueOf<typeof DateHelper.patterns>) {
if (pattern === DateHelper.patterns.dayDateFormat) {
return date.getDate() + " " + this.getMonthOfDay(date) + ", " + date.getFullYear();
}
let dt: any = date.getDate();
if (dt < 10) {
dt = "0" + dt;
}
return dt + "/" + (date.getMonth() + 1) + "/" + date.getFullYear();
}
getTimeFormat(date: Date) {
let timeString = date.getHours();
let postString = timeString >= 12 ? "PM" : "AM";
if (timeString > 12) {
timeString = timeString - 12;
}
let minutes: any = date.getMinutes();
if (minutes < 10) minutes = "0" + minutes;
return timeString + ":" + minutes + " " + postString;
}
getDate(date: Date, pattern: ValueOf<typeof DateHelper.patterns>) {
const today = new Date();
if (today.getMonth() === date.getMonth() && today.getFullYear() === date.getFullYear()) {
let diff = today.getDate() - date.getDate();
if (diff === 0) {
if (pattern === DateHelper.patterns.dayWeekDayDateTimeFormat) {
return this.getTimeFormat(date);
}
return "Today";
} else if (diff === 1) {
return "Yesterday";
} else if (diff < 7 && ([DateHelper.patterns.dayWeekDayDateTimeFormat,DateHelper.patterns.dayWeekDayDateFormat] as ValueOf<typeof DateHelper.patterns>[]).includes(pattern)) {
return this.getWeekOfDay(date);
} else {
return this.getDateFormat(date, pattern);
}
} else {
return this.getDateFormat(date, pattern);
}
}
getFormattedDate(timestamp: number, pattern: ValueOf<typeof DateHelper.patterns>) {
const date = new Date(timestamp);
if (pattern && pattern != null) {
let formattedDate = "";
switch (pattern) {
case DateHelper.patterns.timeFormat:
formattedDate = this.getTimeFormat(date);
break;
case DateHelper.patterns.dayDateFormat:
case DateHelper.patterns.dayWeekDayDateFormat:
case DateHelper.patterns.dayWeekDayDateTimeFormat:
case DateHelper.patterns.dayWeekDayDateTimeFormat:
formattedDate = this.getDate(date, pattern);
break;
case DateHelper.patterns.callBubble:
formattedDate = `${date.getDate()} ${this.getMonthOfDay(date)}, ${this.getTimeFormat(
date
)}`;
case DateHelper.patterns.callLogs:
formattedDate = `${date.getDate()} ${this.getMonthOfDay(
date,
true
)}, ${this.getTimeFormat(date).toLowerCase()}`;
break;
default:
break;
}
return formattedDate;
}
return null;
}
}
export const dateHelperInstance = new DateHelper();