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.
HMG_QLine/lib/views/common_widgets/app_footer.dart

333 lines
14 KiB
Dart

import 'dart:async'; // Add this import
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:hmg_qline/view_models/screen_config_view_model.dart';
import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart';
import 'package:provider/provider.dart';
import 'package:hmg_qline/constants/app_constants.dart';
import 'package:hmg_qline/utilities/enums.dart';
import 'package:hmg_qline/views/common_widgets/app_texts_widget.dart';
import 'package:hmg_qline/views/view_helpers/size_config.dart';
class AppFooter extends StatefulWidget {
const AppFooter({super.key});
@override
State<AppFooter> createState() => _AppFooterState();
}
class _AppFooterState extends State<AppFooter> {
Timer? _timer;
String _remainingTime = "";
@override
void initState() {
super.initState();
_startTimer();
}
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
void _startTimer() {
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
if (mounted) {
setState(() {
_updateRemainingTime();
});
}
});
_updateRemainingTime();
}
void _updateRemainingTime() {
final screenConfigVM = Provider.of<ScreenConfigViewModel>(context, listen: false);
final nextPrayerTimeStr = screenConfigVM.nextPrayerTime;
if (nextPrayerTimeStr.isEmpty) {
_remainingTime = "";
return;
}
try {
final now = DateTime.now();
final timeParts = nextPrayerTimeStr.split(' ');
final timeStr = timeParts[0];
final amPm = timeParts.length > 1 ? timeParts[1].toUpperCase() : 'AM';
final hourMin = timeStr.split(':');
int hour = int.parse(hourMin[0]);
final minute = int.parse(hourMin[1]);
if (amPm == 'PM' && hour != 12) {
hour += 12;
} else if (amPm == 'AM' && hour == 12) {
hour = 0;
}
DateTime nextPrayer = DateTime(now.year, now.month, now.day, hour, minute);
if (nextPrayer.isBefore(now)) {
nextPrayer = nextPrayer.add(const Duration(days: 1));
}
final difference = nextPrayer.difference(now);
if (difference.isNegative) {
_remainingTime = "00:00:00";
} else {
final hours = difference.inHours;
final minutes = difference.inMinutes % 60;
final seconds = difference.inSeconds % 60;
_remainingTime = "${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}";
}
} catch (e) {
_remainingTime = "00:00:00";
}
}
Widget _buildStatusRow(String label, bool isConnected) {
return Row(
children: [
AppText(
"$label:",
fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
),
AppText(
" ${isConnected ? "Connected" : "Disconnected"}",
fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
color: isConnected ? AppColors.greenColor : AppColors.redColor,
),
],
);
}
Widget _buildPrayerColumn(String label, String prayerName, {bool isForArabic = false}) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
AppText(
label,
fontSize: SizeConfig.getWidthMultiplier()! * 1.8,
fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
),
AppText(
prayerName,
fontSize: SizeConfig.getWidthMultiplier()! * 2,
fontWeight: FontWeight.bold,
color: AppColors.darkGreyTextColor,
fontFamily: isForArabic ? AppStrings.fontNameGesTwo : AppStrings.fontNamePoppins,
),
],
);
}
bool _isMoreThanOneHour(String timeString) {
if (timeString.isEmpty) return false;
try {
final parts = timeString.split(':');
if (parts.length >= 3) {
final hours = int.parse(parts[0]);
return hours >= 1;
}
} catch (e) {
return false;
}
return false;
}
String _getHoursFromTime(String timeString) {
if (timeString.isEmpty) return "0";
try {
final parts = timeString.split(':');
if (parts.length >= 3) {
final hours = int.parse(parts[0]);
final minutes = int.parse(parts[1]);
if (minutes > 30) {
return "${hours + 1}";
}
return hours.toString();
}
} catch (e) {
return "0";
}
return "0";
}
@override
Widget build(BuildContext context) {
return Consumer<ScreenConfigViewModel>(
builder: (BuildContext context, ScreenConfigViewModel screenConfigVM, Widget? child) {
bool isPortrait = screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitUp ||
screenConfigVM.globalConfigurationsModel.orientationTypeEnum == ScreenOrientationEnum.portraitDown;
return Padding(
padding: EdgeInsets.symmetric(
horizontal: SizeConfig.getWidthMultiplier() * 4,
vertical: SizeConfig.getHeightMultiplier() * 0.14,
),
child: Row(
children: [
Expanded(
flex: 3,
child: customShadowSmoothContainer(
height: SizeConfig.getHeightMultiplier() * 0.8,
padding: EdgeInsets.symmetric(
horizontal: SizeConfig.getWidthMultiplier() * 3,
vertical: SizeConfig.getHeightMultiplier() * 0.1,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Padding(
padding: EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.1),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AppText(
AppStrings.poweredBy,
fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
fontWeight: FontWeight.w400,
color: AppColors.darkGreyTextColor,
),
AppText(
"v${screenConfigVM.currentScreenIP.replaceAll(".", "").replaceAll("0", "-")}(${AppConstants.currentBuildVersion})",
fontSize: SizeConfig.getWidthMultiplier()! * 1,
fontWeight: FontWeight.w400,
color: AppColors.darkGreyTextColor,
),
],
),
),
SizedBox(width: SizeConfig.getWidthMultiplier()!),
Padding(
padding: EdgeInsets.only(bottom: SizeConfig.getHeightMultiplier()! * 0.06),
child: Image.asset(
AppAssets.cloudLogo,
height: isPortrait ? SizeConfig.getHeightMultiplier()! * 0.6 : SizeConfig.getHeightMultiplier()! * 0.4,
),
),
],
),
Padding(
padding: isPortrait ? EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.3) : EdgeInsets.only(top: SizeConfig.getHeightMultiplier()! * 0.15),
child: isPortrait
? Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
SizedBox(width: SizeConfig.getWidthMultiplier()! * 2),
_buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
],
)
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildStatusRow("Hub Status ", screenConfigVM.isHubConnected),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.05),
_buildStatusRow("Network Status ", screenConfigVM.isInternetConnected),
],
),
),
],
),
),
),
if (screenConfigVM.globalConfigurationsModel.isPrayerTimeReq) ...[
SizedBox(width: SizeConfig.getWidthMultiplier()! * 1.7),
Directionality(
textDirection: screenConfigVM.globalConfigurationsModel.textDirection,
child: Expanded(
flex: isPortrait ? 2 : 3,
child: customShadowSmoothContainer(
height: SizeConfig.getHeightMultiplier() * 0.8,
padding: EdgeInsets.symmetric(
horizontal: isPortrait ? SizeConfig.getWidthMultiplier() * 3 : SizeConfig.getWidthMultiplier() * 1.5,
vertical: SizeConfig.getHeightMultiplier() * 0.1,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SizedBox(
width: SizeConfig.getWidthMultiplier() * 15,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.05),
Padding(
padding: EdgeInsets.only(left: SizeConfig.getWidthMultiplier()! * 0.5),
child: AppText(
_isMoreThanOneHour(_remainingTime) ? AppStrings.namazTimeText : AppStrings.timeRemainingText,
fontSize: SizeConfig.getWidthMultiplier()! * 1.5,
fontFamily: AppStrings.fontNamePoppins,
),
),
_isMoreThanOneHour(_remainingTime)
? AppText(
screenConfigVM.nextPrayerTime,
fontSize: SizeConfig.getWidthMultiplier()! * 3,
fontWeight: FontWeight.bold,
color: AppColors.newRedColor,
letterSpacing: 1.5,
)
: AppText(
_remainingTime,
fontSize: SizeConfig.getWidthMultiplier()! * 3,
fontWeight: FontWeight.bold,
color: AppColors.newRedColor,
letterSpacing: 1.5,
),
],
),
),
Row(
children: [
if (screenConfigVM.nextPrayerToShowEng.isNotEmpty) ...[
_buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextEng, "${screenConfigVM.nextPrayerToShowEng} "),
],
if (screenConfigVM.nextPrayerToShowEng.isNotEmpty && screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[
Padding(
padding: EdgeInsets.fromLTRB(
SizeConfig.getWidthMultiplier()! * 0.1,
SizeConfig.getHeightMultiplier()! * 0.18,
SizeConfig.getWidthMultiplier()! * 0.1,
0,
),
child: AppText("|", fontSize: SizeConfig.getWidthMultiplier()! * 1.8, color: AppColors.darkGreyTextColor),
),
],
if (screenConfigVM.nextPrayerToShowArb.isNotEmpty) ...[
_buildPrayerColumn(screenConfigVM.globalConfigurationsModel.nextPrayerTextArb, screenConfigVM.nextPrayerToShowArb, isForArabic: true),
],
],
),
if (isPortrait) ...[
SvgPicture.asset(
AppAssets.salahTimeIcon,
height: SizeConfig.getHeightMultiplier() * 0.5,
),
],
],
),
),
),
),
],
],
),
);
},
);
}
}