const MAX_EDGE = 960 const JPEG_QUALITY = 0.82 export function toCssBackgroundUrl(url: string): string { const trimmed = url.trim() if (!trimmed) return '' return `url("${trimmed.replace(/"/g, '\\"')}")` } export async function fileToCatalogImage(file: File): Promise { if (!file.type.startsWith('image/')) { throw new Error('فقط فایل تصویری مجاز است.') } if (file.size > 8 * 1024 * 1024) { throw new Error('حجم تصویر نباید بیشتر از ۸ مگابایت باشد.') } const dataUrl = await readFileAsDataUrl(file) return resizeDataUrl(dataUrl) } function readFileAsDataUrl(file: File): Promise { return new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = () => resolve(String(reader.result ?? '')) reader.onerror = () => reject(new Error('خواندن تصویر ناموفق بود.')) reader.readAsDataURL(file) }) } function resizeDataUrl(src: string): Promise { return new Promise((resolve, reject) => { const image = new Image() image.onload = () => { const scale = Math.min(1, MAX_EDGE / Math.max(image.width, image.height)) const width = Math.max(1, Math.round(image.width * scale)) const height = Math.max(1, Math.round(image.height * scale)) const canvas = document.createElement('canvas') canvas.width = width canvas.height = height const ctx = canvas.getContext('2d') if (!ctx) { reject(new Error('پردازش تصویر ناموفق بود.')) return } ctx.drawImage(image, 0, 0, width, height) resolve(canvas.toDataURL('image/jpeg', JPEG_QUALITY)) } image.onerror = () => reject(new Error('تصویر نامعتبر است.')) image.src = src }) }