refactor: update AttireRepositoryImpl to use constructor injection, reorganize profile sections by moving documents and adding certificates, and introduce new UI icons.

This commit is contained in:
Achintha Isuru
2026-02-27 02:00:51 -05:00
parent 2b879158c7
commit f32bd81a46
7 changed files with 53 additions and 20 deletions

View File

@@ -279,4 +279,10 @@ class UiIcons {
/// Gallery icon for gallery
static const IconData gallery = _IconLib.galleryVertical;
/// Certificate icon
static const IconData certificate = _IconLib.fileCheck;
/// Circle dollar icon
static const IconData circleDollar = _IconLib.circleDollarSign;
}

View File

@@ -21,7 +21,9 @@ class ComplianceSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
final TranslationsStaffProfileEn i18n = Translations.of(context).staff.profile;
final TranslationsStaffProfileEn i18n = Translations.of(
context,
).staff.profile;
return BlocBuilder<ProfileCubit, ProfileState>(
builder: (BuildContext context, ProfileState state) {
@@ -33,11 +35,21 @@ class ComplianceSection extends StatelessWidget {
crossAxisCount: 3,
children: <Widget>[
ProfileMenuItem(
icon: UiIcons.file,
icon: UiIcons.circleDollar,
label: i18n.menu_items.tax_forms,
completed: state.taxFormsComplete,
onTap: () => Modular.to.toTaxForms(),
),
ProfileMenuItem(
icon: UiIcons.file,
label: i18n.menu_items.documents,
onTap: () => Modular.to.toDocuments(),
),
ProfileMenuItem(
icon: UiIcons.certificate,
label: i18n.menu_items.certificates,
onTap: () => Modular.to.toCertificates(),
),
],
),
],

View File

@@ -56,11 +56,6 @@ class OnboardingSection extends StatelessWidget {
label: i18n.menu_items.attire,
onTap: () => Modular.to.toAttire(),
),
ProfileMenuItem(
icon: UiIcons.file,
label: i18n.menu_items.documents,
onTap: () => Modular.to.toDocuments(),
),
],
),
],

View File

@@ -15,6 +15,9 @@ import 'presentation/pages/certificate_upload_page.dart';
import 'presentation/pages/certificates_page.dart';
class StaffCertificatesModule extends Module {
@override
List<Module> get imports => <Module>[CoreModule()];
@override
void binds(Injector i) {
i.addLazySingleton<CertificatesRepository>(CertificatesRepositoryImpl.new);

View File

@@ -11,6 +11,9 @@ import 'presentation/pages/documents_page.dart';
import 'presentation/pages/document_upload_page.dart';
class StaffDocumentsModule extends Module {
@override
List<Module> get imports => <Module>[CoreModule()];
@override
void binds(Injector i) {
i.addLazySingleton<DocumentsRepository>(

View File

@@ -14,6 +14,9 @@ import 'presentation/pages/attire_capture_page.dart';
import 'presentation/pages/attire_page.dart';
class StaffAttireModule extends Module {
@override
List<Module> get imports => <Module>[CoreModule()];
@override
void binds(Injector i) {
/// third party services
@@ -25,7 +28,13 @@ class StaffAttireModule extends Module {
);
// Repository
i.addLazySingleton<AttireRepository>(AttireRepositoryImpl.new);
i.addLazySingleton<AttireRepository>(
() => AttireRepositoryImpl(
uploadService: i.get<FileUploadService>(),
signedUrlService: i.get<SignedUrlService>(),
verificationService: i.get<VerificationService>(),
),
);
// Use Cases
i.addLazySingleton(GetAttireOptionsUseCase.new);

View File

@@ -1,5 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:krow_core/core.dart';
import 'package:krow_data_connect/krow_data_connect.dart'
hide AttireVerificationStatus;
@@ -12,12 +11,22 @@ import '../../domain/repositories/attire_repository.dart';
/// Delegates data access to [StaffConnectorRepository].
class AttireRepositoryImpl implements AttireRepository {
/// Creates an [AttireRepositoryImpl].
AttireRepositoryImpl({StaffConnectorRepository? connector})
: _connector =
connector ?? DataConnectService.instance.getStaffRepository();
AttireRepositoryImpl({
required FileUploadService uploadService,
required SignedUrlService signedUrlService,
required VerificationService verificationService,
StaffConnectorRepository? connector,
}) : _connector =
connector ?? DataConnectService.instance.getStaffRepository(),
_uploadService = uploadService,
_signedUrlService = signedUrlService,
_verificationService = verificationService;
/// The Staff Connector repository.
final StaffConnectorRepository _connector;
final FileUploadService _uploadService;
final SignedUrlService _signedUrlService;
final VerificationService _verificationService;
@override
Future<List<AttireItem>> getAttireOptions() async {
@@ -37,8 +46,7 @@ class AttireRepositoryImpl implements AttireRepository {
@override
Future<AttireItem> uploadPhoto(String itemId, String filePath) async {
// 1. Upload file to Core API
final FileUploadService uploadService = Modular.get<FileUploadService>();
final FileUploadResponse uploadRes = await uploadService.uploadFile(
final FileUploadResponse uploadRes = await _uploadService.uploadFile(
filePath: filePath,
fileName: filePath.split('/').last,
);
@@ -46,14 +54,11 @@ class AttireRepositoryImpl implements AttireRepository {
final String fileUri = uploadRes.fileUri;
// 2. Create signed URL for the uploaded file
final SignedUrlService signedUrlService = Modular.get<SignedUrlService>();
final SignedUrlResponse signedUrlRes = await signedUrlService
final SignedUrlResponse signedUrlRes = await _signedUrlService
.createSignedUrl(fileUri: fileUri);
final String photoUrl = signedUrlRes.signedUrl;
// 3. Initiate verification job
final VerificationService verificationService =
Modular.get<VerificationService>();
final Staff staff = await _connector.getStaffProfile();
// Get item details for verification rules
@@ -64,7 +69,7 @@ class AttireRepositoryImpl implements AttireRepository {
final String dressCode =
'${targetItem.description ?? ''} ${targetItem.label}'.trim();
final VerificationResponse verifyRes = await verificationService
final VerificationResponse verifyRes = await _verificationService
.createVerification(
type: 'attire',
subjectType: 'worker',
@@ -81,7 +86,7 @@ class AttireRepositoryImpl implements AttireRepository {
bool isFinished = false;
while (!isFinished && attempts < 5) {
await Future<void>.delayed(const Duration(seconds: 2));
final VerificationResponse statusRes = await verificationService
final VerificationResponse statusRes = await _verificationService
.getStatus(verificationId);
currentStatus = statusRes.status;
if (currentStatus != VerificationStatus.pending &&