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),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
}
|