diff --git a/lib/widgets/activity_action_view.dart b/lib/widgets/activity_action_view.dart index f2da55a..0d77d50 100644 --- a/lib/widgets/activity_action_view.dart +++ b/lib/widgets/activity_action_view.dart @@ -1,10 +1,13 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:sendtrain/classes/activity_action.dart'; +import 'package:sendtrain/widgets/action_card.dart'; class ActivityActionView extends StatefulWidget { - const ActivityActionView({super.key, required this.action}); + ActivityActionView({super.key, required this.action}); - final ActivityAction action; + ActivityAction action; @override State createState() => _ActivityActionViewState(); @@ -15,28 +18,42 @@ class _ActivityActionViewState extends State { Widget build(BuildContext context) { return Expanded( child: ListView.builder( - // shrinkWrap: true, padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), itemCount: widget.action.activityActionSet.total, itemBuilder: (BuildContext context, int index) { - return Text( - widget.action.description - ); + String title = widget.action.title; + Set actionSet = widget.action.activityActionSet; + Reps setReps = widget.action.activityActionSet.reps; + List contents = []; + + // contents.add(Card(child: Text('Set ${index + 1}'))); + + for (int repCount = 0; repCount < setReps.amounts[index]; repCount++) { + contents.add(Card( + child: Padding( + padding: const EdgeInsets.fromLTRB(15, 15, 15, 15), + child: Column( + children: [ + Row(children: [Text('Exercise: ${widget.action.title}')]), + Row(children: [Text('Type: ${actionSet.type}')]), + Row(children: [ + Text( + 'Set: ${index + 1} / ${widget.action.activityActionSet.total}') + ]), + Row(children: [ + Text('Rep: ${repCount + 1} / ${setReps.amounts[index]}') + ]), + Row(children: [Text('Tempo: ${setReps.tempo[index]}')]), + Row(children: [ + Text('Weight: ${setReps.weights[index]}') + ]), + Row(children: [Text('Rest: ${setReps.rest}')]) + ], + )))); + } + + return Column(children: contents); }, )); - // return Column( - // children: [ - // Expanded( - // child: ListView( - // children: [ - // Text( - // textAlign: TextAlign.left, - // style: const TextStyle(fontSize: 15), - // widget.action.description) - // ], - // ), - // ), - // ], - // ); } } diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index 2e8fc21..91c8e74 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:sendtrain/classes/media.dart'; import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/widgets/activity_view.dart'; +import 'package:sendtrain/widgets/media_card.dart'; class ActivityCard extends StatelessWidget { const ActivityCard({super.key, required this.activity}); @@ -10,12 +12,10 @@ class ActivityCard extends StatelessWidget { @override Widget build(BuildContext context) { return Card( - color: const Color(0xff3A5FB6), - child: ListTile( - // dense: true, - focusColor: const Color(0xff3A5FB6), - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.elliptical(10, 10))), + color: const Color(0xff3A5FB6), + clipBehavior: Clip.hardEdge, + child: InkWell( + splashColor: Colors.deepPurple, onTap: () => showGeneralDialog( barrierColor: Colors.black.withOpacity(0.5), transitionDuration: const Duration(milliseconds: 220), @@ -38,11 +38,40 @@ class ActivityCard extends StatelessWidget { 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)), - )); + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: Container( + width: 60, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: findMediaByType( + activity.actions[0].media, 'image')), + // color: Colors.blue, + borderRadius: + const BorderRadius.all(Radius.elliptical(10, 10)), + ), + )), + title: Text(maxLines: 1, activity.title), + subtitle: Text(maxLines: 2, activity.description), + ), + ], + )), + ); + } + + ImageProvider findMediaByType(List? media, String type) { + var found = media!.where((m) => m.type == 'image'); + + if (found.isNotEmpty) { + return NetworkImage(found.first.reference); + } else { + // Element is not found + return const AssetImage('assets/images/placeholder.jpg'); + } } } diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart index dffecb4..28f4f7a 100644 --- a/lib/widgets/activity_view.dart +++ b/lib/widgets/activity_view.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:sendtrain/classes/activity_action.dart'; import 'package:sendtrain/classes/media.dart'; @@ -5,31 +7,52 @@ import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/widgets/activity_action_view.dart'; import 'package:sendtrain/widgets/media_card.dart'; -class ActivityView extends StatelessWidget { - const ActivityView({super.key, required this.activity}); +class ActivityView extends StatefulWidget { + ActivityView({super.key, required this.activity}); - final ActivityModel activity; + ActivityModel activity; + + @override + State createState() => _ActivityViewState(); +} + +class _ActivityViewState extends State { + Timer? _periodicTimer; + int _tickCount = 0; + int currentSet = 0; + int currentRep = 0; + + void _startPeriodicTimer() { + const oneSecond = Duration(seconds: 1); + _periodicTimer = Timer.periodic(oneSecond, (Timer timer) { + setState(() { + _tickCount++; + }); + }); + } @override Widget build(BuildContext context) { + ActivityModel activity = widget.activity; + var content = [ AppBar( + // surfaceTintColor: ThemeData.dark(useMaterial3: true).colorScheme.primary, + // backgroundColor: ThemeData.dark(useMaterial3: true).colorScheme.primaryContainer, centerTitle: true, - title: const Text('Activity', - style: TextStyle(fontSize: 15)), + title: const Text('Activity', style: TextStyle(fontSize: 15)), ), Padding( padding: const EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 10), child: Text( maxLines: 1, - style: - const TextStyle(fontSize: 25, fontWeight: FontWeight.bold), + style: const TextStyle(fontSize: 25, fontWeight: FontWeight.bold), activity.title)), ActivityViewCategories(categories: activity.categories), Padding( padding: - const EdgeInsets.only(top: 0, bottom: 10, left: 15, right: 15), + const EdgeInsets.only(top: 0, bottom: 20, left: 15, right: 15), child: Text( textAlign: TextAlign.left, style: const TextStyle(fontSize: 15), @@ -43,14 +66,45 @@ class ActivityView extends StatelessWidget { 'Actions:')) ]; - for (var action in activity.actions){ + for (var action in activity.actions) { content.add(ActivityActionView(action: action)); } + // add bottom bar to manage activity + content.add(Container( + height: MediaQuery.sizeOf(context).height * .07, + color: ThemeData.dark(useMaterial3: true).colorScheme.primaryContainer, + child: Row(children: [ + Expanded( + flex: 1, + child: Flex(direction: Axis.horizontal, children: [ + IconButton( + iconSize: 30, + icon: const Icon(Icons.play_arrow_rounded), + onPressed: _startPeriodicTimer), + IconButton( + iconSize: 30, + icon: const Icon(Icons.skip_next_rounded), + onPressed: () {}) + ])), + Expanded( + flex: 1, + child: Text( + style: const TextStyle(fontSize: 25), + textAlign: TextAlign.center, + '$_tickCount'), + ), + const Expanded( + flex: 1, + child: Padding( + padding: EdgeInsets.only(right: 10), + child: Text( + style: TextStyle(fontSize: 15), + textAlign: TextAlign.right, + 'Set: 1/3 \nRep: 1/5'))), + ]))); return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: content - ); + crossAxisAlignment: CrossAxisAlignment.start, children: content); } } @@ -103,8 +157,8 @@ class ActivityViewMedia extends StatelessWidget { } } - List mediaCards = List.generate(media.length, - (i) => MediaCard(media: media[i])); + List mediaCards = + List.generate(media.length, (i) => MediaCard(media: media[i])); return Column( children: [ diff --git a/lib/widgets/session_card.dart b/lib/widgets/session_card.dart index 927eb9f..ba2eb46 100644 --- a/lib/widgets/session_card.dart +++ b/lib/widgets/session_card.dart @@ -172,7 +172,7 @@ class SessionCard extends StatelessWidget { margin: const EdgeInsets.fromLTRB(15, 15, 15, 0), clipBehavior: Clip.hardEdge, child: InkWell( - // splashColor: Colors.deepPurple, + splashColor: Colors.deepPurple, onTap: () => showGeneralDialog( barrierColor: Colors.black.withOpacity(0.5), transitionDuration: const Duration(milliseconds: 220), @@ -231,7 +231,7 @@ class SessionCard extends StatelessWidget { color: const Color.fromARGB(125, 0, 0, 0), child: InkWell( // overlayColor: MaterialStateColor(Colors.deepPurple as int), - // splashColor: Colors.deepPurple, + splashColor: Colors.deepPurple, borderRadius: const BorderRadius.all(Radius.elliptical(10, 10)), onTap: () => showGeneralDialog( // barrierColor: Colors.black.withOpacity(0.5),