|
|
|
|
|
export const getBlankCanvasDataURL = (width: number, height: number): string => { |
|
|
const tempCanvas = document.createElement('canvas'); |
|
|
tempCanvas.width = width; |
|
|
tempCanvas.height = height; |
|
|
const ctx = tempCanvas.getContext('2d'); |
|
|
if (ctx) { |
|
|
ctx.fillStyle = '#FFFFFF'; |
|
|
ctx.fillRect(0, 0, width, height); |
|
|
} |
|
|
return tempCanvas.toDataURL('image/png'); |
|
|
}; |
|
|
|
|
|
export const dataURLtoBlob = async (dataurl: string): Promise<Blob> => { |
|
|
const res = await fetch(dataurl); |
|
|
return res.blob(); |
|
|
}; |
|
|
|
|
|
export const calculateSHA256 = async (blob: Blob): Promise<string> => { |
|
|
const buffer = await blob.arrayBuffer(); |
|
|
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer); |
|
|
const hashArray = Array.from(new Uint8Array(hashBuffer)); |
|
|
return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); |
|
|
}; |
|
|
|
|
|
export const copyToClipboard = async ( |
|
|
text: string, |
|
|
showInfoToast: (message: string, type: 'info' | 'error') => void |
|
|
): Promise<boolean> => { |
|
|
if (!navigator.clipboard) { |
|
|
showInfoToast('Clipboard API not available.', 'info'); |
|
|
return false; |
|
|
} |
|
|
try { |
|
|
await navigator.clipboard.writeText(text); |
|
|
return true; |
|
|
} catch (err) { |
|
|
console.error('Failed to copy text: ', err); |
|
|
showInfoToast('Failed to copy URL to clipboard.', 'error'); |
|
|
return false; |
|
|
} |
|
|
}; |
|
|
|