130 lines
4.3 KiB
Dart
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); }
|
|
}
|
|
}
|
|
|
|
|