From b273979ac0971bc3b70a114d5646ebeb4d6d5cc5 Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Wed, 27 Nov 2024 00:32:01 -0500 Subject: [PATCH] refactor and new activity view --- lib/screens/activities_screen.dart | 29 +++++++- lib/widgets/activity_card.dart | 70 +++++++++--------- lib/widgets/activity_view.dart | 34 +++++++++ lib/widgets/session_card.dart | 4 +- lib/widgets/session_view.dart | 115 +++++------------------------ 5 files changed, 119 insertions(+), 133 deletions(-) create mode 100644 lib/widgets/activity_view.dart diff --git a/lib/screens/activities_screen.dart b/lib/screens/activities_screen.dart index 71e4adf..2beb613 100644 --- a/lib/screens/activities_screen.dart +++ b/lib/screens/activities_screen.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:sendtrain/classes/activity_action.dart'; +import 'package:sendtrain/models/activity_model.dart'; import '../widgets/activities_header.dart'; import '../widgets/activity_card.dart'; @@ -11,9 +13,34 @@ class ActivitiesScreen extends StatefulWidget { } class _ActivitiesScreenState extends State { + + final data = ActivityModel( + id: 1, + categories: ['power'], + description: 'description', + title: 'activity', + type: 'fundamentals', + actions: List.generate( + 10, + (i) => ActivityAction( + id: 1, + title: 'test action', + description: 'test description', + activityActionSet: Set( + type: 'drop_set', + total: 3, + rest: 3000, + reps: Reps( + type: 'count', + tempo: [2, 3, 5], + amounts: [5, 3, 2], + weights: [50, 70, 80], + rest: 200))), + )); + @override Widget build(BuildContext context) { - List activities = List.generate(10, (i) => ActivityCard()); + List activities = List.generate(10, (i) => ActivityCard(activity: data)); return Padding( padding: const EdgeInsets.fromLTRB(10, 15, 10, 0), diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index f6b3dc6..2e8fc21 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -1,46 +1,48 @@ import 'package:flutter/material.dart'; -import 'package:sendtrain/classes/activity_action.dart'; import 'package:sendtrain/models/activity_model.dart'; +import 'package:sendtrain/widgets/activity_view.dart'; class ActivityCard extends StatelessWidget { - ActivityCard({super.key}); + const ActivityCard({super.key, required this.activity}); - final data = ActivityModel( - id: 1, - categories: ['power'], - description: 'description', - title: 'activity', - type: 'fundamentals', - actions: List.generate( - 10, - (i) => ActivityAction( - id: 1, - title: 'test action', - description:'test description', - activityActionSet: Set( - type: 'drop_set', - total: 3, - rest: 3000, - reps: Reps( - type: 'count', - tempo: [2,3,5], - amounts: [5,3,2], - weights: [50,70,80], - rest: 200 - ) - ) - ),)); + final ActivityModel activity; @override Widget build(BuildContext context) { return Card( - clipBehavior: Clip.hardEdge, - child: Align( - alignment: Alignment.center, - child: Text( - data.title, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - ), + color: const Color(0xff3A5FB6), + child: ListTile( + // dense: true, + focusColor: const Color(0xff3A5FB6), + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.elliptical(10, 10))), + onTap: () => showGeneralDialog( + barrierColor: Colors.black.withOpacity(0.5), + transitionDuration: const Duration(milliseconds: 220), + transitionBuilder: (BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child) { + Animation custom = Tween( + begin: const Offset(0.0, 1.0), + end: const Offset(0.0, 0.0)) + .animate(animation); + return SlideTransition( + position: custom, + child: Dialog.fullscreen( + child: ActivityView(activity: activity))); + }, + barrierDismissible: true, + barrierLabel: '', + context: context, + pageBuilder: (context, animation1, animation2) { + return Container(); + }), + enableFeedback: true, + title: Text(maxLines: 1, activity.title), + subtitle: Padding( + padding: const EdgeInsets.only(bottom: 3), + child: Text(maxLines: 2, activity.description)), )); } } diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart new file mode 100644 index 0000000..68197ce --- /dev/null +++ b/lib/widgets/activity_view.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; +import 'package:sendtrain/models/activity_model.dart'; + +class ActivityView extends StatelessWidget { + const ActivityView({super.key, required this.activity}); + + final ActivityModel activity; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + AppBar( + centerTitle: true, + title: Text(activity.title, style: const TextStyle(fontSize: 25)), + ), + Padding( + padding: + const EdgeInsets.only(top: 25, bottom: 10, left: 15, right: 15), + child: Text( + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20), + activity.description)), + const Padding( + padding: EdgeInsets.only(top: 25, bottom: 10), + child: Text( + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), + 'Actions:')), + ], + ); + } +} diff --git a/lib/widgets/session_card.dart b/lib/widgets/session_card.dart index 4c756d1..f358334 100644 --- a/lib/widgets/session_card.dart +++ b/lib/widgets/session_card.dart @@ -19,7 +19,7 @@ class SessionCard extends StatelessWidget { Color color = (state == 0) ? const Color(0xff3A5FB6) - : ThemeData.dark(useMaterial3: true).colorScheme.surface; + : ThemeData.dark(useMaterial3: true).colorScheme.surfaceBright; // place holder until we can retrieve real data final data = SessionModel( @@ -35,7 +35,7 @@ class SessionCard extends StatelessWidget { type: 'fundamental', categories: ['strength', 'power'], description: - "Campus board session, focussing on explosiveness and contact strength.", + "Campus board session, focusing on explosiveness and contact strength.", actions: [ ActivityAction( id: 1, diff --git a/lib/widgets/session_view.dart b/lib/widgets/session_view.dart index 3caf4a8..4eb74d0 100644 --- a/lib/widgets/session_view.dart +++ b/lib/widgets/session_view.dart @@ -5,6 +5,7 @@ import 'package:intl/date_symbol_data_local.dart'; import 'package:sendtrain/classes/media.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/session_model.dart'; +import 'package:sendtrain/widgets/activity_card.dart'; import 'package:sendtrain/widgets/media_card.dart'; class SessionView extends StatelessWidget { @@ -18,17 +19,18 @@ class SessionView extends StatelessWidget { final DateFormat dateFormat = DateFormat('yyyy-MM-dd'); return Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ AppBar( centerTitle: true, title: Text('Session @ ${dateFormat.format(data.date)}', - style: const TextStyle(fontSize: 15)), + style: const TextStyle(fontSize: 25)), ), Padding( - padding: const EdgeInsets.only(left: 20, right: 20, bottom: 10), + padding: + const EdgeInsets.only(left: 20, right: 20, top: 15, bottom: 10), child: Text( + textAlign: TextAlign.left, maxLines: 1, style: const TextStyle(fontSize: 25, fontWeight: FontWeight.bold), @@ -36,13 +38,19 @@ class SessionView extends StatelessWidget { SessionViewAchievements(achievements: data.achievements), Padding( padding: const EdgeInsets.only(left: 15, right: 15), - child: Text(textAlign: TextAlign.center, data.content)), + child: Text(textAlign: TextAlign.left, data.content)), + const Padding( + padding: EdgeInsets.fromLTRB(15, 30, 0, 10), + child: Text( + textAlign: TextAlign.left, + style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + 'Media:')), SessionViewMedia(media: data.media), const Padding( - padding: EdgeInsets.only(top: 25, bottom: 10), + padding: EdgeInsets.fromLTRB(15, 30, 0, 10), child: Text( - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - 'Activities:')), + style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + 'Activites:')), SessionViewActivities(activities: data.activities), // TextButton( // onPressed: () { @@ -68,52 +76,7 @@ class SessionViewActivities extends StatelessWidget { padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), itemCount: activities?.length, itemBuilder: (BuildContext context, int index) { - return Card( - color: const Color(0xff3A5FB6), - child: ListTile( - // dense: true, - focusColor: const Color(0xff3A5FB6), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.elliptical(10, 10))), - onTap: () => showGeneralDialog( - barrierColor: Colors.black.withOpacity(0.5), - transitionDuration: const Duration(milliseconds: 220), - transitionBuilder: (BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child) { - Animation custom = Tween( - begin: const Offset(0.0, 1.0), - end: const Offset(0.0, 0.0)) - .animate(animation); - return SlideTransition( - position: custom, - child: Dialog.fullscreen( - child: Flex( - direction: Axis.vertical, - mainAxisSize: MainAxisSize.min, - children: [ - AppBar( - centerTitle: true, - title: const Text('test activity', - style: TextStyle(fontSize: 15)), - ), - ], - ))); - }, - barrierDismissible: true, - barrierLabel: '', - context: context, - pageBuilder: (context, animation1, animation2) { - return Container(); - }), - enableFeedback: true, - title: Text(maxLines: 1, '${activities?[index].title}'), - subtitle: Padding( - padding: const EdgeInsets.only(bottom: 3), - child: - Text(maxLines: 2, '${activities?[index].description}')), - )); + return ActivityCard(activity: activities![index]); }, )); } @@ -143,22 +106,8 @@ class SessionViewAchievements extends StatelessWidget { visualDensity: VisualDensity.compact, avatar: const Icon(Icons.check_circle_outline), label: Text(maxLines: 1, '${achievements?[index]}'), - onPressed: () { - // setState(() { - // favorite = !favorite; - // }); - }, + onPressed: () {}, )); - // return Card( - // child: ListTile( - // // dense: true, - // focusColor: Colors.deepPurple, - // shape: const RoundedRectangleBorder( - // borderRadius: BorderRadius.all(Radius.circular(10))), - // onTap: () {}, - // enableFeedback: true, - // title: Text(maxLines: 1, '${achievements?[index]}'), - // )); }, ))), ], @@ -178,16 +127,11 @@ class SessionViewMedia extends StatelessWidget { return Column( children: [ - const Padding( - padding: EdgeInsets.only(top: 25), - child: Text( - style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), - 'Media:')), SizedBox( width: double.infinity, height: 100, child: GridView.count( - padding: const EdgeInsets.fromLTRB(15, 10, 0, 0), + padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), scrollDirection: Axis.horizontal, crossAxisSpacing: 5, mainAxisSpacing: 5, @@ -197,24 +141,3 @@ class SessionViewMedia extends StatelessWidget { ); } } - -// SizedBox( -// height: 100, -// width: double.infinity, -// child: ListView.builder( -// // scrollDirection: Axis.horizontal, -// padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), -// itemCount: media?.length, -// itemBuilder: (BuildContext context, int index) { -// return Card( -// child: ListTile( -// dense: true, -// focusColor: Colors.deepPurple, -// shape: const RoundedRectangleBorder( -// borderRadius: BorderRadius.all(Radius.circular(10))), -// onTap: () {}, -// enableFeedback: true, -// title: const Text(maxLines: 1, 'test'), -// )); -// })) -