feature(training): Добавлен состояния загрузки, пустоты и наличие данных на экране тренировки #7
@@ -1130,7 +1130,7 @@
|
|||||||
"languageVersion": "3.7"
|
"languageVersion": "3.7"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"generated": "2025-06-17T17:48:52.089260Z",
|
"generated": "2025-06-17T18:40:18.603782Z",
|
||||||
"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
BIN
assets/.DS_Store
vendored
Binary file not shown.
BIN
assets/images/training_empty.png
Normal file
BIN
assets/images/training_empty.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.6 KiB |
@@ -410,6 +410,10 @@ class $AssetsImagesGen {
|
|||||||
/// File path: assets/images/quote.png
|
/// File path: assets/images/quote.png
|
||||||
AssetGenImage get quote => const AssetGenImage('assets/images/quote.png');
|
AssetGenImage get quote => const AssetGenImage('assets/images/quote.png');
|
||||||
|
|
||||||
|
/// File path: assets/images/training_empty.png
|
||||||
|
AssetGenImage get trainingEmpty =>
|
||||||
|
const AssetGenImage('assets/images/training_empty.png');
|
||||||
|
|
||||||
/// List of all assets
|
/// List of all assets
|
||||||
List<dynamic> get values => [
|
List<dynamic> get values => [
|
||||||
aGitkeep,
|
aGitkeep,
|
||||||
@@ -427,6 +431,7 @@ class $AssetsImagesGen {
|
|||||||
logo,
|
logo,
|
||||||
noData,
|
noData,
|
||||||
quote,
|
quote,
|
||||||
|
trainingEmpty,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/// Locales: 2
|
/// Locales: 2
|
||||||
/// Strings: 20 (10 per locale)
|
/// Strings: 20 (10 per locale)
|
||||||
///
|
///
|
||||||
/// Built on 2025-06-17 at 17:49 UTC
|
/// Built on 2025-06-17 at 18:40 UTC
|
||||||
|
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// ignore_for_file: type=lint, unused_import
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ class AppRouter extends RootStackRouter {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
||||||
|
AutoRoute(path: '/training', page: TrainingRoute.page),
|
||||||
|
|
||||||
AutoRoute(path: '/crud_collection', page: CrudCollectionRoute.page),
|
AutoRoute(path: '/crud_collection', page: CrudCollectionRoute.page),
|
||||||
AutoRoute(path: '/collection_search', page: CollectionSearchRoute.page),
|
AutoRoute(path: '/collection_search', page: CollectionSearchRoute.page),
|
||||||
AutoRoute(path: '/crudFullField', page: CrudCollectionFullscreenField.page),
|
AutoRoute(path: '/crudFullField', page: CrudCollectionFullscreenField.page),
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
|
|
||||||
// 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 _i14;
|
||||||
import 'package:flutter/cupertino.dart' as _i14;
|
import 'package:flutter/cupertino.dart' as _i15;
|
||||||
import 'package:flutter/material.dart' as _i16;
|
import 'package:flutter/material.dart' as _i17;
|
||||||
import 'package:remever/database/database.dart' as _i15;
|
import 'package:remever/database/database.dart' as _i16;
|
||||||
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'
|
||||||
as _i2;
|
as _i2;
|
||||||
@@ -28,16 +28,17 @@ import 'package:remever/screens/sandbox/sandbox_screen.dart' as _i9;
|
|||||||
import 'package:remever/screens/settings/settings_screen.dart' as _i10;
|
import 'package:remever/screens/settings/settings_screen.dart' as _i10;
|
||||||
import 'package:remever/screens/splash/splash_screen.dart' as _i11;
|
import 'package:remever/screens/splash/splash_screen.dart' as _i11;
|
||||||
import 'package:remever/screens/statistick/statistick_screen.dart' as _i12;
|
import 'package:remever/screens/statistick/statistick_screen.dart' as _i12;
|
||||||
|
import 'package:remever/screens/training/training_screen.dart' as _i13;
|
||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i1.AuthScreen]
|
/// [_i1.AuthScreen]
|
||||||
class AuthRoute extends _i13.PageRouteInfo<void> {
|
class AuthRoute extends _i14.PageRouteInfo<void> {
|
||||||
const AuthRoute({List<_i13.PageRouteInfo>? children})
|
const AuthRoute({List<_i14.PageRouteInfo>? children})
|
||||||
: super(AuthRoute.name, initialChildren: children);
|
: super(AuthRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'AuthRoute';
|
static const String name = 'AuthRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i1.AuthScreen();
|
return const _i1.AuthScreen();
|
||||||
@@ -48,11 +49,11 @@ class AuthRoute extends _i13.PageRouteInfo<void> {
|
|||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i2.CollectionDetailScreen]
|
/// [_i2.CollectionDetailScreen]
|
||||||
class CollectionDetailRoute
|
class CollectionDetailRoute
|
||||||
extends _i13.PageRouteInfo<CollectionDetailRouteArgs> {
|
extends _i14.PageRouteInfo<CollectionDetailRouteArgs> {
|
||||||
CollectionDetailRoute({
|
CollectionDetailRoute({
|
||||||
_i14.Key? key,
|
_i15.Key? key,
|
||||||
required _i15.Collection collection,
|
required _i16.Collection collection,
|
||||||
List<_i13.PageRouteInfo>? children,
|
List<_i14.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
CollectionDetailRoute.name,
|
CollectionDetailRoute.name,
|
||||||
args: CollectionDetailRouteArgs(key: key, collection: collection),
|
args: CollectionDetailRouteArgs(key: key, collection: collection),
|
||||||
@@ -61,7 +62,7 @@ class CollectionDetailRoute
|
|||||||
|
|
||||||
static const String name = 'CollectionDetailRoute';
|
static const String name = 'CollectionDetailRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final args = data.argsAs<CollectionDetailRouteArgs>();
|
final args = data.argsAs<CollectionDetailRouteArgs>();
|
||||||
@@ -76,9 +77,9 @@ class CollectionDetailRoute
|
|||||||
class CollectionDetailRouteArgs {
|
class CollectionDetailRouteArgs {
|
||||||
const CollectionDetailRouteArgs({this.key, required this.collection});
|
const CollectionDetailRouteArgs({this.key, required this.collection});
|
||||||
|
|
||||||
final _i14.Key? key;
|
final _i15.Key? key;
|
||||||
|
|
||||||
final _i15.Collection collection;
|
final _i16.Collection collection;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
@@ -88,13 +89,13 @@ class CollectionDetailRouteArgs {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i3.CollectionScreen]
|
/// [_i3.CollectionScreen]
|
||||||
class CollectionRoute extends _i13.PageRouteInfo<void> {
|
class CollectionRoute extends _i14.PageRouteInfo<void> {
|
||||||
const CollectionRoute({List<_i13.PageRouteInfo>? children})
|
const CollectionRoute({List<_i14.PageRouteInfo>? children})
|
||||||
: super(CollectionRoute.name, initialChildren: children);
|
: super(CollectionRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'CollectionRoute';
|
static const String name = 'CollectionRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i3.CollectionScreen();
|
return const _i3.CollectionScreen();
|
||||||
@@ -105,11 +106,11 @@ class CollectionRoute extends _i13.PageRouteInfo<void> {
|
|||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i4.CollectionSearchScreen]
|
/// [_i4.CollectionSearchScreen]
|
||||||
class CollectionSearchRoute
|
class CollectionSearchRoute
|
||||||
extends _i13.PageRouteInfo<CollectionSearchRouteArgs> {
|
extends _i14.PageRouteInfo<CollectionSearchRouteArgs> {
|
||||||
CollectionSearchRoute({
|
CollectionSearchRoute({
|
||||||
_i14.Key? key,
|
_i15.Key? key,
|
||||||
required void Function(_i15.Collection) onCollectionSelect,
|
required void Function(_i16.Collection) onCollectionSelect,
|
||||||
List<_i13.PageRouteInfo>? children,
|
List<_i14.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
CollectionSearchRoute.name,
|
CollectionSearchRoute.name,
|
||||||
args: CollectionSearchRouteArgs(
|
args: CollectionSearchRouteArgs(
|
||||||
@@ -121,7 +122,7 @@ class CollectionSearchRoute
|
|||||||
|
|
||||||
static const String name = 'CollectionSearchRoute';
|
static const String name = 'CollectionSearchRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final args = data.argsAs<CollectionSearchRouteArgs>();
|
final args = data.argsAs<CollectionSearchRouteArgs>();
|
||||||
@@ -136,9 +137,9 @@ class CollectionSearchRoute
|
|||||||
class CollectionSearchRouteArgs {
|
class CollectionSearchRouteArgs {
|
||||||
const CollectionSearchRouteArgs({this.key, required this.onCollectionSelect});
|
const CollectionSearchRouteArgs({this.key, required this.onCollectionSelect});
|
||||||
|
|
||||||
final _i14.Key? key;
|
final _i15.Key? key;
|
||||||
|
|
||||||
final void Function(_i15.Collection) onCollectionSelect;
|
final void Function(_i16.Collection) onCollectionSelect;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
@@ -148,11 +149,11 @@ class CollectionSearchRouteArgs {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i5.CreateScreen]
|
/// [_i5.CreateScreen]
|
||||||
class CreateRoute extends _i13.PageRouteInfo<CreateRouteArgs> {
|
class CreateRoute extends _i14.PageRouteInfo<CreateRouteArgs> {
|
||||||
CreateRoute({
|
CreateRoute({
|
||||||
_i14.Key? key,
|
_i15.Key? key,
|
||||||
_i15.Collection? collection,
|
_i16.Collection? collection,
|
||||||
List<_i13.PageRouteInfo>? children,
|
List<_i14.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
CreateRoute.name,
|
CreateRoute.name,
|
||||||
args: CreateRouteArgs(key: key, collection: collection),
|
args: CreateRouteArgs(key: key, collection: collection),
|
||||||
@@ -161,7 +162,7 @@ class CreateRoute extends _i13.PageRouteInfo<CreateRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'CreateRoute';
|
static const String name = 'CreateRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final args = data.argsAs<CreateRouteArgs>(
|
final args = data.argsAs<CreateRouteArgs>(
|
||||||
@@ -175,9 +176,9 @@ class CreateRoute extends _i13.PageRouteInfo<CreateRouteArgs> {
|
|||||||
class CreateRouteArgs {
|
class CreateRouteArgs {
|
||||||
const CreateRouteArgs({this.key, this.collection});
|
const CreateRouteArgs({this.key, this.collection});
|
||||||
|
|
||||||
final _i14.Key? key;
|
final _i15.Key? key;
|
||||||
|
|
||||||
final _i15.Collection? collection;
|
final _i16.Collection? collection;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
@@ -188,15 +189,15 @@ class CreateRouteArgs {
|
|||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i6.CrudCollectionFullscreenField]
|
/// [_i6.CrudCollectionFullscreenField]
|
||||||
class CrudCollectionFullscreenField
|
class CrudCollectionFullscreenField
|
||||||
extends _i13.PageRouteInfo<CrudCollectionFullscreenFieldArgs> {
|
extends _i14.PageRouteInfo<CrudCollectionFullscreenFieldArgs> {
|
||||||
CrudCollectionFullscreenField({
|
CrudCollectionFullscreenField({
|
||||||
_i14.Key? key,
|
_i15.Key? key,
|
||||||
String title = '',
|
String title = '',
|
||||||
String? hint,
|
String? hint,
|
||||||
String? content,
|
String? content,
|
||||||
double height = 92,
|
double height = 92,
|
||||||
required void Function(String?) onEditingComplete,
|
required void Function(String?) onEditingComplete,
|
||||||
List<_i13.PageRouteInfo>? children,
|
List<_i14.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
CrudCollectionFullscreenField.name,
|
CrudCollectionFullscreenField.name,
|
||||||
args: CrudCollectionFullscreenFieldArgs(
|
args: CrudCollectionFullscreenFieldArgs(
|
||||||
@@ -212,7 +213,7 @@ class CrudCollectionFullscreenField
|
|||||||
|
|
||||||
static const String name = 'CrudCollectionFullscreenField';
|
static const String name = 'CrudCollectionFullscreenField';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final args = data.argsAs<CrudCollectionFullscreenFieldArgs>();
|
final args = data.argsAs<CrudCollectionFullscreenFieldArgs>();
|
||||||
@@ -238,7 +239,7 @@ class CrudCollectionFullscreenFieldArgs {
|
|||||||
required this.onEditingComplete,
|
required this.onEditingComplete,
|
||||||
});
|
});
|
||||||
|
|
||||||
final _i14.Key? key;
|
final _i15.Key? key;
|
||||||
|
|
||||||
final String title;
|
final String title;
|
||||||
|
|
||||||
@@ -258,11 +259,11 @@ class CrudCollectionFullscreenFieldArgs {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i7.CrudCollectionScreen]
|
/// [_i7.CrudCollectionScreen]
|
||||||
class CrudCollectionRoute extends _i13.PageRouteInfo<CrudCollectionRouteArgs> {
|
class CrudCollectionRoute extends _i14.PageRouteInfo<CrudCollectionRouteArgs> {
|
||||||
CrudCollectionRoute({
|
CrudCollectionRoute({
|
||||||
_i14.Key? key,
|
_i15.Key? key,
|
||||||
_i15.Collection? editedCollection,
|
_i16.Collection? editedCollection,
|
||||||
List<_i13.PageRouteInfo>? children,
|
List<_i14.PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
CrudCollectionRoute.name,
|
CrudCollectionRoute.name,
|
||||||
args: CrudCollectionRouteArgs(
|
args: CrudCollectionRouteArgs(
|
||||||
@@ -274,7 +275,7 @@ class CrudCollectionRoute extends _i13.PageRouteInfo<CrudCollectionRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'CrudCollectionRoute';
|
static const String name = 'CrudCollectionRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final args = data.argsAs<CrudCollectionRouteArgs>(
|
final args = data.argsAs<CrudCollectionRouteArgs>(
|
||||||
@@ -291,9 +292,9 @@ class CrudCollectionRoute extends _i13.PageRouteInfo<CrudCollectionRouteArgs> {
|
|||||||
class CrudCollectionRouteArgs {
|
class CrudCollectionRouteArgs {
|
||||||
const CrudCollectionRouteArgs({this.key, this.editedCollection});
|
const CrudCollectionRouteArgs({this.key, this.editedCollection});
|
||||||
|
|
||||||
final _i14.Key? key;
|
final _i15.Key? key;
|
||||||
|
|
||||||
final _i15.Collection? editedCollection;
|
final _i16.Collection? editedCollection;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
@@ -303,13 +304,13 @@ class CrudCollectionRouteArgs {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i8.HomeScreen]
|
/// [_i8.HomeScreen]
|
||||||
class HomeRoute extends _i13.PageRouteInfo<void> {
|
class HomeRoute extends _i14.PageRouteInfo<void> {
|
||||||
const HomeRoute({List<_i13.PageRouteInfo>? children})
|
const HomeRoute({List<_i14.PageRouteInfo>? children})
|
||||||
: super(HomeRoute.name, initialChildren: children);
|
: super(HomeRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'HomeRoute';
|
static const String name = 'HomeRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i8.HomeScreen();
|
return const _i8.HomeScreen();
|
||||||
@@ -319,13 +320,13 @@ class HomeRoute extends _i13.PageRouteInfo<void> {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i9.SandboxScreen]
|
/// [_i9.SandboxScreen]
|
||||||
class SandboxRoute extends _i13.PageRouteInfo<void> {
|
class SandboxRoute extends _i14.PageRouteInfo<void> {
|
||||||
const SandboxRoute({List<_i13.PageRouteInfo>? children})
|
const SandboxRoute({List<_i14.PageRouteInfo>? children})
|
||||||
: super(SandboxRoute.name, initialChildren: children);
|
: super(SandboxRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'SandboxRoute';
|
static const String name = 'SandboxRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i9.SandboxScreen();
|
return const _i9.SandboxScreen();
|
||||||
@@ -335,13 +336,13 @@ class SandboxRoute extends _i13.PageRouteInfo<void> {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i10.SettingsScreen]
|
/// [_i10.SettingsScreen]
|
||||||
class SettingsRoute extends _i13.PageRouteInfo<void> {
|
class SettingsRoute extends _i14.PageRouteInfo<void> {
|
||||||
const SettingsRoute({List<_i13.PageRouteInfo>? children})
|
const SettingsRoute({List<_i14.PageRouteInfo>? children})
|
||||||
: super(SettingsRoute.name, initialChildren: children);
|
: super(SettingsRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'SettingsRoute';
|
static const String name = 'SettingsRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i10.SettingsScreen();
|
return const _i10.SettingsScreen();
|
||||||
@@ -351,13 +352,13 @@ class SettingsRoute extends _i13.PageRouteInfo<void> {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i11.SplashScreen]
|
/// [_i11.SplashScreen]
|
||||||
class SplashRoute extends _i13.PageRouteInfo<void> {
|
class SplashRoute extends _i14.PageRouteInfo<void> {
|
||||||
const SplashRoute({List<_i13.PageRouteInfo>? children})
|
const SplashRoute({List<_i14.PageRouteInfo>? children})
|
||||||
: super(SplashRoute.name, initialChildren: children);
|
: super(SplashRoute.name, initialChildren: children);
|
||||||
|
|
||||||
static const String name = 'SplashRoute';
|
static const String name = 'SplashRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i11.SplashScreen();
|
return const _i11.SplashScreen();
|
||||||
@@ -367,8 +368,8 @@ class SplashRoute extends _i13.PageRouteInfo<void> {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i12.StatistickScreen]
|
/// [_i12.StatistickScreen]
|
||||||
class StatistickRoute extends _i13.PageRouteInfo<StatistickRouteArgs> {
|
class StatistickRoute extends _i14.PageRouteInfo<StatistickRouteArgs> {
|
||||||
StatistickRoute({_i16.Key? key, List<_i13.PageRouteInfo>? children})
|
StatistickRoute({_i17.Key? key, List<_i14.PageRouteInfo>? children})
|
||||||
: super(
|
: super(
|
||||||
StatistickRoute.name,
|
StatistickRoute.name,
|
||||||
args: StatistickRouteArgs(key: key),
|
args: StatistickRouteArgs(key: key),
|
||||||
@@ -377,7 +378,7 @@ class StatistickRoute extends _i13.PageRouteInfo<StatistickRouteArgs> {
|
|||||||
|
|
||||||
static const String name = 'StatistickRoute';
|
static const String name = 'StatistickRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
final args = data.argsAs<StatistickRouteArgs>(
|
final args = data.argsAs<StatistickRouteArgs>(
|
||||||
@@ -391,10 +392,26 @@ class StatistickRoute extends _i13.PageRouteInfo<StatistickRouteArgs> {
|
|||||||
class StatistickRouteArgs {
|
class StatistickRouteArgs {
|
||||||
const StatistickRouteArgs({this.key});
|
const StatistickRouteArgs({this.key});
|
||||||
|
|
||||||
final _i16.Key? key;
|
final _i17.Key? key;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'StatistickRouteArgs{key: $key}';
|
return 'StatistickRouteArgs{key: $key}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// generated route for
|
||||||
|
/// [_i13.TrainingScreen]
|
||||||
|
class TrainingRoute extends _i14.PageRouteInfo<void> {
|
||||||
|
const TrainingRoute({List<_i14.PageRouteInfo>? children})
|
||||||
|
: super(TrainingRoute.name, initialChildren: children);
|
||||||
|
|
||||||
|
static const String name = 'TrainingRoute';
|
||||||
|
|
||||||
|
static _i14.PageInfo page = _i14.PageInfo(
|
||||||
|
name,
|
||||||
|
builder: (data) {
|
||||||
|
return const _i13.TrainingScreen();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class HomeScreen extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_buildCentralButton(),
|
_buildCentralButton(context),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -80,12 +80,12 @@ class HomeScreen extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Построение центральной кнопки
|
/// Построение центральной кнопки
|
||||||
Widget _buildCentralButton() {
|
Widget _buildCentralButton(BuildContext context) {
|
||||||
return Align(
|
return Align(
|
||||||
alignment: Alignment(0, 0.91),
|
alignment: Alignment(0, 0.91),
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
// Логика нажатия на центральную кнопку
|
context.pushRoute(TrainingRoute());
|
||||||
},
|
},
|
||||||
child: SizedBox.square(
|
child: SizedBox.square(
|
||||||
dimension: 60.r,
|
dimension: 60.r,
|
||||||
|
|||||||
25
lib/screens/training/cubit/training_cubit.dart
Normal file
25
lib/screens/training/cubit/training_cubit.dart
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||||
|
|
||||||
|
part 'training_state.dart';
|
||||||
|
part 'training_cubit.freezed.dart';
|
||||||
|
|
||||||
|
class TrainingCubit extends Cubit<TrainingState> {
|
||||||
|
TrainingCubit() : super(TrainingState.data());
|
||||||
|
|
||||||
|
Future<void> toLoading() async {
|
||||||
|
emit(TrainingState.loading());
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> toEmptyState() async {
|
||||||
|
emit(TrainingState.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> toDataState() async {
|
||||||
|
emit(TrainingState.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> toResultState() async {
|
||||||
|
emit(TrainingState.result());
|
||||||
|
}
|
||||||
|
}
|
||||||
560
lib/screens/training/cubit/training_cubit.freezed.dart
Normal file
560
lib/screens/training/cubit/training_cubit.freezed.dart
Normal file
@@ -0,0 +1,560 @@
|
|||||||
|
// coverage:ignore-file
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||||
|
|
||||||
|
part of 'training_cubit.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// FreezedGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
T _$identity<T>(T value) => value;
|
||||||
|
|
||||||
|
final _privateConstructorUsedError = UnsupportedError(
|
||||||
|
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models',
|
||||||
|
);
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$TrainingState {
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult when<TResult extends Object?>({
|
||||||
|
required TResult Function() loading,
|
||||||
|
required TResult Function() empty,
|
||||||
|
required TResult Function() data,
|
||||||
|
required TResult Function() result,
|
||||||
|
}) => throw _privateConstructorUsedError;
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? whenOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function()? loading,
|
||||||
|
TResult? Function()? empty,
|
||||||
|
TResult? Function()? data,
|
||||||
|
TResult? Function()? result,
|
||||||
|
}) => throw _privateConstructorUsedError;
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeWhen<TResult extends Object?>({
|
||||||
|
TResult Function()? loading,
|
||||||
|
TResult Function()? empty,
|
||||||
|
TResult Function()? data,
|
||||||
|
TResult Function()? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) => throw _privateConstructorUsedError;
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult map<TResult extends Object?>({
|
||||||
|
required TResult Function(_Loading value) loading,
|
||||||
|
required TResult Function(_Empty value) empty,
|
||||||
|
required TResult Function(_Data value) data,
|
||||||
|
required TResult Function(_Result value) result,
|
||||||
|
}) => throw _privateConstructorUsedError;
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? mapOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function(_Loading value)? loading,
|
||||||
|
TResult? Function(_Empty value)? empty,
|
||||||
|
TResult? Function(_Data value)? data,
|
||||||
|
TResult? Function(_Result value)? result,
|
||||||
|
}) => throw _privateConstructorUsedError;
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeMap<TResult extends Object?>({
|
||||||
|
TResult Function(_Loading value)? loading,
|
||||||
|
TResult Function(_Empty value)? empty,
|
||||||
|
TResult Function(_Data value)? data,
|
||||||
|
TResult Function(_Result value)? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) => throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $TrainingStateCopyWith<$Res> {
|
||||||
|
factory $TrainingStateCopyWith(
|
||||||
|
TrainingState value,
|
||||||
|
$Res Function(TrainingState) then,
|
||||||
|
) = _$TrainingStateCopyWithImpl<$Res, TrainingState>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$TrainingStateCopyWithImpl<$Res, $Val extends TrainingState>
|
||||||
|
implements $TrainingStateCopyWith<$Res> {
|
||||||
|
_$TrainingStateCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of TrainingState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$LoadingImplCopyWith<$Res> {
|
||||||
|
factory _$$LoadingImplCopyWith(
|
||||||
|
_$LoadingImpl value,
|
||||||
|
$Res Function(_$LoadingImpl) then,
|
||||||
|
) = __$$LoadingImplCopyWithImpl<$Res>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$LoadingImplCopyWithImpl<$Res>
|
||||||
|
extends _$TrainingStateCopyWithImpl<$Res, _$LoadingImpl>
|
||||||
|
implements _$$LoadingImplCopyWith<$Res> {
|
||||||
|
__$$LoadingImplCopyWithImpl(
|
||||||
|
_$LoadingImpl _value,
|
||||||
|
$Res Function(_$LoadingImpl) _then,
|
||||||
|
) : super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of TrainingState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$LoadingImpl implements _Loading {
|
||||||
|
const _$LoadingImpl();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'TrainingState.loading()';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType && other is _$LoadingImpl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => runtimeType.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult when<TResult extends Object?>({
|
||||||
|
required TResult Function() loading,
|
||||||
|
required TResult Function() empty,
|
||||||
|
required TResult Function() data,
|
||||||
|
required TResult Function() result,
|
||||||
|
}) {
|
||||||
|
return loading();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? whenOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function()? loading,
|
||||||
|
TResult? Function()? empty,
|
||||||
|
TResult? Function()? data,
|
||||||
|
TResult? Function()? result,
|
||||||
|
}) {
|
||||||
|
return loading?.call();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeWhen<TResult extends Object?>({
|
||||||
|
TResult Function()? loading,
|
||||||
|
TResult Function()? empty,
|
||||||
|
TResult Function()? data,
|
||||||
|
TResult Function()? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (loading != null) {
|
||||||
|
return loading();
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult map<TResult extends Object?>({
|
||||||
|
required TResult Function(_Loading value) loading,
|
||||||
|
required TResult Function(_Empty value) empty,
|
||||||
|
required TResult Function(_Data value) data,
|
||||||
|
required TResult Function(_Result value) result,
|
||||||
|
}) {
|
||||||
|
return loading(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? mapOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function(_Loading value)? loading,
|
||||||
|
TResult? Function(_Empty value)? empty,
|
||||||
|
TResult? Function(_Data value)? data,
|
||||||
|
TResult? Function(_Result value)? result,
|
||||||
|
}) {
|
||||||
|
return loading?.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeMap<TResult extends Object?>({
|
||||||
|
TResult Function(_Loading value)? loading,
|
||||||
|
TResult Function(_Empty value)? empty,
|
||||||
|
TResult Function(_Data value)? data,
|
||||||
|
TResult Function(_Result value)? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (loading != null) {
|
||||||
|
return loading(this);
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _Loading implements TrainingState {
|
||||||
|
const factory _Loading() = _$LoadingImpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$EmptyImplCopyWith<$Res> {
|
||||||
|
factory _$$EmptyImplCopyWith(
|
||||||
|
_$EmptyImpl value,
|
||||||
|
$Res Function(_$EmptyImpl) then,
|
||||||
|
) = __$$EmptyImplCopyWithImpl<$Res>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$EmptyImplCopyWithImpl<$Res>
|
||||||
|
extends _$TrainingStateCopyWithImpl<$Res, _$EmptyImpl>
|
||||||
|
implements _$$EmptyImplCopyWith<$Res> {
|
||||||
|
__$$EmptyImplCopyWithImpl(
|
||||||
|
_$EmptyImpl _value,
|
||||||
|
$Res Function(_$EmptyImpl) _then,
|
||||||
|
) : super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of TrainingState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$EmptyImpl implements _Empty {
|
||||||
|
const _$EmptyImpl();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'TrainingState.empty()';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType && other is _$EmptyImpl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => runtimeType.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult when<TResult extends Object?>({
|
||||||
|
required TResult Function() loading,
|
||||||
|
required TResult Function() empty,
|
||||||
|
required TResult Function() data,
|
||||||
|
required TResult Function() result,
|
||||||
|
}) {
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? whenOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function()? loading,
|
||||||
|
TResult? Function()? empty,
|
||||||
|
TResult? Function()? data,
|
||||||
|
TResult? Function()? result,
|
||||||
|
}) {
|
||||||
|
return empty?.call();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeWhen<TResult extends Object?>({
|
||||||
|
TResult Function()? loading,
|
||||||
|
TResult Function()? empty,
|
||||||
|
TResult Function()? data,
|
||||||
|
TResult Function()? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (empty != null) {
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult map<TResult extends Object?>({
|
||||||
|
required TResult Function(_Loading value) loading,
|
||||||
|
required TResult Function(_Empty value) empty,
|
||||||
|
required TResult Function(_Data value) data,
|
||||||
|
required TResult Function(_Result value) result,
|
||||||
|
}) {
|
||||||
|
return empty(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? mapOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function(_Loading value)? loading,
|
||||||
|
TResult? Function(_Empty value)? empty,
|
||||||
|
TResult? Function(_Data value)? data,
|
||||||
|
TResult? Function(_Result value)? result,
|
||||||
|
}) {
|
||||||
|
return empty?.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeMap<TResult extends Object?>({
|
||||||
|
TResult Function(_Loading value)? loading,
|
||||||
|
TResult Function(_Empty value)? empty,
|
||||||
|
TResult Function(_Data value)? data,
|
||||||
|
TResult Function(_Result value)? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (empty != null) {
|
||||||
|
return empty(this);
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _Empty implements TrainingState {
|
||||||
|
const factory _Empty() = _$EmptyImpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$DataImplCopyWith<$Res> {
|
||||||
|
factory _$$DataImplCopyWith(
|
||||||
|
_$DataImpl value,
|
||||||
|
$Res Function(_$DataImpl) then,
|
||||||
|
) = __$$DataImplCopyWithImpl<$Res>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$DataImplCopyWithImpl<$Res>
|
||||||
|
extends _$TrainingStateCopyWithImpl<$Res, _$DataImpl>
|
||||||
|
implements _$$DataImplCopyWith<$Res> {
|
||||||
|
__$$DataImplCopyWithImpl(_$DataImpl _value, $Res Function(_$DataImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of TrainingState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$DataImpl implements _Data {
|
||||||
|
const _$DataImpl();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'TrainingState.data()';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType && other is _$DataImpl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => runtimeType.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult when<TResult extends Object?>({
|
||||||
|
required TResult Function() loading,
|
||||||
|
required TResult Function() empty,
|
||||||
|
required TResult Function() data,
|
||||||
|
required TResult Function() result,
|
||||||
|
}) {
|
||||||
|
return data();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? whenOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function()? loading,
|
||||||
|
TResult? Function()? empty,
|
||||||
|
TResult? Function()? data,
|
||||||
|
TResult? Function()? result,
|
||||||
|
}) {
|
||||||
|
return data?.call();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeWhen<TResult extends Object?>({
|
||||||
|
TResult Function()? loading,
|
||||||
|
TResult Function()? empty,
|
||||||
|
TResult Function()? data,
|
||||||
|
TResult Function()? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (data != null) {
|
||||||
|
return data();
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult map<TResult extends Object?>({
|
||||||
|
required TResult Function(_Loading value) loading,
|
||||||
|
required TResult Function(_Empty value) empty,
|
||||||
|
required TResult Function(_Data value) data,
|
||||||
|
required TResult Function(_Result value) result,
|
||||||
|
}) {
|
||||||
|
return data(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? mapOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function(_Loading value)? loading,
|
||||||
|
TResult? Function(_Empty value)? empty,
|
||||||
|
TResult? Function(_Data value)? data,
|
||||||
|
TResult? Function(_Result value)? result,
|
||||||
|
}) {
|
||||||
|
return data?.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeMap<TResult extends Object?>({
|
||||||
|
TResult Function(_Loading value)? loading,
|
||||||
|
TResult Function(_Empty value)? empty,
|
||||||
|
TResult Function(_Data value)? data,
|
||||||
|
TResult Function(_Result value)? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (data != null) {
|
||||||
|
return data(this);
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _Data implements TrainingState {
|
||||||
|
const factory _Data() = _$DataImpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$ResultImplCopyWith<$Res> {
|
||||||
|
factory _$$ResultImplCopyWith(
|
||||||
|
_$ResultImpl value,
|
||||||
|
$Res Function(_$ResultImpl) then,
|
||||||
|
) = __$$ResultImplCopyWithImpl<$Res>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$ResultImplCopyWithImpl<$Res>
|
||||||
|
extends _$TrainingStateCopyWithImpl<$Res, _$ResultImpl>
|
||||||
|
implements _$$ResultImplCopyWith<$Res> {
|
||||||
|
__$$ResultImplCopyWithImpl(
|
||||||
|
_$ResultImpl _value,
|
||||||
|
$Res Function(_$ResultImpl) _then,
|
||||||
|
) : super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of TrainingState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$ResultImpl implements _Result {
|
||||||
|
const _$ResultImpl();
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'TrainingState.result()';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType && other is _$ResultImpl);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => runtimeType.hashCode;
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult when<TResult extends Object?>({
|
||||||
|
required TResult Function() loading,
|
||||||
|
required TResult Function() empty,
|
||||||
|
required TResult Function() data,
|
||||||
|
required TResult Function() result,
|
||||||
|
}) {
|
||||||
|
return result();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? whenOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function()? loading,
|
||||||
|
TResult? Function()? empty,
|
||||||
|
TResult? Function()? data,
|
||||||
|
TResult? Function()? result,
|
||||||
|
}) {
|
||||||
|
return result?.call();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeWhen<TResult extends Object?>({
|
||||||
|
TResult Function()? loading,
|
||||||
|
TResult Function()? empty,
|
||||||
|
TResult Function()? data,
|
||||||
|
TResult Function()? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (result != null) {
|
||||||
|
return result();
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult map<TResult extends Object?>({
|
||||||
|
required TResult Function(_Loading value) loading,
|
||||||
|
required TResult Function(_Empty value) empty,
|
||||||
|
required TResult Function(_Data value) data,
|
||||||
|
required TResult Function(_Result value) result,
|
||||||
|
}) {
|
||||||
|
return result(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult? mapOrNull<TResult extends Object?>({
|
||||||
|
TResult? Function(_Loading value)? loading,
|
||||||
|
TResult? Function(_Empty value)? empty,
|
||||||
|
TResult? Function(_Data value)? data,
|
||||||
|
TResult? Function(_Result value)? result,
|
||||||
|
}) {
|
||||||
|
return result?.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
@optionalTypeArgs
|
||||||
|
TResult maybeMap<TResult extends Object?>({
|
||||||
|
TResult Function(_Loading value)? loading,
|
||||||
|
TResult Function(_Empty value)? empty,
|
||||||
|
TResult Function(_Data value)? data,
|
||||||
|
TResult Function(_Result value)? result,
|
||||||
|
required TResult orElse(),
|
||||||
|
}) {
|
||||||
|
if (result != null) {
|
||||||
|
return result(this);
|
||||||
|
}
|
||||||
|
return orElse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _Result implements TrainingState {
|
||||||
|
const factory _Result() = _$ResultImpl;
|
||||||
|
}
|
||||||
9
lib/screens/training/cubit/training_state.dart
Normal file
9
lib/screens/training/cubit/training_state.dart
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
part of 'training_cubit.dart';
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class TrainingState with _$TrainingState {
|
||||||
|
const factory TrainingState.loading() = _Loading;
|
||||||
|
const factory TrainingState.empty() = _Empty;
|
||||||
|
const factory TrainingState.data() = _Data;
|
||||||
|
const factory TrainingState.result() = _Result;
|
||||||
|
}
|
||||||
71
lib/screens/training/states/empty.dart
Normal file
71
lib/screens/training/states/empty.dart
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
import 'package:auto_route/auto_route.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:remever/router.gr.dart';
|
||||||
|
import 'package:remever/widgets/primary_button.dart';
|
||||||
|
|
||||||
|
class TrainingEmpty extends StatelessWidget {
|
||||||
|
const TrainingEmpty({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: AppColors.bg,
|
||||||
|
appBar: _buildAppBar(context),
|
||||||
|
body: _buildMain(context),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Построение шапки
|
||||||
|
AppBar _buildAppBar(BuildContext context) {
|
||||||
|
return AppBar(
|
||||||
|
backgroundColor: AppColors.white,
|
||||||
|
shadowColor: Colors.transparent,
|
||||||
|
leading: GestureDetector(
|
||||||
|
onTap: () => context.back(),
|
||||||
|
child: const Icon(Icons.close, color: Colors.black),
|
||||||
|
),
|
||||||
|
centerTitle: true,
|
||||||
|
title: AppTypography(
|
||||||
|
'Тренировка',
|
||||||
|
type: SemiBold20px(),
|
||||||
|
color: AppColors.body_text,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildMain(BuildContext context) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16).r,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
HSpace(90),
|
||||||
|
Assets.images.trainingEmpty.image(height: 127.h, width: 160.w),
|
||||||
|
HSpace(20),
|
||||||
|
AppTypography(
|
||||||
|
'К сожалению, у вас нет карточек для изучения',
|
||||||
|
type: SemiBold20px(),
|
||||||
|
maxLines: 3,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
PrimaryButton(
|
||||||
|
onTap: () {
|
||||||
|
context.router.replaceAll([CreateRoute()]);
|
||||||
|
},
|
||||||
|
child: AppTypography(
|
||||||
|
'Создать карточку',
|
||||||
|
type: Medium14px(),
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
HSpace(90),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
35
lib/screens/training/states/loading.dart
Normal file
35
lib/screens/training/states/loading.dart
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:remever/common/resources.dart';
|
||||||
|
import 'package:remever/common/widgets/typography.dart';
|
||||||
|
|
||||||
|
class TrainingLoading extends StatelessWidget {
|
||||||
|
const TrainingLoading({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: AppColors.bg,
|
||||||
|
appBar: _buildAppBar(context),
|
||||||
|
body: Center(child: CircularProgressIndicator(color: AppColors.primary)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Построение шапки
|
||||||
|
AppBar _buildAppBar(BuildContext context) {
|
||||||
|
return AppBar(
|
||||||
|
backgroundColor: AppColors.white,
|
||||||
|
shadowColor: Colors.transparent,
|
||||||
|
leading: GestureDetector(
|
||||||
|
onTap: () => context.back(),
|
||||||
|
child: const Icon(Icons.close, color: Colors.black),
|
||||||
|
),
|
||||||
|
centerTitle: true,
|
||||||
|
title: AppTypography(
|
||||||
|
'Тренировка',
|
||||||
|
type: SemiBold20px(),
|
||||||
|
color: AppColors.body_text,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
185
lib/screens/training/training_screen.dart
Normal file
185
lib/screens/training/training_screen.dart
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
import 'package:auto_route/auto_route.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:remever/common/resources.dart';
|
||||||
|
import 'package:remever/common/typography.dart';
|
||||||
|
import 'package:remever/common/widgets/typography.dart';
|
||||||
|
import 'package:remever/common/widgets/w_if.dart';
|
||||||
|
import 'package:remever/common/widgets/wspace.dart';
|
||||||
|
import 'package:remever/components/extensions/context.dart';
|
||||||
|
import 'package:remever/components/extensions/state.dart';
|
||||||
|
import 'package:remever/gen/assets.gen.dart';
|
||||||
|
import 'package:remever/router.gr.dart';
|
||||||
|
import 'package:remever/screens/training/cubit/training_cubit.dart';
|
||||||
|
import 'package:remever/screens/training/states/empty.dart';
|
||||||
|
import 'package:remever/screens/training/states/loading.dart';
|
||||||
|
import 'package:remever/screens/training/widgets/training_ticket.dart';
|
||||||
|
import 'package:remever/widgets/primary_button.dart';
|
||||||
|
|
||||||
|
@RoutePage()
|
||||||
|
class TrainingScreen extends StatelessWidget {
|
||||||
|
const TrainingScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocProvider<TrainingCubit>(
|
||||||
|
create: (BuildContext context) => TrainingCubit(),
|
||||||
|
child: _buildMain(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Построение основного блока
|
||||||
|
///
|
||||||
|
Widget _buildMain() {
|
||||||
|
return PopScope(
|
||||||
|
canPop: false,
|
||||||
|
child: BlocBuilder<TrainingCubit, TrainingState>(
|
||||||
|
builder: (BuildContext context, state) {
|
||||||
|
return state.when(
|
||||||
|
loading: () => TrainingLoading(),
|
||||||
|
empty: () => TrainingEmpty(),
|
||||||
|
data: () => TrainingData(),
|
||||||
|
result: () => Placeholder(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TrainingData extends StatefulWidget {
|
||||||
|
const TrainingData({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<TrainingData> createState() => _TrainingDataState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _TrainingDataState extends State<TrainingData> {
|
||||||
|
bool _showAnswer = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: AppColors.bg,
|
||||||
|
appBar: _buildAppBar(context),
|
||||||
|
body: _buildMain(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Построение шапки
|
||||||
|
AppBar _buildAppBar(BuildContext context) {
|
||||||
|
return AppBar(
|
||||||
|
backgroundColor: AppColors.white,
|
||||||
|
shadowColor: Colors.transparent,
|
||||||
|
leading: GestureDetector(
|
||||||
|
onTap: () => context.back(),
|
||||||
|
child: const Icon(Icons.close, color: Colors.black),
|
||||||
|
),
|
||||||
|
centerTitle: true,
|
||||||
|
title: AppTypography(
|
||||||
|
'Тренировка',
|
||||||
|
type: SemiBold20px(),
|
||||||
|
color: AppColors.body_text,
|
||||||
|
),
|
||||||
|
actions: [_buildCounter(), WSpace(16)],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildCounter() {
|
||||||
|
return Center(
|
||||||
|
child: Container(
|
||||||
|
height: 24.h,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(100)).r,
|
||||||
|
color: AppColors.bg,
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(3).r,
|
||||||
|
child: Center(child: AppTypography('1 из 9', type: Regular14px())),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildMain() {
|
||||||
|
return Column(
|
||||||
|
children: [_buildTickets(), _buildShowAnswerButton(), _buildActions()],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildActions() {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(16).r,
|
||||||
|
child: Row(
|
||||||
|
spacing: 8.r,
|
||||||
|
children: [
|
||||||
|
Flexible(
|
||||||
|
child: PrimaryButton(
|
||||||
|
onTap: () {},
|
||||||
|
color: AppColors.danger,
|
||||||
|
child: AppTypography(
|
||||||
|
'Не помню',
|
||||||
|
type: Medium14px(),
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Flexible(
|
||||||
|
child: PrimaryButton(
|
||||||
|
child: AppTypography(
|
||||||
|
'Помню',
|
||||||
|
type: Medium14px(),
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildShowAnswerButton() {
|
||||||
|
return Wif(
|
||||||
|
condition: !_showAnswer,
|
||||||
|
builder:
|
||||||
|
(context) => PrimaryButton(
|
||||||
|
onTap: () {
|
||||||
|
safeSetState(() {
|
||||||
|
_showAnswer = true;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
color: AppColors.secondary,
|
||||||
|
width: 170,
|
||||||
|
child: AppTypography(
|
||||||
|
'Показать ответ',
|
||||||
|
type: Medium14px(),
|
||||||
|
color: AppColors.primary,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildTickets() {
|
||||||
|
return Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
physics: BouncingScrollPhysics(),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(16).r,
|
||||||
|
child: Column(
|
||||||
|
spacing: 8.r,
|
||||||
|
children: [
|
||||||
|
TrainingTicket(),
|
||||||
|
Wif(
|
||||||
|
condition: _showAnswer,
|
||||||
|
builder: (context) => TrainingTicket(isAnswer: true),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
124
lib/screens/training/widgets/training_ticket.dart
Normal file
124
lib/screens/training/widgets/training_ticket.dart
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:remever/common/resources.dart';
|
||||||
|
import 'package:remever/common/widgets/typography.dart';
|
||||||
|
import 'package:remever/common/widgets/w_if.dart';
|
||||||
|
import 'package:remever/common/widgets/wspace.dart';
|
||||||
|
import 'package:remever/components/extensions/context.dart';
|
||||||
|
|
||||||
|
class TrainingTicket extends StatelessWidget {
|
||||||
|
const TrainingTicket({super.key, this.isAnswer = false});
|
||||||
|
|
||||||
|
final bool isAnswer;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: double.infinity,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(12).r,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
constraints: BoxConstraints(minHeight: 50.h),
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
height: 90.h,
|
||||||
|
width: double.infinity,
|
||||||
|
child: DecoratedBox(decoration: getDecoration()),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(12).r,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
_buildCollectionInfo(),
|
||||||
|
_buildImage(),
|
||||||
|
HSpace(4),
|
||||||
|
_buildText(context),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildCollectionInfo() {
|
||||||
|
return Wif(
|
||||||
|
condition: !isAnswer,
|
||||||
|
builder: (context) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(bottom: 8).r,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
height: 24.h,
|
||||||
|
width: 24.w,
|
||||||
|
child: ClipOval(
|
||||||
|
child: Image.network(
|
||||||
|
'https://avatars.mds.yandex.net/i?id=56429b65e9098a58fcd538387d43bcbb_l-5384017-images-thumbs&n=13',
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
WSpace(4),
|
||||||
|
AppTypography(
|
||||||
|
'Астрология и астрофизика',
|
||||||
|
type: Regular14px(),
|
||||||
|
color: AppColors.disabled,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Декорирование контейнера
|
||||||
|
BoxDecoration getDecoration() {
|
||||||
|
return BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(12).r,
|
||||||
|
gradient: LinearGradient(
|
||||||
|
colors: [
|
||||||
|
isAnswer ? AppColors.answer : AppColors.question,
|
||||||
|
Colors.white,
|
||||||
|
],
|
||||||
|
begin: Alignment.topLeft,
|
||||||
|
end: const Alignment(-0.5, 1),
|
||||||
|
stops: const [0.25, 0.25],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildText(BuildContext context) {
|
||||||
|
return AppTypography(
|
||||||
|
'Родился 19 февраля 1473 года в Торуне в семье купца. После смерти отца воспитывался у дяди, епископа Вармийской епархии. Коперник изложил свои идеи в сочинении «Commentariolus» («Малый комментарий»), в котором сформулировал основные положения гелиоцентрической системы мира в виде 6 аксиом. Их смысл состоит в том, что Земля, как и другие планеты,'
|
||||||
|
'Родился 19 февраля 1473 года в Торуне в семье купца. После смерти отца воспитывался у дяди, епископа Вармийской епархии. Коперник изложил свои идеи в сочинении «Commentariolus» («Малый комментарий»), в котором сформулировал основные положения гелиоцентрической системы мира в виде 6 аксиом. Их смысл состоит в том, что Земля, как и другие планеты,',
|
||||||
|
maxLines: 99,
|
||||||
|
type: Regular14px(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildImage() {
|
||||||
|
// final imageBytes =
|
||||||
|
// isAnswer ? ticket.answerImage : ticket.questionImage;
|
||||||
|
|
||||||
|
return Wif(
|
||||||
|
condition: true, // imageBytes != null,
|
||||||
|
builder:
|
||||||
|
(context) => Padding(
|
||||||
|
padding: const EdgeInsets.only(right: 8).r,
|
||||||
|
child: SizedBox.square(
|
||||||
|
dimension: 100.r,
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: BorderRadius.circular(8).r,
|
||||||
|
// child: Image.memory(imageBytes!, fit: BoxFit.cover),
|
||||||
|
child: Image.network(
|
||||||
|
'https://avatars.mds.yandex.net/i?id=56429b65e9098a58fcd538387d43bcbb_l-5384017-images-thumbs&n=13',
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user