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:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user