feat: Migrate staff profile features from Data Connect to V2 REST API

- Removed data_connect package from mobile pubspec.yaml.
- Added documentation for V2 profile migration status and QA findings.
- Implemented new session management with ClientSessionStore and StaffSessionStore.
- Created V2SessionService for handling user sessions via the V2 API.
- Developed use cases for cancelling late worker assignments and submitting worker reviews.
- Added arguments and use cases for payment chart retrieval and profile completion checks.
- Implemented repository interfaces and their implementations for staff main and profile features.
- Ensured proper error handling and validation in use cases.
This commit is contained in:
Achintha Isuru
2026-03-16 22:45:06 -04:00
parent 4834266986
commit b31a615092
478 changed files with 10512 additions and 19854 deletions

View File

@@ -1,6 +1,7 @@
import 'package:flutter_modular/flutter_modular.dart';
import 'package:krow_core/core.dart';
import 'package:krow_data_connect/krow_data_connect.dart';
import 'package:krow_domain/krow_domain.dart';
import 'src/data/repositories_impl/settings_repository_impl.dart';
import 'src/domain/repositories/settings_repository_interface.dart';
import 'src/domain/usecases/sign_out_usecase.dart';
@@ -9,14 +10,19 @@ import 'src/presentation/pages/client_settings_page.dart';
import 'src/presentation/pages/edit_profile_page.dart';
/// A [Module] for the client settings feature.
///
/// Imports [CoreModule] for [BaseApiService] and registers repositories,
/// use cases, and BLoCs for the client settings flow.
class ClientSettingsModule extends Module {
@override
List<Module> get imports => <Module>[DataConnectModule()];
List<Module> get imports => <Module>[CoreModule()];
@override
void binds(Injector i) {
// Repositories
i.addLazySingleton<SettingsRepositoryInterface>(SettingsRepositoryImpl.new);
i.addLazySingleton<SettingsRepositoryInterface>(
() => SettingsRepositoryImpl(apiService: i.get<BaseApiService>()),
);
// UseCases
i.addLazySingleton(SignOutUseCase.new);

View File

@@ -1,21 +1,40 @@
import 'package:krow_data_connect/krow_data_connect.dart' as dc;
import 'dart:developer' as developer;
import '../../domain/repositories/settings_repository_interface.dart';
import 'package:firebase_auth/firebase_auth.dart' as firebase;
import 'package:krow_core/core.dart';
import 'package:krow_domain/krow_domain.dart';
import 'package:client_settings/src/domain/repositories/settings_repository_interface.dart';
/// Implementation of [SettingsRepositoryInterface].
///
/// This implementation delegates authentication operations to [DataConnectService].
/// Uses V2 API for server-side token revocation and Firebase Auth for local
/// sign-out. Clears the [ClientSessionStore] on sign-out.
class SettingsRepositoryImpl implements SettingsRepositoryInterface {
/// Creates a [SettingsRepositoryImpl] with the required [_service].
const SettingsRepositoryImpl({required dc.DataConnectService service}) : _service = service;
/// Creates a [SettingsRepositoryImpl] with the required [BaseApiService].
const SettingsRepositoryImpl({required BaseApiService apiService})
: _apiService = apiService;
/// The Data Connect service.
final dc.DataConnectService _service;
/// The V2 API service for backend calls.
final BaseApiService _apiService;
@override
Future<void> signOut() async {
return _service.run(() async {
await _service.signOut();
});
try {
// Step 1: Call V2 sign-out endpoint for server-side token revocation.
await _apiService.post(V2ApiEndpoints.clientSignOut);
} catch (e) {
developer.log(
'V2 sign-out request failed: $e',
name: 'SettingsRepository',
);
// Continue with local sign-out even if server-side fails.
}
// Step 2: Sign out from local Firebase Auth.
await firebase.FirebaseAuth.instance.signOut();
// Step 3: Clear the client session store.
ClientSessionStore.instance.clear();
}
}

View File

@@ -3,7 +3,7 @@ import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_modular/flutter_modular.dart';
import 'package:krow_core/core.dart';
import 'package:krow_data_connect/krow_data_connect.dart' as dc;
import 'package:krow_domain/krow_domain.dart' show ClientSession;
/// A widget that displays the profile header with avatar and company info.
class SettingsProfileHeader extends StatelessWidget {
@@ -14,11 +14,11 @@ class SettingsProfileHeader extends StatelessWidget {
Widget build(BuildContext context) {
final TranslationsClientSettingsProfileEn labels =
t.client_settings.profile;
final dc.ClientSession? session = dc.ClientSessionStore.instance.session;
final String businessName =
session?.business?.businessName ?? 'Your Company';
final String email = session?.business?.email ?? 'client@example.com';
final String? photoUrl = session?.business?.companyLogoUrl;
final ClientSession? session = ClientSessionStore.instance.session;
final String businessName = session?.businessName ?? 'Your Company';
final String email = session?.email ?? 'client@example.com';
// V2 session does not include a photo URL; show letter avatar.
final String? photoUrl = null;
final String avatarLetter = businessName.trim().isNotEmpty
? businessName.trim()[0].toUpperCase()
: 'C';

View File

@@ -25,8 +25,6 @@ dependencies:
path: ../../../core
krow_domain:
path: ../../../domain
krow_data_connect:
path: ../../../data_connect
dev_dependencies:
flutter_test: