You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.1 KiB
Dart
148 lines
5.1 KiB
Dart
import 'auth_response_model.dart';
|
|
import 'fingerprint_verify_response_model.dart';
|
|
|
|
/// Presentation-layer model derived from [AuthResponseModel].
|
|
///
|
|
/// All raw API fields are mapped and sanitised here so the UI layer
|
|
/// never has to inspect raw JSON.
|
|
class AuthResultUiModel {
|
|
final bool isSuccess;
|
|
final String statusMessage;
|
|
|
|
// ── Person Information ─────────────────────────────────────────────────────
|
|
final String firstName;
|
|
final String lastName;
|
|
final String fatherName;
|
|
final String grandfatherName;
|
|
final String occupation;
|
|
final String gender;
|
|
final String sponsor;
|
|
final String idNumber;
|
|
final String birthDate;
|
|
final String nationality;
|
|
|
|
// ── Error ──────────────────────────────────────────────────────────────────
|
|
/// null when there is no error.
|
|
final String? errorType;
|
|
|
|
/// null when there is no error.
|
|
final String? errorMessage;
|
|
|
|
const AuthResultUiModel({
|
|
required this.isSuccess,
|
|
required this.statusMessage,
|
|
required this.firstName,
|
|
required this.lastName,
|
|
required this.fatherName,
|
|
required this.grandfatherName,
|
|
required this.occupation,
|
|
required this.gender,
|
|
required this.sponsor,
|
|
required this.idNumber,
|
|
required this.birthDate,
|
|
required this.nationality,
|
|
this.errorType,
|
|
this.errorMessage,
|
|
});
|
|
|
|
/// Convert a raw [AuthResponseModel] (legacy/mock API response) into a UI model.
|
|
factory AuthResultUiModel.fromResponse(AuthResponseModel response) {
|
|
final info = response.personInfo;
|
|
final err = response.error;
|
|
|
|
return AuthResultUiModel(
|
|
isSuccess: response.success,
|
|
statusMessage: response.statusMessage,
|
|
firstName: info?.firstName ?? '',
|
|
lastName: info?.lastName ?? '',
|
|
fatherName: info?.fatherName ?? '',
|
|
grandfatherName: info?.grandfatherName ?? '',
|
|
occupation: info?.occupation ?? '',
|
|
gender: info?.gender ?? '',
|
|
sponsor: info?.sponsor ?? '',
|
|
idNumber: info?.idNumber ?? '',
|
|
birthDate: info?.birthDate ?? '',
|
|
nationality: info?.nationality ?? '',
|
|
errorType:
|
|
(err?.type.isNotEmpty ?? false) ? err!.type : null,
|
|
errorMessage:
|
|
(err?.message.isNotEmpty ?? false) ? err!.message : null,
|
|
);
|
|
}
|
|
|
|
/// Convert a [FingerprintVerifyResponseModel] (real API response for both
|
|
/// the National-ID and Passport authentication endpoints) into a UI model.
|
|
factory AuthResultUiModel.fromFingerprintVerifyResponse(
|
|
FingerprintVerifyResponseModel response) {
|
|
final data = response.data;
|
|
final info = data?.personInfo;
|
|
|
|
// Derive gender label from sex code
|
|
String genderLabel = '';
|
|
if (info?.sexCode == '1' || info?.sexCode.toLowerCase() == 'm') {
|
|
genderLabel = 'Male';
|
|
} else if (info?.sexCode == '2' || info?.sexCode.toLowerCase() == 'f') {
|
|
genderLabel = 'Female';
|
|
} else if (info?.sexCode.isNotEmpty ?? false) {
|
|
genderLabel = info!.sexCode;
|
|
}
|
|
|
|
// Use English occupation if available, otherwise Arabic
|
|
final occupationLabel = (info?.occupationDescEn.isNotEmpty ?? false)
|
|
? info!.occupationDescEn
|
|
: (info?.occupationDescAr ?? '');
|
|
|
|
// Combine first name + family name for "last name" field in the UI
|
|
final lastName = (info?.familyName.isNotEmpty ?? false)
|
|
? info!.familyName
|
|
: '';
|
|
|
|
// Build error message from data fields when isError is true
|
|
String? errorType;
|
|
String? errorMessage;
|
|
if (data?.isError == true) {
|
|
errorType = data?.errorType.isNotEmpty == true ? data!.errorType : null;
|
|
errorMessage =
|
|
data?.errorMessage.isNotEmpty == true ? data!.errorMessage : null;
|
|
}
|
|
|
|
return AuthResultUiModel(
|
|
isSuccess: response.success && (data?.matchFlag ?? false),
|
|
statusMessage: response.message.isNotEmpty
|
|
? response.message
|
|
: (data?.matchFlag == true
|
|
? 'Authentication successful!'
|
|
: 'Authentication failed'),
|
|
firstName: info?.firstName ?? '',
|
|
lastName: lastName,
|
|
fatherName: info?.fatherName ?? '',
|
|
grandfatherName: info?.grandFatherName ?? '',
|
|
occupation: occupationLabel,
|
|
gender: genderLabel,
|
|
sponsor: info?.sponsorName ?? '',
|
|
idNumber: info?.id ?? '',
|
|
birthDate: info?.birthDateG ?? '',
|
|
nationality: info?.nationalityCode ?? '',
|
|
errorType: errorType,
|
|
errorMessage: errorMessage,
|
|
);
|
|
}
|
|
|
|
/// Convenience getter — first and last name joined on two visual lines.
|
|
String get fullNameDisplay =>
|
|
[firstName, lastName].where((s) => s.isNotEmpty).join('\n');
|
|
|
|
bool get hasPersonInfo =>
|
|
firstName.isNotEmpty ||
|
|
lastName.isNotEmpty ||
|
|
fatherName.isNotEmpty ||
|
|
grandfatherName.isNotEmpty ||
|
|
occupation.isNotEmpty ||
|
|
gender.isNotEmpty ||
|
|
idNumber.isNotEmpty ||
|
|
birthDate.isNotEmpty ||
|
|
nationality.isNotEmpty;
|
|
|
|
bool get hasError => errorType != null || errorMessage != null;
|
|
}
|