UNPKG

general-assistant

Version:

General Assistant components

338 lines (337 loc) 12 kB
import React from 'react'; import { toast } from 'datastellar-chatui'; import { defaultsDeep, toLower, toUpper } from 'lodash'; import html2canvas from 'html2canvas'; export function RandomString(length = 9) { const characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; let result = ''; for (let i = 0; i < length; i++) { const randomIndex = Math.floor(Math.random() * characters.length); result += characters.charAt(randomIndex); } return result; } export function isJSON(str) { if (typeof str === 'string') { try { JSON.parse(str); return true; } catch (e) { return false; } } } export async function ASYNC_loadCompFromRemote(obj) { const loadRemoteComponent = async (url) => { const script = await fetch(url).then(res => res.text()); const module = { exports: {} }; const exports = {}; const require = (id) => { if (id === 'react') { return React; } }; const func = new Function('module', 'exports', 'require', script); func(module, exports, require); return module.exports; }; let _obj = obj; for (const key in _obj) { const element = _obj[key]; if (typeof element === 'string') { if (element.search(/^http/) === 0) { try { const _mymodule = (await loadRemoteComponent(element)); _obj[key] = _mymodule.default; } catch (error) { _obj[key] = null; console.log('loadCompFromRemote ? ', error); } } } } return _obj; } export function SYNC_loadCompFromRemote({ cardId, cardFileUrl }) { return new Promise(function (resolve, reject) { if (cardFileUrl.search(/^http/) === 0) { fetch(cardFileUrl).then(res => res.text()).then(script => { const module = { exports: {} }; const exports = {}; const require = (id) => { if (id === 'react') { return React; } }; const func = new Function('module', 'exports', 'require', script); func(module, exports, require); if (module.exports.default) { resolve({ [cardId]: module.exports.default }); } else { reject({ [cardId]: null }); } }).catch(error => { reject({ [cardId]: null }); }); } else { reject({ [cardId]: null }); } }); } export function copyToClipboard(text) { return new Promise(function (resolve, reject) { if (navigator.clipboard) { navigator.clipboard.writeText(text).then(function () { resolve(true); }, function (err) { resolve(false); }); } else if (document.execCommand('copy')) { if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i)) { const range = document.createRange(); range.selectNode(text); const selection = window.getSelection(); if (selection.rangeCount > 0) selection.removeAllRanges(); selection.addRange(range); document.execCommand('copy') ? resolve(true) : resolve(false); } else { var input = document.createElement('input'); input.setAttribute('readonly', 'readonly'); input.setAttribute('value', text); document.body.appendChild(input); input.setSelectionRange(0, 9999); input.select(); document.execCommand('copy') ? resolve(true) : resolve(false); document.body.removeChild(input); } } else { resolve(false); } }); } export function sendRequestWithConfig(args) { const { commonOpt, parameter, isFecth, controller: argController, onResponse, onCatch, onFinally } = args; const { url, ResponseFormat, CatchFormat } = parameter; const controller = argController || new AbortController(); const time = parameter.timeout || commonOpt.timeout || 5000; const timer = setTimeout(() => { controller.abort(); }, time); let _paramCopy = Object.assign({}, parameter); delete _paramCopy.url; delete _paramCopy.ResponseFormat; delete _paramCopy.CatchFormat; delete _paramCopy.timeout; let _optCopy = Object.assign({}, commonOpt); delete _optCopy.timeout; const _reqOpt = defaultsDeep(_paramCopy, _optCopy); if (url === undefined) return onCatch('Parameter "url" is undefined'); fetch(url, { ..._reqOpt, signal: controller.signal }) .then(async (res) => { clearTimeout(timer); if (isFecth && res.body && typeof res.body.getReader === 'function') { const reader = res.body.getReader(); while (true) { const { done, value } = await reader.read(); if (done) { onFinally(); break; } let textValue = new TextDecoder().decode(value); let _formatT = textValue; if (typeof ResponseFormat === 'function') { try { _formatT = ResponseFormat(textValue); } catch (errorT) { throw errorT; } } onResponse(_formatT); } } else { const decodeValue = await res.json(); let _formatD = decodeValue; if (typeof ResponseFormat === 'function') { try { _formatD = ResponseFormat(decodeValue); } catch (errorD) { throw errorD; } } onResponse(_formatD); } }) .catch(e => { clearTimeout(timer); let _formatCat = e.message; if (typeof CatchFormat === 'function') { try { _formatCat = CatchFormat(e); } catch (errorC) { onCatch(errorC); return; } } onCatch(_formatCat); }) .finally(() => onFinally()); } export function getMedia() { return new Promise((resolve, reject) => { const myNavigator = navigator; try { if (myNavigator) { if (myNavigator.mediaDevices && myNavigator.mediaDevices.getUserMedia) { myNavigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) => resolve(stream)) .catch((err) => resolve(err.message)); } else if (myNavigator.oGetUserMedia) { myNavigator.oGetUserMedia({ audio: true }) .then((stream) => resolve(stream)) .catch((err) => resolve(err.message)); } else if (myNavigator.msGetUserMedia) { myNavigator.msGetUserMedia({ audio: true }) .then((stream) => resolve(stream)) .catch((err) => resolve(err.message)); } else if (myNavigator.webkitGetUserMedia) { myNavigator.webkitGetUserMedia({ audio: true }) .then((stream) => resolve(stream)) .catch((err) => resolve(err.message)); } else if (myNavigator.mozGetUserMedia) { myNavigator.mozGetUserMedia({ audio: true }) .then((stream) => resolve(stream)) .catch((err) => resolve(err.message)); } else { resolve('Not support'); } } else { resolve('Not support'); } } catch (error) { resolve(error.message); } }); } function getMimeType(mtype) { switch (mtype) { case 'mp3': return 'audio/mpeg'; case 'mpeg': return 'audio/mpeg'; case 'mpga': return 'audio/mpeg'; case 'mp4': return 'video/mp4'; case 'm4a': return 'audio/mp4a'; case 'wav': return 'audio/wav'; case 'webm': return 'video/webm'; default: throw new Error('Unsupported media type'); } } export function blobToFile(mtype, chunks) { return new Promise((resolve, reject) => { try { const audioBlob = new Blob(chunks, { type: getMimeType(mtype) }); console.log('audioBlob', audioBlob); const _audio_id = new Date().getTime(); const file = new File([audioBlob], _audio_id.toString(), { lastModified: _audio_id, type: audioBlob.type }); const formData = new FormData(); formData.append('file', file); resolve(formData); } catch (error) { reject('不支持的类型:' + mtype); } }); } export function showToast(text) { toast.show(text); } export const FileIcon = { 'code': ['js', 'ts', 'tsx', 'jsx', 'css', 'less', 'sass', 'html', 'java', 'class', 'mapper', 'xml', 'json'], 'wendang': ['doc', 'docx', 'md', 'txt'], 'baobiao': ['xls', 'xlsx', 'ppt', 'pptx'], 'yasuo': ['zip', 'rar', 'gz', 'z', 'jar', 'arj'], 'img': ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'psd', 'svg', 'webp'], 'yingyin': ['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv', 'web', 'm4v', '3gp', 'mpeg', 'mpg', 'rmvb',] }; export function getFileName(_u) { if (!_u.toString().startsWith('http')) return _u; const _name = _u.toString().match(/([^/]+\.\w{3,4})$/); return _name !== null ? _name[0] : '网络文件'; } export function getFileTypeIcon(_t, _n) { let _icon = 'file'; let _color = 'text-theme-shal-3'; const _suf = _n.toString().match(/.\w{3,4}$/); if (_suf !== null) { const _lowcase = toLower(_suf[0]).replace(/^./, ''); if (FileIcon.wendang.includes(_lowcase)) { _color = 'text-[#b71c1c]'; } if (FileIcon.baobiao.includes(_lowcase)) { _color = 'text-[#ff9800]'; } if (FileIcon.yingyin.includes(_lowcase)) { _color = 'text-[#43a047]'; } if (FileIcon.img.includes(_lowcase)) { _color = 'text-[#1e88e5]'; } if (FileIcon.code.includes(_lowcase)) { _color = 'text-[#673ab7]'; } } if (_color === 'text-theme-shal-3' && _t === 'url') { _icon = 'upload'; _color = 'text-[#009688]'; } return { suf: _suf !== null ? toUpper(_suf[0].replace(/^./, '')) : '', color: _color, icon: _icon }; } export function getFileGeneralSize(_bytes) { const units = ['B', 'KB', 'MB', 'GB', 'TB']; const unitIndex = Math.floor(Math.log2(_bytes) / 10); const unitMother = (1024 ** unitIndex).toFixed(2); return `${_bytes / Number(unitMother)}${units[unitIndex]}`; } export function getSnapshot(node, options) { return new Promise(async (resolve, reject) => { let canvas = null; try { canvas = await html2canvas(node, options); canvas = canvas.toDataURL("image/png"); } catch (error) { reject(error.toString()); } resolve(canvas); }); }