global refactoring
This commit is contained in:
38
src/utils/compressImage.js
Normal file
38
src/utils/compressImage.js
Normal file
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* Сжимает изображение до maxW пикселей по ширине и конвертирует в JPEG.
|
||||
* Используется перед отправкой, чтобы не гнать тяжёлые файлы на сервер.
|
||||
* Маленькие картинки (< maxW) не увеличиваются.
|
||||
*
|
||||
* @param {File} file — оригинальный файл
|
||||
* @param {number} maxW — максимальная ширина в пикселях (default 1200)
|
||||
* @param {number} quality — качество JPEG 0..1 (default 0.82)
|
||||
* @returns {Promise<File>}
|
||||
*/
|
||||
export function compressImage(file, maxW = 1200, quality = 0.82) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const img = new Image();
|
||||
const url = URL.createObjectURL(file);
|
||||
|
||||
img.onload = () => {
|
||||
URL.revokeObjectURL(url); // освобождаем память сразу после загрузки
|
||||
|
||||
const scale = Math.min(1, maxW / img.width);
|
||||
const canvas = document.createElement("canvas");
|
||||
canvas.width = Math.round(img.width * scale);
|
||||
canvas.height = Math.round(img.height * scale);
|
||||
canvas.getContext("2d").drawImage(img, 0, 0, canvas.width, canvas.height);
|
||||
|
||||
canvas.toBlob(
|
||||
blob =>
|
||||
blob
|
||||
? resolve(new File([blob], file.name, { type: "image/jpeg" }))
|
||||
: reject(new Error("canvas.toBlob вернул null")),
|
||||
"image/jpeg",
|
||||
quality
|
||||
);
|
||||
};
|
||||
|
||||
img.onerror = reject;
|
||||
img.src = url;
|
||||
});
|
||||
}
|
||||
17
src/utils/formatPhone.js
Normal file
17
src/utils/formatPhone.js
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Форматирует строку в маску +7 (___) ___-__-__.
|
||||
* Принимает любой ввод — чистит всё кроме цифр.
|
||||
*
|
||||
* @param {string} val — сырое значение из input
|
||||
* @returns {string} — отформатированная строка
|
||||
*/
|
||||
export function formatPhone(val) {
|
||||
const digits = val.replace(/\D/g, "");
|
||||
const local = digits.startsWith("7") ? digits.slice(1) : digits;
|
||||
let result = "+7";
|
||||
if (local.length > 0) result += " (" + local.slice(0, 3);
|
||||
if (local.length >= 3) result += ") " + local.slice(3, 6);
|
||||
if (local.length >= 6) result += "-" + local.slice(6, 8);
|
||||
if (local.length >= 8) result += "-" + local.slice(8, 10);
|
||||
return result;
|
||||
}
|
||||
14
src/utils/validatePostForm.js
Normal file
14
src/utils/validatePostForm.js
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Валидирует поля формы объявления на стороне клиента.
|
||||
*
|
||||
* @param {object} form — текущие значения формы
|
||||
* @returns {object} — объект ошибок; пустой = форма валидна
|
||||
*/
|
||||
export function validatePostForm(form) {
|
||||
const errors = {};
|
||||
if (!form.title.trim()) errors.title = "Введите название";
|
||||
if (!form.description.trim()) errors.description = "Введите описание";
|
||||
if (!form.category) errors.category = "Выберите категорию";
|
||||
if (!form.phone.trim()) errors.phone = "Введите номер телефона";
|
||||
return errors;
|
||||
}
|
||||
Reference in New Issue
Block a user