Przebudowanie aplikacji, usprawnione AI, dodanie combo buildera
Some checks failed
Build Linux App / build (push) Failing after 1m18s

This commit is contained in:
Kazimierz Ciołek
2026-07-06 23:44:17 +02:00
parent 9dcc4b87de
commit 6dd7213eb0
48 changed files with 3229 additions and 669 deletions

View File

@@ -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,