release 0.3.4
This commit is contained in:
@@ -1,6 +1,166 @@
|
||||
import { clsx, type ClassValue } from "clsx";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import ms from "ms";
|
||||
import { ContentItem } from "./types/note";
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
|
||||
export const timeAgo = (timestamp: number, timeOnly?: boolean): string => {
|
||||
if (!timestamp) return "never";
|
||||
return `${ms(Date.now() - new Date(timestamp).getTime())}${
|
||||
timeOnly ? "" : " ago"
|
||||
}`;
|
||||
};
|
||||
|
||||
export async function fetcher<JSON = any>(
|
||||
input: RequestInfo,
|
||||
init?: RequestInit,
|
||||
): Promise<JSON> {
|
||||
const res = await fetch(input, init);
|
||||
|
||||
if (!res.ok) {
|
||||
const json = await res.json();
|
||||
if (json.error) {
|
||||
const error = new Error(json.error) as Error & {
|
||||
status: number;
|
||||
};
|
||||
error.status = res.status;
|
||||
throw error;
|
||||
} else {
|
||||
throw new Error("An unexpected error occurred");
|
||||
}
|
||||
}
|
||||
|
||||
return res.json();
|
||||
}
|
||||
|
||||
export function nFormatter(num: number, digits?: number) {
|
||||
if (!num) return "0";
|
||||
const lookup = [
|
||||
{ value: 1, symbol: "" },
|
||||
{ value: 1e3, symbol: "K" },
|
||||
{ value: 1e6, symbol: "M" },
|
||||
{ value: 1e9, symbol: "G" },
|
||||
{ value: 1e12, symbol: "T" },
|
||||
{ value: 1e15, symbol: "P" },
|
||||
{ value: 1e18, symbol: "E" },
|
||||
];
|
||||
const rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
|
||||
var item = lookup
|
||||
.slice()
|
||||
.reverse()
|
||||
.find(function (item) {
|
||||
return num >= item.value;
|
||||
});
|
||||
return item
|
||||
? (num / item.value).toFixed(digits || 1).replace(rx, "$1") + item.symbol
|
||||
: "0";
|
||||
}
|
||||
|
||||
export function isEmail(str: string) {
|
||||
const reg = /^([a-zA-Z\d._%+-]+)@([a-zA-Z\d.-]+\.[a-zA-Z]{2,})$/;
|
||||
return reg.test(str);
|
||||
}
|
||||
|
||||
export function getAvatarById(id: string) {
|
||||
return `https://avatars.dicebear.com/api/micah/${id}.svg`;
|
||||
}
|
||||
|
||||
export function formatDate(dateString: string) {
|
||||
if (!dateString) {
|
||||
return `0秒前`;
|
||||
}
|
||||
const sourceDate = new Date(dateString).getTime();
|
||||
const currentDate = new Date().getTime();
|
||||
|
||||
const timeDiff = currentDate - sourceDate;
|
||||
const secondsDiff = Math.floor(timeDiff / 1000); // 计算秒数差
|
||||
|
||||
if (secondsDiff < 60) {
|
||||
return `${secondsDiff}秒前`;
|
||||
} else if (secondsDiff < 3600) {
|
||||
// 不足1小时
|
||||
const minutesDiff = Math.floor(secondsDiff / 60);
|
||||
return `${minutesDiff}分钟前`;
|
||||
} else if (secondsDiff < 86400) {
|
||||
// 不足1天
|
||||
const hoursDiff = Math.floor(secondsDiff / 3600);
|
||||
return `${hoursDiff}小时前`;
|
||||
} else {
|
||||
const daysDiff = Math.floor(secondsDiff / 86400);
|
||||
return `${daysDiff}天前`;
|
||||
}
|
||||
}
|
||||
|
||||
export function fomatTmpDate(dateNum: number) {
|
||||
const date = new Date(dateNum);
|
||||
return `${date.getMonth() + 1}/${date.getDate()}`;
|
||||
}
|
||||
|
||||
export function generateName(id: string) {
|
||||
return `u-${id.slice(-6)}`;
|
||||
}
|
||||
|
||||
export function exportAsJson(data: any, filename: string) {
|
||||
const dataStr = JSON.stringify(data);
|
||||
const dataUri =
|
||||
"data:application/json;charset=utf-8," + encodeURIComponent(dataStr);
|
||||
|
||||
const linkElement = document.createElement("a");
|
||||
linkElement.setAttribute("href", dataUri);
|
||||
linkElement.setAttribute("download", filename + ".json");
|
||||
linkElement.style.display = "none";
|
||||
document.body.appendChild(linkElement);
|
||||
|
||||
linkElement.click();
|
||||
document.body.removeChild(linkElement);
|
||||
}
|
||||
|
||||
export function exportAsMarkdownFile(data: string, fileName: string) {
|
||||
const dataUri = "data:text/plain;charset=utf-8," + encodeURIComponent(data);
|
||||
|
||||
const linkElement = document.createElement("a");
|
||||
linkElement.setAttribute("href", dataUri);
|
||||
linkElement.setAttribute("download", fileName + ".md");
|
||||
linkElement.style.display = "none";
|
||||
document.body.appendChild(linkElement);
|
||||
|
||||
linkElement.click();
|
||||
document.body.removeChild(linkElement);
|
||||
}
|
||||
|
||||
export function getRandomElement(arr: string[]) {
|
||||
let currentIndex = arr.length;
|
||||
let temporaryValue;
|
||||
let randomIndex;
|
||||
|
||||
// 当还有未洗牌的元素时
|
||||
while (currentIndex !== 0) {
|
||||
// 从剩余的元素中随机选择一个元素
|
||||
randomIndex = Math.floor(Math.random() * currentIndex);
|
||||
currentIndex -= 1;
|
||||
|
||||
// 将当前元素与随机选择的元素进行交换
|
||||
temporaryValue = arr[currentIndex];
|
||||
arr[currentIndex] = arr[randomIndex];
|
||||
arr[randomIndex] = temporaryValue;
|
||||
}
|
||||
|
||||
// 返回洗牌后的数组的第一个元素
|
||||
return arr[0];
|
||||
}
|
||||
|
||||
export function greeting() {
|
||||
var currentTime = new Date();
|
||||
var currentHour = currentTime.getHours();
|
||||
|
||||
if (currentHour < 12) {
|
||||
return "上午好";
|
||||
} else if (currentHour < 18) {
|
||||
return "下午好";
|
||||
} else {
|
||||
return "晚上好";
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user