You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			144 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			144 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
| import 'package:flutter/material.dart';
 | |
| import 'package:provider/provider.dart';
 | |
| import 'package:test_sa/controllers/api_routes/api_manager.dart';
 | |
| import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
 | |
| import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
 | |
| import 'package:test_sa/extensions/context_extension.dart';
 | |
| import 'package:test_sa/extensions/int_extensions.dart';
 | |
| import 'package:test_sa/extensions/text_extensions.dart';
 | |
| import 'package:test_sa/extensions/widget_extensions.dart';
 | |
| import 'package:test_sa/helper/utils.dart';
 | |
| import 'package:test_sa/new_views/app_style/app_color.dart';
 | |
| import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
 | |
| import 'package:test_sa/views/widgets/dialogs/confirm_dialog.dart';
 | |
| 
 | |
| import '../../controllers/providers/api/user_provider.dart';
 | |
| import '../../models/user.dart';
 | |
| 
 | |
| class AppBarWidget extends StatelessWidget {
 | |
|   final VoidCallback onDrawerPress; // Made nullable
 | |
| 
 | |
|   const AppBarWidget({Key? key, required this.onDrawerPress}) : super(key: key);
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return AppBar(
 | |
|       automaticallyImplyLeading: false,
 | |
|       backgroundColor: Theme.of(context).scaffoldBackgroundColor,
 | |
|       titleSpacing: 0,
 | |
|       title: Consumer<UserProvider>(builder: (context, snapshot, _) {
 | |
|         return Row(
 | |
|           // mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | |
|           crossAxisAlignment: CrossAxisAlignment.center,
 | |
|           children: [
 | |
|             CircleAvatar(
 | |
|               radius: 24,
 | |
|               backgroundColor: context.isDark ? AppColor.neutral50 : AppColor.neutral40,
 | |
|               child: Padding(
 | |
|                 padding: const EdgeInsets.all(1), // Border radius
 | |
|                 child: ClipOval(
 | |
|                   child: snapshot.profileImage != null
 | |
|                       ? Image.file(snapshot.profileImage!) // Added null check
 | |
|                       : (snapshot.user?.profilePhotoName?.isNotEmpty ?? false)
 | |
|                           ? Image.network(snapshot.user!.profilePhotoName!) // Added null check
 | |
|                           : const Icon(Icons.person, size: 24, color: Colors.white),
 | |
|                 ),
 | |
|               ),
 | |
|             ).onPress(onDrawerPress), // Handle potential null
 | |
|             8.width,
 | |
|             Column(
 | |
|               crossAxisAlignment: CrossAxisAlignment.start,
 | |
|               children: [
 | |
|                 Text(
 | |
|                   snapshot.user?.username ?? "", // Simplified null check
 | |
|                   style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600),
 | |
|                 ),
 | |
|                 Text(
 | |
|                   snapshot.user?.type?.name.toCamelCase ?? "", // Simplified null check
 | |
|                   style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|             const Spacer(),
 | |
|             Consumer<SettingProvider>(builder: (context, settingProvider, child) {
 | |
|               return Container(
 | |
|                 padding: const EdgeInsets.fromLTRB(12, 6, 6, 6),
 | |
|                 decoration: BoxDecoration(
 | |
|                   borderRadius: BorderRadius.circular(8),
 | |
|                   color: AppColor.background(context),
 | |
|                   boxShadow: const [
 | |
|                     BoxShadow(
 | |
|                       color: Color(0x07000000),
 | |
|                       blurRadius: 14,
 | |
|                       offset: Offset(0, 0),
 | |
|                       spreadRadius: 0,
 | |
|                     )
 | |
|                   ],
 | |
|                 ),
 | |
|                 child: DropdownButton<AssetGroup?>(
 | |
|                   // Made AssetGroup nullable
 | |
|                   value: settingProvider.assetGroup,
 | |
|                   //iconSize: 24,
 | |
|                   isDense: true,
 | |
|                   icon: const Icon(Icons.keyboard_arrow_down),
 | |
|                   elevation: 8,
 | |
|                   // dropdownColor: Colors.amber,
 | |
|                   borderRadius: BorderRadius.circular(8),
 | |
|                   style: TextStyle(color: Theme.of(context).primaryColor),
 | |
|                   underline: const SizedBox.shrink(),
 | |
|                   onChanged: (newValue) async {
 | |
|                     if (settingProvider.assetGroup != newValue) {
 | |
|                       AssetGroup? tempGroup = ApiManager.instance.assetGroup;
 | |
|                       ApiManager.instance.assetGroup = newValue;
 | |
| 
 | |
|                       Utils.showLoading(context);
 | |
|                       bool isSuccess = await context.userProvider.userChangeAssetGroup();
 | |
|                       Utils.hideLoading(context);
 | |
|                       if (isSuccess) {
 | |
|                         settingProvider.setAssetGroup(newValue);
 | |
|                         WidgetsBinding.instance.addPostFrameCallback((_) {
 | |
|                           context.settingProvider.setUser(ApiManager.instance.user!);
 | |
|                           DashBoardProvider dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false);
 | |
|                           dashBoardProvider.setTabs(userType: settingProvider.user!.type!, context: context);
 | |
|                           dashBoardProvider.getDashBoardCount(usersType: settingProvider.user!.type!);
 | |
|                           dashBoardProvider.resetRequestDataList();
 | |
|                           dashBoardProvider.getRequestDetail(usersType: settingProvider.user!.type!, status: dashBoardProvider.tabs[dashBoardProvider.currentListIndex].tag);
 | |
|                         });
 | |
|                       } else {
 | |
|                         ApiManager.instance.assetGroup = tempGroup;
 | |
|                         context.showConfirmDialog("Failed, Please Try again");
 | |
|                       }
 | |
|                     }
 | |
|                   },
 | |
|                   items: Provider.of<UserProvider>(context, listen: false).user?.assetGroups?.map<DropdownMenuItem<AssetGroup?>>((value) {
 | |
|                         // Added null check and made AssetGroup nullable
 | |
|                         return DropdownMenuItem<AssetGroup?>(
 | |
|                           value: value,
 | |
|                           child: Text(
 | |
|                             value.name ?? "",
 | |
|                             style: Theme.of(context).textTheme.bodyLarge,
 | |
|                           ),
 | |
|                         );
 | |
|                       }).toList() ??
 | |
|                       [], // Added null check and empty list default
 | |
|                 ),
 | |
|               );
 | |
|             }),
 | |
|             16.width,
 | |
|             Stack(
 | |
|               alignment: Alignment.topRight,
 | |
|               children: [
 | |
|                 Icon(Icons.notifications, color: context.isDark ? AppColor.neutral30 : AppColor.neutral20, size: 30).paddingOnly(top: 6, end: 0),
 | |
|                 // todo @sikander will add count for unread notifications
 | |
|                 // ... (rest of the code remains the same)
 | |
|               ],
 | |
|             ).onPress(() {
 | |
|               Navigator.of(context).pushNamed(NotificationsPage.id);
 | |
|             }),
 | |
|           ],
 | |
|         ).paddingOnly(start: 16, end: 16);
 | |
|       }),
 | |
|     );
 | |
|   }
 | |
| }
 |