149 lines
3.5 KiB
TypeScript
149 lines
3.5 KiB
TypeScript
|
|
import * as cherrio from "cheerio";
|
||
|
|
|
||
|
|
export const utils = {
|
||
|
|
toNumber,
|
||
|
|
toString,
|
||
|
|
toBoolean,
|
||
|
|
toNumberArray,
|
||
|
|
toStringArray,
|
||
|
|
dateFormat,
|
||
|
|
generateSlugWithId,
|
||
|
|
formattedTime,
|
||
|
|
formateDate,
|
||
|
|
isDev,
|
||
|
|
domainImage,
|
||
|
|
uid,
|
||
|
|
isExternalUrl,
|
||
|
|
isValidPhone,
|
||
|
|
isTouchDevice,
|
||
|
|
toTitleCase
|
||
|
|
};
|
||
|
|
|
||
|
|
function toNumber(value: any, _default?: number): number {
|
||
|
|
const number = parseInt(String(value));
|
||
|
|
return Number(
|
||
|
|
isNaN(number) ? (_default !== undefined ? _default : 0) : number
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
function toString(value: any): string {
|
||
|
|
return String(value);
|
||
|
|
}
|
||
|
|
|
||
|
|
function toBoolean(value: any): boolean {
|
||
|
|
const lowercaseValue = String(value).toLowerCase();
|
||
|
|
if (lowercaseValue === "true") {
|
||
|
|
return true;
|
||
|
|
} else if (lowercaseValue === "false") {
|
||
|
|
return false;
|
||
|
|
} else {
|
||
|
|
throw new Error("Invalid boolean string");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function toNumberArray(value: any): number[] {
|
||
|
|
return String(value)
|
||
|
|
.split(",")
|
||
|
|
.map((item) => Number(item.trim()))
|
||
|
|
.filter((num) => !isNaN(num));
|
||
|
|
}
|
||
|
|
function toStringArray(value: any): string[] {
|
||
|
|
return String(value)
|
||
|
|
.split(",")
|
||
|
|
.map((item) => item.trim());
|
||
|
|
}
|
||
|
|
|
||
|
|
import dayjs from "dayjs";
|
||
|
|
|
||
|
|
function dateFormat(date: any, format?: string) {
|
||
|
|
const dayjsInstance = dayjs(date);
|
||
|
|
const formatter = format ?? "ddd, D MMM YYYY HH:mm";
|
||
|
|
let d = dayjsInstance.format(formatter);
|
||
|
|
return d;
|
||
|
|
}
|
||
|
|
|
||
|
|
function generateSlugWithId(prefix?: string, slug?: string, id?: number) {
|
||
|
|
return `${prefix}/${slug}${id ? "-" + id : ""}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
function formattedTime(seconds: number) {
|
||
|
|
const minutes = Math.floor(seconds / 60);
|
||
|
|
const remainingSeconds = Math.floor(seconds % 60);
|
||
|
|
return `${String(minutes).padStart(2, "0")}:${String(
|
||
|
|
remainingSeconds
|
||
|
|
).padStart(2, "0")}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
function formateDate(
|
||
|
|
date: string | Date | undefined,
|
||
|
|
formatter: string = "HH:mm, dddd, D MMMM YYYY"
|
||
|
|
) {
|
||
|
|
if (!date) {
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
const formattedDate = useDateFormat(date, formatter, { locales: "vi-VN" });
|
||
|
|
|
||
|
|
const dateObject = new Date(date);
|
||
|
|
const time = formattedDate.value.slice(0, 5); // Extract HH:mm
|
||
|
|
const day = `0${dateObject.getDate()}`.slice(-2); // Get day with leading zero
|
||
|
|
const month = `0${dateObject.getMonth() + 1}`.slice(-2); // Get month with leading zero
|
||
|
|
const year = dateObject.getFullYear();
|
||
|
|
|
||
|
|
// Creating the desired format "16:21 | 04/10/2022"
|
||
|
|
const result = ` ${day}/${month}/${year}`;
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
function isDev() {
|
||
|
|
return process.env.NODE_ENV === "development";
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function domainImage(text: string = "", domainImage: string = "") {
|
||
|
|
const replaceDomains = ["http://45.77.168.121:8083"];
|
||
|
|
|
||
|
|
if (text) {
|
||
|
|
const $ = cherrio.load(text, null, false);
|
||
|
|
|
||
|
|
$("figure img").each((i, el) => {
|
||
|
|
const src = $(el).attr("src");
|
||
|
|
|
||
|
|
if (src && replaceDomains.some((domain) => src.startsWith(domain))) {
|
||
|
|
const replaceDomain = replaceDomains.find((domain) =>
|
||
|
|
src.startsWith(domain)
|
||
|
|
)!;
|
||
|
|
$(el).attr("src", src.replace(replaceDomain, domainImage));
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
return $.html();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
let _id = 0
|
||
|
|
|
||
|
|
function uid () {
|
||
|
|
_id = (_id + 1) % Number.MAX_SAFE_INTEGER
|
||
|
|
return `vuid-${_id}`
|
||
|
|
}
|
||
|
|
|
||
|
|
function isExternalUrl(url?: string) {
|
||
|
|
if(!url) return false
|
||
|
|
return /^(http?:|https?:|mailto:|tel:)/.test(url)
|
||
|
|
}
|
||
|
|
|
||
|
|
function isValidPhone(phone:string){
|
||
|
|
return /^(0)(3[2-9]|5[6|8|9]|7[0|6-9]|8[0-6|8|9]|9[0-4|6-9])[0-9]{7}$/.test(phone)
|
||
|
|
}
|
||
|
|
|
||
|
|
function isTouchDevice() {
|
||
|
|
return 'maxTouchPoints' in navigator && navigator.maxTouchPoints > 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
function toTitleCase(str?: string){
|
||
|
|
if (!str) return;
|
||
|
|
return str.replace(/\w\S*/g, function (txt) {
|
||
|
|
return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();
|
||
|
|
});
|
||
|
|
}
|