Files
AmirReza Jamali 50e4f43738 feat: add AI recommendations flow for tenders
Implement company AI onboarding/recommendation models, services, repository, and tender UI integration with supporting tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 11:47:52 +03:30

207 lines
6.1 KiB
Dart

import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:tm_app/core/network/network_manager.dart';
import 'package:tm_app/core/services/tab_navigation_service.dart';
import 'package:tm_app/core/theme/theme_provider.dart';
import 'package:tm_app/data/repositories/company_ai_repository.dart';
import 'package:tm_app/data/repositories/home_repository.dart';
import 'package:tm_app/data/repositories/liked_tenders_repository.dart';
import 'package:tm_app/data/repositories/notification_repository.dart';
import 'package:tm_app/data/repositories/tender_detail_repository.dart';
import 'package:tm_app/data/repositories/tenders_repository.dart';
import 'package:tm_app/data/repositories/your_tenders_repository.dart';
import 'package:tm_app/data/services/home_service.dart';
import 'package:tm_app/data/services/liked_tenders_service.dart';
import 'package:tm_app/data/services/notification_check_service.dart';
import 'package:tm_app/data/services/notification_service.dart';
import 'package:tm_app/data/services/company_ai_service.dart';
import 'package:tm_app/data/services/notification_state_service.dart';
import 'package:tm_app/data/services/tender_detail_service.dart';
import 'package:tm_app/data/services/your_tenders_service.dart';
import 'package:tm_app/view_models/final_completion_of_documents_view_model.dart';
import '../../data/repositories/auth_repository.dart';
import '../../data/repositories/board_repositories.dart';
import '../../data/repositories/profile_repository.dart';
import '../../data/services/auth_service.dart';
import '../../data/services/board_service.dart';
import '../../data/services/profile_service.dart';
import '../../data/services/tenders_service.dart';
import '../../view_models/auth_view_model.dart';
/// Essential providers loaded at app startup
/// Only includes infrastructure and auth
List<SingleChildWidget> get essentialProviders {
return [
...cores,
...apiClients,
...repositories,
...services,
...authProvider,
];
}
List<SingleChildWidget> get cores {
return [
Provider(
create: (context) {
final nm = NetworkManager(context.read());
return nm;
},
lazy: true,
),
ChangeNotifierProvider(create: (context) => ThemeProvider(), lazy: true),
ChangeNotifierProvider(
create: (context) => NotificationStateService(),
lazy: true,
),
ChangeNotifierProvider(
create: (context) => TabNavigationService(),
lazy: true,
),
];
}
List<SingleChildWidget> get apiClients {
return [
Provider(
create: (context) => AuthService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => HomeService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => TenderDetailService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => YourTendersService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => LikedTendersService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => TendersService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => ProfileService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => NotificationsService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => BoardService(networkManager: context.read()),
lazy: true,
),
Provider(
create: (context) => CompanyAiService(networkManager: context.read()),
lazy: true,
),
];
}
List<SingleChildWidget> get repositories {
return [
Provider(
create: (context) => AuthRepository(authService: context.read()),
lazy: true,
),
Provider(
create:
(context) => YourTendersRepository(
yourTendersService: context.read(),
likedTendersService: context.read(),
),
lazy: true,
),
Provider(
create:
(context) => HomeRepository(
homeService: context.read(),
yourTendersService: context.read(),
likedTendersService: context.read(),
),
lazy: true,
),
Provider(
create:
(context) =>
TenderDetailRepository(tenderDetailService: context.read()),
lazy: true,
),
Provider(
create:
(context) =>
LikedTendersRepository(likedTendersService: context.read()),
lazy: true,
),
Provider(
create: (context) => TendersRepository(tendersService: context.read()),
lazy: true,
),
Provider(
create: (context) => ProfileRepository(profileService: context.read()),
lazy: true,
),
Provider(
create:
(context) =>
NotificationsRepository(notificationsService: context.read()),
lazy: true,
),
Provider(
create: (context) => BoardRepository(boardService: context.read()),
lazy: true,
),
Provider(
create:
(context) => CompanyAiRepository(
companyAiService: context.read(),
prefs: context.read(),
),
lazy: true,
),
];
}
List<SingleChildWidget> get services {
return [
Provider(
create:
(context) => NotificationCheckService(
homeRepository: context.read(),
notificationStateService: context.read(),
),
lazy: true,
),
];
}
/// Auth ViewModel - only essential ViewModel loaded at startup
List<SingleChildWidget> get authProvider {
return [
ChangeNotifierProvider(
create: (context) {
final vm = AuthViewModel(authRepository: context.read());
// Hydrate stored user/customer so userRole is available on hot reloads
vm.hydrateFromStorage();
return vm;
},
lazy: false, // Load immediately for auth state checks
),
ChangeNotifierProvider(
create: (context) => FinalCompletionOfDocumentsViewModel(),
lazy: false, // Load immediately for auth state checks
),
];
}