converted to activity from activity model finally
This commit is contained in:
parent
c6030f8ac5
commit
604b099010
@ -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;
|
||||
|
@ -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<ActivityActionView> createState() => ActivityActionViewState();
|
||||
@ -26,7 +27,7 @@ class ActivityActionViewState extends State<ActivityActionView> {
|
||||
Widget build(BuildContext context) {
|
||||
ActivityTimerModel atm =
|
||||
Provider.of<ActivityTimerModel>(context, listen: true);
|
||||
List<List<Map<String, dynamic>>> 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<ActivityActionView> {
|
||||
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<GestureDetector> content = [];
|
||||
List<Map<String, dynamic>> set = sets[setNum];
|
||||
List set = sets[setNum];
|
||||
|
||||
for (int actionNum = 0; actionNum < set.length; actionNum++) {
|
||||
Map<String, dynamic> setItem = set[actionNum];
|
||||
|
@ -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<ActivityCard> createState() => ActivityCardState();
|
||||
@ -33,7 +31,7 @@ class ActivityCardState extends State<ActivityCard> {
|
||||
|
||||
return FutureBuilder<List<MediaItem>>(
|
||||
future: MediaItemsDao(Provider.of<AppDatabase>(context))
|
||||
.fromActivity(widget.data),
|
||||
.fromActivity(widget.activity),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
List<MediaItem> mediaItems = snapshot.data!;
|
||||
@ -58,9 +56,7 @@ class ActivityCardState extends State<ActivityCard> {
|
||||
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<ActivityCard> {
|
||||
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),
|
||||
|
@ -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<ActivityView> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final ActivityModel activityModel = widget.activityModel;
|
||||
final Activity activity = widget.activity;
|
||||
ActivityTimerModel atm =
|
||||
Provider.of<ActivityTimerModel>(context, listen: false);
|
||||
@ -35,7 +32,7 @@ class _ActivityViewState extends State<ActivityView> {
|
||||
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<ActivityView> {
|
||||
semanticsLabel: 'Activity Progress',
|
||||
);
|
||||
})),
|
||||
ActivityActionView(action: activityModel.actions[0]),
|
||||
ActivityActionView(actions: actions),
|
||||
]));
|
||||
} else {
|
||||
return Container(
|
||||
|
@ -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: '',
|
||||
|
@ -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 {
|
||||
|
@ -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<ActivityModel>? activities;
|
||||
final List<Activity> data;
|
||||
final List<Activity> 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]);
|
||||
},
|
||||
));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user