/// Validasi PIN baru di app sebelum dikirim (server juga memeriksa). /// Mengembalikan pesan error, atau `null` bila PIN boleh dipakai. String? validateNewPin(String pin, {String? birthDate}) { if (!RegExp(r'^\d{6}$').hasMatch(pin)) return 'PIN harus 6 digit angka.'; final digits = pin.split('').map(int.parse).toList(); if (digits.every((d) => d == digits.first)) { return 'PIN tidak boleh satu angka berulang.'; } bool stepsBy(int step) { for (var i = 1; i < digits.length; i++) { if (digits[i] - digits[i - 1] != step) return false; } return true; } if (stepsBy(1) || stepsBy(-1)) { return 'PIN tidak boleh angka berurutan.'; } final birth = birthDate == null ? null : DateTime.tryParse(birthDate); if (birth != null) { String two(int v) => (v % 100).toString().padLeft(2, '0'); final dd = two(birth.day), mm = two(birth.month), yy = two(birth.year); if (pin == '$dd$mm$yy' || pin == '$yy$mm$dd') { return 'PIN tidak boleh tanggal lahir kamu.'; } } return null; }