151 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hooks/flutter_hooks.dart';
 | |
| import 'package:gap/gap.dart';
 | |
| import 'package:hooks_riverpod/hooks_riverpod.dart';
 | |
| import 'package:island/pods/event_calendar.dart';
 | |
| import 'package:island/screens/account/profile.dart';
 | |
| import 'package:island/widgets/account/account_nameplate.dart';
 | |
| import 'package:island/widgets/account/event_calendar.dart';
 | |
| import 'package:island/widgets/account/fortune_graph.dart';
 | |
| import 'package:styled_widget/styled_widget.dart';
 | |
| 
 | |
| /// A reusable content widget for event calendar that can be used in screens or sheets
 | |
| /// This widget manages the calendar state and displays the calendar and fortune graph
 | |
| class EventCalendarContent extends HookConsumerWidget {
 | |
|   /// Username to fetch calendar for, null means current user ('me')
 | |
|   final String name;
 | |
| 
 | |
|   /// Whether this is being displayed in a sheet (affects layout)
 | |
|   final bool isSheet;
 | |
| 
 | |
|   const EventCalendarContent({
 | |
|     super.key,
 | |
|     required this.name,
 | |
|     this.isSheet = false,
 | |
|   });
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context, WidgetRef ref) {
 | |
|     // Get the current date
 | |
|     final now = DateTime.now();
 | |
| 
 | |
|     // Create the query for the current month
 | |
|     final query = useState(
 | |
|       EventCalendarQuery(uname: name, year: now.year, month: now.month),
 | |
|     );
 | |
| 
 | |
|     // Watch the event calendar data
 | |
|     final events = ref.watch(eventCalendarProvider(query.value));
 | |
|     final user = ref.watch(accountProvider(name));
 | |
| 
 | |
|     // Track the selected day for synchronizing between widgets
 | |
|     final selectedDay = useState(now);
 | |
| 
 | |
|     void onMonthChanged(int year, int month) {
 | |
|       query.value = EventCalendarQuery(
 | |
|         uname: query.value.uname,
 | |
|         year: year,
 | |
|         month: month,
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     // Function to handle day selection for synchronizing between widgets
 | |
|     void onDaySelected(DateTime day) {
 | |
|       selectedDay.value = day;
 | |
|     }
 | |
| 
 | |
|     if (isSheet) {
 | |
|       // Sheet layout - simplified, no app bar, scrollable content
 | |
|       return SingleChildScrollView(
 | |
|         child: Column(
 | |
|           children: [
 | |
|             // Use the reusable EventCalendarWidget
 | |
|             EventCalendarWidget(
 | |
|               events: events,
 | |
|               initialDate: now,
 | |
|               showEventDetails: true,
 | |
|               onMonthChanged: onMonthChanged,
 | |
|               onDaySelected: onDaySelected,
 | |
|             ),
 | |
| 
 | |
|             // Add the fortune graph widget
 | |
|             const Divider(height: 1),
 | |
|             FortuneGraphWidget(
 | |
|               events: events,
 | |
|               onPointSelected: onDaySelected,
 | |
|             ).padding(horizontal: 8, vertical: 4),
 | |
| 
 | |
|             // Show user profile if viewing someone else's calendar
 | |
|             if (name != 'me' && user.value != null)
 | |
|               AccountNameplate(name: name),
 | |
|             Gap(MediaQuery.of(context).padding.bottom + 16),
 | |
|           ],
 | |
|         ),
 | |
|       );
 | |
|     } else {
 | |
|       // Screen layout - with responsive design
 | |
|       return SingleChildScrollView(
 | |
|         child:
 | |
|             MediaQuery.of(context).size.width > 480
 | |
|                 ? ConstrainedBox(
 | |
|                   constraints: BoxConstraints(maxWidth: 480),
 | |
|                   child: Column(
 | |
|                     children: [
 | |
|                       Card(
 | |
|                         margin: EdgeInsets.only(left: 16, right: 16, top: 16),
 | |
|                         child: Column(
 | |
|                           children: [
 | |
|                             // Use the reusable EventCalendarWidget
 | |
|                             EventCalendarWidget(
 | |
|                               events: events,
 | |
|                               initialDate: now,
 | |
|                               showEventDetails: true,
 | |
|                               onMonthChanged: onMonthChanged,
 | |
|                               onDaySelected: onDaySelected,
 | |
|                             ),
 | |
|                           ],
 | |
|                         ),
 | |
|                       ),
 | |
| 
 | |
|                       // Add the fortune graph widget
 | |
|                       FortuneGraphWidget(
 | |
|                         events: events,
 | |
|                         constrainWidth: true,
 | |
|                         onPointSelected: onDaySelected,
 | |
|                       ),
 | |
| 
 | |
|                       // Show user profile if viewing someone else's calendar
 | |
|                       if (name != 'me' && user.value != null)
 | |
|                         AccountNameplate(name: name),
 | |
|                     ],
 | |
|                   ),
 | |
|                 ).center()
 | |
|                 : Column(
 | |
|                   children: [
 | |
|                     // Use the reusable EventCalendarWidget
 | |
|                     EventCalendarWidget(
 | |
|                       events: events,
 | |
|                       initialDate: now,
 | |
|                       showEventDetails: true,
 | |
|                       onMonthChanged: onMonthChanged,
 | |
|                       onDaySelected: onDaySelected,
 | |
|                     ),
 | |
| 
 | |
|                     // Add the fortune graph widget
 | |
|                     const Divider(height: 1),
 | |
|                     FortuneGraphWidget(
 | |
|                       events: events,
 | |
|                       onPointSelected: onDaySelected,
 | |
|                     ).padding(horizontal: 8, vertical: 4),
 | |
| 
 | |
|                     // Show user profile if viewing someone else's calendar
 | |
|                     if (name != 'me' && user.value != null)
 | |
|                       AccountNameplate(name: name),
 | |
|                     Gap(MediaQuery.of(context).padding.bottom + 16),
 | |
|                   ],
 | |
|                 ),
 | |
|       );
 | |
|     }
 | |
|   }
 | |
| }
 |