Przebudowanie aplikacji, usprawnione AI, dodanie combo buildera
Some checks failed
Build Linux App / build (push) Failing after 1m18s
Some checks failed
Build Linux App / build (push) Failing after 1m18s
This commit is contained in:
@@ -14,6 +14,7 @@ import 'package:trainhub_flutter/presentation/trainings/trainings_controller.dar
|
||||
import 'package:trainhub_flutter/presentation/common/widgets/app_empty_state.dart';
|
||||
import 'package:trainhub_flutter/presentation/common/dialogs/text_input_dialog.dart';
|
||||
import 'package:trainhub_flutter/presentation/common/dialogs/confirm_dialog.dart';
|
||||
import 'package:trainhub_flutter/presentation/trainings/widgets/combo_builder_tab.dart';
|
||||
|
||||
@RoutePage()
|
||||
class TrainingsPage extends ConsumerWidget {
|
||||
@@ -24,7 +25,7 @@ class TrainingsPage extends ConsumerWidget {
|
||||
final asyncState = ref.watch(trainingsControllerProvider);
|
||||
|
||||
return DefaultTabController(
|
||||
length: 2,
|
||||
length: 3,
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
@@ -34,8 +35,9 @@ class TrainingsPage extends ConsumerWidget {
|
||||
),
|
||||
child: const TabBar(
|
||||
tabs: [
|
||||
Tab(text: 'Training Plans'),
|
||||
Tab(text: 'Exercises'),
|
||||
Tab(text: 'TRAINING PLANS'),
|
||||
Tab(text: 'EXERCISES'),
|
||||
Tab(text: 'COMBOS'),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -47,6 +49,7 @@ class TrainingsPage extends ConsumerWidget {
|
||||
children: [
|
||||
_PlansTab(plans: state.plans, ref: ref),
|
||||
_ExercisesTab(exercises: state.exercises, ref: ref),
|
||||
const ComboBuilderTab(),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -401,7 +404,8 @@ class _ExerciseListItemState extends State<_ExerciseListItem> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final hasVideo = widget.exercise.videoUrl != null &&
|
||||
final hasVideo =
|
||||
widget.exercise.videoUrl != null &&
|
||||
widget.exercise.videoUrl!.isNotEmpty;
|
||||
|
||||
return MouseRegion(
|
||||
@@ -542,8 +546,7 @@ class _ExercisePreviewDialog extends StatelessWidget {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
if (hasVideo)
|
||||
_ExerciseVideoPreview(videoPath: exercise.videoUrl!),
|
||||
if (hasVideo) _ExerciseVideoPreview(videoPath: exercise.videoUrl!),
|
||||
Flexible(
|
||||
child: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(UIConstants.spacing24),
|
||||
@@ -578,8 +581,7 @@ class _ExercisePreviewDialog extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
],
|
||||
if (exercise.tags != null &&
|
||||
exercise.tags!.isNotEmpty) ...[
|
||||
if (exercise.tags != null && exercise.tags!.isNotEmpty) ...[
|
||||
const SizedBox(height: UIConstants.spacing12),
|
||||
Wrap(
|
||||
spacing: 6,
|
||||
@@ -740,8 +742,8 @@ class _ExerciseVideoPreviewState extends State<_ExerciseVideoPreview> {
|
||||
_player
|
||||
.seek(Duration(milliseconds: (_clipStart * 1000).round()))
|
||||
.then((_) {
|
||||
if (mounted) setState(() => _isInitialized = true);
|
||||
});
|
||||
if (mounted) setState(() => _isInitialized = true);
|
||||
});
|
||||
} else {
|
||||
if (mounted) setState(() => _isInitialized = true);
|
||||
}
|
||||
@@ -827,7 +829,9 @@ class _ExerciseVideoPreviewState extends State<_ExerciseVideoPreview> {
|
||||
final hasClip = _clipEnd != double.infinity;
|
||||
final clipDuration = hasClip ? (_clipEnd - _clipStart) : 0.0;
|
||||
final clipPosition = (_position - _clipStart).clamp(0.0, clipDuration);
|
||||
final progress = (hasClip && clipDuration > 0) ? clipPosition / clipDuration : 0.0;
|
||||
final progress = (hasClip && clipDuration > 0)
|
||||
? clipPosition / clipDuration
|
||||
: 0.0;
|
||||
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
|
||||
Reference in New Issue
Block a user