fix(ui): fix error text in warning card and update information for device's inter-family owner

This commit is contained in:
anhtunz
2025-07-21 10:09:19 +07:00
parent 4ff2ad4396
commit fe622d8af9
4 changed files with 98 additions and 179 deletions

View File

@@ -13,10 +13,10 @@ class HomeBloc extends BlocBase {
APIServices apiServices = APIServices();
final allDevicesAliasMap =
StreamController<Map<String, List<DeviceWithAlias>>>.broadcast();
StreamSink<Map<String, List<DeviceWithAlias>>> get sinkAllDevicesAliasMap =>
StreamController<Map<String, List<DeviceWithAlias>>?>.broadcast();
StreamSink<Map<String, List<DeviceWithAlias>>?> get sinkAllDevicesAliasMap =>
allDevicesAliasMap.sink;
Stream<Map<String, List<DeviceWithAlias>>> get streamAllDevicesAliasMap =>
Stream<Map<String, List<DeviceWithAlias>>?> get streamAllDevicesAliasMap =>
allDevicesAliasMap.stream;
// final allDevicesAliasJoinedMap =
@@ -47,7 +47,6 @@ class HomeBloc extends BlocBase {
Stream<List<DeviceWithAlias>?> get streamAliasDevices => aliasDevices.stream;
void getOwnerAndJoinedDevices(BuildContext context) async {
await apiServices.execute(context, () async {
List<DeviceWithAlias> devices = await apiServices.getDashBoardDevices().handleApiError();
List<DeviceWithAlias> publicDevices = [];
@@ -56,6 +55,8 @@ class HomeBloc extends BlocBase {
publicDevices.add(device);
}
}
// getDeviceStatusAliasMap(publicDevices);
sinkAllDevicesAliasMap.add(null);
sinkAliasDevices.add(publicDevices);
if (!context.mounted) return;
getOwnerDeviceState(context, publicDevices);

View File

@@ -33,10 +33,17 @@ class _HomeScreenState extends State<HomeScreen> {
super.initState();
homeBloc = BlocProvider.of(context);
const duration = Duration(seconds: 10);
WidgetsBinding.instance.addPostFrameCallback((_) {
// Code ở đây chạy sau khi giao diện render xong
getAllDevicesTimer =
Timer.periodic(duration, (Timer t) => homeBloc.getOwnerAndJoinedDevices(context));
// Ví dụ: gọi API, scroll tới vị trí nào đó, v.v.
});
}
@override
void dispose() {
getAllDevicesTimer?.cancel();
@@ -53,7 +60,6 @@ class _HomeScreenState extends State<HomeScreen> {
homeBloc.getOwnerAndJoinedDevices(context);
return const SharedLoadingAnimation();
}else{
log("Goi else");
homeBloc.getOwnerDeviceState(context, aliasDevicesSnapshot.data ?? []);
homeBloc.getDeviceStatusAliasMap(aliasDevicesSnapshot.data ?? []);
checkSettingDevice(aliasDevicesSnapshot.data ?? []);
@@ -210,7 +216,7 @@ class _HomeScreenState extends State<HomeScreen> {
),
),
),
StreamBuilder<Map<String, List<DeviceWithAlias>>>(
StreamBuilder<Map<String, List<DeviceWithAlias>>?>(
stream: homeBloc.streamAllDevicesAliasMap,
builder: (context, allDevicesAliasMapSnapshot) {
if(allDevicesAliasMapSnapshot.data == null){

View File

@@ -117,6 +117,9 @@ Future<Widget> notificationCard(BuildContext context, String notificationType,
),
],
),
SizedBox(
height: context.lowValue,
),
device.isOwner!
? Align(
alignment: Alignment.centerRight,
@@ -152,20 +155,6 @@ Future<Widget> notificationCard(BuildContext context, String notificationType,
),
),
),
OutlinedButton(
style: const ButtonStyle(
backgroundColor:
WidgetStatePropertyAll(Colors.blueAccent),
),
onPressed: () {
context.pushNamed(AppRoutes.DEVICE_DETAIL.name,
pathParameters: {'thingID': device.thingId!});
},
child: Text(
appLocalization(context).detail_message,
style: const TextStyle(color: Colors.white),
),
),
],
),
],

View File

@@ -35,7 +35,7 @@ Future<Widget> warningCard(BuildContext context, APIServices apiServices,
}
if (device.state! == 3) {
backgroundColor = Colors.grey;
textColor = Colors.black;
textColor = Colors.white;
message = appLocalization(context).in_progress_message;
} else if (device.state! == 2) {
backgroundColor = const Color.fromARGB(255, 6, 138, 72);
@@ -44,32 +44,18 @@ Future<Widget> warningCard(BuildContext context, APIServices apiServices,
} else if (device.state! == 1) {
backgroundColor = const Color.fromARGB(255, 250, 63, 63);
textColor = Colors.white;
if(device.isOwner == true){
message = appLocalization(context).button_fake_fire_message;
}else{
message = appLocalization(context).smoke_detecting_message_lowercase;
}
} else {
backgroundColor = Colors.black;
textColor = Colors.white;
message = appLocalization(context).disconnect_message_uppercase;
}
return badges.Badge(
badgeAnimation: const badges.BadgeAnimation.fade(),
position: badges.BadgePosition.bottomStart(bottom: 15, start: 10),
badgeContent: device.isOwner!
? null
: Text(
appLocalization(context).interfamily_page_name,
style: TextStyle(
fontSize: 20,
color: Theme.of(context).colorScheme.onSurface,
fontWeight: FontWeight.bold),
),
badgeStyle: badges.BadgeStyle(
shape: badges.BadgeShape.square,
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(color: Colors.white, width: 2),
badgeColor: Theme.of(context).colorScheme.surfaceDim,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
),
child: Card(
return Card(
child: Padding(
padding: context.paddingLow,
child: Column(
@@ -158,14 +144,16 @@ Future<Widget> warningCard(BuildContext context, APIServices apiServices,
SizedBox(
height: context.lowValue,
),
Row(
device.isOwner == true
? Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
IconButton.outlined(
onPressed: () async => {},
// displayListOfFireStationPhoneNumbers(testDevice),
icon: IconConstants.instance.getMaterialIcon(Icons.call),
icon:
IconConstants.instance.getMaterialIcon(Icons.call),
iconSize: 25,
style: ButtonStyle(
backgroundColor:
@@ -189,8 +177,7 @@ Future<Widget> warningCard(BuildContext context, APIServices apiServices,
),
),
SizedBox(width: context.mediumValue),
device.isOwner!
? Expanded(
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: OutlinedButton(
@@ -268,6 +255,8 @@ Future<Widget> warningCard(BuildContext context, APIServices apiServices,
),
),
),
),
],
)
: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -286,79 +275,15 @@ Future<Widget> warningCard(BuildContext context, APIServices apiServices,
),
),
),
SizedBox(width: context.mediumValue),
Expanded(
child: Align(
alignment: Alignment.centerRight,
child: OutlinedButton(
style: ButtonStyle(
backgroundColor: WidgetStatePropertyAll(
backgroundColor)),
onPressed: () async {
if (message ==
appLocalization(context)
.button_fake_fire_message) {
await showDialog(
context: context,
builder: (context) => AlertDialog(
icon: const Icon(Icons.warning),
iconColor: Colors.red,
title: Text(appLocalization(context)
.confirm_fake_fire_message),
content: Text(appLocalization(context)
.confirm_fake_fire_body),
actions: [
TextButton(
onPressed: () async {
await apiServices.execute(context,
() async {
int statusCode =
await apiServices
.confirmFakeFireByUser(
device.thingId!);
if (statusCode == 200) {
showNoIconTopSnackBar(
context,
appLocalization(context)
.notification_confirm_fake_fire_success,
Colors.green,
Colors.white);
} else {
showNoIconTopSnackBar(
context,
appLocalization(context)
.notification_confirm_fake_fire_failed,
Colors.red,
Colors.red);
}
});
Navigator.of(context).pop();
},
child: Text(
appLocalization(context)
.confirm_fake_fire_sure_message,
style: const TextStyle(
color: Colors.red)),
),
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(appLocalization(context)
.cancel_button_content),
),
],
),
);
} else {
showNoIconTopSnackBar(
context,
appLocalization(context)
.let_PCCC_handle_message,
Colors.orange,
Colors.white);
}
},
backgroundColor:
WidgetStatePropertyAll(backgroundColor)),
onPressed: () async {},
child: Text(
message,
style: TextStyle(color: textColor),
@@ -370,9 +295,7 @@ Future<Widget> warningCard(BuildContext context, APIServices apiServices,
),
],
),
],
),
),
),
);
}