import 'dart:async'; import 'package:flutter/material.dart'; import '../../product/extension/context_extension.dart'; import '../../product/services/language_services.dart'; import '../../bloc/bell_bloc.dart'; import '../../product/base/bloc/base_bloc.dart'; import '../../product/services/api_services.dart'; import 'bell_model.dart'; class BellScreen extends StatefulWidget { const BellScreen({super.key}); @override State createState() => _BellScreenState(); } class _BellScreenState extends State { late BellBloc bellBloc; APIServices apiServices = APIServices(); Timer? getBellTimer; int offset = 0; Bell bell = Bell(); List items = []; bool check = true; bool hasMore = true; final controller = ScrollController(); @override void initState() { super.initState(); bellBloc = BlocProvider.of(context); getBellNotification(offset); controller.addListener( () { if (controller.position.maxScrollExtent == controller.offset) { offset += 20; getBellNotification(offset); } }, ); } @override Widget build(BuildContext context) { return StreamBuilder( stream: bellBloc.streamIsLoading, builder: (context, isLoadingSnapshot) { return Scaffold( appBar: AppBar( title: Text(appLocalization(context).bell_page_title), centerTitle: true, ), body: StreamBuilder>( stream: bellBloc.streamBellItems, initialData: items, builder: (context, bellSnapshot) { return check ? Center( child: CircularProgressIndicator( value: context.highValue, ), ) : bellSnapshot.data?.isEmpty ?? true ? Center( child: Text( appLocalization(context).bell_page_no_items_body), ) : SizedBox( width: double.infinity, height: double.infinity, child: RefreshIndicator( onRefresh: refresh, child: ListView.builder( controller: controller, itemCount: (bellSnapshot.data!.length + 1), itemBuilder: (context, index) { if (index < bellSnapshot.data!.length) { return GestureDetector( onTap: () async { List read = []; read.add(bellSnapshot.data![index].id!); int code = await apiServices .updateStatusOfNotification(read); if (code == 200) { read.clear(); } else { read.clear(); } refresh(); }, child: Column( children: [ Container( decoration: BoxDecoration( color: bellSnapshot .data![index].status! == 1 ? Theme.of(context) .appBarTheme .backgroundColor : Theme.of(context) .colorScheme .outlineVariant, ), child: ListTile( // style: ListTileS, title: Text( getBellEvent( context, bellSnapshot.data![index] .itemDetail!.sourceName!, bellSnapshot .data![index].eventType!, bellSnapshot.data![index] .itemDetail!.targetName!, ), overflow: TextOverflow.ellipsis, maxLines: 3, style: const TextStyle(fontSize: 15), ), trailing: Text( timeAgo( context, bellSnapshot .data![index].createdAt!, ), ), ), ), const Divider( height: 1, ), ], ), ); } else { return Padding( padding: const EdgeInsets.all(8.0), child: StreamBuilder( stream: bellBloc.streamHasMore, builder: (context, hasMoreSnapshot) { return Center( child: hasMoreSnapshot.data ?? hasMore ? const CircularProgressIndicator() : Text( appLocalization(context) .bell_read_all, ), ); }, ), ); } }, ), ), ); }, ), ); }, ); } Future refresh() async { check = true; offset = 0; items.clear(); bellBloc.sinkBellItems.add(items); hasMore = true; getBellNotification(offset); } Future getBellNotification(int offset) async { bell = await apiServices.getBellNotifications( offset.toString(), (offset + 20).toString()); if (bell.items!.isEmpty) { hasMore = false; bellBloc.sinkHasMore.add(hasMore); } else { for (var item in bell.items!) { items.add(item); } } bellBloc.bellItems.add(items); check = false; } String timeAgo(BuildContext context, DateTime dateTime) { final duration = DateTime.now().difference(dateTime); if (duration.inDays > 0) { return '${duration.inDays} ${appLocalization(context).bell_days_ago}'; } else if (duration.inHours > 0) { return '${duration.inHours} ${appLocalization(context).bell_hours_ago}'; } else if (duration.inMinutes > 0) { return '${duration.inMinutes} ${appLocalization(context).bell_minutes_ago}'; } else { return appLocalization(context).bell_just_now; } } String getBellEvent(BuildContext context, String deviceName, String eventCode, String targetName) { String message = ""; if (eventCode == "001") { message = "${appLocalization(context).device_title} $deviceName ${appLocalization(context).disconnect_message_lowercase}"; } else if (eventCode == "002") { message = "${appLocalization(context).device_title} $deviceName ${appLocalization(context).gf_connected_lowercase}"; } else if (eventCode == "003") { message = "${appLocalization(context).device_title} $deviceName ${appLocalization(context).smoke_detecting_message_lowercase}"; } else if (eventCode == "004") { message = "${appLocalization(context).device_title} $deviceName ${appLocalization(context).error_message_lowercase}"; } else if (eventCode == "005") { message = "${appLocalization(context).device_title} $deviceName ${appLocalization(context).bell_operate_normal}"; } else if (eventCode == "006") { message = "${appLocalization(context).bell_battery_device} $deviceName ${appLocalization(context).low_message_lowercase}"; } else if (eventCode == "101") { message = "${appLocalization(context).bell_user_uppercase} ${appLocalization(context).bell_user_joined_group}"; } else if (eventCode == "102") { message = "${appLocalization(context).bell_user_uppercase} $deviceName ${appLocalization(context).bell_leave_group} $targetName "; } else if (eventCode == "103") { message = "${appLocalization(context).device_title} $deviceName ${appLocalization(context).bell_user_added_group} $targetName"; } else if (eventCode == "104") { message = "${appLocalization(context).device_title} $deviceName ${appLocalization(context).bell_user_kick_group} $targetName"; } else { message = appLocalization(context).bell_invalid_code; } return message; } }