109 lines
4.0 KiB
Dart
109 lines
4.0 KiB
Dart
// import 'package:drift/drift.dart' hide Column;
|
|
import 'package:drift/drift.dart' hide Column;
|
|
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:sendtrain/daos/sessions_dao.dart';
|
|
import 'package:sendtrain/database/database.dart';
|
|
import '../widgets/session_card.dart';
|
|
import 'package:collection/collection.dart';
|
|
|
|
class SessionsScreen extends StatefulWidget {
|
|
const SessionsScreen({super.key});
|
|
|
|
@override
|
|
State<SessionsScreen> createState() => _SessionsScreenState();
|
|
}
|
|
|
|
class _SessionsScreenState extends State<SessionsScreen> {
|
|
Widget getSessionCard(session) {
|
|
if (session != null) {
|
|
return SessionCard(session: session);
|
|
} else {
|
|
return Padding(
|
|
padding: EdgeInsets.all(15),
|
|
child: Icon(Icons.do_not_disturb_alt_outlined));
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
SessionsDao dao = SessionsDao(Provider.of<AppDatabase>(context));
|
|
|
|
return StreamBuilder<List<Session>>(
|
|
stream: dao.watch(),
|
|
builder: (context, snapshot) {
|
|
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
|
|
final sessions = snapshot.data!;
|
|
final pending = sessions.where((session) =>
|
|
session.status == SessionStatus.completed ||
|
|
session.status == SessionStatus.missed);
|
|
final upcoming = sessions.firstWhereOrNull(
|
|
(session) => session.status == SessionStatus.pending);
|
|
final current = sessions.firstWhereOrNull(
|
|
(session) => session.status == SessionStatus.started);
|
|
|
|
if (current == null && upcoming != null) {
|
|
dao.createOrUpdate(SessionsCompanion(
|
|
id: Value(upcoming.id),
|
|
title: Value(upcoming.title),
|
|
content: Value(upcoming.content),
|
|
status: Value(SessionStatus.started),
|
|
address: Value(upcoming.address),
|
|
date: Value(upcoming.date)
|
|
));
|
|
}
|
|
|
|
List<Widget> previousSessions = List.generate(pending.length,
|
|
(i) => SessionCard(type: 1, session: pending.elementAt(i)));
|
|
|
|
Widget upcomingSession = getSessionCard(upcoming);
|
|
Widget currentSession = getSessionCard(current);
|
|
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
const Padding(
|
|
padding: EdgeInsets.fromLTRB(15, 5, 0, 0),
|
|
child: Text(
|
|
style: TextStyle(
|
|
fontSize: 25, fontWeight: FontWeight.bold),
|
|
'Current:')),
|
|
currentSession,
|
|
const Padding(
|
|
padding: EdgeInsets.fromLTRB(15, 30, 0, 0),
|
|
child: Text(
|
|
style: TextStyle(
|
|
fontSize: 25, fontWeight: FontWeight.bold),
|
|
'Upcoming:')),
|
|
upcomingSession,
|
|
const Padding(
|
|
padding: EdgeInsets.fromLTRB(15, 30, 0, 0),
|
|
child: Text(
|
|
style: TextStyle(
|
|
fontSize: 25, fontWeight: FontWeight.bold),
|
|
'Previous:')),
|
|
SizedBox(
|
|
width: double.infinity,
|
|
height: 160,
|
|
child: GridView.count(
|
|
padding: const EdgeInsets.fromLTRB(15, 10, 0, 0),
|
|
scrollDirection: Axis.horizontal,
|
|
crossAxisSpacing: 5,
|
|
mainAxisSpacing: 5,
|
|
crossAxisCount: 1,
|
|
children: previousSessions))
|
|
],
|
|
);
|
|
} else {
|
|
return Container(
|
|
alignment: Alignment.center,
|
|
child: SizedBox(
|
|
height: 50.0,
|
|
width: 50.0,
|
|
child: CircularProgressIndicator(),
|
|
));
|
|
}
|
|
});
|
|
}
|
|
}
|