/** * An composable utility for data. */ const useDataUtils = () => ({ /** * Method to abbreviate the text given */ abbreviate(text, append = '...') { if (text.length < 30) { return text; } return text ? text.substring(0, 15) + append + text.slice(-10) : ''; }, /** * Method to find the byte size of the string provides */ byteSize(base64String) { return this.formatAsBytes(this.size(base64String)); }, /** * Method to open file */ openFile(contentType, data) { const byteCharacters = atob(data); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], { type: contentType, }); const objectURL = URL.createObjectURL(blob); const win = window.open(objectURL); if (win) { win.onload = () => URL.revokeObjectURL(objectURL); } }, /** * Method to convert the file to base64 */ toBase64(file, cb) { const fileReader = new FileReader(); fileReader.readAsDataURL(file); fileReader.onload = (e: any) => { const base64Data = e.target.result.substring(e.target.result.indexOf('base64,') + 'base64,'.length); cb(base64Data); }; }, /** * Method to clear the input */ clearInputImage(entity, elementRef, field, fieldContentType, idInput) { if (entity && field && fieldContentType) { if (Object.hasOwn(entity, field)) { entity[field] = null; } if (Object.hasOwn(entity, fieldContentType)) { entity[fieldContentType] = null; } if (elementRef && idInput && elementRef.nativeElement.querySelector(`#${idInput}`)) { elementRef.nativeElement.querySelector(`#${idInput}`).value = null; } } }, endsWith(suffix, str) { return str.indexOf(suffix, str.length - suffix.length) !== -1; }, paddingSize(value) { if (this.endsWith('==', value)) { return 2; } if (this.endsWith('=', value)) { return 1; } return 0; }, size(value) { return (value.length / 4) * 3 - this.paddingSize(value); }, formatAsBytes(size) { return `${size.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ')} bytes`; }, setFileData(event, entity, field, isImage) { if (event && event.target.files && event.target.files[0]) { const file = event.target.files[0]; if (isImage && !/^image\//.test(file.type)) { return; } this.toBase64(file, base64Data => { entity[field] = base64Data; entity[`${field}ContentType`] = file.type; }); } }, /** * Method to download file */ downloadFile(contentType, data, fileName) { const byteCharacters = atob(data); const byteNumbers = new Array(byteCharacters.length); for (let i = 0; i < byteCharacters.length; i++) { byteNumbers[i] = byteCharacters.charCodeAt(i); } const byteArray = new Uint8Array(byteNumbers); const blob = new Blob([byteArray], { type: contentType, }); const tempLink = document.createElement('a'); tempLink.href = window.URL.createObjectURL(blob); tempLink.download = fileName; tempLink.target = '_blank'; tempLink.click(); }, /** * Method to parse header links */ parseLinks(header) { const links = {}; if ((header?.indexOf(',') ?? -1) === -1) { return links; } // Split parts by comma const parts = header.split(','); // Parse each part into a named link parts.forEach(p => { if (p.indexOf('>;') === -1) { return; } const section = p.split('>;'); const url = section[0].replace(/<(.*)/, '$1').trim(); const queryString = { page: null }; url.replace(new RegExp(/([^?=&]+)(=([^&]*))?/g), ($0, $1, $2, $3) => { queryString[$1] = $3; }); let page = queryString.page; if (typeof page === 'string') { page = parseInt(page, 10); } const name = section[1].replace(/rel="(.*)"/, '$1').trim(); links[name] = page; }); return links; }, }); export default useDataUtils;