| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | import 'package:app_flowy/generated/locale_keys.g.dart';import 'package:app_flowy/plugins/grid/presentation/layout/sizes.dart';import 'package:calendar_view/calendar_view.dart';import 'package:easy_localization/easy_localization.dart';import 'package:flowy_infra/image.dart';import 'package:flowy_infra/size.dart';import 'package:flowy_infra/theme_extension.dart';import 'package:flowy_infra_ui/style_widget/button.dart';import 'package:flowy_infra_ui/style_widget/icon_button.dart';import 'package:flowy_infra_ui/style_widget/text.dart';import 'package:flutter/material.dart';import 'package:styled_widget/styled_widget.dart';import 'layout/sizes.dart';import 'toolbar/calendar_toolbar.dart';class CalendarPage extends StatelessWidget {  const CalendarPage({super.key});  @override  Widget build(BuildContext context) {    return const CalendarContent();  }}class CalendarContent extends StatefulWidget {  const CalendarContent({super.key});  @override  State<CalendarContent> createState() => _CalendarContentState();}class _CalendarContentState extends State<CalendarContent> {  late EventController _eventController;  GlobalKey<MonthViewState>? _calendarState;  @override  void initState() {    _eventController = EventController();    _calendarState = GlobalKey<MonthViewState>();    super.initState();  }  @override  Widget build(BuildContext context) {    return CalendarControllerProvider(      controller: _eventController,      child: Column(        children: [          // const _ToolbarBlocAdaptor(),          _toolbar(),          _buildCalendar(_eventController),        ],      ),    );  }  Widget _toolbar() {    return const CalendarToolbar();  }  Widget _buildCalendar(EventController eventController) {    return Expanded(      child: MonthView(        key: _calendarState,        controller: _eventController,        cellAspectRatio: 1.75,        borderColor: Theme.of(context).dividerColor,        headerBuilder: _headerNavigatorBuilder,        weekDayBuilder: _headerWeekDayBuilder,        cellBuilder: _calendarDayBuilder,      ),    );  }  Widget _headerNavigatorBuilder(DateTime currentMonth) {    return Row(      children: [        FlowyText.medium(          DateFormat('MMMM y', context.locale.toLanguageTag())              .format(currentMonth),        ),        const Spacer(),        FlowyIconButton(          width: CalendarSize.navigatorButtonWidth,          height: CalendarSize.navigatorButtonHeight,          icon: svgWidget('home/arrow_left'),          tooltipText: LocaleKeys.calendar_navigation_previousMonth.tr(),          hoverColor: AFThemeExtension.of(context).lightGreyHover,          onPressed: () => _calendarState?.currentState?.previousPage(),        ),        FlowyTextButton(          LocaleKeys.calendar_navigation_today.tr(),          fillColor: Colors.transparent,          fontWeight: FontWeight.w500,          tooltip: LocaleKeys.calendar_navigation_jumpToday.tr(),          padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 4),          hoverColor: AFThemeExtension.of(context).lightGreyHover,          onPressed: () =>              _calendarState?.currentState?.animateToMonth(DateTime.now()),        ),        FlowyIconButton(          width: CalendarSize.navigatorButtonWidth,          height: CalendarSize.navigatorButtonHeight,          icon: svgWidget('home/arrow_right'),          tooltipText: LocaleKeys.calendar_navigation_nextMonth.tr(),          hoverColor: AFThemeExtension.of(context).lightGreyHover,          onPressed: () => _calendarState?.currentState?.nextPage(),        ),      ],    );  }  Widget _headerWeekDayBuilder(day) {    final symbols = DateFormat.EEEE(context.locale.toLanguageTag()).dateSymbols;    final weekDayString = symbols.WEEKDAYS[day];    return Center(      child: Padding(        padding: CalendarSize.daysOfWeekInsets,        child: FlowyText.medium(          weekDayString,          color: Theme.of(context).hintColor,        ),      ),    );  }  Widget _calendarDayBuilder(date, event, isToday, isInMonth) {    Color dayTextColor = Theme.of(context).colorScheme.onSurface;    Color cellBackgroundColor = Theme.of(context).colorScheme.surface;    String dayString = date.day == 1        ? DateFormat('MMM d', context.locale.toLanguageTag()).format(date)        : date.day.toString();    if (isToday) {      dayTextColor = Theme.of(context).colorScheme.onPrimary;    }    if (!isInMonth) {      dayTextColor = Theme.of(context).disabledColor;      cellBackgroundColor = AFThemeExtension.of(context).lightGreyHover;    }    Widget day = Container(      decoration: BoxDecoration(        color: isToday ? Theme.of(context).colorScheme.primary : null,        borderRadius: Corners.s6Border,      ),      padding: GridSize.typeOptionContentInsets,      child: FlowyText.medium(        dayString,        color: dayTextColor,      ),    );    return Container(      color: cellBackgroundColor,      child: Align(        alignment: Alignment.topRight,        child: day.padding(all: 6.0),      ),    );  }}
 |