Compare commits

..

4 Commits

16 changed files with 319 additions and 37 deletions

View File

@@ -1130,7 +1130,7 @@
"languageVersion": "3.7" "languageVersion": "3.7"
} }
], ],
"generated": "2025-06-16T19:03:33.328096Z", "generated": "2025-06-17T17:48:52.089260Z",
"generator": "pub", "generator": "pub",
"generatorVersion": "3.7.0", "generatorVersion": "3.7.0",
"flutterRoot": "file:///Users/vitalijnecitajlo/fvm/versions/3.29.0", "flutterRoot": "file:///Users/vitalijnecitajlo/fvm/versions/3.29.0",

File diff suppressed because one or more lines are too long

BIN
assets/.DS_Store vendored

Binary file not shown.

BIN
assets/icons/stats_best.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
assets/icons/stats_card.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
assets/icons/stats_down.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

BIN
assets/icons/stats_time.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
assets/icons/stats_up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

View File

@@ -103,6 +103,11 @@ class Bold14px extends TypographyTypeBold {
double get size => 14; double get size => 14;
} }
class Bold24px extends TypographyTypeBold {
@override
double get size => 24;
}
class Bold34px extends TypographyTypeBold { class Bold34px extends TypographyTypeBold {
@override @override
double get size => 34; double get size => 34;

View File

@@ -61,6 +61,29 @@ class $AssetsIconsGen {
AssetGenImage get settingsTrash => AssetGenImage get settingsTrash =>
const AssetGenImage('assets/icons/settings_trash.png'); const AssetGenImage('assets/icons/settings_trash.png');
/// File path: assets/icons/stats_best.png
AssetGenImage get statsBest =>
const AssetGenImage('assets/icons/stats_best.png');
/// File path: assets/icons/stats_card.png
AssetGenImage get statsCard =>
const AssetGenImage('assets/icons/stats_card.png');
/// File path: assets/icons/stats_down.png
AssetGenImage get statsDown =>
const AssetGenImage('assets/icons/stats_down.png');
/// File path: assets/icons/stats_repeat.png
AssetGenImage get statsRepeat =>
const AssetGenImage('assets/icons/stats_repeat.png');
/// File path: assets/icons/stats_time.png
AssetGenImage get statsTime =>
const AssetGenImage('assets/icons/stats_time.png');
/// File path: assets/icons/stats_up.png
AssetGenImage get statsUp => const AssetGenImage('assets/icons/stats_up.png');
/// File path: assets/icons/type=arrow_down.png /// File path: assets/icons/type=arrow_down.png
AssetGenImage get typeArrowDown => AssetGenImage get typeArrowDown =>
const AssetGenImage('assets/icons/type=arrow_down.png'); const AssetGenImage('assets/icons/type=arrow_down.png');
@@ -271,6 +294,12 @@ class $AssetsIconsGen {
settingsProfile, settingsProfile,
settingsShare, settingsShare,
settingsTrash, settingsTrash,
statsBest,
statsCard,
statsDown,
statsRepeat,
statsTime,
statsUp,
typeArrowDown, typeArrowDown,
typeBack, typeBack,
typeBold, typeBold,

View File

@@ -6,7 +6,7 @@
/// Locales: 2 /// Locales: 2
/// Strings: 20 (10 per locale) /// Strings: 20 (10 per locale)
/// ///
/// Built on 2025-06-16 at 19:03 UTC /// Built on 2025-06-17 at 17:49 UTC
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: type=lint, unused_import // ignore_for_file: type=lint, unused_import

View File

@@ -11,6 +11,7 @@
// ignore_for_file: no_leading_underscores_for_library_prefixes // ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:auto_route/auto_route.dart' as _i13; import 'package:auto_route/auto_route.dart' as _i13;
import 'package:flutter/cupertino.dart' as _i14; import 'package:flutter/cupertino.dart' as _i14;
import 'package:flutter/material.dart' as _i16;
import 'package:remever/database/database.dart' as _i15; import 'package:remever/database/database.dart' as _i15;
import 'package:remever/screens/auth/auth_screen.dart' as _i1; import 'package:remever/screens/auth/auth_screen.dart' as _i1;
import 'package:remever/screens/collections/collection_detail_screen.dart' import 'package:remever/screens/collections/collection_detail_screen.dart'
@@ -366,16 +367,34 @@ class SplashRoute extends _i13.PageRouteInfo<void> {
/// generated route for /// generated route for
/// [_i12.StatistickScreen] /// [_i12.StatistickScreen]
class StatistickRoute extends _i13.PageRouteInfo<void> { class StatistickRoute extends _i13.PageRouteInfo<StatistickRouteArgs> {
const StatistickRoute({List<_i13.PageRouteInfo>? children}) StatistickRoute({_i16.Key? key, List<_i13.PageRouteInfo>? children})
: super(StatistickRoute.name, initialChildren: children); : super(
StatistickRoute.name,
args: StatistickRouteArgs(key: key),
initialChildren: children,
);
static const String name = 'StatistickRoute'; static const String name = 'StatistickRoute';
static _i13.PageInfo page = _i13.PageInfo( static _i13.PageInfo page = _i13.PageInfo(
name, name,
builder: (data) { builder: (data) {
return const _i12.StatistickScreen(); final args = data.argsAs<StatistickRouteArgs>(
orElse: () => const StatistickRouteArgs(),
);
return _i12.StatistickScreen(key: args.key);
}, },
); );
} }
class StatistickRouteArgs {
const StatistickRouteArgs({this.key});
final _i16.Key? key;
@override
String toString() {
return 'StatistickRouteArgs{key: $key}';
}
}

View File

@@ -21,7 +21,9 @@ class HomeScreen extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
logger.logBuild('build home screen'); logger.logBuild('build home screen');
return SafeArea( return Stack(
children: [
SafeArea(
top: false, top: false,
child: AutoTabsScaffold( child: AutoTabsScaffold(
routes: <PageRouteInfo>[ routes: <PageRouteInfo>[
@@ -31,21 +33,12 @@ class HomeScreen extends StatelessWidget {
CollectionRoute(), CollectionRoute(),
], ],
bottomNavigationBuilder: (_, TabsRouter tabsRouter) { bottomNavigationBuilder: (_, TabsRouter tabsRouter) {
return ColoredBox( return _buildBackgroundBar(tabsRouter);
color: AppColors.bg,
child: SizedBox(
height: 73.h,
child: Stack(
alignment: Alignment.bottomCenter,
children: <Widget>[
_buildBackgroundBar(tabsRouter),
_buildCentralButton(),
],
),
),
);
}, },
), ),
),
_buildCentralButton(),
],
); );
} }
@@ -89,7 +82,7 @@ class HomeScreen extends StatelessWidget {
/// Построение центральной кнопки /// Построение центральной кнопки
Widget _buildCentralButton() { Widget _buildCentralButton() {
return Align( return Align(
alignment: Alignment.topCenter, alignment: Alignment(0, 0.91),
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
// Логика нажатия на центральную кнопку // Логика нажатия на центральную кнопку

View File

@@ -9,6 +9,7 @@ import 'package:remever/components/extensions/context.dart';
import 'package:remever/gen/assets.gen.dart'; import 'package:remever/gen/assets.gen.dart';
import 'package:remever/screens/settings/cubit/settings_cubit.dart'; import 'package:remever/screens/settings/cubit/settings_cubit.dart';
import 'package:remever/widgets/primary_button.dart'; import 'package:remever/widgets/primary_button.dart';
import 'package:share_plus/share_plus.dart';
class AboutSettingsState extends StatelessWidget { class AboutSettingsState extends StatelessWidget {
const AboutSettingsState({super.key}); const AboutSettingsState({super.key});
@@ -32,8 +33,8 @@ class AboutSettingsState extends StatelessWidget {
), ),
actions: <Widget>[ actions: <Widget>[
IconButton( IconButton(
onPressed: () { onPressed: () async {
showInfoToast('тут будет sharing'); await Share.share('Присоединяйся к нам в REMEVER');
}, },
icon: Assets.icons.settingsShare.image(height: 24.h, width: 24.w), icon: Assets.icons.settingsShare.image(height: 24.h, width: 24.w),
color: Colors.black, color: Colors.black,

View File

@@ -1,12 +1,247 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:remever/common/resources.dart';
import 'package:remever/common/widgets/typography.dart';
import 'package:remever/common/widgets/wspace.dart';
import 'package:remever/components/extensions/context.dart';
import 'package:remever/gen/assets.gen.dart';
import 'package:share_plus/share_plus.dart';
import 'package:intl/intl.dart';
@RoutePage() @RoutePage()
class StatistickScreen extends StatelessWidget { class StatistickScreen extends StatelessWidget {
const StatistickScreen({super.key}); StatistickScreen({super.key});
final DateTime today = DateTime.now();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return const Placeholder(color: Colors.orange); return Scaffold(
backgroundColor: AppColors.bg,
appBar: _buildAppBar(context),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16).r,
child: SingleChildScrollView(
physics: BouncingScrollPhysics(),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 16).r,
child: Container(
decoration: BoxDecoration(
color: AppColors.white,
borderRadius: BorderRadius.all(Radius.circular(12)).r,
),
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 16).r,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(
child: AppTypography(
"Лучший результат за день",
type: Medium16px(),
),
),
Center(
child: AppTypography(
DateFormat('dd.MM.yyyy').format(today),
type: Regular14px(),
color: AppColors.disabled,
),
),
HSpace(16),
_buildTodayStats(),
HSpace(32),
_buildSectionHeader(
"Повторили карточек",
Assets.icons.statsRepeat,
),
HSpace(16),
_buildStatisticsList([
{"label": "За сегодня", "value": "77"},
{"label": "За эту неделю", "value": "188"},
{"label": "За прошлую неделю", "value": "33"},
{"label": "За последний месяц", "value": "1669"},
{"label": "За все время", "value": "1345669"},
]),
HSpace(32),
_buildSectionHeader(
"Всего изучено карточек",
Assets.icons.statsBest,
),
HSpace(16),
_buildStatisticsList([
{"label": "За сегодня", "value": "77"},
{"label": "За эту неделю", "value": "188"},
{"label": "За прошлую неделю", "value": "33"},
{"label": "За последний месяц", "value": "1669"},
{"label": "За все время", "value": "1345669"},
]),
HSpace(32),
_buildSectionHeader(
"Прошли тренировок",
Assets.icons.statsTime,
),
HSpace(16),
_buildStatisticsList([
{"label": "За сегодня", "value": "77"},
{"label": "За эту неделю", "value": "188"},
{"label": "За прошлую неделю", "value": "33"},
{"label": "За последний месяц", "value": "1669"},
{"label": "За все время", "value": "1345669"},
]),
HSpace(32),
_buildSectionHeader(
"Вырос уровень у карточек",
Assets.icons.statsUp,
),
HSpace(16),
_buildStatisticsList([
{"label": "За сегодня", "value": "77"},
{"label": "За эту неделю", "value": "188"},
{"label": "За прошлую неделю", "value": "33"},
{"label": "За последний месяц", "value": "1669"},
{"label": "За все время", "value": "1345669"},
]),
HSpace(32),
_buildSectionHeader(
"Снизился уровень у карточек",
Assets.icons.statsDown,
),
HSpace(16),
_buildStatisticsList([
{"label": "За сегодня", "value": "77"},
{"label": "За эту неделю", "value": "188"},
{"label": "За прошлую неделю", "value": "33"},
{"label": "За последний месяц", "value": "1669"},
{"label": "За все время", "value": "1345669"},
]),
],
),
),
),
),
),
),
);
}
Widget _buildTodayStats() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
spacing: 8.r,
children: [
_buildStatBlock(
"230",
"повторили\nкарточек",
Color(0xFFD7E6F4),
Color(0xFF0058AB),
),
_buildStatBlock(
"19",
"прошли\nтренировок",
Color(0xFFFFE4E6),
Color(0xFFFF5C69),
),
_buildStatBlock(
"196",
"вырос\nуровень",
Color(0xFFD7F4EA),
Color(0xFF008456),
),
],
);
}
/// AppBar экрана настроек
AppBar _buildAppBar(BuildContext context) {
return AppBar(
toolbarHeight: 66.h,
backgroundColor: AppColors.white,
shadowColor: Colors.transparent,
centerTitle: true,
leadingWidth: 0,
title: AppTypography('Статистика', type: SemiBold20px()),
actions: [
IconButton(
onPressed: () => Share.share('Зацени мою статистику в REMEVER'),
icon: Assets.icons.settingsShare.image(height: 24.h, width: 24.w),
color: Colors.black,
),
],
);
}
// Вспомогательные методы
Widget _buildStatBlock(
String value,
String label,
Color color,
Color textColor,
) {
return Expanded(
child: Container(
decoration: BoxDecoration(
color: color,
borderRadius: BorderRadius.circular(12).r,
),
padding: EdgeInsets.all(12).r,
child: Column(
children: [
AppTypography(value, type: Bold24px(), color: textColor),
AppTypography(
label,
type: Regular12px(),
color: textColor,
maxLines: 2,
textAlign: TextAlign.center,
),
],
),
),
);
}
Widget _buildSectionHeader(String title, AssetGenImage icon) {
return Row(
children: [
icon.image(height: 20.h, width: 20.w),
WSpace(4),
AppTypography(title, type: Medium16px()),
],
);
}
Widget _buildStatisticsList(List<Map<String, String>> data) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(12)).r,
color: AppColors.bg,
),
child: Padding(
padding: const EdgeInsets.all(12).r,
child: Column(
spacing: 8.r,
children:
data
.map(
(e) => Row(
children: [
Expanded(
child: AppTypography(
e['label']!,
type: Regular16px(),
),
),
Assets.icons.statsCard.image(height: 18.h, width: 18.w),
AppTypography(e["value"]!, type: Regular16px()),
],
),
)
.toList(),
),
),
);
} }
} }