From 604b099010bf3d03710dcb02801d8296af93cae1 Mon Sep 17 00:00:00 2001 From: Joshua Burman Date: Tue, 24 Dec 2024 16:58:50 -0500 Subject: [PATCH] converted to activity from activity model finally --- lib/models/activity_timer_model.dart | 12 +- lib/widgets/activity_action_view.dart | 13 +- lib/widgets/activity_card.dart | 18 +-- lib/widgets/activity_view.dart | 9 +- lib/widgets/session_card.dart | 157 +---------------------- lib/widgets/session_view.dart | 6 +- lib/widgets/session_view_activities.dart | 13 +- 7 files changed, 30 insertions(+), 198 deletions(-) diff --git a/lib/models/activity_timer_model.dart b/lib/models/activity_timer_model.dart index 6f9d7a9..3baaf88 100644 --- a/lib/models/activity_timer_model.dart +++ b/lib/models/activity_timer_model.dart @@ -1,13 +1,12 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:sendtrain/database/database.dart'; -import 'package:sendtrain/models/activity_model.dart'; class ActivityTimerModel with ChangeNotifier { int _actionCounter = 0; - ActivityModel? _activityModel; Activity? _activity; List _sets = []; List _actions = []; @@ -23,7 +22,6 @@ class ActivityTimerModel with ChangeNotifier { dynamic get currentAction => currentSet[_currentActionNum]; int get currentSetNum => _currentSetNum; dynamic get currentSet => _sets[_currentSetNum]; - ActivityModel? get activityModel => _activityModel; Activity? get activity => _activity; List get sets => _sets; Timer? get periodicTimer => _periodicTimer; @@ -31,14 +29,14 @@ class ActivityTimerModel with ChangeNotifier { double get progress => _progress; int get totalTime => _totalTime; - void setup(ActivityModel activityModel, Activity activity, List actions) { - if (_activityModel == null || activityModel.id != _activityModel?.id) { + void setup(Activity activity, List actions) { + if (_activity == null || activity.id != _activity?.id) { _periodicTimer?.cancel(); _progress = 0; _isc = null; - _activityModel = activityModel; _activity = activity; - _sets = activityModel.actions[0].items(); + // only one action for now + _sets = json.decode(actions[0].set); _actions = actions; _currentActionNum = 0; _currentSetNum = 0; diff --git a/lib/widgets/activity_action_view.dart b/lib/widgets/activity_action_view.dart index ca68591..73d965d 100644 --- a/lib/widgets/activity_action_view.dart +++ b/lib/widgets/activity_action_view.dart @@ -1,13 +1,14 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; -import 'package:sendtrain/classes/activity_action.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; class ActivityActionView extends StatefulWidget { - const ActivityActionView({super.key, required this.action}); - final ActivityAction action; + const ActivityActionView({super.key, required this.actions}); + final List actions; @override State createState() => ActivityActionViewState(); @@ -26,7 +27,7 @@ class ActivityActionViewState extends State { Widget build(BuildContext context) { ActivityTimerModel atm = Provider.of(context, listen: true); - List>> sets = atm.activityModel!.actions[0].items(); + List sets = json.decode(widget.actions[0].set); // we need to set the scroll controller // so we can update the selected item position @@ -35,14 +36,14 @@ class ActivityActionViewState extends State { return Expanded( child: ScrollablePositionedList.builder( padding: const EdgeInsets.fromLTRB(10, 0, 10, 20), - itemCount: widget.action.activityActionSet.total, + itemCount: sets.length, itemScrollController: itemScrollController, scrollOffsetController: scrollOffsetController, itemPositionsListener: itemPositionsListener, scrollOffsetListener: scrollOffsetListener, itemBuilder: (BuildContext context, int setNum) { List content = []; - List> set = sets[setNum]; + List set = sets[setNum]; for (int actionNum = 0; actionNum < set.length; actionNum++) { Map setItem = set[actionNum]; diff --git a/lib/widgets/activity_card.dart b/lib/widgets/activity_card.dart index 839b152..e94d00c 100644 --- a/lib/widgets/activity_card.dart +++ b/lib/widgets/activity_card.dart @@ -3,15 +3,13 @@ import 'package:provider/provider.dart'; import 'package:sendtrain/daos/media_items_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_view.dart'; class ActivityCard extends StatefulWidget { - final ActivityModel activity; - final Activity data; + final Activity activity; - const ActivityCard({super.key, required this.activity, required this.data}); + const ActivityCard({super.key, required this.activity}); @override State createState() => ActivityCardState(); @@ -33,7 +31,7 @@ class ActivityCardState extends State { return FutureBuilder>( future: MediaItemsDao(Provider.of(context)) - .fromActivity(widget.data), + .fromActivity(widget.activity), builder: (context, snapshot) { if (snapshot.hasData) { List mediaItems = snapshot.data!; @@ -58,9 +56,7 @@ class ActivityCardState extends State { return SlideTransition( position: custom, child: Dialog.fullscreen( - child: ActivityView( - activityModel: widget.activity, - activity: widget.data))); + child: ActivityView(activity: widget.activity))); }, barrierDismissible: true, barrierLabel: '', @@ -93,13 +89,13 @@ class ActivityCardState extends State { if (atm.activity?.id == widget.activity.id) { return Text( maxLines: 1, - "${widget.data.title.toTitleCase()} (${formattedTime(atm.totalTime)})"); + "${widget.activity.title.toTitleCase()} (${formattedTime(atm.totalTime)})"); } else { - return Text(maxLines: 1, widget.data.title.toTitleCase()); + return Text(maxLines: 1, widget.activity.title.toTitleCase()); } }, ), - subtitle: Text(maxLines: 2, widget.data.description), + subtitle: Text(maxLines: 2, widget.activity.description), trailing: IconButton( visualDensity: VisualDensity.compact, icon: Icon(Icons.close_rounded), diff --git a/lib/widgets/activity_view.dart b/lib/widgets/activity_view.dart index f00263a..d430a35 100644 --- a/lib/widgets/activity_view.dart +++ b/lib/widgets/activity_view.dart @@ -4,7 +4,6 @@ import 'package:provider/provider.dart'; import 'package:sendtrain/daos/actions_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/models/activity_timer_model.dart'; import 'package:sendtrain/widgets/activity_action_view.dart'; import 'package:sendtrain/widgets/activity_view_categories.dart'; @@ -13,8 +12,7 @@ import 'package:sendtrain/widgets/activity_view_types.dart'; class ActivityView extends StatefulWidget { const ActivityView( - {super.key, required this.activityModel, required this.activity}); - final ActivityModel activityModel; + {super.key, required this.activity}); final Activity activity; @override @@ -24,7 +22,6 @@ class ActivityView extends StatefulWidget { class _ActivityViewState extends State { @override Widget build(BuildContext context) { - final ActivityModel activityModel = widget.activityModel; final Activity activity = widget.activity; ActivityTimerModel atm = Provider.of(context, listen: false); @@ -35,7 +32,7 @@ class _ActivityViewState extends State { builder: (context, snapshot) { if (snapshot.hasData) { List actions = snapshot.data!; - atm.setup(activityModel, activity, actions); + atm.setup(activity, actions); return Scaffold( floatingActionButtonLocation: ExpandableFab.location, @@ -183,7 +180,7 @@ class _ActivityViewState extends State { semanticsLabel: 'Activity Progress', ); })), - ActivityActionView(action: activityModel.actions[0]), + ActivityActionView(actions: actions), ])); } else { return Container( diff --git a/lib/widgets/session_card.dart b/lib/widgets/session_card.dart index 0a0bbe7..297efd9 100644 --- a/lib/widgets/session_card.dart +++ b/lib/widgets/session_card.dart @@ -1,12 +1,8 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:intl/date_symbol_data_local.dart'; -import 'package:sendtrain/classes/activity_action.dart'; -import 'package:sendtrain/classes/media.dart'; import 'package:sendtrain/database/database.dart' hide ActivityAction; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/activity_model.dart'; -import 'package:sendtrain/models/session_model.dart'; import 'package:sendtrain/widgets/session_view.dart'; class SessionCard extends StatelessWidget { @@ -23,155 +19,6 @@ class SessionCard extends StatelessWidget { ? Theme.of(context).colorScheme.primaryContainer : Theme.of(context).colorScheme.surfaceContainerLow; - // place holder until we can retrieve real data - final data = SessionModel( - id: 1, - title: "Projecting @ Climbers Rock", - content: - "Beta pully beta beta pinch one arm crimpy. Futuristic pinch, dyno dynamic drop knee climb. Climbing ondra slopey onsight beta ondra power endurance.", - date: DateTime.now(), - activities: [ - ActivityModel( - id: 1, - title: 'Campus Board', - type: 'fundamental', - categories: ['strength', 'power'], - description: - "Campus board session, focusing on explosiveness and contact strength.", - actions: [ - ActivityAction( - id: 1, - title: '1, 3, 5', - description: - 'Move between the first, third, and fifth rungs, alternating hands. Rest and alternate sides, to start', - media: [ - Media( - id: 1, - reference: - 'https://www.climbing.com/wp-content/uploads/2022/06/campus-board-e1655470701154.jpeg', - type: 'image', - description: 'Campus board movement'), - Media( - id: 1, - reference: '7ACyeOP-Hxo', - type: 'youtube', - description: 'How to campus board') - ], - activityActionSet: Set( - type: 'drop_set', - total: 3, - rest: 300000, - reps: Reps( - type: 'repititions', - tempo: [0], - amounts: [1, 1, 1], - weights: [0], - rest: 20000))), - ], - resources: ['https://www.youtube.com/watch?v=bLz0xp1PEm4']), - ActivityModel( - id: 2, - title: 'Projecting', - type: 'fundamental', - categories: ['technique', 'conditioning'], - description: - "Session focused on attempting a climb at or beyond your perceived limit.", - actions: [ - ActivityAction( - id: 1, - title: 'Attempt Climb', - description: - 'Attempt your selected climb, if you fall off early in the climb, attempt again. 1 repitition equals roughly doing all the moves, not necessarily in 1 attempt.', - media: [ - Media( - id: 1, - reference: - 'https://www.climbing.com/wp-content/uploads/2022/07/Fixed-44.jpg', - type: 'image', - description: 'Projecting a climb'), - Media( - id: 1, - reference: 'BgheYcxhrsw', - type: 'youtube', - description: 'How to project climbs') - ], - activityActionSet: Set( - type: 'standard', - total: 10, - rest: 300000, - reps: Reps( - type: 'repititions', - tempo: [0], - amounts: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - weights: [0], - rest: 0))), - ], - resources: ['https://www.youtube.com/watch?v=dyAvbUvY_PU']), - ActivityModel( - id: 3, - title: 'Long Block Pulls', - type: 'Hypertrophy', - categories: ['Strength', 'Power'], - description: - "Block pull on a edge of a specific size and time to induce a hypertrophic effect on the formarms.", - actions: [ - ActivityAction( - id: 1, - title: 'Long Pulls', - description: - 'Select your desired weight to pull, add it to the block. You should aim for an effort level of 8-9 when reaching the end of the set time, going to failure will result in significantly extended recovery time.', - media: [ - Media( - id: 1, - reference: - 'https://trailandcrag.com/sites/default/files/inline-images/05-min_3.jpg', - type: 'image', - description: 'Block pull example'), - Media( - id: 1, - reference: 'sZVAEy9UmoY', - type: 'youtube', - description: - 'Principals of Grip gains, and related protocols') - ], - activityActionSet: Set( - type: 'alternating', - total: 5, - rest: 5000, - reps: Reps( - type: 'seconds', - tempo: [0], - amounts: [5, 5, 5, 5, 5], - weights: [80, 80, 80, 80, 80], - rest: 5000))), - ], - resources: ['https://www.youtube.com/watch?v=dyAvbUvY_PU']), - ], - achievements: [ - 'got 1 3 5 first time!', - 'no pain in elbow', - 'life is pain', - 'new PR for pullups' - ], - media: [ - Media( - id: 1, - reference: 'TwS8ycTY5cc', - type: 'youtube', - description: 'Attempting crux move'), - Media( - id: 1, - reference: - 'https://static.wixstatic.com/media/c83481_1dd473ad49524ae5a95d993ba10e0a50~mv2.jpg/v1/fill/w_640,h_426,al_c,q_80,usm_0.66_1.00_0.01,enc_auto/c83481_1dd473ad49524ae5a95d993ba10e0a50~mv2.jpg', - type: 'image', - description: 'Struggling on deadpoints'), - Media( - id: 1, - reference: 'TwS8ycTY5cc', - type: 'youtube', - description: 'Attempting crux move') - ]); - if (type == 0) { return Card( color: color, @@ -192,7 +39,7 @@ class SessionCard extends StatelessWidget { .animate(animation); return SlideTransition( position: custom, - child: Dialog.fullscreen(child: SessionView(data: data, session: session))); + child: Dialog.fullscreen(child: SessionView(session: session))); }, barrierDismissible: true, barrierLabel: '', @@ -277,7 +124,7 @@ class SessionCard extends StatelessWidget { return SlideTransition( position: custom, child: - Dialog.fullscreen(child: SessionView(data: data, session: session))); + Dialog.fullscreen(child: SessionView(session: session))); }, barrierDismissible: true, barrierLabel: '', diff --git a/lib/widgets/session_view.dart b/lib/widgets/session_view.dart index 1f8b407..b71e327 100644 --- a/lib/widgets/session_view.dart +++ b/lib/widgets/session_view.dart @@ -7,15 +7,13 @@ import 'package:sendtrain/daos/activities_dao.dart'; import 'package:sendtrain/database/database.dart'; import 'package:sendtrain/extensions/string_extensions.dart'; -import 'package:sendtrain/models/session_model.dart'; import 'package:sendtrain/widgets/session_view_achievements.dart'; import 'package:sendtrain/widgets/session_view_activities.dart'; import 'package:sendtrain/widgets/session_view_media.dart'; class SessionView extends StatelessWidget { - const SessionView({super.key, required this.data, required this.session}); + const SessionView({super.key, required this.session}); - final SessionModel data; final Session session; @override @@ -91,7 +89,7 @@ class SessionView extends StatelessWidget { fontSize: 20, fontWeight: FontWeight.bold), 'Activites:')), SessionViewActivities( - activities: data.activities, data: activities), + activities: activities), ], )); } else { diff --git a/lib/widgets/session_view_activities.dart b/lib/widgets/session_view_activities.dart index 57c12da..48a2607 100644 --- a/lib/widgets/session_view_activities.dart +++ b/lib/widgets/session_view_activities.dart @@ -1,15 +1,11 @@ -import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:sendtrain/database/database.dart'; -import 'package:sendtrain/models/activity_model.dart'; import 'package:sendtrain/widgets/activity_card.dart'; class SessionViewActivities extends StatelessWidget { - const SessionViewActivities({super.key, this.activities, required this.data}); + const SessionViewActivities({super.key, required this.activities }); - final List? activities; - final List data; + final List activities; @override Widget build(BuildContext context) { @@ -17,11 +13,10 @@ class SessionViewActivities extends StatelessWidget { child: ListView.builder( // shrinkWrap: true, padding: const EdgeInsets.fromLTRB(10, 0, 10, 0), - itemCount: data.length, + itemCount: activities.length, itemBuilder: (BuildContext context, int index) { return ActivityCard( - activity: activities![Random().nextInt(activities!.length)], - data: data[index]); + activity: activities[index]); }, )); }