merged branches

This commit is contained in:
amirrezaghabeli
2025-08-12 09:11:26 +03:30
parent ba3becc709
commit a7e208a5de
58 changed files with 4584 additions and 2336 deletions
+23 -4
View File
@@ -3,6 +3,7 @@ import 'package:provider/single_child_widget.dart';
import 'package:tm_app/core/theme/theme_provider.dart';
import 'package:tm_app/data/repositories/home_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/tender_detail_service.dart';
@@ -14,6 +15,7 @@ import 'package:tm_app/view_models/your_tenders_view_model.dart';
import '../../data/repositories/auth_repository.dart';
import '../../data/services/auth_service.dart';
import '../../data/services/network_manager.dart';
import '../../data/services/tenders_service.dart';
import '../../view_models/auth_view_model.dart';
import '../../view_models/home_view_model.dart';
@@ -35,7 +37,11 @@ List<SingleChildWidget> get apiClients {
Provider(
create: (context) => TenderDetailService(networkManager: context.read()),
),
Provider(create: (context) => YourTendersService()),
Provider(
create: (context) => TendersService(networkManager: context.read()),
),
];
}
@@ -49,7 +55,12 @@ List<SingleChildWidget> get repositories {
TenderDetailRepository(tenderDetailService: context.read()),
),
Provider(
create: (context) => YourTendersRepository(yourTendersService: context.read()),
create:
(context) =>
YourTendersRepository(yourTendersService: context.read()),
),
Provider(
create: (context) => TendersRepository(tendersService: context.read()),
),
];
}
@@ -67,9 +78,17 @@ List<SingleChildWidget> get viewModels {
(context) =>
TenderDetailViewModel(tenderDetailRepository: context.read()),
),
ChangeNotifierProvider(create: (context) => TendersViewModel()),
ChangeNotifierProvider(
create: (context) => YourTendersViewModel(yourTendersRepository: context.read()),
ChangeNotifierProvider(
create: (context) => TendersViewModel(tendersRepository: context.read()),
),
ChangeNotifierProvider(
create:
(context) =>
YourTendersViewModel(yourTendersRepository: context.read()),
),
ChangeNotifierProvider(
create: (context) => TendersViewModel(tendersRepository: context.read()),
),
];
}
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
@@ -41,29 +42,29 @@ class DesktopShellPage extends StatelessWidget {
Spacer(),
_bottomNavigationItem(
context: context,
text: 'Home',
text: AppStrings.home,
isActive: navigationShell.currentIndex == 0,
onTap: () => onTap(0),
iconPath: 'assets/icons/home.svg',
iconPath: AssetsManager.home,
activeIconPath: AssetsManager.homeActive,
),
SizedBox(width: 24),
_bottomNavigationItem(
context: context,
text: 'Tenders',
text: AppStrings.tendersTitle,
isActive: navigationShell.currentIndex == 1,
onTap: () => onTap(1),
iconPath: 'assets/icons/task_square.svg',
activeIconPath: 'assets/icons/task-square_active.svg',
iconPath: AssetsManager.tenders,
activeIconPath: AssetsManager.tendersActive,
),
SizedBox(width: 24),
_bottomNavigationItem(
context: context,
text: 'Profile',
text: AppStrings.profile,
isActive: navigationShell.currentIndex == 2,
onTap: () => onTap(2),
iconPath: 'assets/icons/profile-circle.svg',
activeIconPath: 'assets/icons/profile-circle_active.svg',
iconPath: AssetsManager.profile,
activeIconPath: AssetsManager.profileActive,
),
Spacer(),
SizedBox(width: 59),
@@ -96,10 +97,7 @@ class DesktopShellPage extends StatelessWidget {
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color:
isActive
? const Color(0xFF0164FF)
: const Color(0xFF777777),
color: isActive ? AppColors.primaryColor : AppColors.grey60,
),
),
],
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
@@ -30,27 +31,27 @@ class MobileShellPage extends StatelessWidget {
children: [
_bottomNavigationItem(
context: context,
text: 'Home',
text: AppStrings.home,
isActive: navigationShell.currentIndex == 0,
onTap: () => onTap(0),
iconPath: 'assets/icons/home.svg',
iconPath: AssetsManager.home,
activeIconPath: AssetsManager.homeActive,
),
_bottomNavigationItem(
context: context,
text: 'Tenders',
text: AppStrings.tendersTitle,
isActive: navigationShell.currentIndex == 1,
onTap: () => onTap(1),
iconPath: 'assets/icons/task_square.svg',
activeIconPath: 'assets/icons/task-square_active.svg',
iconPath: AssetsManager.tenders,
activeIconPath: AssetsManager.tendersActive,
),
_bottomNavigationItem(
context: context,
text: 'Profile',
text: AppStrings.profile,
isActive: navigationShell.currentIndex == 2,
onTap: () => onTap(2),
iconPath: 'assets/icons/profile-circle.svg',
activeIconPath: 'assets/icons/profile-circle_active.svg',
iconPath: AssetsManager.profile,
activeIconPath: AssetsManager.profileActive,
),
],
),
@@ -83,10 +84,8 @@ class MobileShellPage extends StatelessWidget {
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color:
isActive
? const Color(0xFF0164FF)
: const Color(0xFF777777),
color: isActive ? AppColors.primaryColor : AppColors.grey60,
),
),
],
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
@@ -60,7 +61,7 @@ class TabletShellPage extends StatelessWidget {
SizedBox(height: 48.0.h()),
_drawerItem(
context: context,
text: 'Home',
text: AppStrings.home,
isActive: navigationShell.currentIndex == 0,
onTap: () => onTap(0),
iconPath: AssetsManager.home,
@@ -68,7 +69,7 @@ class TabletShellPage extends StatelessWidget {
),
_drawerItem(
context: context,
text: 'Tenders',
text: AppStrings.tendersTitle,
isActive: navigationShell.currentIndex == 1,
onTap: () => onTap(1),
iconPath: AssetsManager.tenders,
@@ -76,7 +77,7 @@ class TabletShellPage extends StatelessWidget {
),
_drawerItem(
context: context,
text: 'Profile',
text: AppStrings.profile,
isActive: navigationShell.currentIndex == 2,
onTap: () => onTap(2),
iconPath: AssetsManager.profile,
@@ -112,10 +113,7 @@ class TabletShellPage extends StatelessWidget {
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color:
isActive
? const Color(0xFF0164FF)
: const Color(0xFF777777),
color: isActive ? AppColors.primaryColor : AppColors.grey60,
),
),
],
+10 -10
View File
@@ -37,23 +37,23 @@ class AppLogger {
Logger get logger => _logger;
// Convenient logging methods
void debug(dynamic message, {dynamic error, StackTrace? stackTrace}) {
void debug(message, {error, StackTrace? stackTrace}) {
_logger.d(message, error: error, stackTrace: stackTrace);
}
void info(dynamic message, {dynamic error, StackTrace? stackTrace}) {
void info(message, {error, StackTrace? stackTrace}) {
_logger.i(message, error: error, stackTrace: stackTrace);
}
void warning(dynamic message, {dynamic error, StackTrace? stackTrace}) {
void warning(message, {error, StackTrace? stackTrace}) {
_logger.w(message, error: error, stackTrace: stackTrace);
}
void error(dynamic message, {dynamic error, StackTrace? stackTrace}) {
void error(message, {error, StackTrace? stackTrace}) {
_logger.e(message, error: error, stackTrace: stackTrace);
}
void fatal(dynamic message, {dynamic error, StackTrace? stackTrace}) {
void fatal(message, {error, StackTrace? stackTrace}) {
_logger.f(message, error: error, stackTrace: stackTrace);
}
@@ -62,9 +62,9 @@ class AppLogger {
required String method,
required String url,
int? statusCode,
dynamic requestBody,
dynamic responseBody,
dynamic error,
requestBody,
responseBody,
error,
}) {
final buffer = StringBuffer();
buffer.writeln('🌐 Network Request:');
@@ -114,7 +114,7 @@ class AppLogger {
}
// Custom log with tag
void logWithTag(String tag, dynamic message, {Level? level}) {
void logWithTag(String tag, message, {Level? level}) {
final taggedMessage = '[$tag] $message';
switch (level ?? Level.info) {
@@ -195,7 +195,7 @@ extension LoggerExtension on Object {
appLogger.warning(message ?? toString());
}
void logError([String? message, dynamic error, StackTrace? stackTrace]) {
void logError([String? message, error, StackTrace? stackTrace]) {
appLogger.error(
message ?? toString(),
error: error,