You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
5.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

export const isNotEmptyValue = (value: any) => {
if (Array.isArray(value)) {
return value.length > 0;
}
return !!value || value === 0 || value === false;
};
export const isNotEmptyValueAllowNull = (value: any) => {
if (Array.isArray(value)) {
return value.length > 0;
}
return !!value || value === 0 || value === false || value === null;
};
export const handleBatchRequest = async (
list: any[],
fn: (args: any) => void
) => {
return Promise.all(list.map((item) => fn(item)));
};
export const convertFileSize = (
sizeInBytes: number | undefined,
prec?: number,
allowEmpty = false
) => {
const precision = prec ?? 1;
if (!sizeInBytes) {
return allowEmpty ? '' : '0';
}
if (sizeInBytes < 1024) {
return `${sizeInBytes.toFixed(precision)} B`;
} else if (sizeInBytes < 1024 * 1024) {
return `${(sizeInBytes / 1024).toFixed(precision)} KiB`;
} else if (sizeInBytes < 1024 * 1024 * 1024) {
return `${(sizeInBytes / (1024 * 1024)).toFixed(precision)} MiB`;
} else if (sizeInBytes < 1024 * 1024 * 1024 * 1024) {
return `${(sizeInBytes / (1024 * 1024 * 1024)).toFixed(precision)} GiB`;
} else {
return `${(sizeInBytes / (1024 * 1024 * 1024 * 1024)).toFixed(precision)} TiB`;
}
};
export const platformCall = () => {
const platform = navigator.userAgent;
const isMac = () => {
return platform.indexOf('Mac') !== -1;
};
const isWin = () => {
return platform.indexOf('Win') !== -1;
};
return {
isMac: isMac(),
isWin: isWin()
};
};
export const formatTime = (seconds: number) => {
if (isNaN(seconds) || !seconds || seconds === Infinity) {
return '00:00';
}
const hrs = Math.floor(seconds / 3600);
const mins = Math.floor((seconds % 3600) / 60);
const secs = Math.floor(seconds % 60);
const formatted = [
hrs.toString().padStart(2, '0'),
mins.toString().padStart(2, '0'),
secs.toString().padStart(2, '0')
];
if (hrs > 0) {
return `${formatted[0]}:${formatted[1]}:${formatted[2]}`;
}
return `${formatted[1]}:${formatted[2]}`;
};
export const formatNumber = (num: number) => {
if (!num) {
return '0';
}
if (num >= 1000000) {
return (num / 1000000).toFixed(2) + 'M';
} else if (num >= 1000) {
return (num / 1000).toFixed(2) + 'k';
} else {
return num.toString();
}
};
export function loadLanguageConfig(language: string) {
// @ts-ignore
const requireContext = require.context(`./${language}`, false, /\.ts$/);
const languageConfig: Record<string, string> = {};
requireContext.keys().forEach((fileName: any) => {
const moduleConfig = requireContext(fileName).default;
const moduleName = fileName.replace(/(\.\/|\.ts)/g, '');
languageConfig[moduleName] = moduleConfig;
});
return languageConfig;
}
export function readBlob(blob: Blob): Promise<string> {
return new Promise((resolve) => {
const reader = new FileReader();
reader.onload = function (e: any) {
resolve(e.target.result);
};
reader.readAsText(blob, 'utf-8');
});
}
export const cosineSimilarity = (vec1: number[], vec2: number[]) => {
if (vec1.length !== vec2.length) {
throw new Error('both vectors must have the same length');
}
const dotProduct = vec1.reduce(
(sum, value, index) => sum + value * vec2[index],
0
);
const magnitudeA = Math.sqrt(
vec1.reduce((sum, value) => sum + value * value, 0)
);
const magnitudeB = Math.sqrt(
vec2.reduce((sum, value) => sum + value * value, 0)
);
if (magnitudeA === 0 || magnitudeB === 0) {
throw new Error('both vectors must have a length greater than 0');
}
return dotProduct / (magnitudeA * magnitudeB);
};
const htmlSpecialTags = /^<html>(.|\n|\r)*<\/html>$/i;
export const isHTMLDocumentString = (str: string) => {
return htmlSpecialTags.test(str?.trim());
};
// generate a random number between 0 and 64 bit
export const generateRandomNumber = () => {
// 16: 0x100032:0x100000000
return Math.floor(Math.random() * 0x100000000);
};
function base64ToBlob(base64: string, contentType = '', sliceSize = 512) {
try {
const base64Content = base64.replace(/^data:image\/[^;]+;base64,/, '');
const byteCharacters = atob(base64Content);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
return new Blob(byteArrays, { type: contentType });
} catch (error) {
return null;
}
}
export const base64ToFile = (base64String: string, fileName: string) => {
try {
if (!base64String) {
return null;
}
console.log('base64String:', base64String);
const match = base64String.match(/data:(.*?);base64,/);
if (!match) {
throw new Error('Invalid base64 string');
}
const contentType = match[1];
const blob = base64ToBlob(base64String, contentType);
if (!blob) {
throw new Error('Failed to convert base64 to blob');
}
return new File([blob], fileName || contentType, { type: contentType });
} catch (error) {
return null;
}
};
// check onlinestatus
export const isOnline = () => {
return window.navigator.onLine;
};