Files
reverse_nn/lib/ui/screens/calendar_screen.dart
2024-12-22 02:32:40 +03:00

130 lines
4.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:reverse_nn/application/controllers/calendar_schedule_controller.dart';
import 'package:reverse_nn/application/services/schedule.dart';
import 'package:reverse_nn/ui/components/schedule_item_component.dart';
import 'package:reverse_nn/ui/layouts/application_layout.dart';
import 'package:intl/intl.dart' show DateFormat;
class CalendarScreen extends StatelessWidget {
const CalendarScreen({super.key});
@override
Widget build(BuildContext context) {
final CalendarScheduleController controller = Get.put(CalendarScheduleController());
return ApplicationLayout(
body: RefreshIndicator(
onRefresh: () async { controller.loadSchedule(controller.date.value); },
child: GetBuilder<CalendarScheduleController>(
builder: (controller) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_SelectedDateWidget(
date: controller.date.value,
onSelectDate: controller.goToConcreteDay,
onTapPrev: controller.goToPrevDay,
onTapNext: controller.goToNextDay,
),
if(controller.loading.value) const Padding(
padding: EdgeInsets.all(40),
child: Center(child: CircularProgressIndicator())
),
if(!controller.loading.value && controller.schedule.value != null) Expanded(
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: controller.schedule.value!
.map((item) => ScheduleItemComponent(item: item))
.toList(),
),
),
),
],
),
);
}
),
),
);
}
}
class _SelectedDateWidget extends StatelessWidget {
final DateTime date;
final void Function(DateTime)? onSelectDate;
final void Function()? onTapPrev;
final void Function()? onTapNext;
const _SelectedDateWidget({super.key, required this.date, this.onSelectDate, this.onTapPrev, this.onTapNext});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 10),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.primaryContainer,
borderRadius: BorderRadius.circular(10),
),
alignment: Alignment.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: () { onTapPrev?.call(); },
child: const SizedBox(
width: 40,
child: Center(child: Icon(Icons.arrow_left, size: 40)),
),
),
Expanded(
child: GestureDetector(
onTap: () {_openCalendar(context); },
child: Center(
child: Text(
formatDate(date),
style: Theme.of(context).textTheme.displaySmall,
),
),
),
),
GestureDetector(
onTap: () { onTapNext?.call(); },
child: const SizedBox(
width: 40,
child: Center(child: Icon(Icons.arrow_right, size: 40)),
),
),
]
),
);
}
String formatDate(DateTime date) {
return DateFormat('dd.MM.yyyy').format(date);
}
void _openCalendar(BuildContext context) async {
DateTime now = DateTime.now();
DateTime? picked = await showDatePicker(
context: context,
initialDate: now,
firstDate: DateTime(2024, 8, 1, 12),
lastDate: DateTime(2025, 12, 31, 12),
locale: const Locale('ru')
);
if(picked != null) { onSelectDate?.call(picked); }
}
}