Initial ecommerce standalone package
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
/** Summarize a URL for display in tool pages. */
|
||||
export function summarizeUrl(value: string): string {
|
||||
try {
|
||||
const url = new URL(value);
|
||||
const lastSegment = url.pathname.split("/").filter(Boolean).pop();
|
||||
return lastSegment ? `${url.host}/.../${lastSegment}` : url.host;
|
||||
} catch {
|
||||
return value.length > 72 ? `${value.slice(0, 34)}...${value.slice(-28)}` : value;
|
||||
}
|
||||
}
|
||||
|
||||
/** Format a byte count to human-readable file size. */
|
||||
export function formatFileSize(bytes: number): string {
|
||||
if (!Number.isFinite(bytes) || bytes <= 0) return "0 KB";
|
||||
if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(2)} MB`;
|
||||
return `${(bytes / 1024).toFixed(1)} KB`;
|
||||
}
|
||||
|
||||
/** Read a File as a data URL string via FileReader. */
|
||||
export function fileToDataUrl(file: File): Promise<string> {
|
||||
return new Promise<string>((resolve, reject) => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = () => resolve(String(reader.result || ""));
|
||||
reader.onerror = () => reject(new Error("读取素材失败"));
|
||||
reader.readAsDataURL(file);
|
||||
});
|
||||
}
|
||||
|
||||
/** Return a Promise that resolves after the given milliseconds. */
|
||||
export function wait(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => window.setTimeout(resolve, ms));
|
||||
}
|
||||
Reference in New Issue
Block a user