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.
cloudsolutions-atoms/lib/dashboard_latest/widgets/app_bar_widget.dart

248 lines
13 KiB
Dart

2 months ago
import 'dart:io';
import 'package:flutter/cupertino.dart';
2 years ago
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
2 years ago
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
2 years ago
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
2 years ago
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
2 years ago
import 'package:test_sa/extensions/text_extensions.dart';
2 years ago
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
2 years ago
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/pages/user/notifications/unread_chat_list.dart';
import 'package:test_sa/views/widgets/dialogs/confirm_dialog.dart';
2 years ago
import '../../controllers/providers/api/user_provider.dart';
import '../../models/user.dart';
class AppBarWidget extends StatelessWidget {
final VoidCallback onDrawerPress; // Made nullable
2 years ago
const AppBarWidget({Key? key, required this.onDrawerPress}) : super(key: key);
2 years ago
@override
Widget build(BuildContext context) {
2 years ago
return AppBar(
2 years ago
automaticallyImplyLeading: false,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
titleSpacing: 0,
2 years ago
title: Consumer<UserProvider>(builder: (context, snapshot, _) {
return Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
CircleAvatar(
2 years ago
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
2 years ago
: const Icon(Icons.person, size: 24, color: Colors.white),
2 years ago
),
),
).onPress(onDrawerPress), // Handle potential null
2 years ago
8.width,
Column(
crossAxisAlignment: CrossAxisAlignment.start,
2 months ago
spacing: 4,
2 years ago
children: [
Text(
2 months ago
snapshot.user?.username ?? "",
style: AppTextStyles.heading6.copyWith(color: AppColor.headingTextColor(context), fontSize: context.isTablet() ? 14 : null),
2 years ago
),
Text(
2 months ago
snapshot.user?.type?.name.toCamelCase ?? "",
2 months ago
style: AppTextStyles.bodyText.copyWith(color: AppColor.lightTextColor(context), fontSize: context.isTablet() ? 12 : null),
2 years ago
),
],
).expanded,
2 years ago
const Spacer(),
Consumer<SettingProvider>(builder: (context, settingProvider, child) {
2 months ago
return MenuAnchor(
style: MenuStyle(
backgroundColor: WidgetStateProperty.all(AppColor.background(context)),
shape: WidgetStateProperty.all(
RoundedRectangleBorder(
borderRadius: const BorderRadius.all(Radius.circular(20.0)),
side: BorderSide(color: AppColor.borderColor(context), width: 1),
),
),
padding: WidgetStateProperty.all(
EdgeInsets.symmetric(
horizontal: 0.toScreenWidth,
vertical: 8.toScreenHeight,
),
),
elevation: WidgetStateProperty.all(0),
),
menuChildren: Provider.of<UserProvider>(context, listen: false).user?.assetGroups?.map<MenuItemButton>((value) {
return MenuItemButton(
onPressed: () async {
if (settingProvider.assetGroup != value) {
AssetGroup? tempGroup = ApiManager.instance.assetGroup;
ApiManager.instance.assetGroup = value;
Utils.showLoading(context);
bool isSuccess = await context.userProvider.userChangeAssetGroup();
Utils.hideLoading(context);
if (isSuccess) {
await context.userProvider.getMobilePermissionByUser();
settingProvider.setAssetGroup(value);
WidgetsBinding.instance.addPostFrameCallback((_) {
context.settingProvider.setUser(ApiManager.instance.user!);
context.userProvider.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");
}
}
},
child: Text(value.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))),
);
}).toList() ??
[],
builder: (_, MenuController controller, Widget? child) {
return Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: AppColor.assetGroupBackground(context),
border: Border.all(color: AppColor.white936.withValues(alpha: .03), width: 1),
boxShadow: [
BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 4, offset: const Offset(0, 0), spreadRadius: 0),
],
),
child: Row(
mainAxisSize: MainAxisSize.min,
spacing: 16,
children: [
Text(settingProvider.assetGroup?.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))),
Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)),
],
),
).onPress(() {
if (controller.isOpen) {
controller.close();
} else {
controller.open();
}
});
},
);
return Container(
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: AppColor.assetGroupBackground(context),
border: Border.all(color: AppColor.white936.withValues(alpha: .03), width: 1),
boxShadow: [
BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 4, offset: const Offset(0, 0), spreadRadius: 0),
],
),
child: Row(
mainAxisSize: MainAxisSize.min,
spacing: 16,
children: [
Text(settingProvider.assetGroup?.name ?? "", style: AppTextStyles.bodyText2.copyWith(color: AppColor.headingTextColor(context))),
Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)),
],
),
);
2 years ago
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
2 years ago
value: settingProvider.assetGroup,
//iconSize: 24,
isDense: true,
2 months ago
icon: Icon(Icons.keyboard_arrow_down, color: AppColor.headingTextColor(context)),
2 years ago
elevation: 8,
// dropdownColor: Colors.amber,
borderRadius: BorderRadius.circular(8),
2 months ago
style: AppTextStyles.tinyFont.copyWith(color: AppColor.headingTextColor(context)),
2 years ago
underline: const SizedBox.shrink(),
onChanged: (newValue) async {
2 years ago
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) {
await context.userProvider.getMobilePermissionByUser();
settingProvider.setAssetGroup(newValue);
WidgetsBinding.instance.addPostFrameCallback((_) {
context.settingProvider.setUser(ApiManager.instance.user!);
8 months ago
context.userProvider.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");
}
2 years ago
}
},
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
2 years ago
),
);
2 years ago
}),
16.width,
if (context.settingProvider.isUserFlowMedical) ...[
2 months ago
("dashboard/chat").toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).paddingOnly(top: 0, end: 0).onPress(() {
Navigator.of(context).push(CupertinoPageRoute(builder: (_) => UnReadChatList()));
}),
2 months ago
16.width,
],
2 months ago
("dashboard/notification").toSvgAsset(height: 24, width: 24, color: AppColor.icon2Color(context)).paddingOnly(top: 0, end: 0).onPress(() {
2 years ago
Navigator.of(context).pushNamed(NotificationsPage.id);
}),
],
).paddingOnly(start: 16, end: 16);
}),
2 years ago
);
}
}