62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
/**
|
|
* Composable untuk menyediakan fungsi dan aturan validasi umum.
|
|
*/
|
|
export const useValidation = () => {
|
|
|
|
const required = (value, message = 'Bidang ini wajib diisi.') => {
|
|
// Memastikan nilai ada dan bukan string kosong (setelah trim)
|
|
return (value !== null && value !== undefined && String(value).trim() !== '') || message;
|
|
};
|
|
|
|
const minNameLength = (value, minLength = 3) => {
|
|
if (!value) return true; // Lewati jika kosong (handle oleh 'required')
|
|
const length = value.trim().length; // Hitung panjang setelah menghapus spasi di awal/akhir
|
|
return length >= minLength || `Panjang minimal adalah ${minLength} karakter.`;
|
|
};
|
|
|
|
const isNumber = (value) => {
|
|
if (!value) return true; // Lewati jika kosong (handle oleh 'required')
|
|
return /^[0-9]+$/.test(value) || 'Hanya boleh mengandung angka.';
|
|
};
|
|
|
|
const phoneLength = (value) => {
|
|
if (!value) return true;
|
|
// Hapus karakter non-angka sebelum menghitung panjang
|
|
const length = value.replace(/[^0-9]/g, '').length;
|
|
return (length >= 9 && length <= 15) || 'Nomor telepon harus antara 9 hingga 15 digit.';
|
|
};
|
|
|
|
const indonesianPhoneFormat = (value) => {
|
|
if (!value) return true;
|
|
// Pola: Harus dimulai dengan '08', diikuti 7 hingga 13 digit angka
|
|
return /^08[0-9]{7,13}$/.test(value) || 'Format nomor telepon tidak valid (Contoh: 08xxxxxxxx).';
|
|
};
|
|
|
|
// Gabungkan semua aturan validasi telepon ke dalam satu objek untuk kemudahan
|
|
const phoneRules = [
|
|
required,
|
|
isNumber,
|
|
phoneLength,
|
|
indonesianPhoneFormat // Opsional: Hapus komentar jika format 08 wajib
|
|
];
|
|
|
|
const textRules = [
|
|
required,
|
|
minNameLength
|
|
];
|
|
|
|
const requiredRules = [
|
|
required
|
|
]
|
|
|
|
return {
|
|
required,
|
|
isNumber,
|
|
phoneLength,
|
|
indonesianPhoneFormat,
|
|
phoneRules,
|
|
textRules,
|
|
requiredRules
|
|
};
|
|
};
|