Merge remote-tracking branch 'origin/export_module_ui_ux_enhancement' into export_module_ui_ux_enhancement

# Conflicts:
#	lib/new_views/common_widgets/app_text_form_field.dart
#	lib/views/widgets/date_and_time/date_picker.dart
#	lib/views/widgets/timer/app_timer.dart
main_production_RSG
WaseemAbbasi22 2 months ago
commit 474a244b55

@ -33,7 +33,7 @@ class RequestCategoryList extends StatelessWidget {
shrinkWrap: true,
padding: const EdgeInsets.all(16),
physics: const NeverScrollableScrollPhysics(),
separatorBuilder: (cxt, index) => 16.height,
separatorBuilder: (cxt, index) => 12.height,
itemBuilder: (context, index) {
if (index == list.length) {
return CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 1).center;

@ -157,7 +157,7 @@ class DeviceSearch {
final map = <String, dynamic>{};
if (code != null && code!.isNotEmpty) map['code'] = code;
if (assetSerialNumber != null && assetSerialNumber!.isNotEmpty) map['assetSerialNumber'] = assetSerialNumber;
if (assetName != null && assetName!.isNotEmpty) map['assetName'] = [assetName];
if (assetName != null && assetName!.isNotEmpty) map['assetName'] = assetName; // todo @discuss baha about multiple asset search
if (supplyDateSymbol != null) {
map['supplyDateSymbol'] = supplyDateSymbol!.toJson();
}

@ -79,16 +79,13 @@ class _ChatMessagesState {
_ChatMessagesState({
required this.isLoading,
required this.messages,
}) : messageCount = messages.length,
lastMessageTime = messages.isNotEmpty ? messages.first.createdDate : null;
}) : messageCount = messages.length,
lastMessageTime = messages.isNotEmpty ? messages.first.createdDate : null;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is _ChatMessagesState &&
isLoading == other.isLoading &&
messageCount == other.messageCount &&
lastMessageTime == other.lastMessageTime; // FIX: Compare timestamp to detect new messages
identical(this, other) ||
other is _ChatMessagesState && isLoading == other.isLoading && messageCount == other.messageCount && lastMessageTime == other.lastMessageTime; // FIX: Compare timestamp to detect new messages
@override
int get hashCode => Object.hash(isLoading, messageCount, lastMessageTime);
@ -198,7 +195,7 @@ class _ChatPageState extends State<ChatPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.white10,
// backgroundColor: AppColor.white10,
appBar: DefaultAppBar(title: widget.title),
// OPTIMIZATION: Using Selector for connection state (rarely changes)
// This prevents rebuilding entire chat UI on every message/typing event
@ -208,7 +205,7 @@ class _ChatPageState extends State<ChatPage> {
loginResponse: provider.chatLoginResponse,
),
builder: (context, connectionState, child) {
if (connectionState.isLoading) return CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 3).center;
if (connectionState.isLoading) return CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 3).center;
if (connectionState.loginResponse == null) {
return Column(
@ -278,7 +275,7 @@ class _ChatPageState extends State<ChatPage> {
style: AppTextStyles.bodyText.copyWith(
color: AppColor.white10,
decoration: TextDecoration.underline,
decorationColor: AppColor.white10,
decorationColor: AppColor.white10
),
).onPress(() {
Navigator.push(context, CupertinoPageRoute(builder: (context) => ViewAllAttachmentPage(moduleId: widget.moduleId, requestId: widget.requestId)));
@ -294,7 +291,7 @@ class _ChatPageState extends State<ChatPage> {
messages: provider.chatResponseList,
),
builder: (context, messagesState, _) => Container(
color: AppColor.neutral100,
// color: AppColor.neutral100,
child: messagesState.isLoading
? ListView(
padding: const EdgeInsets.all(16),
@ -311,7 +308,7 @@ class _ChatPageState extends State<ChatPage> {
"Send a message to start conversation",
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: AppTextStyles.heading6.copyWith(color: AppColor.neutral50.withOpacity(.5), fontWeight: FontWeight.w500),
style: AppTextStyles.heading6.copyWith(color: AppColor.lightTextColor(context), fontWeight: FontWeight.w500),
).center
: ListView.builder(
padding: const EdgeInsets.all(16),
@ -340,7 +337,7 @@ class _ChatPageState extends State<ChatPage> {
),
).expanded,
if (!widget.readOnly) ...[
Divider(height: 1, thickness: 1, color: const Color(0xff767676).withOpacity(.11)),
const Divider().defaultStyle(context),
SafeArea(
child: ConstrainedBox(
constraints: const BoxConstraints(minHeight: 56),
@ -349,8 +346,8 @@ class _ChatPageState extends State<ChatPage> {
if (chatState == ChatState.idle) ...[
TextFormField(
controller: textEditingController,
cursorColor: AppColor.neutral50,
style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral50),
cursorColor: AppColor.loadingColor(context),
style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 14, color: AppColor.textStyleColor(context)),
minLines: 1,
maxLines: 3,
textInputAction: TextInputAction.none,
@ -371,11 +368,11 @@ class _ChatPageState extends State<ChatPage> {
errorBorder: InputBorder.none,
contentPadding: const EdgeInsets.only(left: 16, top: 8, bottom: 8),
alignLabelWithHint: true,
filled: true,
// filled: true,
constraints: const BoxConstraints(),
suffixIconConstraints: const BoxConstraints(),
hintText: "Type your message here...",
hintStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xffCCCCCC)),
hintStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: AppColor.lightTextColor(context)),
),
).expanded,
IconButton(
@ -399,7 +396,7 @@ class _ChatPageState extends State<ChatPage> {
style: const ButtonStyle(
tapTargetSize: MaterialTapTargetSize.shrinkWrap, // or .padded
),
icon: "chat_attachment".toSvgAsset(width: 24, height: 24),
icon: "chat_attachment".toSvgAsset(width: 24, height: 24,color: AppColor.icon2Color(context)),
constraints: const BoxConstraints(),
),
IconButton(
@ -420,7 +417,7 @@ class _ChatPageState extends State<ChatPage> {
style: const ButtonStyle(
tapTargetSize: MaterialTapTargetSize.shrinkWrap, // or .padded
),
icon: "chat_mic".toSvgAsset(width: 24, height: 24),
icon: "chat_mic".toSvgAsset(width: 24, height: 24,color: AppColor.icon2Color(context)),
constraints: const BoxConstraints(),
),
] else if (chatState == ChatState.voiceRecordingStarted) ...[

@ -55,7 +55,7 @@ class _ViewAllAttachmentPageState extends State<ViewAllAttachmentPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.neutral100,
// backgroundColor: AppColor.neutral100,
appBar: const DefaultAppBar(title: "Documents"),
body: FutureBuilder<List<ChatAttachment>>(
future: viewAllDocuments(widget.moduleId, widget.requestId),
@ -112,7 +112,7 @@ class AttachmentFileViewer extends StatelessWidget {
decoration: ShapeDecoration(
color: AppColor.background(context),
shape: RoundedRectangleBorder(
side: BorderSide(width: 1, color: (context.isDark ? AppColor.neutral20 : AppColor.neutral30)),
side: BorderSide(width: 1, color: AppColor.border2Color(context)),
borderRadius: BorderRadius.circular(32),
),
),

@ -54,7 +54,7 @@ class IncidentDetailPage extends StatelessWidget {
InfoDateWidget(snapshot.data!.createdDate?.toString() ?? ""),
],
),
12.height,
// 12.height,
...requesterDetails(context, snapshot.data!),
const Divider().defaultStyle(context),
...requestDetails(context, snapshot.data!),

@ -66,7 +66,7 @@ class IncidentItemView extends StatelessWidget {
InfoTextWidget(label: context.translation.requestType, value: requestDetails!.requestType),
InfoTextWidget(label: "Incident No", value: requestDetails!.requestNo),
InfoTextWidget(label: context.translation.assetName, value: requestDetails!.assetName),
InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showArrow: true),
InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showEmptyValue: true, showArrow: true),
],
).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.push(context, MaterialPageRoute(builder: (context) => IncidentDetailPage(incidentId: requestDetails!.id!)));

@ -23,6 +23,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
@ -115,7 +116,7 @@ class _InstallationFormViewState extends State<InstallationFormView> {
formatDateWithTime: true,
date: _formData.date,
onDatePicker: (DateTime date) async {
final time = await showTimePicker(context: context, initialTime: TimeOfDay.now());
final time = await showThemedTimePicker(context: context, initialTime: TimeOfDay.now());
if (time == null) return;
setState(() {
_formData.date = DateTime(date.year, date.month, date.day, time.hour, time.minute);

@ -24,6 +24,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
@ -60,7 +61,7 @@ class _InstallationPullOutFormViewState extends State<InstallationPullOutFormVie
}
void _pickInstallationDate(DateTime date) async {
final time = await showTimePicker(
final time = await showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
@ -116,7 +117,7 @@ class _InstallationPullOutFormViewState extends State<InstallationPullOutFormVie
formatDateWithTime: true,
date: _formData.date,
onDatePicker: (DateTime date) async {
final time = await showTimePicker(context: context, initialTime: TimeOfDay.now());
final time = await showThemedTimePicker(context: context, initialTime: TimeOfDay.now());
if (time == null) return;
setState(() {
_formData.date = DateTime(date.year, date.month, date.day, time.hour, time.minute);

@ -25,6 +25,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/working_time_tile.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart';
@ -583,7 +584,7 @@ class EmployeeCard extends StatelessWidget {
formatDateWithTime: true,
from: DateTime.tryParse(createdDate ?? ''),
onDatePicker: (selectedDate) {
showTimePicker(
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
@ -628,7 +629,7 @@ class EmployeeCard extends StatelessWidget {
formatDateWithTime: true,
from: DateTime.tryParse(createdDate ?? ''),
onDatePicker: (selectedDate) {
showTimePicker(
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {

@ -28,6 +28,7 @@ import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/task_request_provider/task_job_provider.dart';
import 'package:test_sa/providers/task_request_provider/task_request_provider.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/equipment/asset_picker.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
@ -339,7 +340,7 @@ class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStat
date: DateTime.tryParse(_addTaskModel?.estimationDeliveryDate ?? ""),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
showTimePicker(
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {

@ -36,6 +36,7 @@ import 'package:test_sa/providers/task_request_provider/task_job_provider.dart';
import 'package:test_sa/providers/task_request_provider/task_request_provider.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
@ -315,7 +316,7 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
date: DateTime.tryParse(taskModel.installationDate ?? ""),
formatDateWithTime: false,
onDatePicker: (selectedDate) {
showTimePicker(
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
@ -827,7 +828,7 @@ class EmployeeCard extends StatelessWidget {
formatDateWithTime: true,
from: DateTime.tryParse(createdDate ?? ''),
onDatePicker: (selectedDate) {
showTimePicker(
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {
@ -872,7 +873,7 @@ class EmployeeCard extends StatelessWidget {
formatDateWithTime: true,
from: DateTime.tryParse(createdDate ?? ''),
onDatePicker: (selectedDate) {
showTimePicker(
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
).then((selectedTime) {

@ -316,7 +316,7 @@ class _CreateTRAFRequestPageState extends State<CreateTRAFRequestPage> {
),
],
),
separatorBuilder: (cxt, index) => Divider(thickness: 1, height: 1, color: context.isDark ? AppColor.neutral20 : AppColor.neutral30),
separatorBuilder: (cxt, index) => const Divider().defaultStyle(context),
itemCount: userBasedOnSearch.length)
],
12.height,

@ -59,9 +59,9 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
padding: const EdgeInsets.all(16),
children: [
requesterInformation(trafProvider.trafRequestDataModel!),
16.height,
12.height,
requestInformation(trafProvider.trafRequestDataModel!),
16.height,
12.height,
assetInformation(trafProvider.trafRequestDataModel!),
],
).expanded,
@ -96,7 +96,7 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
InfoTextWidget(label: 'Number/Contact Information'.addTranslation, value: data.requesterContactNumber ?? '-'),
InfoTextWidget(label: 'Extension'.addTranslation, value: data.requesterExtensionNumber ?? '-'),
],
).toShadowContainer(context, borderRadius: 20, padding: 16);
).toShadowContainer(context);
}
Widget requestInformation(TrafRequestDataModel data) {
@ -129,7 +129,7 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
InfoTextWidget(label: 'Equipment going to be used with combination of other equipments', value: data.usedWithCombination ?? '-'),
],
],
).toShadowContainer(context, borderRadius: 20, padding: 16);
).toShadowContainer(context);
}
Widget assetInformation(TrafRequestDataModel data) {
@ -167,6 +167,6 @@ class _TrafRequestDetailPageState extends State<TrafRequestDetailPage> {
})
],
],
).toShadowContainer(context, borderRadius: 20, padding: 16);
).toShadowContainer(context);
}
}

@ -76,7 +76,7 @@ class TrafRequestItemView extends StatelessWidget {
InfoHeaderWidget(requestDetails?.nameOfType ?? "TRAF Request"),
InfoTextWidget(label: context.translation.requestType, value: requestDetails!.requestType),
InfoTextWidget(label: "TRAF No", value: requestDetails!.requestNo),
InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showArrow: true),
InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showEmptyValue: true,showArrow: true),
],
).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.push(context, MaterialPageRoute(builder: (context) => TrafRequestDetailPage(trafId: requestDetails!.id!)));

@ -59,11 +59,12 @@ class _UsersAutoCompleteFieldState extends State<SearchUserAutoCompleteField> {
@override
Widget build(BuildContext context) {
final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10));
final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(16));
return Container(
decoration: BoxDecoration(
color: AppColor.background(context),
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
borderRadius: BorderRadius.circular(16),
border: Border.all(color: AppColor.border2Color(context)),
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
child: Autocomplete<UsersBasedOnSearchModel>(
@ -92,7 +93,8 @@ class _UsersAutoCompleteFieldState extends State<SearchUserAutoCompleteField> {
return TextField(
controller: _controller,
focusNode: fieldFocusNode,
style: AppTextStyles.bodyText.copyWith(color: AppColor.black10),
style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 14, color: AppColor.textStyleColor(context)),
cursorColor: AppColor.loadingColor(context),
textAlign: TextAlign.start,
decoration: InputDecoration(
border: border,
@ -104,11 +106,13 @@ class _UsersAutoCompleteFieldState extends State<SearchUserAutoCompleteField> {
constraints: const BoxConstraints(),
suffixIconConstraints: const BoxConstraints(maxHeight: 24, maxWidth: 24 + 8),
filled: true,
fillColor: AppColor.fieldBgColor(context),
fillColor: AppColor.dropDownBackground(context),
errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
// floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20),
floatingLabelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: AppColor.floatingTextStyleColor(context)),
labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: AppColor.labelTextStyleColor(context)),
labelText: "Users going to use technology",
labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)),
// labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)),
suffixIcon: loading ? CircularProgressIndicator(color: AppColor.loadingColor(context), strokeWidth: 3.0).paddingOnly(end: 8) : null,
),
textInputAction: TextInputAction.search,

@ -200,9 +200,7 @@ class ADatePicker extends StatelessWidget {
),
// Icon theme for navigation arrows
iconTheme: const IconThemeData(
color: Colors.white,
),
iconTheme: IconThemeData(color: Colors.white),
),
child: child!,
);

@ -172,28 +172,7 @@ class _AppTimerState extends State<AppTimer> {
enable: widget.enabled ? _tempPickerTimer == null : false,
formatDateWithTime: true,
onDatePicker: (selectedDate) {
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
// builder: (BuildContext context, Widget? child) {
// final ThemeData currentTheme = Theme.of(context);
// return Theme(
// data: currentTheme.copyWith(
// timePickerTheme: TimePickerThemeData(
// dialHandColor: AppColor.primary10,
// dialBackgroundColor: Colors.grey.withOpacity(0.1),
// hourMinuteColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.grey.withOpacity(0.1)),
// dayPeriodColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent),
// dayPeriodTextColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? Colors.white : AppColor.primary10),
// dayPeriodBorderSide: BorderSide(color: Colors.grey.withOpacity(0.2)),
// entryModeIconColor: AppColor.primary10,
// ),
// textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(foregroundColor: AppColor.primary10)),
// ),
// child: child!,
// );
// },
).then((selectedTime) {
showThemedTimePicker(context: context, initialTime: TimeOfDay.now()).then((selectedTime) {
if (selectedTime != null) {
_pickerStartAt = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
if (widget.pickerFromDate != null && _pickerStartAt!.isBefore(widget.pickerFromDate!)) {
@ -217,7 +196,7 @@ class _AppTimerState extends State<AppTimer> {
ADatePicker(
label: context.translation.endTime,
hideShadow: true,
// backgroundColor: AppColor.dropDownBackground(context),
// backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: widget.enabled ? _pickerStartAt != null : false,
from: _pickerStartAt,
date: _pickerEndAt,
@ -227,24 +206,6 @@ class _AppTimerState extends State<AppTimer> {
showThemedTimePicker(
context: context,
initialTime: TimeOfDay.now(),
// builder: (BuildContext context, Widget? child) {
// final ThemeData currentTheme = Theme.of(context);
// return Theme(
// data: currentTheme.copyWith(
// timePickerTheme: TimePickerThemeData(
// dialHandColor: AppColor.primary10,
// dialBackgroundColor: Colors.grey.withOpacity(0.1),
// hourMinuteColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.grey.withOpacity(0.1)),
// dayPeriodColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent),
// dayPeriodTextColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? Colors.white : AppColor.primary10),
// dayPeriodBorderSide: BorderSide(color: Colors.grey.withOpacity(0.2)),
// entryModeIconColor: AppColor.primary10,
// ),
// textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(foregroundColor: AppColor.primary10)),
// ),
// child: child!,
// );
// },
).then((selectedTime) {
if (selectedTime != null) {
selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute));
@ -274,8 +235,10 @@ class _AppTimerState extends State<AppTimer> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CMRequestUtils.formatTimerDurationCM(_tempPickerTimer!.durationInSecond!.round()).bodyText(context).custom(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
"Start at: ${_tempPickerTimer!.startAt!.toIso8601String().toFirstActionFormat}\nEnd at: ${_tempPickerTimer!.endAt!.toIso8601String().toFirstActionFormat}".tinyFont(context),
CMRequestUtils.formatTimerDurationCM(_tempPickerTimer!.durationInSecond!.round()).bodyText(context).custom(color: AppColor.labelTextStyleColor(context)),
"Start at: ${_tempPickerTimer!.startAt!.toIso8601String().toFirstActionFormat}\nEnd at: ${_tempPickerTimer!.endAt!.toIso8601String().toFirstActionFormat}"
.tinyFont(context)
.custom(color: AppColor.lightTextColor(context)),
],
).expanded,
8.width,
@ -283,7 +246,7 @@ class _AppTimerState extends State<AppTimer> {
deletePickerTime();
})
],
).toShadowContainer(context, padding: 8)
).toShadowContainer(context)
],
8.height,
],
@ -332,7 +295,11 @@ class _AppTimerState extends State<AppTimer> {
},
),
),
if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow,color: AppColor.icon2Color(context),),
if (widget.enabled)
Icon(
_running ? Icons.pause : Icons.play_arrow,
color: AppColor.icon2Color(context),
),
],
),
).onPress(_loading || !widget.enabled ? null : _onPressed),

Loading…
Cancel
Save