Files
tm_app/lib/views/shared/desktop_navigation_widget.dart
T
amirrezaghabeli e03c87f99d Add board navigation and assets
- Introduced new board-related assets in AssetsManager.
- Updated NetworkManager to increase connection and receive timeouts to 20 seconds.
- Added BoardRouteData for navigation to the BoardScreen.
- Updated app routes to include the new board route.
- Modified DesktopNavigationWidget to include a navigation item for the board.
- Added a new string constant for the board label in TendersStrings.
2025-11-10 16:14:50 +03:30

217 lines
6.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/services/tab_navigation_service.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/data/services/notification_state_service.dart';
import 'package:tm_app/views/home/strings/home_strings.dart';
import 'package:tm_app/views/profile/strings/profile_strings.dart';
import 'package:tm_app/views/tenders/strings/tenders_strings.dart';
import '../../core/routes/app_routes.dart';
class DesktopNavigationWidget extends StatelessWidget {
const DesktopNavigationWidget({
required this.currentIndex,
super.key,
this.haveFilter = false,
});
final int currentIndex;
final bool haveFilter;
@override
Widget build(BuildContext context) {
return Container(
height: 64,
decoration: BoxDecoration(
color: AppColors.backgroundColor,
border: Border(bottom: BorderSide(color: AppColors.grey30)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(width: 40),
InkWell(
onTap: () {
if (currentIndex == 0) {
return;
} else {
Router.neglect(
context,
() => const HomeRouteData().go(context),
);
context.read<TabNavigationService>().onTabSelected(0);
}
},
child: SvgPicture.asset(AssetsManager.logoSmall),
),
const Spacer(),
_navigationItem(
context: context,
text: HomeStrings.home,
isActive: currentIndex == 0,
onTap: () {
if (currentIndex == 0) {
return;
} else {
Router.neglect(
context,
() => const HomeRouteData().go(context),
);
context.read<TabNavigationService>().onTabSelected(0);
}
},
iconPath: AssetsManager.home,
activeIconPath: AssetsManager.homeActive,
),
const SizedBox(width: 24),
_navigationItem(
context: context,
text: TendersStrings.tendersTitle,
isActive: currentIndex == 1,
onTap: () {
Router.neglect(
context,
() => const TendersRouteData().go(context),
);
context.read<TabNavigationService>().onTabSelected(1);
},
iconPath: AssetsManager.tenders,
activeIconPath: AssetsManager.tendersActive,
),
const SizedBox(width: 24),
_navigationItem(
context: context,
text: TendersStrings.board,
isActive: currentIndex == 2,
onTap: () {
if (currentIndex == 2) {
return;
} else {
Router.neglect(
context,
() => const BoardRouteData().go(context),
);
// context.read<TendersViewModel>().getTenders();
}
},
iconPath: AssetsManager.board,
activeIconPath: AssetsManager.boardActive,
),
const SizedBox(width: 24),
_navigationItem(
context: context,
text: TendersStrings.notifications,
isActive: currentIndex == 3,
onTap: () {
if (currentIndex == 3) {
return;
} else {
Router.neglect(
context,
() => const NotificationRouteData().go(context),
);
context.read<TabNavigationService>().onTabSelected(3);
}
},
iconPath: AssetsManager.notify,
activeIconPath: AssetsManager.notifyActive,
),
const SizedBox(width: 24),
_navigationItem(
context: context,
text: ProfileStrings.profileTitle,
isActive: currentIndex == 4,
onTap: () {
if (currentIndex == 4) {
return;
} else {
Router.neglect(
context,
() => const ProfileRouteData().go(context),
);
}
},
iconPath: AssetsManager.profile,
activeIconPath: AssetsManager.profileActive,
),
const Spacer(),
if (haveFilter)
Builder(
builder:
(context) => IconButton(
icon: SvgPicture.asset(
AssetsManager.filter,
height: 24.0.w(),
width: 24.0.w(),
),
onPressed: () {
Scaffold.of(context).openEndDrawer();
},
),
),
const SizedBox(width: 68),
],
),
);
}
Widget _navigationItem({
required BuildContext context,
required String text,
required bool isActive,
required VoidCallback onTap,
required String iconPath,
required String activeIconPath,
}) {
final hasUnread =
context.watch<NotificationStateService>().hasUnreadNotification;
return InkWell(
onTap: onTap,
child: SizedBox(
width: 115.0,
height: 64,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Stack(
clipBehavior: Clip.none,
children: [
SvgPicture.asset(isActive ? activeIconPath : iconPath),
if (text == TendersStrings.notifications && hasUnread)
Positioned(
right: -5,
top: -2,
child: Container(
width: 8,
height: 8,
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
),
),
],
),
const SizedBox(width: 8),
Text(
text,
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color: isActive ? AppColors.primaryColor : AppColors.grey60,
),
),
],
),
),
);
}
}