From a007e53aae432a4bd5d6319d3ccfc294ddd68e57 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 20 Nov 2024 12:11:37 +0300 Subject: [PATCH 1/6] fix(blogPost): create --- .../blog_post_create_cubit.dart | 28 + .../blog_post_create_state.dart | 16 + .../blog_post_create_state.freezed.dart | 608 ++++++++++++++++++ .../pages/blog_post_create_screen.dart | 128 ++-- .../repositories/blog_post_repository.dart | 32 + .../repositories/blog_repository.dart | 0 .../services/blog_post_service.dart | 8 +- .../services/blog_post_service.g.dart | 20 +- lib/locator_service.dart | 6 + 9 files changed, 756 insertions(+), 90 deletions(-) create mode 100644 lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart create mode 100644 lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.dart create mode 100644 lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.freezed.dart create mode 100644 lib/features/blog_post_create/repositories/blog_post_repository.dart delete mode 100644 lib/features/blog_post_create/repositories/blog_repository.dart diff --git a/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart b/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart new file mode 100644 index 00000000..e66401f2 --- /dev/null +++ b/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart @@ -0,0 +1,28 @@ +import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.dart'; +import 'package:eatvio_app/features/blog_post_create/repositories/blog_post_repository.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_image_compress/flutter_image_compress.dart'; + +class BlogPostCreateCubit extends Cubit { + final BlogPostRepository blogPostRepository; + + BlogPostCreateCubit({ + required this.blogPostRepository, + }) : super(BlogPostCreateState()); + + createBlogPost({ + String? title, + String? youtubeURL, + String? description, + XFile? image, + }) async { + emit(BlogPostCreateState.loading()); + await blogPostRepository.createBlogPost( + title, + youtubeURL, + description, + image, + ); + emit(BlogPostCreateState.loaded()); + } +} diff --git a/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.dart b/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.dart new file mode 100644 index 00000000..05919499 --- /dev/null +++ b/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.dart @@ -0,0 +1,16 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'blog_post_create_state.freezed.dart'; + +@freezed +abstract class BlogPostCreateState with _$BlogPostCreateState { + const factory BlogPostCreateState() = _BlogPostCreateState; + + const factory BlogPostCreateState.loading() = BlogPostCreateStateLoading; + + const factory BlogPostCreateState.loaded() = BlogPostCreateStateLoaded; + + const factory BlogPostCreateState.error({ + required String errorMessage, + }) = BlogPostCreateStateError; +} diff --git a/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.freezed.dart b/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.freezed.dart new file mode 100644 index 00000000..d9a702c6 --- /dev/null +++ b/lib/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.freezed.dart @@ -0,0 +1,608 @@ +// 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 'blog_post_create_state.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(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 _$BlogPostCreateState { + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String errorMessage) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String errorMessage)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult map( + TResult Function(_BlogPostCreateState value) $default, { + required TResult Function(BlogPostCreateStateLoading value) loading, + required TResult Function(BlogPostCreateStateLoaded value) loaded, + required TResult Function(BlogPostCreateStateError value) error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_BlogPostCreateState value)? $default, { + TResult? Function(BlogPostCreateStateLoading value)? loading, + TResult? Function(BlogPostCreateStateLoaded value)? loaded, + TResult? Function(BlogPostCreateStateError value)? error, + }) => + throw _privateConstructorUsedError; + @optionalTypeArgs + TResult maybeMap( + TResult Function(_BlogPostCreateState value)? $default, { + TResult Function(BlogPostCreateStateLoading value)? loading, + TResult Function(BlogPostCreateStateLoaded value)? loaded, + TResult Function(BlogPostCreateStateError value)? error, + required TResult orElse(), + }) => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $BlogPostCreateStateCopyWith<$Res> { + factory $BlogPostCreateStateCopyWith( + BlogPostCreateState value, $Res Function(BlogPostCreateState) then) = + _$BlogPostCreateStateCopyWithImpl<$Res, BlogPostCreateState>; +} + +/// @nodoc +class _$BlogPostCreateStateCopyWithImpl<$Res, $Val extends BlogPostCreateState> + implements $BlogPostCreateStateCopyWith<$Res> { + _$BlogPostCreateStateCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + /// Create a copy of BlogPostCreateState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc +abstract class _$$BlogPostCreateStateImplCopyWith<$Res> { + factory _$$BlogPostCreateStateImplCopyWith(_$BlogPostCreateStateImpl value, + $Res Function(_$BlogPostCreateStateImpl) then) = + __$$BlogPostCreateStateImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$BlogPostCreateStateImplCopyWithImpl<$Res> + extends _$BlogPostCreateStateCopyWithImpl<$Res, _$BlogPostCreateStateImpl> + implements _$$BlogPostCreateStateImplCopyWith<$Res> { + __$$BlogPostCreateStateImplCopyWithImpl(_$BlogPostCreateStateImpl _value, + $Res Function(_$BlogPostCreateStateImpl) _then) + : super(_value, _then); + + /// Create a copy of BlogPostCreateState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$BlogPostCreateStateImpl implements _BlogPostCreateState { + const _$BlogPostCreateStateImpl(); + + @override + String toString() { + return 'BlogPostCreateState()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BlogPostCreateStateImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String errorMessage) error, + }) { + return $default(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String errorMessage)? error, + }) { + return $default?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_BlogPostCreateState value) $default, { + required TResult Function(BlogPostCreateStateLoading value) loading, + required TResult Function(BlogPostCreateStateLoaded value) loaded, + required TResult Function(BlogPostCreateStateError value) error, + }) { + return $default(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_BlogPostCreateState value)? $default, { + TResult? Function(BlogPostCreateStateLoading value)? loading, + TResult? Function(BlogPostCreateStateLoaded value)? loaded, + TResult? Function(BlogPostCreateStateError value)? error, + }) { + return $default?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_BlogPostCreateState value)? $default, { + TResult Function(BlogPostCreateStateLoading value)? loading, + TResult Function(BlogPostCreateStateLoaded value)? loaded, + TResult Function(BlogPostCreateStateError value)? error, + required TResult orElse(), + }) { + if ($default != null) { + return $default(this); + } + return orElse(); + } +} + +abstract class _BlogPostCreateState implements BlogPostCreateState { + const factory _BlogPostCreateState() = _$BlogPostCreateStateImpl; +} + +/// @nodoc +abstract class _$$BlogPostCreateStateLoadingImplCopyWith<$Res> { + factory _$$BlogPostCreateStateLoadingImplCopyWith( + _$BlogPostCreateStateLoadingImpl value, + $Res Function(_$BlogPostCreateStateLoadingImpl) then) = + __$$BlogPostCreateStateLoadingImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$BlogPostCreateStateLoadingImplCopyWithImpl<$Res> + extends _$BlogPostCreateStateCopyWithImpl<$Res, + _$BlogPostCreateStateLoadingImpl> + implements _$$BlogPostCreateStateLoadingImplCopyWith<$Res> { + __$$BlogPostCreateStateLoadingImplCopyWithImpl( + _$BlogPostCreateStateLoadingImpl _value, + $Res Function(_$BlogPostCreateStateLoadingImpl) _then) + : super(_value, _then); + + /// Create a copy of BlogPostCreateState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$BlogPostCreateStateLoadingImpl implements BlogPostCreateStateLoading { + const _$BlogPostCreateStateLoadingImpl(); + + @override + String toString() { + return 'BlogPostCreateState.loading()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BlogPostCreateStateLoadingImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String errorMessage) error, + }) { + return loading(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loading?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_BlogPostCreateState value) $default, { + required TResult Function(BlogPostCreateStateLoading value) loading, + required TResult Function(BlogPostCreateStateLoaded value) loaded, + required TResult Function(BlogPostCreateStateError value) error, + }) { + return loading(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_BlogPostCreateState value)? $default, { + TResult? Function(BlogPostCreateStateLoading value)? loading, + TResult? Function(BlogPostCreateStateLoaded value)? loaded, + TResult? Function(BlogPostCreateStateError value)? error, + }) { + return loading?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_BlogPostCreateState value)? $default, { + TResult Function(BlogPostCreateStateLoading value)? loading, + TResult Function(BlogPostCreateStateLoaded value)? loaded, + TResult Function(BlogPostCreateStateError value)? error, + required TResult orElse(), + }) { + if (loading != null) { + return loading(this); + } + return orElse(); + } +} + +abstract class BlogPostCreateStateLoading implements BlogPostCreateState { + const factory BlogPostCreateStateLoading() = _$BlogPostCreateStateLoadingImpl; +} + +/// @nodoc +abstract class _$$BlogPostCreateStateLoadedImplCopyWith<$Res> { + factory _$$BlogPostCreateStateLoadedImplCopyWith( + _$BlogPostCreateStateLoadedImpl value, + $Res Function(_$BlogPostCreateStateLoadedImpl) then) = + __$$BlogPostCreateStateLoadedImplCopyWithImpl<$Res>; +} + +/// @nodoc +class __$$BlogPostCreateStateLoadedImplCopyWithImpl<$Res> + extends _$BlogPostCreateStateCopyWithImpl<$Res, + _$BlogPostCreateStateLoadedImpl> + implements _$$BlogPostCreateStateLoadedImplCopyWith<$Res> { + __$$BlogPostCreateStateLoadedImplCopyWithImpl( + _$BlogPostCreateStateLoadedImpl _value, + $Res Function(_$BlogPostCreateStateLoadedImpl) _then) + : super(_value, _then); + + /// Create a copy of BlogPostCreateState + /// with the given fields replaced by the non-null parameter values. +} + +/// @nodoc + +class _$BlogPostCreateStateLoadedImpl implements BlogPostCreateStateLoaded { + const _$BlogPostCreateStateLoadedImpl(); + + @override + String toString() { + return 'BlogPostCreateState.loaded()'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BlogPostCreateStateLoadedImpl); + } + + @override + int get hashCode => runtimeType.hashCode; + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String errorMessage) error, + }) { + return loaded(); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String errorMessage)? error, + }) { + return loaded?.call(); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_BlogPostCreateState value) $default, { + required TResult Function(BlogPostCreateStateLoading value) loading, + required TResult Function(BlogPostCreateStateLoaded value) loaded, + required TResult Function(BlogPostCreateStateError value) error, + }) { + return loaded(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_BlogPostCreateState value)? $default, { + TResult? Function(BlogPostCreateStateLoading value)? loading, + TResult? Function(BlogPostCreateStateLoaded value)? loaded, + TResult? Function(BlogPostCreateStateError value)? error, + }) { + return loaded?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_BlogPostCreateState value)? $default, { + TResult Function(BlogPostCreateStateLoading value)? loading, + TResult Function(BlogPostCreateStateLoaded value)? loaded, + TResult Function(BlogPostCreateStateError value)? error, + required TResult orElse(), + }) { + if (loaded != null) { + return loaded(this); + } + return orElse(); + } +} + +abstract class BlogPostCreateStateLoaded implements BlogPostCreateState { + const factory BlogPostCreateStateLoaded() = _$BlogPostCreateStateLoadedImpl; +} + +/// @nodoc +abstract class _$$BlogPostCreateStateErrorImplCopyWith<$Res> { + factory _$$BlogPostCreateStateErrorImplCopyWith( + _$BlogPostCreateStateErrorImpl value, + $Res Function(_$BlogPostCreateStateErrorImpl) then) = + __$$BlogPostCreateStateErrorImplCopyWithImpl<$Res>; + @useResult + $Res call({String errorMessage}); +} + +/// @nodoc +class __$$BlogPostCreateStateErrorImplCopyWithImpl<$Res> + extends _$BlogPostCreateStateCopyWithImpl<$Res, + _$BlogPostCreateStateErrorImpl> + implements _$$BlogPostCreateStateErrorImplCopyWith<$Res> { + __$$BlogPostCreateStateErrorImplCopyWithImpl( + _$BlogPostCreateStateErrorImpl _value, + $Res Function(_$BlogPostCreateStateErrorImpl) _then) + : super(_value, _then); + + /// Create a copy of BlogPostCreateState + /// with the given fields replaced by the non-null parameter values. + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? errorMessage = null, + }) { + return _then(_$BlogPostCreateStateErrorImpl( + errorMessage: null == errorMessage + ? _value.errorMessage + : errorMessage // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$BlogPostCreateStateErrorImpl implements BlogPostCreateStateError { + const _$BlogPostCreateStateErrorImpl({required this.errorMessage}); + + @override + final String errorMessage; + + @override + String toString() { + return 'BlogPostCreateState.error(errorMessage: $errorMessage)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$BlogPostCreateStateErrorImpl && + (identical(other.errorMessage, errorMessage) || + other.errorMessage == errorMessage)); + } + + @override + int get hashCode => Object.hash(runtimeType, errorMessage); + + /// Create a copy of BlogPostCreateState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + @override + @pragma('vm:prefer-inline') + _$$BlogPostCreateStateErrorImplCopyWith<_$BlogPostCreateStateErrorImpl> + get copyWith => __$$BlogPostCreateStateErrorImplCopyWithImpl< + _$BlogPostCreateStateErrorImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when( + TResult Function() $default, { + required TResult Function() loading, + required TResult Function() loaded, + required TResult Function(String errorMessage) error, + }) { + return error(errorMessage); + } + + @override + @optionalTypeArgs + TResult? whenOrNull( + TResult? Function()? $default, { + TResult? Function()? loading, + TResult? Function()? loaded, + TResult? Function(String errorMessage)? error, + }) { + return error?.call(errorMessage); + } + + @override + @optionalTypeArgs + TResult maybeWhen( + TResult Function()? $default, { + TResult Function()? loading, + TResult Function()? loaded, + TResult Function(String errorMessage)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(errorMessage); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map( + TResult Function(_BlogPostCreateState value) $default, { + required TResult Function(BlogPostCreateStateLoading value) loading, + required TResult Function(BlogPostCreateStateLoaded value) loaded, + required TResult Function(BlogPostCreateStateError value) error, + }) { + return error(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull( + TResult? Function(_BlogPostCreateState value)? $default, { + TResult? Function(BlogPostCreateStateLoading value)? loading, + TResult? Function(BlogPostCreateStateLoaded value)? loaded, + TResult? Function(BlogPostCreateStateError value)? error, + }) { + return error?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap( + TResult Function(_BlogPostCreateState value)? $default, { + TResult Function(BlogPostCreateStateLoading value)? loading, + TResult Function(BlogPostCreateStateLoaded value)? loaded, + TResult Function(BlogPostCreateStateError value)? error, + required TResult orElse(), + }) { + if (error != null) { + return error(this); + } + return orElse(); + } +} + +abstract class BlogPostCreateStateError implements BlogPostCreateState { + const factory BlogPostCreateStateError({required final String errorMessage}) = + _$BlogPostCreateStateErrorImpl; + + String get errorMessage; + + /// Create a copy of BlogPostCreateState + /// with the given fields replaced by the non-null parameter values. + @JsonKey(includeFromJson: false, includeToJson: false) + _$$BlogPostCreateStateErrorImplCopyWith<_$BlogPostCreateStateErrorImpl> + get copyWith => throw _privateConstructorUsedError; +} diff --git a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart index d41a1967..c09cbf94 100644 --- a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart +++ b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:io'; -import 'package:eatvio_app/old/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart'; +import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart'; +import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.dart'; +import 'package:eatvio_app/locator_service.dart'; import 'package:eatvio_app/theme/app_decoration.dart'; import 'package:eatvio_app/theme/theme_helper.dart'; import 'package:eatvio_app/widgets/custom_text_form_field.dart'; @@ -8,19 +10,27 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; +import 'package:go_router/go_router.dart'; import 'package:image_picker/image_picker.dart'; class BlogPostCreateScreen extends StatefulWidget { - const BlogPostCreateScreen({Key? key}) : super(key: key); + const BlogPostCreateScreen({ + Key? key, + }) : super(key: key); @override State createState() => _BlogPostCreateScreenState(); } class _BlogPostCreateScreenState extends State { - final blogPostCreateBloc = BlogPostCreateBloc(BlogPostCreateState())..add(BlogPostCreateInitialEvent()); + final blogPostCubit = sl(); bool shrinkImage = false; late StreamSubscription keyboardSubscription; + XFile? image; + final titleController = TextEditingController(); + final descriptionController = TextEditingController(); + final youtubeUrlController = TextEditingController(); + bool isLoading = false; @override void initState() { @@ -40,26 +50,15 @@ class _BlogPostCreateScreenState extends State { } Widget build(BuildContext context) { - return BlocProvider( - create: (BuildContext context) => blogPostCreateBloc, - child: BlocBuilder( - builder: (context, state) { - if (state is BlogPostCreateInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is BlogPostCreateLoadedState) { - // Данные загружены, можно строить экран. - return _buildBlogPostCreate(context, state); - } else if (state is BlogPostCreateErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. + return BlocProvider( + create: (BuildContext context) => blogPostCubit, + child: BlocListener( + listener: (BuildContext context, BlogPostCreateState state) { + if (state is BlogPostCreateStateLoaded) { + GoRouter.of(context).pop(); } }, + child: _buildBlogPostCreate(), ), ); } @@ -72,8 +71,8 @@ class _BlogPostCreateScreenState extends State { CupertinoActionSheetAction( onPressed: () async { final picker = ImagePicker(); - XFile? image = await picker.pickImage(source: ImageSource.camera); - if (image != null) blogPostCreateBloc.add(UploadImages(image)); + image = await picker.pickImage(source: ImageSource.camera); + setState(() {}); Navigator.of(context).pop(); }, child: const Row( @@ -87,8 +86,8 @@ class _BlogPostCreateScreenState extends State { CupertinoActionSheetAction( onPressed: () async { final picker = ImagePicker(); - XFile? image = await picker.pickImage(source: ImageSource.gallery); - if (image != null) blogPostCreateBloc.add(UploadImages(image)); + image = await picker.pickImage(source: ImageSource.gallery); + setState(() {}); Navigator.of(context).pop(); }, child: const Row( @@ -109,7 +108,7 @@ class _BlogPostCreateScreenState extends State { ); } - _buildBlogPostCreate(BuildContext context, BlogPostCreateLoadedState state) { + _buildBlogPostCreate() { return Scaffold( resizeToAvoidBottomInset: true, appBar: AppBar(), @@ -125,13 +124,27 @@ class _BlogPostCreateScreenState extends State { borderRadius: BorderRadius.circular(16), ), backgroundColor: appTheme.blueA400, - onPressed: () => _submitForm(context, state.title!.text, state.description!.text, state.youtubeURL!.text), - label: Text( - 'Создать', - style: TextStyle( - color: Colors.white, - ), - ), + label: isLoading + ? CircularProgressIndicator() + : Text( + 'Создать', + style: TextStyle( + color: Colors.white, + ), + ), + onPressed: isLoading + ? null + : () { + setState(() { + isLoading = true; + }); + blogPostCubit.createBlogPost( + title: titleController.text, + description: descriptionController.text, + youtubeURL: youtubeUrlController.text, + image: image, + ); + }, ), ), body: SingleChildScrollView( @@ -143,26 +156,26 @@ class _BlogPostCreateScreenState extends State { Text('Заголовок'), SizedBox(height: 8), CustomTextFormField( - controller: state.title, + controller: titleController, ), SizedBox(height: 16), Text('Описание'), SizedBox(height: 8), CustomTextFormField( - controller: state.description, + controller: descriptionController, maxLines: 6, minLines: 4, ), SizedBox(height: 16), - if (state.youtubeURL!.text.isEmpty) Text('Изображение поста'), - if (state.youtubeURL!.text.isEmpty) SizedBox(height: 8), - if (state.youtubeURL!.text.isEmpty) _buildAddPhoto(state), + if (youtubeUrlController.text.isEmpty) Text('Изображение поста'), + if (youtubeUrlController.text.isEmpty) SizedBox(height: 8), + if (youtubeUrlController.text.isEmpty) _buildAddPhoto(), SizedBox(height: 16), - if (state.image == null) Text('Ссылка на видео'), - if (state.image == null) SizedBox(height: 8), - if (state.image == null) + if (image == null) Text('Ссылка на видео'), + if (image == null) SizedBox(height: 8), + if (image == null) CustomTextFormField( - controller: state.youtubeURL, + controller: youtubeUrlController, ), SizedBox(height: 80), ], @@ -171,14 +184,14 @@ class _BlogPostCreateScreenState extends State { ); } - _buildAddPhoto(BlogPostCreateLoadedState state) { - bool isLoading = state.isLoading; - + _buildAddPhoto() { return GestureDetector( - onTap: addImage(context, isLoading), + onTap: () { + _showImagePicker(); + }, child: Stack( children: [ - if (state.image == null) + if (image == null) AnimatedContainer( height: shrinkImage ? 52 : 128, curve: Curves.easeIn, @@ -202,7 +215,7 @@ class _BlogPostCreateScreenState extends State { ], ), ), - if (state.image != null) + if (image != null) Container( width: shrinkImage ? 52 : MediaQuery.of(context).size.width - 32, child: ClipRRect( @@ -210,7 +223,7 @@ class _BlogPostCreateScreenState extends State { child: Image( image: FileImage( File( - state.image!.path, + image!.path, ), ), ), @@ -220,21 +233,4 @@ class _BlogPostCreateScreenState extends State { ), ); } - - addImage(BuildContext context, bool isLoading) { - if (!isLoading) { - return () { - _showImagePicker(); - }; - } - } -} - -_submitForm( - BuildContext context, - String title, - String description, - String youtubeURL, -) async { - context.read().add(CreateBlogPost()); } diff --git a/lib/features/blog_post_create/repositories/blog_post_repository.dart b/lib/features/blog_post_create/repositories/blog_post_repository.dart new file mode 100644 index 00000000..3c0e9c37 --- /dev/null +++ b/lib/features/blog_post_create/repositories/blog_post_repository.dart @@ -0,0 +1,32 @@ +import 'dart:io'; +import 'package:dio/dio.dart'; +import 'package:eatvio_app/core/image_compressing/image_compress_utility.dart'; +import 'package:eatvio_app/features/blog_post_create/services/blog_post_service.dart'; +import 'package:flutter_image_compress/flutter_image_compress.dart'; + +class BlogPostRepository { + final BlogPostService blogPostService; + + BlogPostRepository({ + required this.blogPostService, + }); + + Future createBlogPost( + String? title, + String? youtubeURL, + String? description, + XFile? image, + ) async { + FormData formData = FormData.fromMap({ + 'title': title, + 'description': description, + 'state': 'active', + 'youtube_url': youtubeURL, + 'image': image != null ? await MultipartFile.fromFile((await ImageCompressUtility.compressFile(File(image.path))).path, filename: image.name) : null, + }); + + return await blogPostService.createBlogPost( + formData: formData, + ); + } +} diff --git a/lib/features/blog_post_create/repositories/blog_repository.dart b/lib/features/blog_post_create/repositories/blog_repository.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/features/blog_post_create/services/blog_post_service.dart b/lib/features/blog_post_create/services/blog_post_service.dart index 33524124..8d09a84e 100644 --- a/lib/features/blog_post_create/services/blog_post_service.dart +++ b/lib/features/blog_post_create/services/blog_post_service.dart @@ -9,11 +9,7 @@ abstract class BlogPostService { @POST('/api/blogPosts/create') @MultiPart() - Future sendMessage({ - @Path() String? title, - @Path() required String state, - @Path() String? description, - @Part() String? youtube_url, - @Part(name: 'image', contentType: 'multipart/form-data') List? media_data, + Future createBlogPost({ + @Body() required FormData formData, }); } diff --git a/lib/features/blog_post_create/services/blog_post_service.g.dart b/lib/features/blog_post_create/services/blog_post_service.g.dart index b104b16e..de8f722f 100644 --- a/lib/features/blog_post_create/services/blog_post_service.g.dart +++ b/lib/features/blog_post_create/services/blog_post_service.g.dart @@ -22,27 +22,11 @@ class _BlogPostService implements BlogPostService { final ParseErrorLogger? errorLogger; @override - Future sendMessage({ - String? title, - required String state, - String? description, - String? youtube_url, - List? media_data, - }) async { + Future createBlogPost({required FormData formData}) async { final _extra = {}; final queryParameters = {}; - queryParameters.removeWhere((k, v) => v == null); final _headers = {}; - final _data = FormData(); - if (youtube_url != null) { - _data.fields.add(MapEntry( - 'youtube_url', - youtube_url, - )); - } - if (media_data != null) { - _data.files.addAll(media_data.map((i) => MapEntry('image', i))); - } + final _data = formData; final _options = _setStreamType(Options( method: 'POST', headers: _headers, diff --git a/lib/locator_service.dart b/lib/locator_service.dart index 8afebb45..cd75ebcc 100644 --- a/lib/locator_service.dart +++ b/lib/locator_service.dart @@ -3,6 +3,9 @@ import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/core/data/diet/repositories/diet_repository.dart'; import 'package:eatvio_app/core/data/diet/services/diet_service.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; +import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart'; +import 'package:eatvio_app/features/blog_post_create/repositories/blog_post_repository.dart'; +import 'package:eatvio_app/features/blog_post_create/services/blog_post_service.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart'; @@ -70,6 +73,7 @@ Future init() async { sl.registerFactory(() => RegisterConsultantCubit(consultantRepository: sl())); sl.registerFactory(() => DiaryCubit(diaryRepository: sl(), glossaryRepository: sl())); sl.registerFactory(() => AboutDietCubit(dietsRepository: sl())); + sl.registerFactory(() => BlogPostCreateCubit(blogPostRepository: sl())); // Repository sl.registerLazySingleton(() => ChatRepository(chatService: sl())); @@ -84,6 +88,7 @@ Future init() async { sl.registerLazySingleton(() => DiaryRepository(diaryService: sl())); sl.registerLazySingleton(() => GlossaryRepository(glossaryService: sl())); sl.registerLazySingleton(() => DietRepository(dietsService: sl())); + sl.registerLazySingleton(() => BlogPostRepository(blogPostService: sl())); // Services sl.registerLazySingleton(() => ChatService(sl())); @@ -98,6 +103,7 @@ Future init() async { sl.registerLazySingleton(() => DiaryService(sl())); sl.registerLazySingleton(() => GlossaryService(sl())); sl.registerLazySingleton(() => DietService(sl())); + sl.registerLazySingleton(() => BlogPostService(sl())); // External sl.registerLazySingleton( From 63dc72bd7a08fafdd104a3a325e19768c0d88074 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 20 Nov 2024 14:10:05 +0300 Subject: [PATCH 2/6] fix: remove old unused features and widgets --- lib/app_router.dart | 38 +- .../auth/auth_screen/auth_screen.dart | 0 .../auth/auth_screen/bloc/auth_bloc.dart | 2 +- .../auth/auth_screen/bloc/auth_event.dart | 0 .../auth/auth_screen/bloc/auth_state.dart | 0 .../auth/auth_screen/models/auth_model.dart | 0 .../pages/become_consultant_screen.dart | 2 +- .../repositories/profile_repository.dart | 4 +- .../bloc/diary_edit_state.dart | 185 ------- .../diary_edit_screen/diary_edit_screen.dart | 0 .../models/diary_edit_model.dart | 26 - .../bloc/diet_create_bloc.dart | 95 ---- .../bloc/diet_create_event.dart | 21 - .../bloc/diet_create_state.dart | 67 --- .../diet_create_screen.dart | 98 ---- .../models/diet_create_model.dart | 19 - .../diet_edit_screen/bloc/diet_edit_bloc.dart | 120 ----- .../bloc/diet_edit_event.dart | 21 - .../bloc/diet_edit_state.dart | 71 --- .../diet_edit_screen/diet_edit_screen.dart | 120 ----- .../models/diet_edit_model.dart | 19 - .../bloc/diet_select_bloc.dart | 71 --- .../bloc/diet_select_event.dart | 25 - .../bloc/diet_select_state.dart | 49 -- .../diet_select_screen.dart | 202 -------- .../models/diet_select_model.dart | 16 - .../diet_show_screen/bloc/diet_show_bloc.dart | 80 --- .../bloc/diet_show_event.dart | 25 - .../bloc/diet_show_state.dart | 53 -- .../diet_show_screen/diet_show_screen.dart | 147 ------ .../models/diet_show_model.dart | 19 - .../bloc/blog_post_create_bloc.dart | 103 ---- .../bloc/blog_post_create_event.dart | 30 -- .../bloc/blog_post_create_state.dart | 87 ---- .../models/blog_post_create_model.dart | 19 - .../bloc/blog_post_edit_bloc.dart | 121 ----- .../bloc/blog_post_edit_event.dart | 21 - .../bloc/blog_post_edit_state.dart | 71 --- .../blog_post_edit_screen.dart | 139 ------ .../models/blog_post_edit_model.dart | 19 - .../models/blog_post_model.dart | 22 - .../models/comment_model.dart | 27 - .../widgets/comment_widget.dart | 113 ----- .../feed_screen/widgets/feed_scroll_item.dart | 23 - .../feed_screen/widgets/feed_search_view.dart | 152 ------ .../bloc/glossary_screen_bloc.dart | 131 ----- .../bloc/glossary_screen_event.dart | 34 -- .../bloc/glossary_screen_state.dart | 67 --- .../glossary_screen/glossary_screen.dart | 355 ------------- .../models/glossary_screen_model.dart | 17 - .../widgets/glossary_scroll_item.dart | 23 - .../widgets/glossary_search_widget.dart | 152 ------ .../bloc/plan_create_bloc.dart | 95 ---- .../bloc/plan_create_event.dart | 21 - .../bloc/plan_create_state.dart | 67 --- .../models/plan_create_model.dart | 19 - .../plan_create_screen.dart | 98 ---- .../plan_edit_screen/bloc/plan_edit_bloc.dart | 120 ----- .../bloc/plan_edit_event.dart | 21 - .../bloc/plan_edit_state.dart | 71 --- .../models/plan_edit_model.dart | 19 - .../plan_edit_screen/plan_edit_screen.dart | 120 ----- .../bloc/plan_select_bloc.dart | 68 --- .../bloc/plan_select_event.dart | 25 - .../bloc/plan_select_state.dart | 49 -- .../models/plan_select_model.dart | 16 - .../plan_select_screen.dart | 202 -------- .../plan_show_screen/bloc/plan_show_bloc.dart | 80 --- .../bloc/plan_show_event.dart | 25 - .../bloc/plan_show_state.dart | 53 -- .../models/plan_show_model.dart | 19 - .../plan_show_screen/plan_show_screen.dart | 146 ------ .../bloc/my_profile_bloc.dart | 294 ----------- .../bloc/my_profile_event.dart | 25 - .../bloc/my_profile_state.dart | 216 -------- .../models/my_profile_model.dart | 16 - .../my_profile_screen/my_settings_screen.dart | 202 -------- .../bloc/recipe_edit_bloc.dart | 225 --------- .../bloc/recipe_edit_event.dart | 44 -- .../bloc/recipe_edit_state.dart | 91 ---- .../models/recipe_edit_model.dart | 19 - .../recipe_edit_screen.dart | 460 ----------------- .../bloc/recipe_select_bloc.dart | 65 --- .../bloc/recipe_select_event.dart | 25 - .../bloc/recipe_select_state.dart | 49 -- .../models/recipe_select_model.dart | 16 - .../recipe_select_screen.dart | 201 -------- .../bloc/subscribers_bloc.dart | 66 --- .../bloc/subscribers_event.dart | 16 - .../bloc/subscribers_state.dart | 49 -- .../models/subscribers_model.dart | 16 - .../subscribers_screen.dart | 217 -------- lib/widgets/custom_expandable_list.dart | 466 ------------------ lib/widgets/custom_hyper_switch.dart | 59 --- lib/widgets/custom_hypo_switch.dart | 59 --- test/auth_test.dart | 6 +- 96 files changed, 9 insertions(+), 7548 deletions(-) rename lib/{old => features}/auth/auth_screen/auth_screen.dart (100%) rename lib/{old => features}/auth/auth_screen/bloc/auth_bloc.dart (89%) rename lib/{old => features}/auth/auth_screen/bloc/auth_event.dart (100%) rename lib/{old => features}/auth/auth_screen/bloc/auth_state.dart (100%) rename lib/{old => features}/auth/auth_screen/models/auth_model.dart (100%) delete mode 100644 lib/old/diary/diary_edit_screen/bloc/diary_edit_state.dart delete mode 100644 lib/old/diary/diary_edit_screen/diary_edit_screen.dart delete mode 100644 lib/old/diary/diary_edit_screen/models/diary_edit_model.dart delete mode 100644 lib/old/diets/diet_create_screen/bloc/diet_create_bloc.dart delete mode 100644 lib/old/diets/diet_create_screen/bloc/diet_create_event.dart delete mode 100644 lib/old/diets/diet_create_screen/bloc/diet_create_state.dart delete mode 100644 lib/old/diets/diet_create_screen/diet_create_screen.dart delete mode 100644 lib/old/diets/diet_create_screen/models/diet_create_model.dart delete mode 100644 lib/old/diets/diet_edit_screen/bloc/diet_edit_bloc.dart delete mode 100644 lib/old/diets/diet_edit_screen/bloc/diet_edit_event.dart delete mode 100644 lib/old/diets/diet_edit_screen/bloc/diet_edit_state.dart delete mode 100644 lib/old/diets/diet_edit_screen/diet_edit_screen.dart delete mode 100644 lib/old/diets/diet_edit_screen/models/diet_edit_model.dart delete mode 100644 lib/old/diets/diet_select_screen/bloc/diet_select_bloc.dart delete mode 100644 lib/old/diets/diet_select_screen/bloc/diet_select_event.dart delete mode 100644 lib/old/diets/diet_select_screen/bloc/diet_select_state.dart delete mode 100644 lib/old/diets/diet_select_screen/diet_select_screen.dart delete mode 100644 lib/old/diets/diet_select_screen/models/diet_select_model.dart delete mode 100644 lib/old/diets/diet_show_screen/bloc/diet_show_bloc.dart delete mode 100644 lib/old/diets/diet_show_screen/bloc/diet_show_event.dart delete mode 100644 lib/old/diets/diet_show_screen/bloc/diet_show_state.dart delete mode 100644 lib/old/diets/diet_show_screen/diet_show_screen.dart delete mode 100644 lib/old/diets/diet_show_screen/models/diet_show_model.dart delete mode 100644 lib/old/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart delete mode 100644 lib/old/feed/blog_post_create_screen/bloc/blog_post_create_event.dart delete mode 100644 lib/old/feed/blog_post_create_screen/bloc/blog_post_create_state.dart delete mode 100644 lib/old/feed/blog_post_create_screen/models/blog_post_create_model.dart delete mode 100644 lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart delete mode 100644 lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_event.dart delete mode 100644 lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_state.dart delete mode 100644 lib/old/feed/blog_post_edit_screen/blog_post_edit_screen.dart delete mode 100644 lib/old/feed/blog_post_edit_screen/models/blog_post_edit_model.dart delete mode 100644 lib/old/feed/blog_post_screen/models/blog_post_model.dart delete mode 100644 lib/old/feed/blog_post_screen/models/comment_model.dart delete mode 100644 lib/old/feed/blog_post_screen/widgets/comment_widget.dart delete mode 100644 lib/old/feed/feed_screen/widgets/feed_scroll_item.dart delete mode 100644 lib/old/feed/feed_screen/widgets/feed_search_view.dart delete mode 100644 lib/old/glossary/glossary_screen/bloc/glossary_screen_bloc.dart delete mode 100644 lib/old/glossary/glossary_screen/bloc/glossary_screen_event.dart delete mode 100644 lib/old/glossary/glossary_screen/bloc/glossary_screen_state.dart delete mode 100644 lib/old/glossary/glossary_screen/glossary_screen.dart delete mode 100644 lib/old/glossary/glossary_screen/models/glossary_screen_model.dart delete mode 100644 lib/old/glossary/glossary_screen/widgets/glossary_scroll_item.dart delete mode 100644 lib/old/glossary/glossary_screen/widgets/glossary_search_widget.dart delete mode 100644 lib/old/plans/plan_create_screen/bloc/plan_create_bloc.dart delete mode 100644 lib/old/plans/plan_create_screen/bloc/plan_create_event.dart delete mode 100644 lib/old/plans/plan_create_screen/bloc/plan_create_state.dart delete mode 100644 lib/old/plans/plan_create_screen/models/plan_create_model.dart delete mode 100644 lib/old/plans/plan_create_screen/plan_create_screen.dart delete mode 100644 lib/old/plans/plan_edit_screen/bloc/plan_edit_bloc.dart delete mode 100644 lib/old/plans/plan_edit_screen/bloc/plan_edit_event.dart delete mode 100644 lib/old/plans/plan_edit_screen/bloc/plan_edit_state.dart delete mode 100644 lib/old/plans/plan_edit_screen/models/plan_edit_model.dart delete mode 100644 lib/old/plans/plan_edit_screen/plan_edit_screen.dart delete mode 100644 lib/old/plans/plan_select_screen/bloc/plan_select_bloc.dart delete mode 100644 lib/old/plans/plan_select_screen/bloc/plan_select_event.dart delete mode 100644 lib/old/plans/plan_select_screen/bloc/plan_select_state.dart delete mode 100644 lib/old/plans/plan_select_screen/models/plan_select_model.dart delete mode 100644 lib/old/plans/plan_select_screen/plan_select_screen.dart delete mode 100644 lib/old/plans/plan_show_screen/bloc/plan_show_bloc.dart delete mode 100644 lib/old/plans/plan_show_screen/bloc/plan_show_event.dart delete mode 100644 lib/old/plans/plan_show_screen/bloc/plan_show_state.dart delete mode 100644 lib/old/plans/plan_show_screen/models/plan_show_model.dart delete mode 100644 lib/old/plans/plan_show_screen/plan_show_screen.dart delete mode 100644 lib/old/profile/my_profile_screen/bloc/my_profile_bloc.dart delete mode 100644 lib/old/profile/my_profile_screen/bloc/my_profile_event.dart delete mode 100644 lib/old/profile/my_profile_screen/bloc/my_profile_state.dart delete mode 100644 lib/old/profile/my_profile_screen/models/my_profile_model.dart delete mode 100644 lib/old/profile/my_profile_screen/my_settings_screen.dart delete mode 100644 lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart delete mode 100644 lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_event.dart delete mode 100644 lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_state.dart delete mode 100644 lib/old/recipe/recipe_edit_screen/models/recipe_edit_model.dart delete mode 100644 lib/old/recipe/recipe_edit_screen/recipe_edit_screen.dart delete mode 100644 lib/old/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart delete mode 100644 lib/old/recipe/recipe_select_screen/bloc/recipe_select_event.dart delete mode 100644 lib/old/recipe/recipe_select_screen/bloc/recipe_select_state.dart delete mode 100644 lib/old/recipe/recipe_select_screen/models/recipe_select_model.dart delete mode 100644 lib/old/recipe/recipe_select_screen/recipe_select_screen.dart delete mode 100644 lib/old/users/subscribers_screen/bloc/subscribers_bloc.dart delete mode 100644 lib/old/users/subscribers_screen/bloc/subscribers_event.dart delete mode 100644 lib/old/users/subscribers_screen/bloc/subscribers_state.dart delete mode 100644 lib/old/users/subscribers_screen/models/subscribers_model.dart delete mode 100644 lib/old/users/subscribers_screen/subscribers_screen.dart delete mode 100644 lib/widgets/custom_expandable_list.dart delete mode 100644 lib/widgets/custom_hyper_switch.dart delete mode 100644 lib/widgets/custom_hypo_switch.dart diff --git a/lib/app_router.dart b/lib/app_router.dart index 457c532c..ad931701 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -1,5 +1,6 @@ import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; import 'package:eatvio_app/core/token_storage.dart'; +import 'package:eatvio_app/features/auth/auth_screen/auth_screen.dart'; import 'package:eatvio_app/features/blog_post/presentation/pages/blog_post_screen.dart'; import 'package:eatvio_app/features/blog_post_create/presentation/pages/blog_post_create_screen.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart'; @@ -34,13 +35,6 @@ import 'package:eatvio_app/features/settings/presentation/pages/physical_activit import 'package:eatvio_app/features/settings/presentation/pages/physical_form_screen.dart'; import 'package:eatvio_app/features/settings/presentation/pages/pressure_screen.dart'; import 'package:eatvio_app/features/settings/presentation/pages/settings_screen.dart'; -import 'package:eatvio_app/old/auth/auth_screen/auth_screen.dart'; -import 'package:eatvio_app/old/diets/diet_create_screen/diet_create_screen.dart'; -import 'package:eatvio_app/old/diets/diet_select_screen/diet_select_screen.dart'; -import 'package:eatvio_app/old/glossary/glossary_screen/glossary_screen.dart'; -import 'package:eatvio_app/old/plans/plan_select_screen/plan_select_screen.dart'; -import 'package:eatvio_app/old/profile/my_profile_screen/my_settings_screen.dart'; -import 'package:eatvio_app/old/recipe/recipe_select_screen/recipe_select_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; @@ -227,11 +221,6 @@ class AppRouter { ), ], ), - GoRoute( - path: '/my-settings-screen', - name: 'mySettingsScreen', - builder: (context, state) => MySettingsScreen.builder(context), - ), GoRoute( path: '/become-consultant-screen', name: 'becomeConsultantScreen', @@ -242,36 +231,11 @@ class AppRouter { name: 'stepperBecomeConsultantScreen', builder: (context, state) => StepperBecomeConsultantScreen(), ), - GoRoute( - path: '/recipe-select-screen', - name: 'recipeSelectScreen', - builder: (context, state) => RecipeSelectScreen.builder(context), - ), - GoRoute( - path: '/diet-select-screen', - name: 'dietSelectScreen', - builder: (context, state) => DietSelectScreen.builder(context), - ), - GoRoute( - path: '/diet-create-screen', - name: 'dietCreateScreen', - builder: (context, state) => DietCreateScreen.builder(context), - ), - GoRoute( - path: '/plan-select-screen', - name: 'planSelectScreen', - builder: (context, state) => PlanSelectScreen.builder(context), - ), GoRoute( path: '/calendar-screen', name: 'calendarScreen', builder: (context, state) => CalendarScreen(), ), - GoRoute( - path: '/glossary-screen', - name: 'glossaryScreen', - builder: (context, state) => GlossaryScreen.builder(context), - ), GoRoute( path: '/photo-view-screen/:index', name: 'photoViewScreen', diff --git a/lib/old/auth/auth_screen/auth_screen.dart b/lib/features/auth/auth_screen/auth_screen.dart similarity index 100% rename from lib/old/auth/auth_screen/auth_screen.dart rename to lib/features/auth/auth_screen/auth_screen.dart diff --git a/lib/old/auth/auth_screen/bloc/auth_bloc.dart b/lib/features/auth/auth_screen/bloc/auth_bloc.dart similarity index 89% rename from lib/old/auth/auth_screen/bloc/auth_bloc.dart rename to lib/features/auth/auth_screen/bloc/auth_bloc.dart index f75da299..f2df813c 100644 --- a/lib/old/auth/auth_screen/bloc/auth_bloc.dart +++ b/lib/features/auth/auth_screen/bloc/auth_bloc.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/old/auth/auth_screen/models/auth_model.dart'; +import 'package:eatvio_app/features/auth/auth_screen/models/auth_model.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/old/auth/auth_screen/bloc/auth_event.dart b/lib/features/auth/auth_screen/bloc/auth_event.dart similarity index 100% rename from lib/old/auth/auth_screen/bloc/auth_event.dart rename to lib/features/auth/auth_screen/bloc/auth_event.dart diff --git a/lib/old/auth/auth_screen/bloc/auth_state.dart b/lib/features/auth/auth_screen/bloc/auth_state.dart similarity index 100% rename from lib/old/auth/auth_screen/bloc/auth_state.dart rename to lib/features/auth/auth_screen/bloc/auth_state.dart diff --git a/lib/old/auth/auth_screen/models/auth_model.dart b/lib/features/auth/auth_screen/models/auth_model.dart similarity index 100% rename from lib/old/auth/auth_screen/models/auth_model.dart rename to lib/features/auth/auth_screen/models/auth_model.dart diff --git a/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart index c2807492..c125ac1d 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart @@ -25,7 +25,7 @@ class _BecomeConsultantScreenState extends State { body: Padding( padding: const EdgeInsets.all(16), child: Text( - ' Чтобы стать консультантом необходимо пройти короткую регистрацию. Подготовьте свои дипломы и/или сертификаты в формате jpg, они Вам пригодятся для проверки и подтверждения. Также необходимо будет указать ссылки на Ваши соц. сети и указать тип лица (физ. лицо или юр. лицо). На данный момент доступна регистрация в качестве физ. лица.\n\n Внутри Итвио разница между обычным пользователем и консультантом заключается в дополнительных возможностях последнего создавать публичные диеты, рецепты и планы питания; участвовать в ежемесячных рейтингах.', + 'Чтобы стать консультантом необходимо пройти короткую регистрацию. Подготовьте свои дипломы и/или сертификаты в формате jpg, они Вам пригодятся для проверки и подтверждения. Также необходимо будет указать ссылки на Ваши соц. сети и указать тип лица (физ. лицо или юр. лицо). На данный момент доступна регистрация в качестве физ. лица.\n\nВнутри Итвио разница между обычным пользователем и консультантом заключается в дополнительных возможностях последнего создавать публичные диеты, рецепты и планы питания; участвовать в ежемесячных рейтингах.', style: TextStyle( fontSize: 16, ), diff --git a/lib/features/profile/repositories/profile_repository.dart b/lib/features/profile/repositories/profile_repository.dart index 58b31442..d423fbfa 100644 --- a/lib/features/profile/repositories/profile_repository.dart +++ b/lib/features/profile/repositories/profile_repository.dart @@ -7,7 +7,9 @@ import 'package:eatvio_app/features/profile/services/profile_service.dart'; class ProfileRepository { final ProfileService profileService; - ProfileRepository({required this.profileService}); + ProfileRepository({ + required this.profileService, + }); Future getProfileBySlug(String slug) async { try { diff --git a/lib/old/diary/diary_edit_screen/bloc/diary_edit_state.dart b/lib/old/diary/diary_edit_screen/bloc/diary_edit_state.dart deleted file mode 100644 index 78ed499f..00000000 --- a/lib/old/diary/diary_edit_screen/bloc/diary_edit_state.dart +++ /dev/null @@ -1,185 +0,0 @@ -// ignore_for_file: must_be_immutable - -/*part of '../../../../features/diary/presentation/bloc/diary_bloc.dart'; - -class DiaryEditState extends Equatable { - const DiaryEditState({this.diaryEditModelObj}); - - final DiaryEditModel? diaryEditModelObj; - - @override - List get props => [diaryEditModelObj]; -} - -class DiaryEditInitialState extends DiaryEditState { - DiaryEditInitialState({required DiaryEditModel diaryEditModelObj}) : super(diaryEditModelObj: diaryEditModelObj); -} - -/// Represents the state of DiaryEdit in the application. -class DiaryEditLoadedState extends DiaryEditState { - DiaryEditLoadedState({ - this.diaryEditModelObj, - this.diaryDate, - this.token, - this.meals, - this.portions, - this.photos, - this.autocompleteList, - this.wakeupController, - this.retireController, - this.commentController, - this.mealTimeController, - this.portionController, - this.productNameController, - this.productQuantityController, - this.selectedMood, - this.currentMeal, - this.caloriesController, - this.fatsController, - this.proteinsController, - this.carbsController, - this.isLoading = false, - this.isAdded = false, - required this.recommendedChartValues, - required this.consumedChartValues, - required this.diaryId, - required this.selectedSatiety, - required this.moderationExpanded, - required this.wakeupExpanded, - required this.moodExpanded, - }) : super(diaryEditModelObj: null); - - DiaryEditModel? diaryEditModelObj; - String? diaryDate; - String? token; - List? meals; - List? portions; - List? photos; - List? autocompleteList; - List recommendedChartValues; - List consumedChartValues; - SelectionPopupModel? currentMeal; - SelectionPopupModel? portionController; - TimeOfDay? wakeupController; - TimeOfDay? retireController; - TimeOfDay? mealTimeController; - TextEditingController? commentController; - TextEditingController? productNameController; - TextEditingController? productQuantityController; - TextEditingController? caloriesController; - TextEditingController? fatsController; - TextEditingController? proteinsController; - TextEditingController? carbsController; - int? selectedMood; - int selectedSatiety; - int diaryId; - bool wakeupExpanded; - bool moderationExpanded; - bool moodExpanded; - bool isLoading; - bool isAdded; - @override - List get props => [ - diaryEditModelObj, - diaryDate, - token, - meals, - portions, - photos, - recommendedChartValues, - consumedChartValues, - autocompleteList, - wakeupController, - retireController, - mealTimeController, - commentController, - productNameController, - productQuantityController, - portionController, - caloriesController, - fatsController, - proteinsController, - carbsController, - selectedMood, - selectedSatiety, - diaryId, - wakeupExpanded, - moodExpanded, - moderationExpanded, - isLoading, - isAdded, - currentMeal, - ]; - DiaryEditLoadedState copyWith({ - DiaryEditModel? diaryEditModelObj, - SelectionPopupModel? currentMeal, - SelectionPopupModel? portionController, - String? diaryDate, - String? token, - List? recommendedChartValues, - List? consumedChartValues, - List? meals, - List? portions, - List? photos, - List? autocompleteList, - TimeOfDay? wakeupController, - TimeOfDay? retireController, - TimeOfDay? mealTimeController, - TextEditingController? commentController, - TextEditingController? productNameController, - TextEditingController? productQuantityController, - TextEditingController? caloriesController, - TextEditingController? fatsController, - TextEditingController? proteinsController, - TextEditingController? carbsController, - int? selectedMood, - int? selectedSatiety, - int? diaryId, - bool? wakeupExpanded, - bool? moderationExpanded, - bool? moodExpanded, - bool? isLoading, - bool? isAdded, - }) { - return DiaryEditLoadedState( - diaryEditModelObj: diaryEditModelObj ?? this.diaryEditModelObj, - diaryDate: diaryDate ?? this.diaryDate, - token: token ?? this.token, - meals: meals ?? this.meals, - photos: photos ?? this.photos, - autocompleteList: autocompleteList ?? this.autocompleteList, - portions: portions ?? this.portions, - recommendedChartValues: recommendedChartValues ?? this.recommendedChartValues, - consumedChartValues: consumedChartValues ?? this.consumedChartValues, - wakeupController: wakeupController ?? this.wakeupController, - retireController: retireController ?? this.retireController, - mealTimeController: mealTimeController ?? this.mealTimeController, - commentController: commentController ?? this.commentController, - portionController: portionController ?? this.portionController, - productNameController: productNameController ?? this.productNameController, - productQuantityController: productQuantityController ?? this.productQuantityController, - selectedMood: selectedMood ?? this.selectedMood, - selectedSatiety: selectedSatiety ?? this.selectedSatiety, - diaryId: diaryId ?? this.diaryId, - currentMeal: currentMeal ?? this.currentMeal, - caloriesController: caloriesController ?? this.caloriesController, - fatsController: fatsController ?? this.fatsController, - proteinsController: proteinsController ?? this.proteinsController, - carbsController: carbsController ?? this.carbsController, - wakeupExpanded: wakeupExpanded ?? this.wakeupExpanded, - moderationExpanded: moderationExpanded ?? this.moderationExpanded, - moodExpanded: moodExpanded ?? this.moodExpanded, - isAdded: isAdded ?? this.isAdded, - isLoading: isLoading ?? this.isLoading, - ); - } -} - -class DiaryEditErrorState extends DiaryEditState { - final String errorMessage; - - const DiaryEditErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -}*/ diff --git a/lib/old/diary/diary_edit_screen/diary_edit_screen.dart b/lib/old/diary/diary_edit_screen/diary_edit_screen.dart deleted file mode 100644 index e69de29b..00000000 diff --git a/lib/old/diary/diary_edit_screen/models/diary_edit_model.dart b/lib/old/diary/diary_edit_screen/models/diary_edit_model.dart deleted file mode 100644 index 5c58eff0..00000000 --- a/lib/old/diary/diary_edit_screen/models/diary_edit_model.dart +++ /dev/null @@ -1,26 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [k0_page], -/// and is typically used to hold data that is passed between different parts of the application. -class DiaryEditModel extends Equatable { - DiaryEditModel({this.mealList = const [], this.portionList = const []}); - - List mealList; - List? portionList; - - DiaryEditModel copyWith({ - List? mealList, - List? portionList, - }) { - return DiaryEditModel( - mealList: mealList ?? this.mealList, - portionList: portionList ?? this.portionList, - ); - } - - @override - List get props => [mealList, portionList]; -} diff --git a/lib/old/diets/diet_create_screen/bloc/diet_create_bloc.dart b/lib/old/diets/diet_create_screen/bloc/diet_create_bloc.dart deleted file mode 100644 index e574c5bc..00000000 --- a/lib/old/diets/diet_create_screen/bloc/diet_create_bloc.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/diets/diet_create_screen/models/diet_create_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'diet_create_event.dart'; -part 'diet_create_state.dart'; - -/// A bloc that manages the state of a DietCreate according to the event that is dispatched to it. -class DietCreateBloc extends Bloc { - DietCreateBloc(DietCreateState initialState) : super(initialState) { - on(_onInitialize); - on(_createDiet); - } - - _onInitialize( - DietCreateInitialEvent event, - Emitter emit, - ) async { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - if (state is DietCreateLoadedState) { - var currentState = state as DietCreateLoadedState; - emit( - currentState.copyWith( - dietModelObj: currentState.dietModelObj, - name: currentState.name, - details: currentState.details, - ), - ); - } else { - emit( - DietCreateLoadedState( - name: TextEditingController(), - details: TextEditingController(), - ), - ); - } - } - - FutureOr _createDiet( - CreateDiet event, - Emitter emit, - ) async { - if (state is DietCreateLoadedState) { - var currentState = state as DietCreateLoadedState; - - var response = await sendDiet( - currentState.name?.text, - currentState.details?.text, - ); - - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed('dietSelectScreen'); - } - } - } - - FutureOr sendDiet( - String? name, - String? details, - ) async { - String url = '${baseUrl}/api/diets/create'; - - final Map credentials = { - 'name': name, - 'details': details, - 'duration': '14', - 'state': 'active', - 'type': '{"meat": true}', - 'daily_schedule': - '{"1": {"lunch": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 494}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 12}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 432}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 195}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 710}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "grams", "quantity": 119}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 287}], "snacks": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 445}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "grams", "quantity": 500}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 764}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 735}], "breakfast": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 127}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 89}]}, "2": {"lunch": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 436}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 700}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 766}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 194}], "dinner": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 426}], "snacks": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 58}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 152}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 925}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 224}], "breakfast": [{"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 918}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 81}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 308}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 579}]}, "3": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 266}], "dinner": [{"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 790}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 26}], "snacks": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 549}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 446}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "grams", "quantity": 406}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 92}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 403}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 894}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 457}]}, "4": {"lunch": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 698}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 43}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 994}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 965}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 42}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 948}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 28}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 54}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 112}], "supper": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 891}], "breakfast": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 538}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 635}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "pcs", "quantity": 586}]}, "5": {"lunch": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 900}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "milliliters", "quantity": 242}], "dinner": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 375}], "snacks": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 604}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 510}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 887}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 554}], "supper": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 731}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 574}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 274}], "breakfast": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 276}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 80}]}, "6": {"lunch": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 359}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 358}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 639}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 861}], "dinner": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 124}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 122}], "snacks": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 980}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 837}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 444}], "supper": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 577}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 706}], "breakfast": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 839}]}, "7": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 118}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 664}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 665}], "dinner": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 986}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 296}], "snacks": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 807}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 493}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "milliliters", "quantity": 227}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 385}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 448}], "breakfast": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 784}]}, "8": {"lunch": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 433}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 871}], "dinner": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 332}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 41}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 388}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 649}], "supper": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 114}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "milliliters", "quantity": 968}], "breakfast": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 180}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 269}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 998}]}, "9": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 68}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 505}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 554}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 579}], "snacks": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 751}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 144}], "supper": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 677}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 263}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "pcs", "quantity": 304}], "breakfast": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 963}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 258}]}, "10": {"lunch": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 167}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 306}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 243}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 79}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 560}], "snacks": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 294}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 145}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 639}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 108}], "supper": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 924}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 894}], "breakfast": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 280}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 336}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 338}]}, "11": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 817}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 968}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 525}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 864}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 457}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 548}], "snacks": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 658}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 239}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 358}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 406}], "supper": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "grams", "quantity": 416}], "breakfast": [{"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 220}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 323}]}, "12": {"lunch": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 377}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 138}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 654}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 237}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 902}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 76}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 723}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 481}], "breakfast": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 571}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 515}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 188}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 411}]}, "13": {"lunch": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 379}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 231}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 376}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 147}], "dinner": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 871}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 679}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 359}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 561}], "snacks": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 414}], "supper": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 827}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 649}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 363}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 161}], "breakfast": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 185}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 464}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 387}]}, "14": {"lunch": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 248}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 5}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 693}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 655}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 709}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 881}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 588}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 36}], "snacks": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 453}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 692}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 186}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 721}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 740}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 731}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 842}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 850}]}, "15": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 124}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 380}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 211}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 689}], "dinner": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 326}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 629}], "snacks": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 201}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 129}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 749}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 315}], "breakfast": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 444}]}, "16": {"lunch": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 953}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 101}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 684}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 506}], "dinner": [{"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 333}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 416}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 796}], "snacks": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 799}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 799}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 756}], "supper": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 858}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 619}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 800}], "breakfast": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 363}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 539}]}, "17": {"lunch": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 134}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 977}], "snacks": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 211}], "supper": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 209}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "grams", "quantity": 227}], "breakfast": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 195}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 917}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 706}]}, "18": {"lunch": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "pcs", "quantity": 296}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 239}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 798}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 155}], "dinner": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 959}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 958}], "snacks": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 984}], "supper": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 134}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 432}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 242}]}, "19": {"lunch": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 906}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 152}], "dinner": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 610}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 605}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 498}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 616}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 512}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 146}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 200}], "supper": [{"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 764}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 353}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 181}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 783}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 506}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 887}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 130}]}, "20": {"lunch": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 48}], "dinner": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 266}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 143}], "snacks": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 55}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 174}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 855}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 6}], "supper": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 296}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 878}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 376}], "breakfast": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 442}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 528}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "milliliters", "quantity": 558}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 885}]}, "21": {"lunch": [{"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 504}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 652}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 996}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 200}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 641}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 87}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 689}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 143}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 528}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 475}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 924}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 98}], "breakfast": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 438}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 383}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 462}]}}', - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } -} diff --git a/lib/old/diets/diet_create_screen/bloc/diet_create_event.dart b/lib/old/diets/diet_create_screen/bloc/diet_create_event.dart deleted file mode 100644 index a346af77..00000000 --- a/lib/old/diets/diet_create_screen/bloc/diet_create_event.dart +++ /dev/null @@ -1,21 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_create_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///DietCreate widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class DietCreateEvent extends Equatable {} - -/// Event that is dispatched when the DietCreate widget is first created. -class DietCreateInitialEvent extends DietCreateEvent { - @override - List get props => []; -} - -class CreateDiet extends DietCreateEvent { - @override - List get props => []; -} diff --git a/lib/old/diets/diet_create_screen/bloc/diet_create_state.dart b/lib/old/diets/diet_create_screen/bloc/diet_create_state.dart deleted file mode 100644 index e063a438..00000000 --- a/lib/old/diets/diet_create_screen/bloc/diet_create_state.dart +++ /dev/null @@ -1,67 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_create_bloc.dart'; - -/// Represents the state of DietCreate in the application. -/// - -class DietCreateState extends Equatable { - DietCreateState({ - this.dietModelObj, - }); - - DietCreateModel? dietModelObj; - - @override - List get props => [dietModelObj]; - - DietCreateState copyWith({DietCreateModel? dietModelObj}) { - return DietCreateState( - dietModelObj: dietModelObj ?? this.dietModelObj, - ); - } -} - -class DietCreateLoadedState extends DietCreateState { - DietCreateLoadedState({ - this.dietModelObj, - this.name, - this.details, - }); - - DietCreateModel? dietModelObj; - TextEditingController? name; - TextEditingController? details; - - @override - List get props => [ - dietModelObj, - name, - details, - ]; - - DietCreateLoadedState copyWith({ - DietCreateModel? dietModelObj, - TextEditingController? name, - TextEditingController? details, - }) { - return DietCreateLoadedState( - dietModelObj: dietModelObj ?? this.dietModelObj, - name: name ?? this.name, - details: details ?? this.details, - ); - } -} - -class DietCreateErrorState extends DietCreateState { - final String errorMessage; - - DietCreateErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class DietCreateInitialState extends DietCreateState { - DietCreateInitialState({required DietCreateModel dietModelObj}) : super(dietModelObj: dietModelObj); -} diff --git a/lib/old/diets/diet_create_screen/diet_create_screen.dart b/lib/old/diets/diet_create_screen/diet_create_screen.dart deleted file mode 100644 index d04fff59..00000000 --- a/lib/old/diets/diet_create_screen/diet_create_screen.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'bloc/diet_create_bloc.dart'; -import 'models/diet_create_model.dart'; - -class DietCreateScreen extends StatelessWidget { - const DietCreateScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - final dietID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => DietCreateBloc(DietCreateState(dietModelObj: DietCreateModel(dietID: dietID.toString())))..add(DietCreateInitialEvent()), - child: DietCreateScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is DietCreateInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is DietCreateLoadedState) { - // Данные загружены, можно строить экран. - return _buildDietCreate(context, state); - } else if (state is DietCreateErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildDietCreate(BuildContext context, DietCreateLoadedState state) { - return SafeArea( - child: Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: ListView( - children: [ - const SizedBox(height: 30), - Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(height: 16.0), - TextFormField( - controller: state.name, - decoration: InputDecoration(labelText: 'Заголовок'), - ), - const SizedBox(height: 16.0), - TextFormField( - controller: state.details, - decoration: InputDecoration(labelText: 'Описание'), - ), - const SizedBox(height: 16.0), - // Здесь нужно добавить виджет для загрузки картинки - ElevatedButton( - onPressed: () => context.read().add(CreateDiet()), - child: Text('Создать'), - ), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/old/diets/diet_create_screen/models/diet_create_model.dart b/lib/old/diets/diet_create_screen/models/diet_create_model.dart deleted file mode 100644 index 955e8d63..00000000 --- a/lib/old/diets/diet_create_screen/models/diet_create_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [diet_create_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class DietCreateModel extends Equatable { - final String dietID; - - DietCreateModel({required String dietID}) : dietID = dietID; - - DietCreateModel copyWith(String dietID) { - return DietCreateModel(dietID: dietID); - } - - @override - List get props => [dietID]; -} diff --git a/lib/old/diets/diet_edit_screen/bloc/diet_edit_bloc.dart b/lib/old/diets/diet_edit_screen/bloc/diet_edit_bloc.dart deleted file mode 100644 index 84fe86c8..00000000 --- a/lib/old/diets/diet_edit_screen/bloc/diet_edit_bloc.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/diets/diet_edit_screen/models/diet_edit_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'diet_edit_event.dart'; -part 'diet_edit_state.dart'; - -/// A bloc that manages the state of a DietEdit according to the event that is dispatched to it. -class DietEditBloc extends Bloc { - DietEditBloc(DietEditState initialState) : super(initialState) { - on(_onInitialize); - on(_editDiet); - } - - _onInitialize( - DietEditInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final String? dietID = state.dietModelObj?.dietID; - final response = await http.get( - Uri.parse(baseUrl + '/api/diets/show/$dietID'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map) { - if (state is DietEditLoadedState) { - var currentState = state as DietEditLoadedState; - emit( - currentState.copyWith( - dietModelObj: currentState.dietModelObj, - diet: currentState.diet, - name: currentState.name, - duration: currentState.duration, - details: currentState.details, - ), - ); - } else { - emit( - DietEditLoadedState( - diet: data, - name: TextEditingController(text: data['name']), - details: TextEditingController(text: data['details']), - duration: TextEditingController(text: data['duration']), - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(DietEditErrorState('Некоторые необходимые данные отсутствуют.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(DietEditErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(DietEditErrorState('Ошибка при получении данных о чатах: $e')); - } - } - - FutureOr _editDiet(EditDiet event, Emitter emit) async { - if (state is DietEditLoadedState) { - var currentState = state as DietEditLoadedState; - int duration = int.parse(currentState.duration!.text) * 7; - - var response = await sendDiet(currentState.diet, currentState.name?.text, currentState.details?.text, duration.toString()); - - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed( - 'dietScreen', - extra: currentState.diet?['id'].toString(), - ); - } else {} - } - } - - FutureOr sendDiet( - Map? diet, - String? name, - String? details, - String? duration, - ) async { - int id = diet?['id']; - String url = '${baseUrl}/api/diets/update/$id'; - - final Map credentials = { - 'id': id, - 'name': name, - 'details': details, - 'duration': '14', - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } -} diff --git a/lib/old/diets/diet_edit_screen/bloc/diet_edit_event.dart b/lib/old/diets/diet_edit_screen/bloc/diet_edit_event.dart deleted file mode 100644 index b2184444..00000000 --- a/lib/old/diets/diet_edit_screen/bloc/diet_edit_event.dart +++ /dev/null @@ -1,21 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_edit_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///DietEdit widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class DietEditEvent extends Equatable {} - -/// Event that is dispatched when the DietEdit widget is first created. -class DietEditInitialEvent extends DietEditEvent { - @override - List get props => []; -} - -class EditDiet extends DietEditEvent { - @override - List get props => []; -} diff --git a/lib/old/diets/diet_edit_screen/bloc/diet_edit_state.dart b/lib/old/diets/diet_edit_screen/bloc/diet_edit_state.dart deleted file mode 100644 index 4673ea13..00000000 --- a/lib/old/diets/diet_edit_screen/bloc/diet_edit_state.dart +++ /dev/null @@ -1,71 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_edit_bloc.dart'; - -/// Represents the state of DietEdit in the application. -/// - -class DietEditState extends Equatable { - DietEditState({ - this.dietModelObj, - }); - - DietEditModel? dietModelObj; - - @override - List get props => [dietModelObj]; - - DietEditState copyWith({DietEditModel? dietModelObj}) { - return DietEditState( - dietModelObj: dietModelObj ?? this.dietModelObj, - ); - } -} - -class DietEditLoadedState extends DietEditState { - DietEditLoadedState({ - this.dietModelObj, - this.diet, - this.name, - this.details, - this.duration, - }); - - DietEditModel? dietModelObj; - Map? diet; - TextEditingController? name; - TextEditingController? details; - TextEditingController? duration; - - @override - List get props => [dietModelObj, diet, name, details, duration]; - - DietEditLoadedState copyWith({ - DietEditModel? dietModelObj, - Map? diet, - TextEditingController? name, - TextEditingController? details, - TextEditingController? duration, - }) { - return DietEditLoadedState( - dietModelObj: dietModelObj ?? this.dietModelObj, - diet: diet ?? this.diet, - name: name ?? this.name, - details: details ?? this.details, - duration: duration ?? this.duration, - ); - } -} - -class DietEditErrorState extends DietEditState { - final String errorMessage; - - DietEditErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class DietEditInitialState extends DietEditState { - DietEditInitialState({required DietEditModel dietModelObj}) : super(dietModelObj: dietModelObj); -} diff --git a/lib/old/diets/diet_edit_screen/diet_edit_screen.dart b/lib/old/diets/diet_edit_screen/diet_edit_screen.dart deleted file mode 100644 index 57b857b0..00000000 --- a/lib/old/diets/diet_edit_screen/diet_edit_screen.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/diet_edit_bloc.dart'; -import 'models/diet_edit_model.dart'; - -class DietEditScreen extends StatelessWidget { - const DietEditScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - final dietID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => DietEditBloc(DietEditState(dietModelObj: DietEditModel(dietID: dietID.toString())))..add(DietEditInitialEvent()), - child: DietEditScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is DietEditInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is DietEditLoadedState) { - // Данные загружены, можно строить экран. - return _buildDietEdit(context, state); - } else if (state is DietEditErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildDietEdit(BuildContext context, DietEditLoadedState state) { - return SafeArea( - child: Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: ListView( - children: [ - SizedBox(height: 30), - Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (state.diet?['image'] ?? ''), - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.name, - decoration: InputDecoration(labelText: 'Заголовок'), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.details, - decoration: InputDecoration(labelText: 'Описание'), - ), - SizedBox(height: 16.0), - // Здесь нужно добавить виджет для загрузки картинки - ElevatedButton( - onPressed: () => context.read().add(EditDiet()), - child: Text('Сохранить'), - ), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/old/diets/diet_edit_screen/models/diet_edit_model.dart b/lib/old/diets/diet_edit_screen/models/diet_edit_model.dart deleted file mode 100644 index 8c02d1b1..00000000 --- a/lib/old/diets/diet_edit_screen/models/diet_edit_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [diet_edit_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class DietEditModel extends Equatable { - final String dietID; - - DietEditModel({required String dietID}) : dietID = dietID; - - DietEditModel copyWith(String dietID) { - return DietEditModel(dietID: dietID); - } - - @override - List get props => [dietID]; -} diff --git a/lib/old/diets/diet_select_screen/bloc/diet_select_bloc.dart b/lib/old/diets/diet_select_screen/bloc/diet_select_bloc.dart deleted file mode 100644 index 6ce9ec1b..00000000 --- a/lib/old/diets/diet_select_screen/bloc/diet_select_bloc.dart +++ /dev/null @@ -1,71 +0,0 @@ -//import 'package:eatvio_app/old/auth/auth_screen/auth_screen.dart'; -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/diets/diet_select_screen/models/diet_select_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; -import 'package:image_picker/image_picker.dart'; - -part 'diet_select_event.dart'; -part 'diet_select_state.dart'; - -/// A bloc that manages the state of a DietSelect according to the event that is dispatched to it. -class DietSelectBloc extends Bloc { - DietSelectBloc(DietSelectState initialState) : super(initialState) { - on(_onInitialize); - } - - Future _onInitialize( - DietSelectInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final response = await http.get( - Uri.parse(baseUrl + '/api/diets/index'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is List) { - if (state is DietSelectLoadedState) { - var currentState = state as DietSelectLoadedState; - emit( - (currentState).copyWith( - posts: data, - myProfileModelObj: currentState.myProfileModelObj, - ), - ); - } else { - emit( - DietSelectLoadedState( - posts: data, - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(DietSelectErrorState('Неверный формат ответа API.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(DietSelectErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(DietSelectErrorState('Ошибка при получении данных ленты: $e')); - } - } -} diff --git a/lib/old/diets/diet_select_screen/bloc/diet_select_event.dart b/lib/old/diets/diet_select_screen/bloc/diet_select_event.dart deleted file mode 100644 index 75a889b6..00000000 --- a/lib/old/diets/diet_select_screen/bloc/diet_select_event.dart +++ /dev/null @@ -1,25 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_select_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///DietSelect widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class DietSelectEvent extends Equatable {} - -/// Event that is dispatched when the DietSelect widget is first created. -class DietSelectInitialEvent extends DietSelectEvent { - @override - List get props => []; -} - -class UploadAvatar extends DietSelectEvent { - UploadAvatar(this.image); - - final XFile image; - - @override - List get props => [image]; -} diff --git a/lib/old/diets/diet_select_screen/bloc/diet_select_state.dart b/lib/old/diets/diet_select_screen/bloc/diet_select_state.dart deleted file mode 100644 index 64014819..00000000 --- a/lib/old/diets/diet_select_screen/bloc/diet_select_state.dart +++ /dev/null @@ -1,49 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_select_bloc.dart'; - -class DietSelectState extends Equatable { - const DietSelectState({this.myProfileModelObj}); - - final DietSelectModel? myProfileModelObj; - - @override - List get props => [myProfileModelObj]; -} - -class DietSelectInitialState extends DietSelectState { - DietSelectInitialState({required DietSelectModel myProfileModelObj}) : super(myProfileModelObj: myProfileModelObj); -} - -/// Represents the state of DietSelect in the application. -class DietSelectLoadedState extends DietSelectState { - DietSelectLoadedState({this.myProfileModelObj, this.posts}) : super(myProfileModelObj: null); - - DietSelectModel? myProfileModelObj; - List? posts; - - @override - List get props => [ - myProfileModelObj, - posts, - ]; - - DietSelectLoadedState copyWith({ - DietSelectModel? myProfileModelObj, - List? posts, - }) { - return DietSelectLoadedState( - myProfileModelObj: myProfileModelObj ?? this.myProfileModelObj, - posts: posts ?? this.posts, - ); - } -} - -class DietSelectErrorState extends DietSelectState { - final String errorMessage; - - const DietSelectErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} diff --git a/lib/old/diets/diet_select_screen/diet_select_screen.dart b/lib/old/diets/diet_select_screen/diet_select_screen.dart deleted file mode 100644 index b4e517c2..00000000 --- a/lib/old/diets/diet_select_screen/diet_select_screen.dart +++ /dev/null @@ -1,202 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_leading_image.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_subtitle.dart'; -import 'package:eatvio_app/widgets/app_bar/custom_app_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/diet_select_bloc.dart'; -import 'models/diet_select_model.dart'; - -class DietSelectScreen extends StatelessWidget { - static Widget builder(BuildContext context) { - return BlocProvider( - create: (context) => DietSelectBloc(DietSelectState(myProfileModelObj: DietSelectModel()))..add(DietSelectInitialEvent()), - child: DietSelectScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is DietSelectInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } else if (state is DietSelectLoadedState) { - // Данные загружены, можно строить экран. - return _buildSetingsScreen(context, state); - } else { - // Другие состояния, если они есть. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } - }, - ); - } - - _buildSetingsScreen(BuildContext context, DietSelectLoadedState state) { - return Scaffold( - appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, - ), - backgroundColor: Colors.grey[200], - resizeToAvoidBottomInset: true, - body: SingleChildScrollView( - child: Container( - width: double.maxFinite, - decoration: BoxDecoration(color: Colors.grey[200]), - child: Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: 10), - Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: CustomAppBar( - height: 54, - leadingWidth: 28, - leading: AppbarLeadingImage( - imagePath: ImageConstant.imgArrowLeft, - margin: EdgeInsets.only(left: 16, top: 15, bottom: 15), - onTap: () => GoRouter.of(context).pop(), - ), - title: Padding( - padding: EdgeInsets.only(left: 20), - child: Row( - children: [ - AppbarSubtitle( - text: "Диеты", - margin: EdgeInsets.only(left: 80, top: 12, bottom: 9), - ), - Spacer(), - Padding( - padding: const EdgeInsets.only(right: 20.0), - child: GestureDetector( - onTap: () => GoRouter.of(context).goNamed('dietCreateScreen'), - child: Icon(Icons.create_outlined), - ), - ), - ], - ), - ), - ), - ), - SizedBox(height: 20), - _buildDietList(context, state), - ], - ), - ), - ), - ), - ); - } - - _buildDietList(BuildContext context, DietSelectLoadedState state) { - return ListView.builder( - shrinkWrap: true, // Add this line - itemCount: state.posts?.length ?? 0, - itemBuilder: (context, index) { - final post = state.posts?[index]; - return Container( - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: ListTile( - leading: CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + post['image'], - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - title: Text( - post?['name'] ?? '', - style: CustomTextStyles.titleMediumSemiBold, - ), - subtitle: Text(post?['details'] ?? ''), - onTap: () => GoRouter.of(context).goNamed( - 'dietScreen', - extra: post?['id'].toString(), - ), - trailing: GestureDetector( - onTap: () => GoRouter.of(context).goNamed( - 'dietEditScreen', - extra: post?['id'].toString(), - ), - child: Icon(Icons.edit), - ), - ), - ); - }, - ); - } - - Function onTapBack(BuildContext context) { - return () { - onTapArrowLeft(context); - }; - } - - onTapArrowLeft(BuildContext context) { - GoRouter.of(context).pop(); - } -} diff --git a/lib/old/diets/diet_select_screen/models/diet_select_model.dart b/lib/old/diets/diet_select_screen/models/diet_select_model.dart deleted file mode 100644 index 5dcaa802..00000000 --- a/lib/old/diets/diet_select_screen/models/diet_select_model.dart +++ /dev/null @@ -1,16 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [k0_page], -/// and is typically used to hold data that is passed between different parts of the application. -class DietSelectModel extends Equatable { - DietSelectModel(); - - DietSelectModel copyWith() { - return DietSelectModel(); - } - - @override - List get props => []; -} diff --git a/lib/old/diets/diet_show_screen/bloc/diet_show_bloc.dart b/lib/old/diets/diet_show_screen/bloc/diet_show_bloc.dart deleted file mode 100644 index 91026abc..00000000 --- a/lib/old/diets/diet_show_screen/bloc/diet_show_bloc.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/diets/diet_show_screen/models/diet_show_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'diet_show_event.dart'; -part 'diet_show_state.dart'; - -/// A bloc that manages the state of a Diet according to the event that is dispatched to it. -class DietBloc extends Bloc { - DietBloc(DietState initialState) : super(initialState) { - on(_onInitialize); - on(_deleteEntry); - } - - _onInitialize( - DietInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final String? dietID = state.dietModelObj?.dietID; - final response = await http.get( - Uri.parse(baseUrl + '/api/diets/show/$dietID'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map) { - if (state is DietLoadedState) { - var currentState = state as DietLoadedState; - emit(currentState.copyWith(dietModelObj: currentState.dietModelObj, diet: currentState.diet)); - } else { - emit(DietLoadedState(diet: data)); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(DietErrorState('Некоторые необходимые данные отсутствуют.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(DietErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(DietErrorState('Ошибка при получении данных о чатах: $e')); - } - } - - FutureOr _deleteEntry(DeleteEntry event, Emitter emit) async { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final int id = event.id; - final response = await http.post( - Uri.parse(baseUrl + '/api/diets/delete/$id'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed('dietSelectScreen'); - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(DietErrorState('Ошибка: ${response.statusCode}')); - } - } -} diff --git a/lib/old/diets/diet_show_screen/bloc/diet_show_event.dart b/lib/old/diets/diet_show_screen/bloc/diet_show_event.dart deleted file mode 100644 index c79eaf3f..00000000 --- a/lib/old/diets/diet_show_screen/bloc/diet_show_event.dart +++ /dev/null @@ -1,25 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_show_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///Diet widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class DietEvent extends Equatable {} - -/// Event that is dispatched when the Diet widget is first created. -class DietInitialEvent extends DietEvent { - @override - List get props => []; -} - -class DeleteEntry extends DietEvent { - DeleteEntry(this.id); - - final int id; - - @override - List get props => [id]; -} diff --git a/lib/old/diets/diet_show_screen/bloc/diet_show_state.dart b/lib/old/diets/diet_show_screen/bloc/diet_show_state.dart deleted file mode 100644 index 32070c14..00000000 --- a/lib/old/diets/diet_show_screen/bloc/diet_show_state.dart +++ /dev/null @@ -1,53 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'diet_show_bloc.dart'; - -/// Represents the state of Diet in the application. -/// - -class DietState extends Equatable { - DietState({ - this.dietModelObj, - }); - - DietModel? dietModelObj; - - @override - List get props => [dietModelObj]; - - DietState copyWith({DietModel? dietModelObj}) { - return DietState( - dietModelObj: dietModelObj ?? this.dietModelObj, - ); - } -} - -class DietLoadedState extends DietState { - DietLoadedState({this.dietModelObj, this.diet}); - - DietModel? dietModelObj; - Map? diet; - - @override - List get props => [dietModelObj, diet]; - - DietLoadedState copyWith({DietModel? dietModelObj, Map? diet}) { - return DietLoadedState( - dietModelObj: dietModelObj ?? this.dietModelObj, - diet: diet ?? this.diet, - ); - } -} - -class DietErrorState extends DietState { - final String errorMessage; - - DietErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class DietInitialState extends DietState { - DietInitialState({required DietModel dietModelObj}) : super(dietModelObj: dietModelObj); -} diff --git a/lib/old/diets/diet_show_screen/diet_show_screen.dart b/lib/old/diets/diet_show_screen/diet_show_screen.dart deleted file mode 100644 index 4339ccbc..00000000 --- a/lib/old/diets/diet_show_screen/diet_show_screen.dart +++ /dev/null @@ -1,147 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/diet_show_bloc.dart'; -import 'models/diet_show_model.dart'; - -class DietScreen extends StatelessWidget { - const DietScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - final dietID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => DietBloc(DietState(dietModelObj: DietModel(dietID: dietID.toString())))..add(DietInitialEvent()), - child: DietScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is DietInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is DietLoadedState) { - // Данные загружены, можно строить экран. - return _buildDiet(context, state); - } else if (state is DietErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildDiet(BuildContext context, DietLoadedState state) { - return SafeArea( - child: Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: ListView( - children: [ - SizedBox(height: 30), - Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (state.diet?['image'] ?? ''), - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - SizedBox(height: 16.0), - Text(state.diet?['name'], style: CustomTextStyles.titleMediumBlack), - SizedBox(height: 8.0), - Text( - state.diet?['details'], - ), - SizedBox(height: 16.0), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - ElevatedButton( - onPressed: () => GoRouter.of(context).goNamed( - 'dietEditScreen', - extra: state.diet?['id'].toString(), - ), - child: Text('Редактировать'), - ), - ElevatedButton( - onPressed: () => context.read().add(DeleteEntry(state.diet?['id'])), - child: Text('Удалить'), - ), - ], - ), - ], - ), - ), - ], - ), - ), - ), - ); - } - - ///Handling page based on route - Widget getCurrentPage( - BuildContext context, - String currentRoute, - ) { - switch (currentRoute) { - case '/diet': - return DietScreen.builder(context); - default: - return DietScreen(); - } - } - - /// Navigates to the previous screen. - onTapArrowleftone(BuildContext context) { - GoRouter.of(context).pop(); - } -} diff --git a/lib/old/diets/diet_show_screen/models/diet_show_model.dart b/lib/old/diets/diet_show_screen/models/diet_show_model.dart deleted file mode 100644 index 803827f8..00000000 --- a/lib/old/diets/diet_show_screen/models/diet_show_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [diet_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class DietModel extends Equatable { - final String dietID; - - DietModel({required String dietID}) : dietID = dietID; - - DietModel copyWith(String dietID) { - return DietModel(dietID: dietID); - } - - @override - List get props => [dietID]; -} diff --git a/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart b/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart deleted file mode 100644 index 26bb0306..00000000 --- a/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_bloc.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:dio/dio.dart'; -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/image_compressing/image_compress_utility.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/old/feed/blog_post_create_screen/models/blog_post_create_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:image_picker/image_picker.dart'; - -part 'blog_post_create_event.dart'; -part 'blog_post_create_state.dart'; - -/// A bloc that manages the state of a BlogPostCreate according to the event that is dispatched to it. -class BlogPostCreateBloc extends Bloc { - BlogPostCreateBloc(BlogPostCreateState initialState) : super(initialState) { - on(_onInitialize); - on(_createBlogPost); - on(_uploadImages); - } - - _onInitialize( - BlogPostCreateInitialEvent event, - Emitter emit, - ) async { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - if (state is BlogPostCreateLoadedState) { - var currentState = state as BlogPostCreateLoadedState; - emit( - currentState.copyWith( - blog_postModelObj: currentState.blog_postModelObj, - title: currentState.title, - description: currentState.description, - youtubeURL: currentState.youtubeURL, - token: currentState.token, - ), - ); - } else { - emit( - BlogPostCreateLoadedState( - token: await TokenStorage.getTokenFromStorage(), - title: TextEditingController(), - description: TextEditingController(), - youtubeURL: TextEditingController(), - ), - ); - } - } - - FutureOr _createBlogPost( - CreateBlogPost event, - Emitter emit, - ) async { - if (state is BlogPostCreateLoadedState) { - var currentState = state as BlogPostCreateLoadedState; - - var response = await sendBlogPost( - currentState.title?.text, - currentState.youtubeURL?.text, - currentState.description?.text, - currentState.image, - ); - - if (response.statusCode == 200 || response.statusCode == 201) { - AppRouter.navigatorKey.currentContext?.goNamed('feedScreen'); - } else {} - } - } - - Future sendBlogPost(String? title, String? youtubeURL, String? description, XFile? image) async { - String url = baseUrl + '/api/blogPosts/create'; - - FormData formData = FormData.fromMap({ - 'title': title, - 'description': description, - 'state': 'active', - 'youtube_url': youtubeURL, - 'image': image != null ? await MultipartFile.fromFile((await ImageCompressUtility.compressFile(File(image.path))).path, filename: image.name) : null, - }); - - final response = await sl().post( - url, - data: formData, - ); - - return response; - } - - FutureOr _uploadImages(UploadImages event, Emitter emit) { - if (state is BlogPostCreateLoadedState) { - var currentState = state as BlogPostCreateLoadedState; - emit(currentState.copyWith(image: event.image)); - } - } -} diff --git a/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_event.dart b/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_event.dart deleted file mode 100644 index 6ce10caa..00000000 --- a/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_event.dart +++ /dev/null @@ -1,30 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'blog_post_create_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///BlogPostCreate widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class BlogPostCreateEvent extends Equatable {} - -/// Event that is dispatched when the BlogPostCreate widget is first created. -class BlogPostCreateInitialEvent extends BlogPostCreateEvent { - @override - List get props => []; -} - -class CreateBlogPost extends BlogPostCreateEvent { - @override - List get props => []; -} - -class UploadImages extends BlogPostCreateEvent { - UploadImages(this.image); - - final XFile image; - - @override - List get props => [image]; -} diff --git a/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_state.dart b/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_state.dart deleted file mode 100644 index 8e0c8e87..00000000 --- a/lib/old/feed/blog_post_create_screen/bloc/blog_post_create_state.dart +++ /dev/null @@ -1,87 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'blog_post_create_bloc.dart'; - -/// Represents the state of BlogPostCreate in the application. -/// - -class BlogPostCreateState extends Equatable { - BlogPostCreateState({ - this.blog_postModelObj, - }); - - BlogPostCreateModel? blog_postModelObj; - - @override - List get props => [blog_postModelObj]; - - BlogPostCreateState copyWith({BlogPostCreateModel? blog_postModelObj}) { - return BlogPostCreateState( - blog_postModelObj: blog_postModelObj ?? this.blog_postModelObj, - ); - } -} - -class BlogPostCreateLoadedState extends BlogPostCreateState { - BlogPostCreateLoadedState({ - this.token, - this.blog_postModelObj, - this.title, - this.description, - this.youtubeURL, - this.image, - this.isLoading = false, - }); - - BlogPostCreateModel? blog_postModelObj; - TextEditingController? title; - TextEditingController? description; - TextEditingController? youtubeURL; - String? token; - bool isLoading; - XFile? image; - - @override - List get props => [ - blog_postModelObj, - title, - description, - youtubeURL, - token, - image, - isLoading, - ]; - - BlogPostCreateLoadedState copyWith({ - BlogPostCreateModel? blog_postModelObj, - TextEditingController? title, - TextEditingController? description, - TextEditingController? youtubeURL, - String? token, - XFile? image, - bool isLoading = false, - }) { - return BlogPostCreateLoadedState( - blog_postModelObj: blog_postModelObj ?? this.blog_postModelObj, - title: title ?? this.title, - description: description ?? this.description, - youtubeURL: youtubeURL ?? this.youtubeURL, - token: token ?? this.token, - image: image ?? this.image, - isLoading: this.isLoading, - ); - } -} - -class BlogPostCreateErrorState extends BlogPostCreateState { - final String errorMessage; - - BlogPostCreateErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class BlogPostCreateInitialState extends BlogPostCreateState { - BlogPostCreateInitialState({required BlogPostCreateModel blog_postModelObj}) : super(blog_postModelObj: blog_postModelObj); -} diff --git a/lib/old/feed/blog_post_create_screen/models/blog_post_create_model.dart b/lib/old/feed/blog_post_create_screen/models/blog_post_create_model.dart deleted file mode 100644 index b571cef7..00000000 --- a/lib/old/feed/blog_post_create_screen/models/blog_post_create_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [blog_post_create_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class BlogPostCreateModel extends Equatable { - final String blog_postID; - - BlogPostCreateModel({required String blog_postID}) : blog_postID = blog_postID; - - BlogPostCreateModel copyWith(String blog_postID) { - return BlogPostCreateModel(blog_postID: blog_postID); - } - - @override - List get props => [blog_postID]; -} diff --git a/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart b/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart deleted file mode 100644 index 613fe6ec..00000000 --- a/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_bloc.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/feed/blog_post_edit_screen/models/blog_post_edit_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'blog_post_edit_event.dart'; -part 'blog_post_edit_state.dart'; - -/// A bloc that manages the state of a BlogPostEdit according to the event that is dispatched to it. -class BlogPostEditBloc extends Bloc { - BlogPostEditBloc(BlogPostEditState initialState) : super(initialState) { - on(_onInitialize); - on(_editBlogPost); - } - - _onInitialize( - BlogPostEditInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final String? blog_postID = state.blog_postModelObj?.blog_postID; - final response = await http.get( - Uri.parse(baseUrl + '/api/blogPosts/show/$blog_postID'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map) { - if (state is BlogPostEditLoadedState) { - var currentState = state as BlogPostEditLoadedState; - emit( - currentState.copyWith( - blog_postModelObj: currentState.blog_postModelObj, - blog_post: currentState.blog_post, - title: currentState.title, - description: currentState.description, - youtubeURL: currentState.youtubeURL, - ), - ); - } else { - emit( - BlogPostEditLoadedState( - blog_post: data, - title: TextEditingController(text: data['title']), - description: TextEditingController(text: data['description']), - youtubeURL: TextEditingController(text: data['youtubeURL']), - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(BlogPostEditErrorState('Некоторые необходимые данные отсутствуют.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(BlogPostEditErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(BlogPostEditErrorState('Ошибка при получении данных о чатах: $e')); - } - } - - FutureOr _editBlogPost(EditBlogPost event, Emitter emit) async { - if (state is BlogPostEditLoadedState) { - var currentState = state as BlogPostEditLoadedState; - - var response = await sendBlogPost( - currentState.blog_post, - currentState.title?.text, - currentState.youtubeURL?.text, - currentState.description?.text, - ); - - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed('blogPostScreen', extra: currentState.blog_post?['id'].toString()); - } else {} - } - } - - FutureOr sendBlogPost( - Map? blog_post, - String? title, - String? youtubeURL, - String? description, - ) async { - int id = blog_post?['id']; - String url = '${baseUrl}/api/feed/update/$id'; - - final Map credentials = { - 'id': id, - 'title': title, - 'description': description, - 'youtubeURL': youtubeURL, - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } -} diff --git a/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_event.dart b/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_event.dart deleted file mode 100644 index c8961556..00000000 --- a/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_event.dart +++ /dev/null @@ -1,21 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'blog_post_edit_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///BlogPostEdit widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class BlogPostEditEvent extends Equatable {} - -/// Event that is dispatched when the BlogPostEdit widget is first created. -class BlogPostEditInitialEvent extends BlogPostEditEvent { - @override - List get props => []; -} - -class EditBlogPost extends BlogPostEditEvent { - @override - List get props => []; -} diff --git a/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_state.dart b/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_state.dart deleted file mode 100644 index 3fa6f7bf..00000000 --- a/lib/old/feed/blog_post_edit_screen/bloc/blog_post_edit_state.dart +++ /dev/null @@ -1,71 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'blog_post_edit_bloc.dart'; - -/// Represents the state of BlogPostEdit in the application. -/// - -class BlogPostEditState extends Equatable { - BlogPostEditState({ - this.blog_postModelObj, - }); - - BlogPostEditModel? blog_postModelObj; - - @override - List get props => [blog_postModelObj]; - - BlogPostEditState copyWith({BlogPostEditModel? blog_postModelObj}) { - return BlogPostEditState( - blog_postModelObj: blog_postModelObj ?? this.blog_postModelObj, - ); - } -} - -class BlogPostEditLoadedState extends BlogPostEditState { - BlogPostEditLoadedState({ - this.blog_postModelObj, - this.blog_post, - this.title, - this.description, - this.youtubeURL, - }); - - BlogPostEditModel? blog_postModelObj; - Map? blog_post; - TextEditingController? title; - TextEditingController? description; - TextEditingController? youtubeURL; - - @override - List get props => [blog_postModelObj, blog_post, title, description, youtubeURL]; - - BlogPostEditLoadedState copyWith({ - BlogPostEditModel? blog_postModelObj, - Map? blog_post, - TextEditingController? title, - TextEditingController? description, - TextEditingController? youtubeURL, - }) { - return BlogPostEditLoadedState( - blog_postModelObj: blog_postModelObj ?? this.blog_postModelObj, - blog_post: blog_post ?? this.blog_post, - title: title ?? this.title, - description: description ?? this.description, - youtubeURL: youtubeURL ?? this.youtubeURL, - ); - } -} - -class BlogPostEditErrorState extends BlogPostEditState { - final String errorMessage; - - BlogPostEditErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class BlogPostEditInitialState extends BlogPostEditState { - BlogPostEditInitialState({required BlogPostEditModel blog_postModelObj}) : super(blog_postModelObj: blog_postModelObj); -} diff --git a/lib/old/feed/blog_post_edit_screen/blog_post_edit_screen.dart b/lib/old/feed/blog_post_edit_screen/blog_post_edit_screen.dart deleted file mode 100644 index 7669284a..00000000 --- a/lib/old/feed/blog_post_edit_screen/blog_post_edit_screen.dart +++ /dev/null @@ -1,139 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/blog_post_edit_bloc.dart'; -import 'models/blog_post_edit_model.dart'; - -class BlogPostEditScreen extends StatelessWidget { - const BlogPostEditScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context, blog_postID) { - return BlocProvider( - create: (context) => - BlogPostEditBloc(BlogPostEditState(blog_postModelObj: BlogPostEditModel(blog_postID: blog_postID.toString())))..add(BlogPostEditInitialEvent()), - child: BlogPostEditScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is BlogPostEditInitialState) { - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } else if (state is BlogPostEditLoadedState) { - // Данные загружены, можно строить экран. - return _buildBlogPostEdit(context, state); - } else if (state is BlogPostEditErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } - }, - ); - } - - _buildBlogPostEdit(BuildContext context, BlogPostEditLoadedState state) { - return Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: ListView( - children: [ - SizedBox(height: 30), - Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (state.blog_post?['image'] ?? ''), - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.title, - decoration: InputDecoration(labelText: 'Заголовок'), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.description, - decoration: InputDecoration(labelText: 'Описание'), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.youtubeURL, - decoration: InputDecoration(labelText: 'Ссылка'), - ), - SizedBox(height: 16.0), - // Здесь нужно добавить виджет для загрузки картинки - ElevatedButton( - onPressed: () => context.read().add(EditBlogPost()), - child: Text('Сохранить'), - ), - ], - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/old/feed/blog_post_edit_screen/models/blog_post_edit_model.dart b/lib/old/feed/blog_post_edit_screen/models/blog_post_edit_model.dart deleted file mode 100644 index f9ef98c2..00000000 --- a/lib/old/feed/blog_post_edit_screen/models/blog_post_edit_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [blog_post_edit_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class BlogPostEditModel extends Equatable { - final String blog_postID; - - BlogPostEditModel({required String blog_postID}) : blog_postID = blog_postID; - - BlogPostEditModel copyWith(String blog_postID) { - return BlogPostEditModel(blog_postID: blog_postID); - } - - @override - List get props => [blog_postID]; -} diff --git a/lib/old/feed/blog_post_screen/models/blog_post_model.dart b/lib/old/feed/blog_post_screen/models/blog_post_model.dart deleted file mode 100644 index 1230d998..00000000 --- a/lib/old/feed/blog_post_screen/models/blog_post_model.dart +++ /dev/null @@ -1,22 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:eatvio_app/old/feed/blog_post_screen/models/comment_model.dart'; -import 'package:equatable/equatable.dart'; - -class BlogPostModel extends Equatable { - final String blog_postID; - - BlogPostModel({required this.blog_postID, this.comments = const []}); - - List comments; - - BlogPostModel copyWith({String? blog_postID, List? comments}) { - return BlogPostModel( - blog_postID: blog_postID ?? this.blog_postID, - comments: comments ?? this.comments, - ); - } - - @override - List get props => [blog_postID, comments]; -} diff --git a/lib/old/feed/blog_post_screen/models/comment_model.dart b/lib/old/feed/blog_post_screen/models/comment_model.dart deleted file mode 100644 index f5bb4131..00000000 --- a/lib/old/feed/blog_post_screen/models/comment_model.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:eatvio_app/core/utils/image_constant.dart'; - -class CommentModel { - CommentModel({ - this.userImage, - this.username, - this.dateText, - this.greetingText, - required this.id, - }) { - userImage = userImage ?? ImageConstant.imageNotFound; - username = username; - dateText = dateText; - greetingText = greetingText; - id = id; - } - - String? userImage; - - String? username; - - String? dateText; - - String? greetingText; - - String id; -} diff --git a/lib/old/feed/blog_post_screen/widgets/comment_widget.dart b/lib/old/feed/blog_post_screen/widgets/comment_widget.dart deleted file mode 100644 index da9f5dfb..00000000 --- a/lib/old/feed/blog_post_screen/widgets/comment_widget.dart +++ /dev/null @@ -1,113 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/old/feed/blog_post_screen/models/comment_model.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_image_view.dart'; -import 'package:flutter/material.dart'; -import 'package:rive/rive.dart'; - -class CommentWidget extends StatelessWidget { - CommentWidget(this.commentModelObj, {Key? key}) - : super( - key: key, - ); - - CommentModel commentModelObj; - - @override - Widget build(BuildContext context) { - return Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, // Move the main axis alignment to space between - crossAxisAlignment: CrossAxisAlignment.center, // Center the items vertically - children: [ - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + commentModelObj.userImage!, - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.only( - left: 12, - top: 2, - bottom: 11, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - width: 227, - child: Row( - children: [ - Text( - commentModelObj.username!.length <= 15 ? commentModelObj.username! : commentModelObj.username!.substring(0, 15) + '...', - style: theme.textTheme.titleMedium, - ), - Spacer(), - Padding( - padding: EdgeInsets.only(left: 6), - child: Text( - commentModelObj.dateText!, - style: theme.textTheme.bodyMedium, - ), - ), - ], - ), - ), - SizedBox(height: 6), - Text( - commentModelObj.greetingText!, - style: CustomTextStyles.bodyMediumBluegray800, - ), - ], - ), - ), - ), - CustomImageView( - imagePath: ImageConstant.imgSend, - height: 30, - width: 30, - margin: EdgeInsets.only(left: 5), - ), - ], - ), - ); - } -} diff --git a/lib/old/feed/feed_screen/widgets/feed_scroll_item.dart b/lib/old/feed/feed_screen/widgets/feed_scroll_item.dart deleted file mode 100644 index da1ca390..00000000 --- a/lib/old/feed/feed_screen/widgets/feed_scroll_item.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:flutter/material.dart'; - -class ScrollItem extends StatelessWidget { - final String title; - - const ScrollItem({required this.title}); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5), - margin: EdgeInsets.only(right: 10), - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(20)), - ), - child: Text( - title, - style: CustomTextStyles.titleMediumSemiBold, - ), - ); - } -} diff --git a/lib/old/feed/feed_screen/widgets/feed_search_view.dart b/lib/old/feed/feed_screen/widgets/feed_search_view.dart deleted file mode 100644 index 579a0a29..00000000 --- a/lib/old/feed/feed_screen/widgets/feed_search_view.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:flutter/material.dart'; - -class CustomSearchView extends StatelessWidget { - CustomSearchView({ - Key? key, - this.alignment, - this.width, - this.scrollPadding, - this.controller, - this.focusNode, - this.autofocus = false, - this.textStyle, - this.textInputType = TextInputType.text, - this.maxLines, - this.hintText, - this.hintStyle, - this.prefix, - this.prefixConstraints, - this.suffix, - this.suffixConstraints, - this.contentPadding, - this.borderDecoration, - this.fillColor, - this.filled = true, - this.validator, - this.onChanged, - }) : super( - key: key, - ); - - final Alignment? alignment; - - final double? width; - - final TextEditingController? scrollPadding; - - final TextEditingController? controller; - - final FocusNode? focusNode; - - final bool? autofocus; - - final TextStyle? textStyle; - - final TextInputType? textInputType; - - final int? maxLines; - - final String? hintText; - - final TextStyle? hintStyle; - - final Widget? prefix; - - final BoxConstraints? prefixConstraints; - - final Widget? suffix; - - final BoxConstraints? suffixConstraints; - - final EdgeInsets? contentPadding; - - final InputBorder? borderDecoration; - - final Color? fillColor; - - final bool? filled; - - final FormFieldValidator? validator; - - final Function(String)? onChanged; - - @override - Widget build(BuildContext context) { - return alignment != null - ? Align( - alignment: alignment ?? Alignment.center, - child: searchViewWidget(context), - ) - : searchViewWidget(context); - } - - searchViewWidget(BuildContext context) => SizedBox( - width: width ?? double.maxFinite, - child: TextFormField( - scrollPadding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - controller: controller, - focusNode: focusNode, - onTapOutside: (event) => onTapOutside(), - autofocus: autofocus!, - style: textStyle ?? CustomTextStyles.bodySmallMulishBluegray800, - keyboardType: textInputType, - maxLines: maxLines ?? 1, - decoration: decoration, - validator: validator, - onChanged: (String value) => onChanged?.call(value), - ), - ); - - void onTapOutside() { - if (focusNode != null) { - focusNode?.unfocus(); - } else { - FocusManager.instance.primaryFocus?.unfocus(); - } - } - - InputDecoration get decoration => InputDecoration( - hintText: hintText ?? "", - hintStyle: hintStyle ?? CustomTextStyles.bodySmallMulishBluegray800, - prefixIcon: prefix ?? - SizedBox( - child: Padding( - padding: EdgeInsets.only(left: 10), - child: Icon(Icons.search), - ), - ), - prefixIconConstraints: prefixConstraints ?? - BoxConstraints( - maxHeight: 40, - ), - suffixIconConstraints: suffixConstraints ?? - BoxConstraints( - maxHeight: 40, - ), - isDense: true, - contentPadding: contentPadding ?? - EdgeInsets.only( - top: 11, - right: 11, - bottom: 11, - ), - fillColor: fillColor ?? Colors.grey[200], - filled: filled, - border: borderDecoration ?? - OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide.none, - ), - enabledBorder: borderDecoration ?? - OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide.none, - ), - focusedBorder: borderDecoration ?? - OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide.none, - ), - ); -} diff --git a/lib/old/glossary/glossary_screen/bloc/glossary_screen_bloc.dart b/lib/old/glossary/glossary_screen/bloc/glossary_screen_bloc.dart deleted file mode 100644 index 3c3817d4..00000000 --- a/lib/old/glossary/glossary_screen/bloc/glossary_screen_bloc.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; -import 'package:eatvio_app/old/glossary/glossary_screen/models/glossary_screen_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'glossary_screen_event.dart'; -part 'glossary_screen_state.dart'; - -/// A bloc that manages the state of a Glossary according to the event that is dispatched to it. -class GlossaryBloc extends Bloc { - GlossaryBloc(GlossaryState initialState) : super(initialState) { - on(_onInitialize); - on(_changeProductGroup); - } - - _onInitialize( - GlossaryInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final responseProductGroups = await http.get( - Uri.parse(baseUrl + '/api/glossaries/group/index'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (responseProductGroups.statusCode == 200) { - final dataProductGroups = jsonDecode(responseProductGroups.body); - if (dataProductGroups is List) { - if (state is GlossaryLoadedState) { - var currentState = state as GlossaryLoadedState; - emit( - currentState.copyWith( - glossaryModelObj: currentState.glossaryModelObj, - token: currentState.token, - productGroups: currentState.productGroups, - productList: currentState.productList, - ), - ); - } else { - List productGroupsModel = _fillProductGroups(dataProductGroups); - emit( - GlossaryLoadedState( - token: await TokenStorage.getTokenFromStorage(), - productGroups: productGroupsModel, - productList: [], - ), - ); - await _getProductListById(await TokenStorage.getTokenFromStorage(), emit, productGroupsModel[0].id); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(GlossaryErrorState('Список категорий некорректного формата')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit( - GlossaryErrorState( - 'Ошибка сервера: ${responseProductGroups.statusCode}', - ), - ); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(GlossaryErrorState('Ошибка при получении данных о чатах: $e')); - } - } - - void _changeProductGroup( - ChangeProductGroup event, - Emitter emit, - ) async { - if (state is GlossaryLoadedState) { - var currentState = state as GlossaryLoadedState; - await _getProductListById(currentState.token, emit, event.id); - } - } - - Future _getProductListById( - token, - Emitter emit, - int? productGroupID, - ) async { - final responseProductList = await http.get( - Uri.parse(baseUrl + '/api/glossary/index/$productGroupID'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - final dataProductList = jsonDecode(responseProductList.body); - if (dataProductList is List) { - var currentState = state as GlossaryLoadedState; - emit( - currentState.copyWith( - glossaryModelObj: currentState.glossaryModelObj, - productGroups: currentState.productGroups, - productList: dataProductList, - ), - ); - } else { - emit(GlossaryErrorState('Список продуктов некорректного формата')); - } - } - - List _fillProductGroups(List productGroups) { - List result = []; - for (int i = 0; i < productGroups.length; i++) { - result.add( - SelectionPopupModel( - id: productGroups[i]['id'], - title: productGroups[i]['name'], - isSelected: i == 0, - ), - ); - } - return result; - } -} diff --git a/lib/old/glossary/glossary_screen/bloc/glossary_screen_event.dart b/lib/old/glossary/glossary_screen/bloc/glossary_screen_event.dart deleted file mode 100644 index 29cabd5f..00000000 --- a/lib/old/glossary/glossary_screen/bloc/glossary_screen_event.dart +++ /dev/null @@ -1,34 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'glossary_screen_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///Glossary widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class GlossaryEvent extends Equatable {} - -/// Event that is dispatched when the Glossary widget is first created. -class GlossaryInitialEvent extends GlossaryEvent { - @override - List get props => []; -} - -class DeleteEntry extends GlossaryEvent { - DeleteEntry(this.id); - - final int id; - - @override - List get props => [id]; -} - -class ChangeProductGroup extends GlossaryEvent { - ChangeProductGroup(this.id); - - final int id; - - @override - List get props => [id]; -} diff --git a/lib/old/glossary/glossary_screen/bloc/glossary_screen_state.dart b/lib/old/glossary/glossary_screen/bloc/glossary_screen_state.dart deleted file mode 100644 index a3d819f2..00000000 --- a/lib/old/glossary/glossary_screen/bloc/glossary_screen_state.dart +++ /dev/null @@ -1,67 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'glossary_screen_bloc.dart'; - -/// Represents the state of Glossary in the application. -/// - -class GlossaryState extends Equatable { - GlossaryState({ - this.glossaryModelObj, - }); - - GlossaryModel? glossaryModelObj; - - @override - List get props => [glossaryModelObj]; - - GlossaryState copyWith({GlossaryModel? glossaryModelObj}) { - return GlossaryState( - glossaryModelObj: glossaryModelObj ?? this.glossaryModelObj, - ); - } -} - -class GlossaryLoadedState extends GlossaryState { - GlossaryLoadedState({ - this.glossaryModelObj, - this.productGroups, - this.productList, - this.token, - }); - - GlossaryModel? glossaryModelObj; - String? token; - List? productGroups; - List? productList; - - @override - List get props => [glossaryModelObj, productGroups, productList, token]; - - GlossaryLoadedState copyWith({ - GlossaryModel? glossaryModelObj, - String? token, - List? productGroups, - List? productList, - }) { - return GlossaryLoadedState( - glossaryModelObj: glossaryModelObj ?? this.glossaryModelObj, - productGroups: productGroups ?? this.productGroups, - productList: productList ?? this.productList, - token: token ?? this.token, - ); - } -} - -class GlossaryErrorState extends GlossaryState { - final String errorMessage; - - GlossaryErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class GlossaryInitialState extends GlossaryState { - GlossaryInitialState({required GlossaryModel glossaryModelObj}) : super(glossaryModelObj: glossaryModelObj); -} diff --git a/lib/old/glossary/glossary_screen/glossary_screen.dart b/lib/old/glossary/glossary_screen/glossary_screen.dart deleted file mode 100644 index aa07d867..00000000 --- a/lib/old/glossary/glossary_screen/glossary_screen.dart +++ /dev/null @@ -1,355 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; -import 'package:eatvio_app/old/glossary/glossary_screen/widgets/glossary_scroll_item.dart'; -import 'package:eatvio_app/old/glossary/glossary_screen/widgets/glossary_search_widget.dart'; -import 'package:eatvio_app/theme/custom_button_style.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/widgets/custom_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_outlined_button.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/glossary_screen_bloc.dart'; -import 'models/glossary_screen_model.dart'; - -class GlossaryScreen extends StatelessWidget { - const GlossaryScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - return BlocProvider( - create: (context) => GlossaryBloc(GlossaryState(glossaryModelObj: GlossaryModel()))..add(GlossaryInitialEvent()), - child: GlossaryScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is GlossaryInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } else if (state is GlossaryLoadedState) { - // Данные загружены, можно строить экран. - return _buildGlossary(context, state); - } else if (state is GlossaryErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } - }, - ); - } - - _buildGlossary(BuildContext context, GlossaryLoadedState state) { - return Scaffold( - appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, - ), - backgroundColor: Colors.grey[200], - resizeToAvoidBottomInset: true, - body: SingleChildScrollView( - child: Container( - width: double.maxFinite, - decoration: BoxDecoration(color: Colors.grey[200]), - child: Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: 20), - _buildSearch(context), - SizedBox(height: 20), - _buildMenu(context), - SizedBox(height: 20), - _buildProducts(context, state), - ], - ), - ), - ), - ), - ); - } - - _buildSearch(BuildContext context) { - return Container( - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Column( - children: [ - CustomSearchView( - hintText: "Поиск записей", - ), - SizedBox(height: 10), - CustomOutlinedButton( - text: "Найти продукт", - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - ], - ), - ), - ); - } - - _buildMenu(BuildContext context) { - return Container( - padding: EdgeInsets.all(12), - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - children: [ - Align( - alignment: Alignment.centerLeft, - child: Text( - "Поиск по алфавиту", - style: CustomTextStyles.titleMediumSemiBold, - ), - ), - SizedBox( - height: 8, - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Row( - children: List.generate(33, _fillAlphabet), - ), - ), - ], - ), - ); - } - - _buildProducts(BuildContext context, GlossaryLoadedState state) { - return Container( - padding: EdgeInsets.all(12), - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - children: [ - Align( - alignment: Alignment.centerLeft, - child: Text( - "Группа продуктов", - style: CustomTextStyles.titleMediumSemiBold, - ), - ), - SizedBox( - height: 8, - ), - CustomDropDown( - items: state.productGroups, - value: state.productGroups?[0], - fillColor: Colors.grey[200]!, - hintText: 'Выберите категорию', - borderDecoration: OutlineInputBorder( - borderRadius: const BorderRadius.all(Radius.circular(8)), - borderSide: BorderSide(color: Colors.grey[200]!, width: 1), - ), - contentPadding: EdgeInsets.symmetric( - horizontal: 10, - vertical: 9, - ), - onChanged: _changeProductGroup(context, state), - width: MediaQuery.of(context).size.width, // Set a percentage value as per your layout - ), - SizedBox( - height: 8, - ), - Align(alignment: Alignment.centerLeft, child: Text("*КБЖУ указано за 100гр")), - SizedBox( - height: 8, - ), - _buildProductList(context, state), - ], - ), - ); - } - - _buildProductList(BuildContext context, GlossaryLoadedState state) { - List postWidgets = []; - - if (state.productList != null) { - for (var post in state.productList!) { - postWidgets.add(_buildProductEntry(post, context)); - } - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: postWidgets, - ); - } - - _buildProductEntry(product, BuildContext context) { - return Container( - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 1, - blurRadius: 3, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - children: [ - ListTile( - trailing: CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (product['image'] ?? ''), - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - title: Text( - product?['name'] ?? '', - style: CustomTextStyles.titleMediumSemiBold, - ), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - Row( - children: [ - Column( - children: [ - Text("Ккал - ${product['energy_on_100gr'].toString()}"), - SizedBox(height: 8), - Text("Белки - ${product['proteins_on_100gr'].toString()}"), - ], - ), - Spacer(), - Padding( - padding: const EdgeInsets.only(right: 24.0), - child: Column( - children: [ - Text("Жиры - ${product['fats_on_100gr'].toString()}"), - SizedBox(height: 8), - Text("Углеводы - ${product['carbohydrates_on_100gr'].toString()}"), - ], - ), - ), - ], - ), - ], - ), - ), - ], - ), - ); - } - - Widget _fillAlphabet(int index) { - return ScrollItem(title: String.fromCharCode(1040 + index)); - } - - List fillProductGroups(List productGroups) { - List result = []; - - for (int i = 0; i < productGroups.length; i++) { - result.add( - SelectionPopupModel( - id: productGroups[i]['id'], - title: productGroups[i]['name'], - isSelected: true, - ), - ); - } - return result; - } - - ///Handling page based on route - Widget getCurrentPage( - BuildContext context, - String currentRoute, - ) { - switch (currentRoute) { - case '/glossary': - return GlossaryScreen.builder(context); - default: - return GlossaryScreen(); - } - } - - _changeProductGroup(BuildContext context, GlossaryLoadedState state) { - return (value) { - context.read().add(ChangeProductGroup(value.id)); - }; - } -} diff --git a/lib/old/glossary/glossary_screen/models/glossary_screen_model.dart b/lib/old/glossary/glossary_screen/models/glossary_screen_model.dart deleted file mode 100644 index 1077bd61..00000000 --- a/lib/old/glossary/glossary_screen/models/glossary_screen_model.dart +++ /dev/null @@ -1,17 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [glossary_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class GlossaryModel extends Equatable { - GlossaryModel(); - - GlossaryModel copyWith() { - return GlossaryModel(); - } - - @override - List get props => []; -} diff --git a/lib/old/glossary/glossary_screen/widgets/glossary_scroll_item.dart b/lib/old/glossary/glossary_screen/widgets/glossary_scroll_item.dart deleted file mode 100644 index da1ca390..00000000 --- a/lib/old/glossary/glossary_screen/widgets/glossary_scroll_item.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:flutter/material.dart'; - -class ScrollItem extends StatelessWidget { - final String title; - - const ScrollItem({required this.title}); - - @override - Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5), - margin: EdgeInsets.only(right: 10), - decoration: BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(20)), - ), - child: Text( - title, - style: CustomTextStyles.titleMediumSemiBold, - ), - ); - } -} diff --git a/lib/old/glossary/glossary_screen/widgets/glossary_search_widget.dart b/lib/old/glossary/glossary_screen/widgets/glossary_search_widget.dart deleted file mode 100644 index 579a0a29..00000000 --- a/lib/old/glossary/glossary_screen/widgets/glossary_search_widget.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:flutter/material.dart'; - -class CustomSearchView extends StatelessWidget { - CustomSearchView({ - Key? key, - this.alignment, - this.width, - this.scrollPadding, - this.controller, - this.focusNode, - this.autofocus = false, - this.textStyle, - this.textInputType = TextInputType.text, - this.maxLines, - this.hintText, - this.hintStyle, - this.prefix, - this.prefixConstraints, - this.suffix, - this.suffixConstraints, - this.contentPadding, - this.borderDecoration, - this.fillColor, - this.filled = true, - this.validator, - this.onChanged, - }) : super( - key: key, - ); - - final Alignment? alignment; - - final double? width; - - final TextEditingController? scrollPadding; - - final TextEditingController? controller; - - final FocusNode? focusNode; - - final bool? autofocus; - - final TextStyle? textStyle; - - final TextInputType? textInputType; - - final int? maxLines; - - final String? hintText; - - final TextStyle? hintStyle; - - final Widget? prefix; - - final BoxConstraints? prefixConstraints; - - final Widget? suffix; - - final BoxConstraints? suffixConstraints; - - final EdgeInsets? contentPadding; - - final InputBorder? borderDecoration; - - final Color? fillColor; - - final bool? filled; - - final FormFieldValidator? validator; - - final Function(String)? onChanged; - - @override - Widget build(BuildContext context) { - return alignment != null - ? Align( - alignment: alignment ?? Alignment.center, - child: searchViewWidget(context), - ) - : searchViewWidget(context); - } - - searchViewWidget(BuildContext context) => SizedBox( - width: width ?? double.maxFinite, - child: TextFormField( - scrollPadding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - controller: controller, - focusNode: focusNode, - onTapOutside: (event) => onTapOutside(), - autofocus: autofocus!, - style: textStyle ?? CustomTextStyles.bodySmallMulishBluegray800, - keyboardType: textInputType, - maxLines: maxLines ?? 1, - decoration: decoration, - validator: validator, - onChanged: (String value) => onChanged?.call(value), - ), - ); - - void onTapOutside() { - if (focusNode != null) { - focusNode?.unfocus(); - } else { - FocusManager.instance.primaryFocus?.unfocus(); - } - } - - InputDecoration get decoration => InputDecoration( - hintText: hintText ?? "", - hintStyle: hintStyle ?? CustomTextStyles.bodySmallMulishBluegray800, - prefixIcon: prefix ?? - SizedBox( - child: Padding( - padding: EdgeInsets.only(left: 10), - child: Icon(Icons.search), - ), - ), - prefixIconConstraints: prefixConstraints ?? - BoxConstraints( - maxHeight: 40, - ), - suffixIconConstraints: suffixConstraints ?? - BoxConstraints( - maxHeight: 40, - ), - isDense: true, - contentPadding: contentPadding ?? - EdgeInsets.only( - top: 11, - right: 11, - bottom: 11, - ), - fillColor: fillColor ?? Colors.grey[200], - filled: filled, - border: borderDecoration ?? - OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide.none, - ), - enabledBorder: borderDecoration ?? - OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide.none, - ), - focusedBorder: borderDecoration ?? - OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide.none, - ), - ); -} diff --git a/lib/old/plans/plan_create_screen/bloc/plan_create_bloc.dart b/lib/old/plans/plan_create_screen/bloc/plan_create_bloc.dart deleted file mode 100644 index 00fd741a..00000000 --- a/lib/old/plans/plan_create_screen/bloc/plan_create_bloc.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/plans/plan_create_screen/models/plan_create_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'plan_create_event.dart'; -part 'plan_create_state.dart'; - -/// A bloc that manages the state of a PlanCreate according to the event that is dispatched to it. -class PlanCreateBloc extends Bloc { - PlanCreateBloc(PlanCreateState initialState) : super(initialState) { - on(_onInitialize); - on(_createPlan); - } - - _onInitialize( - PlanCreateInitialEvent event, - Emitter emit, - ) async { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - if (state is PlanCreateLoadedState) { - var currentState = state as PlanCreateLoadedState; - emit( - currentState.copyWith( - planModelObj: currentState.planModelObj, - name: currentState.name, - details: currentState.details, - ), - ); - } else { - emit( - PlanCreateLoadedState( - name: TextEditingController(), - details: TextEditingController(), - ), - ); - } - } - - FutureOr _createPlan( - CreatePlan event, - Emitter emit, - ) async { - if (state is PlanCreateLoadedState) { - var currentState = state as PlanCreateLoadedState; - - var response = await sendPlan( - currentState.name?.text, - currentState.details?.text, - ); - - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed('planSelectScreen'); - } - } - } - - FutureOr sendPlan( - String? name, - String? details, - ) async { - String url = '${baseUrl}/api/plans/create'; - - final Map credentials = { - 'name': name, - 'details': details, - 'duration': '14', - 'state': 'active', - 'type': '{"meat": true}', - 'daily_schedule': - '{"1": {"lunch": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 494}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 12}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 432}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 195}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 710}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "grams", "quantity": 119}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 287}], "snacks": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 445}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "grams", "quantity": 500}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 764}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 735}], "breakfast": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 127}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 89}]}, "2": {"lunch": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 436}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 700}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 766}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 194}], "dinner": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 426}], "snacks": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 58}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 152}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 925}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 224}], "breakfast": [{"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 918}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 81}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 308}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 579}]}, "3": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 266}], "dinner": [{"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 790}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 26}], "snacks": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 549}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 446}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "grams", "quantity": 406}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 92}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 403}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 894}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 457}]}, "4": {"lunch": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 698}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 43}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 994}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 965}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 42}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 948}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 28}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 54}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 112}], "supper": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 891}], "breakfast": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 538}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 635}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "pcs", "quantity": 586}]}, "5": {"lunch": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 900}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "milliliters", "quantity": 242}], "dinner": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 375}], "snacks": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 604}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 510}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 887}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 554}], "supper": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 731}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 574}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 274}], "breakfast": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 276}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 80}]}, "6": {"lunch": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 359}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 358}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 639}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 861}], "dinner": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 124}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 122}], "snacks": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 980}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 837}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 444}], "supper": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 577}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 706}], "breakfast": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 839}]}, "7": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 118}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 664}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 665}], "dinner": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 986}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 296}], "snacks": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 807}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 493}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "milliliters", "quantity": 227}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 385}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 448}], "breakfast": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 784}]}, "8": {"lunch": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 433}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 871}], "dinner": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 332}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 41}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 388}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 649}], "supper": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 114}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "milliliters", "quantity": 968}], "breakfast": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 180}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 269}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 998}]}, "9": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 68}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 505}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 554}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 579}], "snacks": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 751}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 144}], "supper": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 677}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 263}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "pcs", "quantity": 304}], "breakfast": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 963}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 258}]}, "10": {"lunch": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 167}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 306}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 243}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 79}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 560}], "snacks": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 294}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 145}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 639}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 108}], "supper": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 924}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 894}], "breakfast": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 280}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 336}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 338}]}, "11": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 817}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 968}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 525}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 864}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "pcs", "quantity": 457}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 548}], "snacks": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 658}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 239}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 358}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 406}], "supper": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "grams", "quantity": 416}], "breakfast": [{"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 220}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 323}]}, "12": {"lunch": [{"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 377}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 138}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 654}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 237}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 902}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 76}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 723}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 481}], "breakfast": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 571}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 515}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 188}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 411}]}, "13": {"lunch": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 379}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "grams", "quantity": 231}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 376}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 147}], "dinner": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 871}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 679}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 359}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 561}], "snacks": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 414}], "supper": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 827}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 649}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 363}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 161}], "breakfast": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 185}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 464}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 387}]}, "14": {"lunch": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 248}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 5}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 693}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 655}], "dinner": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 709}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 881}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 588}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 36}], "snacks": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "pcs", "quantity": 453}], "supper": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 692}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 186}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 721}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 740}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 731}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 842}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 850}]}, "15": {"lunch": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "grams", "quantity": 124}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 380}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 211}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 689}], "dinner": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 326}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 629}], "snacks": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 201}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 129}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 749}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "milliliters", "quantity": 315}], "breakfast": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 444}]}, "16": {"lunch": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 953}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 101}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 684}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "pcs", "quantity": 506}], "dinner": [{"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 333}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 416}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "milliliters", "quantity": 796}], "snacks": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 799}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 799}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "pcs", "quantity": 756}], "supper": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 858}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 619}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 800}], "breakfast": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "pcs", "quantity": 363}, {"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "grams", "quantity": 539}]}, "17": {"lunch": [{"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 134}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 977}], "snacks": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "pcs", "quantity": 211}], "supper": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 209}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "grams", "quantity": 227}], "breakfast": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 195}, {"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "pcs", "quantity": 917}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 706}]}, "18": {"lunch": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "pcs", "quantity": 296}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 239}, {"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 798}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 155}], "dinner": [{"name": "Little Hamburger", "uniq": "Little Hamburger-1709115623", "portion": "grams", "quantity": 959}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 958}], "snacks": [{"name": "Pasta", "uniq": "Pasta-1709115623", "portion": "milliliters", "quantity": 984}], "supper": [{"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 134}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 432}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "milliliters", "quantity": 242}]}, "19": {"lunch": [{"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 906}, {"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 152}], "dinner": [{"name": "Cheeseburger", "uniq": "Cheeseburger-1709115623", "portion": "milliliters", "quantity": 610}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 605}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "grams", "quantity": 498}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 616}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 512}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 146}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 200}], "supper": [{"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 764}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 353}, {"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 181}], "breakfast": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 783}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 506}, {"name": "Bacon Cheeseburger", "uniq": "Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 887}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 130}]}, "20": {"lunch": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 48}], "dinner": [{"name": "Bacon Dog", "uniq": "Bacon Dog-1709115623", "portion": "milliliters", "quantity": 266}, {"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 143}], "snacks": [{"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "grams", "quantity": 55}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "grams", "quantity": 174}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 855}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "milliliters", "quantity": 6}], "supper": [{"name": "Grilled Cheese", "uniq": "Grilled Cheese-1709115623", "portion": "pcs", "quantity": 296}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 878}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "pcs", "quantity": 376}], "breakfast": [{"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "milliliters", "quantity": 442}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "pcs", "quantity": 528}, {"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "milliliters", "quantity": 558}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 885}]}, "21": {"lunch": [{"name": "Little Bacon Burger", "uniq": "Little Bacon Burger-1709115623", "portion": "grams", "quantity": 504}, {"name": "Little Bacon Cheeseburger", "uniq": "Little Bacon Cheeseburger-1709115623", "portion": "milliliters", "quantity": 652}, {"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 996}], "dinner": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "milliliters", "quantity": 200}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "pcs", "quantity": 641}, {"name": "Cheese Veggie Sandwich", "uniq": "Cheese Veggie Sandwich-1709115623", "portion": "milliliters", "quantity": 87}, {"name": "Cheese Dog", "uniq": "Cheese Dog-1709115623", "portion": "pcs", "quantity": 689}], "snacks": [{"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 143}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "pcs", "quantity": 528}, {"name": "Veggie Sandwich", "uniq": "Veggie Sandwich-1709115623", "portion": "grams", "quantity": 475}], "supper": [{"name": "Little Cheeseburger", "uniq": "Little Cheeseburger-1709115623", "portion": "grams", "quantity": 924}, {"name": "Hamburger", "uniq": "Hamburger-1709115623", "portion": "grams", "quantity": 98}], "breakfast": [{"name": "Bacon Cheese Dog", "uniq": "Bacon Cheese Dog-1709115623", "portion": "grams", "quantity": 438}, {"name": "Cheese Pizza", "uniq": "Cheese Pizza-1709115623", "portion": "milliliters", "quantity": 383}, {"name": "Bacon Burger", "uniq": "Bacon Burger-1709115623", "portion": "grams", "quantity": 462}]}}', - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } -} diff --git a/lib/old/plans/plan_create_screen/bloc/plan_create_event.dart b/lib/old/plans/plan_create_screen/bloc/plan_create_event.dart deleted file mode 100644 index 0bcfb740..00000000 --- a/lib/old/plans/plan_create_screen/bloc/plan_create_event.dart +++ /dev/null @@ -1,21 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_create_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///PlanCreate widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class PlanCreateEvent extends Equatable {} - -/// Event that is dispatched when the PlanCreate widget is first created. -class PlanCreateInitialEvent extends PlanCreateEvent { - @override - List get props => []; -} - -class CreatePlan extends PlanCreateEvent { - @override - List get props => []; -} diff --git a/lib/old/plans/plan_create_screen/bloc/plan_create_state.dart b/lib/old/plans/plan_create_screen/bloc/plan_create_state.dart deleted file mode 100644 index f2485655..00000000 --- a/lib/old/plans/plan_create_screen/bloc/plan_create_state.dart +++ /dev/null @@ -1,67 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_create_bloc.dart'; - -/// Represents the state of PlanCreate in the application. -/// - -class PlanCreateState extends Equatable { - PlanCreateState({ - this.planModelObj, - }); - - PlanCreateModel? planModelObj; - - @override - List get props => [planModelObj]; - - PlanCreateState copyWith({PlanCreateModel? planModelObj}) { - return PlanCreateState( - planModelObj: planModelObj ?? this.planModelObj, - ); - } -} - -class PlanCreateLoadedState extends PlanCreateState { - PlanCreateLoadedState({ - this.planModelObj, - this.name, - this.details, - }); - - PlanCreateModel? planModelObj; - TextEditingController? name; - TextEditingController? details; - - @override - List get props => [ - planModelObj, - name, - details, - ]; - - PlanCreateLoadedState copyWith({ - PlanCreateModel? planModelObj, - TextEditingController? name, - TextEditingController? details, - }) { - return PlanCreateLoadedState( - planModelObj: planModelObj ?? this.planModelObj, - name: name ?? this.name, - details: details ?? this.details, - ); - } -} - -class PlanCreateErrorState extends PlanCreateState { - final String errorMessage; - - PlanCreateErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class PlanCreateInitialState extends PlanCreateState { - PlanCreateInitialState({required PlanCreateModel planModelObj}) : super(planModelObj: planModelObj); -} diff --git a/lib/old/plans/plan_create_screen/models/plan_create_model.dart b/lib/old/plans/plan_create_screen/models/plan_create_model.dart deleted file mode 100644 index b105414c..00000000 --- a/lib/old/plans/plan_create_screen/models/plan_create_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [plan_create_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class PlanCreateModel extends Equatable { - final String planID; - - PlanCreateModel({required String planID}) : planID = planID; - - PlanCreateModel copyWith(String planID) { - return PlanCreateModel(planID: planID); - } - - @override - List get props => [planID]; -} diff --git a/lib/old/plans/plan_create_screen/plan_create_screen.dart b/lib/old/plans/plan_create_screen/plan_create_screen.dart deleted file mode 100644 index 284d94b2..00000000 --- a/lib/old/plans/plan_create_screen/plan_create_screen.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'bloc/plan_create_bloc.dart'; -import 'models/plan_create_model.dart'; - -class PlanCreateScreen extends StatelessWidget { - const PlanCreateScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - final planID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => PlanCreateBloc(PlanCreateState(planModelObj: PlanCreateModel(planID: planID.toString())))..add(PlanCreateInitialEvent()), - child: PlanCreateScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is PlanCreateInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is PlanCreateLoadedState) { - // Данные загружены, можно строить экран. - return _buildPlanCreate(context, state); - } else if (state is PlanCreateErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildPlanCreate(BuildContext context, PlanCreateLoadedState state) { - return SafeArea( - child: Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: ListView( - children: [ - SizedBox(height: 30), - Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox(height: 16.0), - TextFormField( - controller: state.name, - decoration: InputDecoration(labelText: 'Заголовок'), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.details, - decoration: InputDecoration(labelText: 'Описание'), - ), - SizedBox(height: 16.0), - // Здесь нужно добавить виджет для загрузки картинки - ElevatedButton( - onPressed: () => context.read().add(CreatePlan()), - child: Text('Создать'), - ), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/old/plans/plan_edit_screen/bloc/plan_edit_bloc.dart b/lib/old/plans/plan_edit_screen/bloc/plan_edit_bloc.dart deleted file mode 100644 index c98331e9..00000000 --- a/lib/old/plans/plan_edit_screen/bloc/plan_edit_bloc.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/plans/plan_edit_screen/models/plan_edit_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'plan_edit_event.dart'; -part 'plan_edit_state.dart'; - -/// A bloc that manages the state of a PlanEdit according to the event that is dispatched to it. -class PlanEditBloc extends Bloc { - PlanEditBloc(PlanEditState initialState) : super(initialState) { - on(_onInitialize); - on(_editPlan); - } - - _onInitialize( - PlanEditInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final String? planID = state.planModelObj?.planID; - final response = await http.get( - Uri.parse(baseUrl + '/api/plans/show/$planID'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map) { - if (state is PlanEditLoadedState) { - var currentState = state as PlanEditLoadedState; - emit( - currentState.copyWith( - planModelObj: currentState.planModelObj, - plan: currentState.plan, - name: currentState.name, - duration: currentState.duration, - details: currentState.details, - ), - ); - } else { - emit( - PlanEditLoadedState( - plan: data, - name: TextEditingController(text: data['name']), - details: TextEditingController(text: data['details']), - duration: TextEditingController(text: data['duration'].toString()), - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(PlanEditErrorState('Некоторые необходимые данные отсутствуют.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(PlanEditErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(PlanEditErrorState('Ошибка при получении данных о чатах: $e')); - } - } - - FutureOr _editPlan(EditPlan event, Emitter emit) async { - if (state is PlanEditLoadedState) { - var currentState = state as PlanEditLoadedState; - int duration = int.parse(currentState.duration!.text) * 7; - - var response = await sendPlan(currentState.plan, currentState.name?.text, currentState.details?.text, duration.toString()); - - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed( - 'planScreen', - extra: currentState.plan?['id'].toString(), - ); - } else {} - } - } - - FutureOr sendPlan( - Map? plan, - String? name, - String? details, - String? duration, - ) async { - int id = plan?['id']; - String url = '${baseUrl}/api/plans/update/$id'; - - final Map credentials = { - 'id': id, - 'name': name, - 'details': details, - 'duration': '14', - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } -} diff --git a/lib/old/plans/plan_edit_screen/bloc/plan_edit_event.dart b/lib/old/plans/plan_edit_screen/bloc/plan_edit_event.dart deleted file mode 100644 index 2596b8aa..00000000 --- a/lib/old/plans/plan_edit_screen/bloc/plan_edit_event.dart +++ /dev/null @@ -1,21 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_edit_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///PlanEdit widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class PlanEditEvent extends Equatable {} - -/// Event that is dispatched when the PlanEdit widget is first created. -class PlanEditInitialEvent extends PlanEditEvent { - @override - List get props => []; -} - -class EditPlan extends PlanEditEvent { - @override - List get props => []; -} diff --git a/lib/old/plans/plan_edit_screen/bloc/plan_edit_state.dart b/lib/old/plans/plan_edit_screen/bloc/plan_edit_state.dart deleted file mode 100644 index 57e0a3ab..00000000 --- a/lib/old/plans/plan_edit_screen/bloc/plan_edit_state.dart +++ /dev/null @@ -1,71 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_edit_bloc.dart'; - -/// Represents the state of PlanEdit in the application. -/// - -class PlanEditState extends Equatable { - PlanEditState({ - this.planModelObj, - }); - - PlanEditModel? planModelObj; - - @override - List get props => [planModelObj]; - - PlanEditState copyWith({PlanEditModel? planModelObj}) { - return PlanEditState( - planModelObj: planModelObj ?? this.planModelObj, - ); - } -} - -class PlanEditLoadedState extends PlanEditState { - PlanEditLoadedState({ - this.planModelObj, - this.plan, - this.name, - this.details, - this.duration, - }); - - PlanEditModel? planModelObj; - Map? plan; - TextEditingController? name; - TextEditingController? details; - TextEditingController? duration; - - @override - List get props => [planModelObj, plan, name, details, duration]; - - PlanEditLoadedState copyWith({ - PlanEditModel? planModelObj, - Map? plan, - TextEditingController? name, - TextEditingController? details, - TextEditingController? duration, - }) { - return PlanEditLoadedState( - planModelObj: planModelObj ?? this.planModelObj, - plan: plan ?? this.plan, - name: name ?? this.name, - details: details ?? this.details, - duration: duration ?? this.duration, - ); - } -} - -class PlanEditErrorState extends PlanEditState { - final String errorMessage; - - PlanEditErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class PlanEditInitialState extends PlanEditState { - PlanEditInitialState({required PlanEditModel planModelObj}) : super(planModelObj: planModelObj); -} diff --git a/lib/old/plans/plan_edit_screen/models/plan_edit_model.dart b/lib/old/plans/plan_edit_screen/models/plan_edit_model.dart deleted file mode 100644 index 22c3d277..00000000 --- a/lib/old/plans/plan_edit_screen/models/plan_edit_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [plan_edit_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class PlanEditModel extends Equatable { - final String planID; - - PlanEditModel({required String planID}) : planID = planID; - - PlanEditModel copyWith(String planID) { - return PlanEditModel(planID: planID); - } - - @override - List get props => [planID]; -} diff --git a/lib/old/plans/plan_edit_screen/plan_edit_screen.dart b/lib/old/plans/plan_edit_screen/plan_edit_screen.dart deleted file mode 100644 index 31fbd435..00000000 --- a/lib/old/plans/plan_edit_screen/plan_edit_screen.dart +++ /dev/null @@ -1,120 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/plan_edit_bloc.dart'; -import 'models/plan_edit_model.dart'; - -class PlanEditScreen extends StatelessWidget { - const PlanEditScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - final planID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => PlanEditBloc(PlanEditState(planModelObj: PlanEditModel(planID: planID.toString())))..add(PlanEditInitialEvent()), - child: PlanEditScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is PlanEditInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is PlanEditLoadedState) { - // Данные загружены, можно строить экран. - return _buildPlanEdit(context, state); - } else if (state is PlanEditErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildPlanEdit(BuildContext context, PlanEditLoadedState state) { - return SafeArea( - child: Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: ListView( - children: [ - SizedBox(height: 30), - Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (state.plan?['image'] ?? ''), - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.name, - decoration: InputDecoration(labelText: 'Заголовок'), - ), - SizedBox(height: 16.0), - TextFormField( - controller: state.details, - decoration: InputDecoration(labelText: 'Описание'), - ), - SizedBox(height: 16.0), - // Здесь нужно добавить виджет для загрузки картинки - ElevatedButton( - onPressed: () => context.read().add(EditPlan()), - child: Text('Сохранить'), - ), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/old/plans/plan_select_screen/bloc/plan_select_bloc.dart b/lib/old/plans/plan_select_screen/bloc/plan_select_bloc.dart deleted file mode 100644 index 4f2d6bf7..00000000 --- a/lib/old/plans/plan_select_screen/bloc/plan_select_bloc.dart +++ /dev/null @@ -1,68 +0,0 @@ -//import 'package:eatvio_app/old/auth/auth_screen/auth_screen.dart'; -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/plans/plan_select_screen/models/plan_select_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; -import 'package:image_picker/image_picker.dart'; - -part 'plan_select_event.dart'; -part 'plan_select_state.dart'; - -/// A bloc that manages the state of a PlanSelect according to the event that is dispatched to it. -class PlanSelectBloc extends Bloc { - PlanSelectBloc(PlanSelectState initialState) : super(initialState) { - on(_onInitialize); - } - - Future _onInitialize( - PlanSelectInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final response = await http.get( - Uri.parse(baseUrl + '/api/plans/index'), - ); - - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is List) { - if (state is PlanSelectLoadedState) { - var currentState = state as PlanSelectLoadedState; - emit( - (currentState).copyWith( - posts: data, - myProfileModelObj: currentState.myProfileModelObj, - ), - ); - } else { - emit( - PlanSelectLoadedState( - posts: data, - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(PlanSelectErrorState('Неверный формат ответа API.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(PlanSelectErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(PlanSelectErrorState('Ошибка при получении данных ленты: $e')); - } - } -} diff --git a/lib/old/plans/plan_select_screen/bloc/plan_select_event.dart b/lib/old/plans/plan_select_screen/bloc/plan_select_event.dart deleted file mode 100644 index 1cae632f..00000000 --- a/lib/old/plans/plan_select_screen/bloc/plan_select_event.dart +++ /dev/null @@ -1,25 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_select_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///PlanSelect widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class PlanSelectEvent extends Equatable {} - -/// Event that is dispatched when the PlanSelect widget is first created. -class PlanSelectInitialEvent extends PlanSelectEvent { - @override - List get props => []; -} - -class UploadAvatar extends PlanSelectEvent { - UploadAvatar(this.image); - - final XFile image; - - @override - List get props => [image]; -} diff --git a/lib/old/plans/plan_select_screen/bloc/plan_select_state.dart b/lib/old/plans/plan_select_screen/bloc/plan_select_state.dart deleted file mode 100644 index b5245be7..00000000 --- a/lib/old/plans/plan_select_screen/bloc/plan_select_state.dart +++ /dev/null @@ -1,49 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_select_bloc.dart'; - -class PlanSelectState extends Equatable { - const PlanSelectState({this.myProfileModelObj}); - - final PlanSelectModel? myProfileModelObj; - - @override - List get props => [myProfileModelObj]; -} - -class PlanSelectInitialState extends PlanSelectState { - PlanSelectInitialState({required PlanSelectModel myProfileModelObj}) : super(myProfileModelObj: myProfileModelObj); -} - -/// Represents the state of PlanSelect in the application. -class PlanSelectLoadedState extends PlanSelectState { - PlanSelectLoadedState({this.myProfileModelObj, this.posts}) : super(myProfileModelObj: null); - - PlanSelectModel? myProfileModelObj; - List? posts; - - @override - List get props => [ - myProfileModelObj, - posts, - ]; - - PlanSelectLoadedState copyWith({ - PlanSelectModel? myProfileModelObj, - List? posts, - }) { - return PlanSelectLoadedState( - myProfileModelObj: myProfileModelObj ?? this.myProfileModelObj, - posts: posts ?? this.posts, - ); - } -} - -class PlanSelectErrorState extends PlanSelectState { - final String errorMessage; - - const PlanSelectErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} diff --git a/lib/old/plans/plan_select_screen/models/plan_select_model.dart b/lib/old/plans/plan_select_screen/models/plan_select_model.dart deleted file mode 100644 index 238869f6..00000000 --- a/lib/old/plans/plan_select_screen/models/plan_select_model.dart +++ /dev/null @@ -1,16 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [k0_page], -/// and is typically used to hold data that is passed between different parts of the application. -class PlanSelectModel extends Equatable { - PlanSelectModel(); - - PlanSelectModel copyWith() { - return PlanSelectModel(); - } - - @override - List get props => []; -} diff --git a/lib/old/plans/plan_select_screen/plan_select_screen.dart b/lib/old/plans/plan_select_screen/plan_select_screen.dart deleted file mode 100644 index 991ffe24..00000000 --- a/lib/old/plans/plan_select_screen/plan_select_screen.dart +++ /dev/null @@ -1,202 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_leading_image.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_subtitle.dart'; -import 'package:eatvio_app/widgets/app_bar/custom_app_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/plan_select_bloc.dart'; -import 'models/plan_select_model.dart'; - -class PlanSelectScreen extends StatelessWidget { - static Widget builder(BuildContext context) { - return BlocProvider( - create: (context) => PlanSelectBloc(PlanSelectState(myProfileModelObj: PlanSelectModel()))..add(PlanSelectInitialEvent()), - child: PlanSelectScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is PlanSelectInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } else if (state is PlanSelectLoadedState) { - // Данные загружены, можно строить экран. - return _buildSetingsScreen(context, state); - } else { - // Другие состояния, если они есть. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } - }, - ); - } - - _buildSetingsScreen(BuildContext context, PlanSelectLoadedState state) { - return Scaffold( - appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, - ), - backgroundColor: Colors.grey[200], - resizeToAvoidBottomInset: true, - body: SingleChildScrollView( - child: Container( - width: double.maxFinite, - decoration: BoxDecoration(color: Colors.grey[200]), - child: Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: 10), - Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: CustomAppBar( - height: 54, - leadingWidth: 28, - leading: AppbarLeadingImage( - imagePath: ImageConstant.imgArrowLeft, - margin: EdgeInsets.only(left: 16, top: 15, bottom: 15), - onTap: () => GoRouter.of(context).pop(), - ), - title: Padding( - padding: EdgeInsets.only(left: 20), - child: Row( - children: [ - AppbarSubtitle( - text: "Планы", - margin: EdgeInsets.only(left: 80, top: 12, bottom: 9), - ), - Spacer(), - Padding( - padding: const EdgeInsets.only(right: 20.0), - child: GestureDetector( - onTap: () => GoRouter.of(context).goNamed('planCreateScreen'), - child: Icon(Icons.create_outlined), - ), - ), - ], - ), - ), - ), - ), - SizedBox(height: 20), - _buildPlanList(context, state), - ], - ), - ), - ), - ), - ); - } - - _buildPlanList(BuildContext context, PlanSelectLoadedState state) { - return ListView.builder( - shrinkWrap: true, // Add this line - itemCount: state.posts?.length ?? 0, - itemBuilder: (context, index) { - final post = state.posts?[index]; - return Container( - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: ListTile( - leading: CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + post['image'], - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - title: Text( - post?['name'] ?? '', - style: CustomTextStyles.titleMediumSemiBold, - ), - subtitle: Text(post?['details'] ?? ''), - onTap: () => GoRouter.of(context).goNamed( - 'planScreen', - extra: post?['id'].toString(), - ), - trailing: GestureDetector( - onTap: () => GoRouter.of(context).goNamed( - 'planEditScreen', - extra: post?['id'].toString(), - ), - child: Icon(Icons.edit), - ), - ), - ); - }, - ); - } - - Function onTapBack(BuildContext context) { - return () { - onTapArrowLeft(context); - }; - } - - onTapArrowLeft(BuildContext context) { - GoRouter.of(context).pop(); - } -} diff --git a/lib/old/plans/plan_show_screen/bloc/plan_show_bloc.dart b/lib/old/plans/plan_show_screen/bloc/plan_show_bloc.dart deleted file mode 100644 index 36cdea7f..00000000 --- a/lib/old/plans/plan_show_screen/bloc/plan_show_bloc.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/plans/plan_show_screen/models/plan_show_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'plan_show_event.dart'; -part 'plan_show_state.dart'; - -/// A bloc that manages the state of a Plan according to the event that is dispatched to it. -class PlanBloc extends Bloc { - PlanBloc(PlanState initialState) : super(initialState) { - on(_onInitialize); - on(_deleteEntry); - } - - _onInitialize( - PlanInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final String? planID = state.planModelObj?.planID; - final response = await http.get( - Uri.parse(baseUrl + '/api/plans/show/$planID'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map) { - if (state is PlanLoadedState) { - var currentState = state as PlanLoadedState; - emit(currentState.copyWith(planModelObj: currentState.planModelObj, plan: currentState.plan)); - } else { - emit(PlanLoadedState(plan: data)); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(PlanErrorState('Некоторые необходимые данные отсутствуют.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(PlanErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(PlanErrorState('Ошибка при получении данных о чатах: $e')); - } - } - - FutureOr _deleteEntry(DeleteEntry event, Emitter emit) async { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final int id = event.id; - final response = await http.post( - Uri.parse(baseUrl + '/api/plans/delete/$id'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed('planSelectScreen'); - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(PlanErrorState('Ошибка: ${response.statusCode}')); - } - } -} diff --git a/lib/old/plans/plan_show_screen/bloc/plan_show_event.dart b/lib/old/plans/plan_show_screen/bloc/plan_show_event.dart deleted file mode 100644 index 6572e250..00000000 --- a/lib/old/plans/plan_show_screen/bloc/plan_show_event.dart +++ /dev/null @@ -1,25 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_show_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///Plan widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class PlanEvent extends Equatable {} - -/// Event that is dispatched when the Plan widget is first created. -class PlanInitialEvent extends PlanEvent { - @override - List get props => []; -} - -class DeleteEntry extends PlanEvent { - DeleteEntry(this.id); - - final int id; - - @override - List get props => [id]; -} diff --git a/lib/old/plans/plan_show_screen/bloc/plan_show_state.dart b/lib/old/plans/plan_show_screen/bloc/plan_show_state.dart deleted file mode 100644 index 127be045..00000000 --- a/lib/old/plans/plan_show_screen/bloc/plan_show_state.dart +++ /dev/null @@ -1,53 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'plan_show_bloc.dart'; - -/// Represents the state of Plan in the application. -/// - -class PlanState extends Equatable { - PlanState({ - this.planModelObj, - }); - - PlanModel? planModelObj; - - @override - List get props => [planModelObj]; - - PlanState copyWith({PlanModel? planModelObj}) { - return PlanState( - planModelObj: planModelObj ?? this.planModelObj, - ); - } -} - -class PlanLoadedState extends PlanState { - PlanLoadedState({this.planModelObj, this.plan}); - - PlanModel? planModelObj; - Map? plan; - - @override - List get props => [planModelObj, plan]; - - PlanLoadedState copyWith({PlanModel? planModelObj, Map? plan}) { - return PlanLoadedState( - planModelObj: planModelObj ?? this.planModelObj, - plan: plan ?? this.plan, - ); - } -} - -class PlanErrorState extends PlanState { - final String errorMessage; - - PlanErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class PlanInitialState extends PlanState { - PlanInitialState({required PlanModel planModelObj}) : super(planModelObj: planModelObj); -} diff --git a/lib/old/plans/plan_show_screen/models/plan_show_model.dart b/lib/old/plans/plan_show_screen/models/plan_show_model.dart deleted file mode 100644 index 6a6c37c2..00000000 --- a/lib/old/plans/plan_show_screen/models/plan_show_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [plan_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class PlanModel extends Equatable { - final String planID; - - PlanModel({required String planID}) : planID = planID; - - PlanModel copyWith(String planID) { - return PlanModel(planID: planID); - } - - @override - List get props => [planID]; -} diff --git a/lib/old/plans/plan_show_screen/plan_show_screen.dart b/lib/old/plans/plan_show_screen/plan_show_screen.dart deleted file mode 100644 index f2467d2b..00000000 --- a/lib/old/plans/plan_show_screen/plan_show_screen.dart +++ /dev/null @@ -1,146 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/plan_show_bloc.dart'; -import 'models/plan_show_model.dart'; - -class PlanScreen extends StatelessWidget { - const PlanScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - final planID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => PlanBloc(PlanState(planModelObj: PlanModel(planID: planID.toString())))..add(PlanInitialEvent()), - child: PlanScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is PlanInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is PlanLoadedState) { - // Данные загружены, можно строить экран. - return _buildPlan(context, state); - } else if (state is PlanErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildPlan(BuildContext context, PlanLoadedState state) { - return SafeArea( - child: Scaffold( - resizeToAvoidBottomInset: false, - body: Container( - width: double.maxFinite, - decoration: AppDecoration.fillGray, - child: ListView( - children: [ - SizedBox(height: 30), - Container( - margin: EdgeInsets.only( - left: 16, - right: 20, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (state.plan?['image'] ?? ''), - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - SizedBox(height: 16.0), - Text(state.plan?['name'], style: CustomTextStyles.titleMediumBlack), - SizedBox(height: 8.0), - Text( - state.plan?['details'], - ), - SizedBox(height: 16.0), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - ElevatedButton( - onPressed: () { - // Действие для редактирования - }, - child: Text('Редактировать'), - ), - ElevatedButton( - onPressed: () => context.read().add(DeleteEntry(state.plan?['id'])), - child: Text('Удалить'), - ), - ], - ), - ], - ), - ), - ], - ), - ), - ), - ); - } - - ///Handling page based on route - Widget getCurrentPage( - BuildContext context, - String currentRoute, - ) { - switch (currentRoute) { - case '/plan': - return PlanScreen.builder(context); - default: - return PlanScreen(); - } - } - - /// Navigates to the previous screen. - onTapArrowleftone(BuildContext context) { - GoRouter.of(context).pop(); - } -} diff --git a/lib/old/profile/my_profile_screen/bloc/my_profile_bloc.dart b/lib/old/profile/my_profile_screen/bloc/my_profile_bloc.dart deleted file mode 100644 index 5f17e43c..00000000 --- a/lib/old/profile/my_profile_screen/bloc/my_profile_bloc.dart +++ /dev/null @@ -1,294 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/profile/my_profile_screen/models/my_profile_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; -import 'package:image_picker/image_picker.dart'; - -part 'my_profile_event.dart'; -part 'my_profile_state.dart'; - -/// A bloc that manages the state of a MyProfile according to the event that is dispatched to it. -class MyProfileBloc extends Bloc { - MyProfileBloc(MyProfileState initialState) : super(initialState) { - on(_onInitialize); - on(_uploadAvatar); - } - - Future _onInitialize( - MyProfileInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final response = await http.get( - Uri.parse(baseUrl + '/api/profile/index'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map && - data.containsKey('user') && - data.containsKey('userDetails') && - data.containsKey('chartPoints') && - data.containsKey('circumferences')) { - if (state is MyProfileLoadedState) { - var currentState = state as MyProfileLoadedState; - var plans = [] - ..addAll(data["finishedPlans"]) - ..addAll(data["rejectedPlans"]) - ..addAll(data["startedPlan"]) - ..addAll(data["paidPlan"]) - ..addAll(data["requestedPlan"]) - ..addAll(data["initedPlan"]); - emit( - (currentState).copyWith( - chartPoints: currentState.chartPoints, - chartDates: currentState.chartDates, - circumferences: currentState.circumferences, - user: data['user'], - userDetails: data['userDetails'], - plans: plans, - token: await TokenStorage.getTokenFromStorage(), - chestCircumferenceController: TextEditingController(), - waistCircumferenceController: TextEditingController(), - hipCircumferenceController: TextEditingController(), - weightController: TextEditingController(), - chestCircumferenceFormController: currentState.chestCircumferenceFormController, - waistCircumferenceFormController: currentState.waistCircumferenceFormController, - hipCircumferenceFormController: currentState.hipCircumferenceFormController, - firstNameFormController: currentState.firstNameFormController, - lastNameFormController: currentState.lastNameFormController, - countryFormController: currentState.countryFormController, - cityFormController: currentState.cityFormController, - heightFormController: currentState.heightFormController, - upPressureFormController: currentState.upPressureFormController, - downPressureFormController: currentState.downPressureFormController, - allergiesFormController: currentState.allergiesFormController, - pillsFormController: currentState.pillsFormController, - favoriteFormController: currentState.favoriteFormController, - unfavoriteFormController: currentState.unfavoriteFormController, - additionalFormController: currentState.additionalFormController, - sportsFormController: currentState.sportsFormController, - dateFormController: currentState.dateFormController, - hypoFormController: currentState.hypoFormController, - hyperFormController: currentState.hyperFormController, - selectedCity: currentState.selectedCity, - selectedCountry: currentState.selectedCountry, - selectedActivity: currentState.selectedActivity, - myProfileModelObj: currentState.myProfileModelObj, - ), - ); - } else { - var plans = [] - ..addAll(data["finishedPlans"]) - ..addAll(data["rejectedPlans"]) - ..addAll(data["startedPlan"]) - ..addAll(data["paidPlan"]) - ..addAll(data["requestedPlan"]) - ..addAll(data["initedPlan"]); - - /* - - - */ - if (data["chartPoints"].length == 1) { - data["chartPoints"] = []; - } - if (data["circumferences"].length == 1) { - data["circumferences"] = []; - } - var circumferences = data["circumferences"].isEmpty - ? data["circumferences"].asMap().map((index, value) { - return MapEntry(index.toString(), value); - }) - : data["circumferences"]; - var chartPoints = data["chartPoints"].isEmpty - ? data["chartPoints"].asMap().map((index, value) { - return MapEntry(index.toString(), value); - }) - : data["chartPoints"]; - - List dates = [ - "0000-00-00 00:00:00", - "0000-00-00 00:00:00", - "0000-00-00 00:00:00", - "0000-00-00 00:00:00", - ]; - for (int i = 0; i < data["circumferences"].length; i++) { - dates[i] = data["circumferences"]['$i']["created_at"]; - } - if (chartPoints.length < 4) { - for (int i = chartPoints.length; i < 4; i++) { - chartPoints["$i"] = { - "id": 0, - "user_id": 0, - "weight": 0, - "created_at": "0000-00-00 00:00:00", - "updated_at": "0000-00-00 00:00:00", - }; - } - } - - if (circumferences.length < 4) { - for (int i = circumferences.length; i < 4; i++) { - circumferences["$i"] = { - "id": 0, - "user_id": 0, - "chest_circumference": 0, - "waist_circumference": 0, - "hip_circumference": 0, - "created_at": "0000-00-00 00:00:00", - "updated_at": "0000-00-00 00:00:00", - }; - } - } - - emit( - MyProfileLoadedState( - chartPoints: chartPoints, - chartDates: dates, - circumferences: circumferences, - user: data['user'], - userDetails: data['userDetails'], - plans: plans, - token: await TokenStorage.getTokenFromStorage(), - chestCircumferenceController: TextEditingController(), - waistCircumferenceController: TextEditingController(), - hipCircumferenceController: TextEditingController(), - hypoFormController: data['userDetails']['has_hypo'].toString(), - hyperFormController: data['userDetails']['has_hyper'].toString(), - chestCircumferenceFormController: TextEditingController( - text: data['userDetails']['chest_circumference']?.toString(), - ), - waistCircumferenceFormController: TextEditingController( - text: data['userDetails']['waist_circumference']?.toString(), - ), - hipCircumferenceFormController: TextEditingController( - text: data['userDetails']['hip_circumference']?.toString(), - ), - weightController: TextEditingController( - text: data['userDetails']['weight']?.toString(), - ), - weightFormController: TextEditingController( - text: data['userDetails']['weight']?.toString(), - ), - firstNameFormController: TextEditingController( - text: data['userDetails']['first_name'], - ), - lastNameFormController: TextEditingController(text: data['userDetails']['last_name']), - countryFormController: TextEditingController(text: data['userDetails']['country']), - cityFormController: TextEditingController(text: data['userDetails']['city']), - heightFormController: TextEditingController( - text: data['userDetails']['height']?.toString(), - ), - upPressureFormController: TextEditingController( - text: data['userDetails']['blood_pressure_up']?.toString(), - ), - downPressureFormController: TextEditingController( - text: data['userDetails']['blood_pressure_down']?.toString(), - ), - allergiesFormController: TextEditingController( - text: data['userDetails']['about_alergy'], - ), - pillsFormController: TextEditingController( - text: data['userDetails']['about_taking_pils'], - ), - sportsFormController: TextEditingController( - text: data['userDetails']['about_sport_hobbies'], - ), - favoriteFormController: TextEditingController( - text: data['userDetails']['favorite_foods'], - ), - unfavoriteFormController: TextEditingController( - text: data['userDetails']['unfavorite_foods'], - ), - additionalFormController: TextEditingController( - text: data['userDetails']['additional_info'], - ), - dateFormController: TextEditingController(text: data['userDetails']['birthdate']), - selectedCity: data['userDetails']['city'], - selectedCountry: data['userDetails']['country'], - selectedActivity: determineActivityLevel( - data['userDetails']['activity_coefficient'], - ), - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit( - MyProfileErrorState('Некоторые необходимые данные отсутствуют.'), - ); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(MyProfileErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(MyProfileErrorState('Ошибка при получении данных профиля: $e')); - } - } - - String determineActivityLevel(double activityFactor) { - if (activityFactor <= 1.2) { - return "сидячий"; - } else if (activityFactor <= 1.375) { - return "низкий (1-3 тренировки в неделю по 20 мин)"; - } else if (activityFactor <= 1.55) { - return "умеренный (3-4 тренировки в неделю по 30-60 мин)"; - } else if (activityFactor <= 1.7) { - return "высокий (5-7 тренировок по 30-60 мин)"; - } else { - return "экстремальный (несколько интенсивных тренировок в день)"; - } - } // колхоз, но свитчкейсы в дарте странно ведут себя при сравнении double - - Future _uploadAvatar( - UploadAvatar event, - Emitter emit, - ) async { - if (state is MyProfileLoadedState) { - var currentState = state as MyProfileLoadedState; - - await uploadImageToServer(event.image.path, currentState.token); - this.add(MyProfileInitialEvent()); - } - } - - Future uploadImageToServer(String imagePath, String? token) async { - String url = '${baseUrl}/api/profile/photo/upload'; - - var request = http.MultipartRequest('POST', Uri.parse(url)); - request.headers['Authorization'] = 'Bearer $token'; - - request.files.add(await http.MultipartFile.fromPath('photo', imagePath)); - - var client = http.Client(); - var streamedResponse = await client.send(request); - - if (streamedResponse.statusCode == 200) { - var response = await http.Response.fromStream(streamedResponse); - var imageUrl = response.body; - - return imageUrl; - } else { - throw Exception( - 'Failed to upload image. Status code: ${streamedResponse.statusCode} ${streamedResponse}}', - ); - } - } -} diff --git a/lib/old/profile/my_profile_screen/bloc/my_profile_event.dart b/lib/old/profile/my_profile_screen/bloc/my_profile_event.dart deleted file mode 100644 index e6822525..00000000 --- a/lib/old/profile/my_profile_screen/bloc/my_profile_event.dart +++ /dev/null @@ -1,25 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'my_profile_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///MyProfile widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class MyProfileEvent extends Equatable {} - -/// Event that is dispatched when the MyProfile widget is first created. -class MyProfileInitialEvent extends MyProfileEvent { - @override - List get props => []; -} - -class UploadAvatar extends MyProfileEvent { - UploadAvatar(this.image); - - final XFile image; - - @override - List get props => [image]; -} diff --git a/lib/old/profile/my_profile_screen/bloc/my_profile_state.dart b/lib/old/profile/my_profile_screen/bloc/my_profile_state.dart deleted file mode 100644 index 002d6f0d..00000000 --- a/lib/old/profile/my_profile_screen/bloc/my_profile_state.dart +++ /dev/null @@ -1,216 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'my_profile_bloc.dart'; - -class MyProfileState extends Equatable { - const MyProfileState({this.myProfileModelObj}); - - final MyProfileModel? myProfileModelObj; - - @override - List get props => [myProfileModelObj]; -} - -class MyProfileInitialState extends MyProfileState { - MyProfileInitialState({required MyProfileModel myProfileModelObj}) : super(myProfileModelObj: myProfileModelObj); -} - -/// Represents the state of MyProfile in the application. -class MyProfileLoadedState extends MyProfileState { - MyProfileLoadedState({ - this.chestCircumferenceController, - this.waistCircumferenceController, - this.hipCircumferenceController, - this.myProfileModelObj, - this.weightController, - this.user, - this.userDetails, - this.chartPoints, - this.chartDates, - this.plans, - this.token, - this.selectedCountry, - this.selectedCity, - this.selectedActivity, - this.chestCircumferenceFormController, - this.waistCircumferenceFormController, - this.hipCircumferenceFormController, - this.firstNameFormController, - this.lastNameFormController, - this.countryFormController, - this.dateFormController, - this.cityFormController, - this.heightFormController, - this.weightFormController, - this.upPressureFormController, - this.downPressureFormController, - this.allergiesFormController, - this.pillsFormController, - this.sportsFormController, - this.favoriteFormController, - this.unfavoriteFormController, - this.additionalFormController, - this.hypoFormController, - this.hyperFormController, - this.circumferences, - }) : super(myProfileModelObj: null); - - MyProfileModel? myProfileModelObj; - Map? user; - Map? userDetails; - Map? circumferences; - Map? chartPoints; - List? chartDates; - List? plans; - TextEditingController? weightController; - TextEditingController? chestCircumferenceController; - TextEditingController? waistCircumferenceController; - TextEditingController? hipCircumferenceController; - TextEditingController? weightFormController; - TextEditingController? chestCircumferenceFormController; - TextEditingController? waistCircumferenceFormController; - TextEditingController? hipCircumferenceFormController; - TextEditingController? firstNameFormController; - TextEditingController? lastNameFormController; - TextEditingController? countryFormController; - TextEditingController? dateFormController; - TextEditingController? cityFormController; - TextEditingController? heightFormController; - TextEditingController? upPressureFormController; - TextEditingController? downPressureFormController; - TextEditingController? allergiesFormController; - TextEditingController? pillsFormController; - TextEditingController? sportsFormController; - TextEditingController? favoriteFormController; - TextEditingController? unfavoriteFormController; - TextEditingController? additionalFormController; - String? token; - String? selectedCountry; - String? selectedCity; - String? selectedActivity; - String? hypoFormController; - String? hyperFormController; - - @override - List get props => [ - myProfileModelObj, - user, - chartPoints, - chartDates, - circumferences, - plans, - weightController, - chestCircumferenceController, - waistCircumferenceController, - hipCircumferenceController, - token, - chestCircumferenceFormController, - waistCircumferenceFormController, - hipCircumferenceFormController, - firstNameFormController, - lastNameFormController, - countryFormController, - dateFormController, - cityFormController, - heightFormController, - weightFormController, - upPressureFormController, - downPressureFormController, - allergiesFormController, - pillsFormController, - sportsFormController, - favoriteFormController, - unfavoriteFormController, - additionalFormController, - selectedCountry, - selectedCity, - selectedActivity, - hypoFormController, - hyperFormController, - ]; - - MyProfileLoadedState copyWith({ - MyProfileModel? myProfileModelObj, - Map? user, - Map? userDetails, - List? plans, - Map? chartPoints, - List? chartDates, - Map? circumferences, - TextEditingController? weightController, - TextEditingController? chestCircumferenceController, - TextEditingController? waistCircumferenceController, - TextEditingController? hipCircumferenceController, - TextEditingController? chestCircumferenceFormController, - TextEditingController? waistCircumferenceFormController, - TextEditingController? hipCircumferenceFormController, - TextEditingController? firstNameFormController, - TextEditingController? lastNameFormController, - TextEditingController? countryFormController, - TextEditingController? dateFormController, - TextEditingController? cityFormController, - TextEditingController? heightFormController, - TextEditingController? weightFormeFormController, - TextEditingController? allergiesFormController, - TextEditingController? pillsFormController, - TextEditingController? sportsFormController, - TextEditingController? favoriteFormController, - TextEditingController? unfavoriteFormController, - TextEditingController? additionalFormController, - TextEditingController? downPressureFormController, - TextEditingController? upPressureFormController, - String? token, - String? selectedCountry, - String? selectedCity, - String? selectedActivity, - String? hypoFormController, - String? hyperFormController, - }) { - return MyProfileLoadedState( - myProfileModelObj: myProfileModelObj ?? this.myProfileModelObj, - user: user ?? this.user, - plans: plans ?? this.plans, - userDetails: userDetails ?? this.userDetails, - circumferences: circumferences ?? this.circumferences, - chartPoints: chartPoints ?? this.chartPoints, - chartDates: chartDates ?? this.chartDates, - weightController: weightController ?? this.weightController, - chestCircumferenceController: chestCircumferenceController ?? this.chestCircumferenceController, - waistCircumferenceController: waistCircumferenceController ?? this.waistCircumferenceController, - hipCircumferenceController: hipCircumferenceController ?? this.hipCircumferenceController, - chestCircumferenceFormController: chestCircumferenceFormController ?? this.chestCircumferenceFormController, - waistCircumferenceFormController: waistCircumferenceFormController ?? this.waistCircumferenceFormController, - hipCircumferenceFormController: hipCircumferenceFormController ?? this.hipCircumferenceFormController, - firstNameFormController: firstNameFormController ?? this.firstNameFormController, - lastNameFormController: lastNameFormController ?? this.lastNameFormController, - countryFormController: countryFormController ?? this.countryFormController, - dateFormController: dateFormController ?? this.dateFormController, - cityFormController: cityFormController ?? this.cityFormController, - heightFormController: heightFormController ?? this.heightFormController, - weightFormController: weightFormController ?? this.weightFormController, - upPressureFormController: upPressureFormController ?? this.upPressureFormController, - downPressureFormController: downPressureFormController ?? this.downPressureFormController, - allergiesFormController: allergiesFormController ?? this.allergiesFormController, - pillsFormController: pillsFormController ?? this.pillsFormController, - sportsFormController: sportsFormController ?? this.sportsFormController, - favoriteFormController: favoriteFormController ?? this.favoriteFormController, - unfavoriteFormController: unfavoriteFormController ?? this.unfavoriteFormController, - additionalFormController: additionalFormController ?? this.additionalFormController, - token: token ?? this.token, - selectedCountry: selectedCountry ?? this.selectedCountry, - selectedCity: selectedCity ?? this.selectedCity, - selectedActivity: selectedActivity ?? this.selectedActivity, - hypoFormController: hypoFormController ?? this.hypoFormController, - hyperFormController: hyperFormController ?? this.hyperFormController, - ); - } -} - -class MyProfileErrorState extends MyProfileState { - final String errorMessage; - - const MyProfileErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} diff --git a/lib/old/profile/my_profile_screen/models/my_profile_model.dart b/lib/old/profile/my_profile_screen/models/my_profile_model.dart deleted file mode 100644 index ae803e19..00000000 --- a/lib/old/profile/my_profile_screen/models/my_profile_model.dart +++ /dev/null @@ -1,16 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [k0_page], -/// and is typically used to hold data that is passed between different parts of the application. -class MyProfileModel extends Equatable { - MyProfileModel(); - - MyProfileModel copyWith() { - return MyProfileModel(); - } - - @override - List get props => []; -} diff --git a/lib/old/profile/my_profile_screen/my_settings_screen.dart b/lib/old/profile/my_profile_screen/my_settings_screen.dart deleted file mode 100644 index 9f3df67e..00000000 --- a/lib/old/profile/my_profile_screen/my_settings_screen.dart +++ /dev/null @@ -1,202 +0,0 @@ -import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_leading_image.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_subtitle.dart'; -import 'package:eatvio_app/widgets/app_bar/custom_app_bar.dart'; -import 'package:eatvio_app/widgets/custom_about_list.dart'; -import 'package:eatvio_app/widgets/custom_expandable_list.dart'; -import 'package:eatvio_app/widgets/custom_language_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_notification_screen.dart'; -import 'package:eatvio_app/widgets/custom_section_title.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/my_profile_bloc.dart'; -import 'models/my_profile_model.dart'; - -class MySettingsScreen extends StatelessWidget { - static Widget builder(BuildContext context) { - return BlocProvider( - create: (context) => MyProfileBloc(MyProfileState(myProfileModelObj: MyProfileModel()))..add(MyProfileInitialEvent()), - child: MySettingsScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is MyProfileInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } else if (state is MyProfileLoadedState) { - // Данные загружены, можно строить экран. - return _buildSetingsScreen(context, state); - } else { - // Другие состояния, если они есть. - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } - }, - ); - } - - _buildSetingsScreen(BuildContext context, MyProfileLoadedState state) { - return Scaffold( - appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, - ), - backgroundColor: Colors.grey[200], - resizeToAvoidBottomInset: true, - body: SingleChildScrollView( - child: Container( - width: double.maxFinite, - decoration: BoxDecoration(color: Colors.grey[200]), - child: Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: 30), - Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: CustomAppBar( - height: 54, - leadingWidth: 28, - leading: AppbarLeadingImage( - imagePath: ImageConstant.imgArrowLeft, - margin: EdgeInsets.only(left: 16, top: 15, bottom: 15), - onTap: () => GoRouter.of(context).pop(), - ), - title: Padding( - padding: EdgeInsets.only(left: 20), - child: Row(children: [AppbarSubtitle(text: state.user?['name'], margin: EdgeInsets.only(left: 80, top: 12, bottom: 9))]), - ), - ), - ), - SizedBox(height: 20), - Container( - padding: EdgeInsets.symmetric( - horizontal: 24, - vertical: 12, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - children: [ - SectionTitle('Язык'), - LanguageDropdown(), - ], - ), - ), - SizedBox(height: 20), - Container( - padding: EdgeInsets.symmetric( - horizontal: 24, - vertical: 12, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - children: [ - SectionTitle('Уведомления'), - NotificationSwitch('Уведомление об обновлениях'), - NotificationSwitch('Напоминания о заполнении'), - ], - ), - ), - SizedBox(height: 20), - Container( - padding: EdgeInsets.symmetric( - horizontal: 24, - vertical: 12, - ), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - children: [ - SectionTitle('Дополнительная информация'), - ExpandableList('Персональные данные'), - AboutList('О нас', ['ООО Итвио', '2023-н.в.']), - ], - ), - ), - ], - ), - ), - ), - ), - ); - } - - Function onTapBack(BuildContext context) { - return () { - onTapArrowLeft(context); - }; - } - - onTapArrowLeft(BuildContext context) { - GoRouter.of(context).pop(); - } -} diff --git a/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart b/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart deleted file mode 100644 index da258c37..00000000 --- a/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_bloc.dart +++ /dev/null @@ -1,225 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/recipe/recipe_edit_screen/models/recipe_edit_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'recipe_edit_event.dart'; -part 'recipe_edit_state.dart'; - -/// A bloc that manages the state of a RecipeEdit according to the event that is dispatched to it. -class RecipeEditBloc extends Bloc { - RecipeEditBloc(RecipeEditState initialState) : super(initialState) { - on(_onInitialize); - on(_editRecipe); - on(_addStep); - on(_removeStep); - on(_reloadScreen); - } - - _onInitialize( - RecipeEditInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final String? recipeID = state.recipeModelObj?.recipeID; - final response = await http.get( - Uri.parse(baseUrl + '/api/recipes/show/$recipeID'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is Map) { - if (state is RecipeEditLoadedState) { - var currentState = state as RecipeEditLoadedState; - emit( - currentState.copyWith( - recipeModelObj: currentState.recipeModelObj, - title: currentState.title, - token: currentState.token, - recipe: currentState.recipe, - description: currentState.description, - video_url: currentState.video_url, - steps: currentState.steps, - stepDescriptions: currentState.stepDescriptions, - tags: currentState.tags, - ), - ); - } else { - final Map defaultStep = { - 'description': '', - 'image': '', - }; - - List steps = data['steps']; - List stepDescriptions = []; - - if (data['steps'] == null) { - stepDescriptions.add(TextEditingController()); - data['steps'].add(defaultStep); - } else { - for (var step in steps) { - stepDescriptions.add(TextEditingController(text: step['description'])); - } - } - - emit( - RecipeEditLoadedState( - token: await TokenStorage.getTokenFromStorage(), - recipe: data, - title: TextEditingController(text: data['title']), - description: TextEditingController(text: data['description']), - video_url: TextEditingController(text: data['video_url']), - tagsController: TextEditingController(), - tags: await _fetchTags(data['id']), - stepDescriptions: stepDescriptions, - steps: steps, - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(RecipeEditErrorState('Некоторые необходимые данные отсутствуют.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(RecipeEditErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(RecipeEditErrorState('Ошибка при получении данных о чатах: $e')); - } - } - - FutureOr _editRecipe(EditRecipe event, Emitter emit) async { - if (state is RecipeEditLoadedState) { - var currentState = state as RecipeEditLoadedState; - - var response = await sendRecipe( - currentState.recipe, - currentState.title?.text, - currentState.video_url?.text, - currentState.description?.text, - ); - - if (response.statusCode == 200) { - AppRouter.navigatorKey.currentContext?.goNamed( - 'recipeScreen', - extra: currentState.recipe?['id'].toString(), - ); - } else {} - } - } - - FutureOr _addStep(AddStep event, Emitter emit) async { - if (state is RecipeEditLoadedState) { - var currentState = state as RecipeEditLoadedState; - - List? updatedSteps = currentState.steps; - List? updatedStepDescriptions = currentState.stepDescriptions; - - updatedSteps!.add({ - 'description': '', - 'image': '', - }); - updatedStepDescriptions!.add(TextEditingController()); - emit(currentState.copyWith(steps: updatedSteps, stepDescriptions: updatedStepDescriptions)); - await _reloadScreen(event, emit); - } - } - - FutureOr _removeStep(RemoveStep event, Emitter emit) async { - if (state is RecipeEditLoadedState) { - var currentState = state as RecipeEditLoadedState; - - List? updatedSteps = currentState.steps; - List? updatedStepDescriptions = currentState.stepDescriptions; - - updatedSteps!.removeAt(event.id); - updatedStepDescriptions!.removeAt(event.id); - emit(currentState.copyWith(steps: updatedSteps, stepDescriptions: updatedStepDescriptions)); - await _reloadScreen(event, emit); - } - } - - FutureOr sendRecipe( - Map? recipe, - String? title, - String? video_url, - String? description, - ) async { - int id = recipe?['id']; - String url = '${baseUrl}/api/recipe/update/$id'; - - final Map credentials = { - 'id': id, - 'title': title, - 'description': description, - 'video_url': video_url, - 'steps': - '[{"image": "steps/bT91V52zY2hIkjZezUxO4jW4njfhDfCe2PcMxciZ.jpg", "description": "Excepturi fuga sed quaerat impedit facere recusandae. Nihil exercitationem architecto accusantium ut. Qui consequuntur rerum quam asperiores repellendus molestias."}, {"image": "steps/7vaLlotrw65NXbqaD0dK4OTLVyxMgmB9wL3xBzg3.jpg", "description": "Sit hic sint ullam qui. Odit nihil possimus quo id itaque nisi non."}, {"image": "steps/et7cKUsnQkegcRAE72TS0mfAf2jLJXW93QDAGfjz.jpg", "description": "Ab dolores qui voluptatem sed quasi vero. Culpa minus optio in voluptatibus aut corrupti. Dolor expedita minus aut nesciunt quos quibusdam rerum."}, {"image": "steps/260401J6r71r9kuUt694VcsuMMQKTlQMrlIwfaKo.jpg", "description": "Eos dolores corrupti cupiditate aut. Nam nesciunt eveniet eos nam vitae ut. Quibusdam ab commodi ut natus. Nisi earum porro quidem et eligendi iste doloribus."}, {"image": "steps/Ol10BkOFeZ9EG4BAShgB1wnVwtCimoUMcSNDh2EB.jpg", "description": "Consectetur optio porro nobis voluptas quibusdam. Consequatur dolor dolorem laboriosam magnam iste atque."}, {"image": "steps/8PanRq2aWWdXG1xCYkRyJ0M3Z39y6jMPfnHCqlVi.jpg", "description": "A optio porro eligendi ullam. Sed numquam ullam quasi aperiam inventore corrupti enim. Alias id et consequatur perferendis. Ullam consequatur incidunt nesciunt ut et aut."}, {"image": "steps/19U2sYSGDkprS3L8SIFT3xz59OwQJ5xs0A8etZjr.jpg", "description": "In doloribus vel voluptas dolorum. Temporibus iusto est repellat quo sed. Perspiciatis enim sit beatae in dolor ut. Quis ad qui eligendi nisi. Est suscipit dolore ratione dolores suscipit molestiae."}, {"image": "steps/CRxJtjgQw84kG3teJVtl9GqwWUQ1WKpvOeBbwf9a.jpg", "description": "Aut quia maiores et aut. Quidem ab voluptates blanditiis. Est quam quia repellat exercitationem rerum et iste mollitia. Et sed dolores tempore nam et similique qui."}, {"image": "steps/NoG9rHtvHNLrYI2LujURT3DMQCmEe68UbpiXco2y.jpg", "description": "Nam et dolorum delectus. Labore fuga asperiores nam cumque sit. Eum hic officiis ea asperiores qui. Soluta totam enim quasi explicabo sed aut."}]', - 'ingredients': - '[{"name": "Cheeseburger", "unit": "pcs", "portion": 336}, {"name": "Little Cheeseburger", "unit": "gr", "portion": 623}, {"name": "Bacon Burger", "unit": "ml", "portion": 713}, {"name": "Little Bacon Burger", "unit": "pcs", "portion": 160}, {"name": "Hamburger", "unit": "tablespoon", "portion": 390}, {"name": "Bacon Cheese Dog", "unit": "teespons", "portion": 295}, {"name": "Hamburger", "unit": "pcs", "portion": 813}, {"name": "Cheeseburger", "unit": "gr", "portion": 951}]', - }; - - var response = await http.post( - Uri.parse(url), - headers: { - 'Content-Type': 'application/json', - }, - body: json.encode(credentials), - encoding: utf8, - ); - - return response; - } - - _fetchTags(int id) async { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - - final response = await http.get( - Uri.parse(baseUrl + '/api/recipes/getTags/$id'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - final data = jsonDecode(response.body); - return data; - } - - FutureOr _reloadScreen(RecipeEditEvent? event, Emitter emit) async { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - if (state is RecipeEditLoadedState) { - var currentState = state as RecipeEditLoadedState; - emit( - currentState.copyWith( - recipeModelObj: currentState.recipeModelObj, - recipe: currentState.recipe, - title: currentState.title, - token: currentState.token, - description: currentState.description, - video_url: currentState.video_url, - steps: currentState.steps, - stepDescriptions: currentState.stepDescriptions, - tags: currentState.tags, - ), - ); - } - } -} diff --git a/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_event.dart b/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_event.dart deleted file mode 100644 index b4bdd5f5..00000000 --- a/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_event.dart +++ /dev/null @@ -1,44 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'recipe_edit_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///RecipeEdit widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class RecipeEditEvent extends Equatable {} - -/// Event that is dispatched when the RecipeEdit widget is first created. -class RecipeEditInitialEvent extends RecipeEditEvent { - @override - List get props => []; -} - -class EditRecipe extends RecipeEditEvent { - @override - List get props => []; -} - -class AddStep extends RecipeEditEvent { - AddStep(); - - @override - List get props => []; -} - -class RemoveStep extends RecipeEditEvent { - RemoveStep(this.id); - - final int id; - - @override - List get props => [id]; -} - -class ReloadScreen extends RecipeEditEvent { - ReloadScreen(); - - @override - List get props => []; -} diff --git a/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_state.dart b/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_state.dart deleted file mode 100644 index c01ffc41..00000000 --- a/lib/old/recipe/recipe_edit_screen/bloc/recipe_edit_state.dart +++ /dev/null @@ -1,91 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'recipe_edit_bloc.dart'; - -/// Represents the state of RecipeEdit in the application. -/// - -class RecipeEditState extends Equatable { - RecipeEditState({ - this.recipeModelObj, - }); - - RecipeEditModel? recipeModelObj; - - @override - List get props => [recipeModelObj]; - - RecipeEditState copyWith({RecipeEditModel? recipeModelObj}) { - return RecipeEditState( - recipeModelObj: recipeModelObj ?? this.recipeModelObj, - ); - } -} - -class RecipeEditLoadedState extends RecipeEditState { - RecipeEditLoadedState({ - this.recipeModelObj, - this.token, - this.recipe, - this.title, - this.description, - this.video_url, - this.tagsController, - this.stepDescriptions, - this.tags, - this.steps, - }); - - RecipeEditModel? recipeModelObj; - Map? recipe; - String? token; - TextEditingController? title; - TextEditingController? description; - TextEditingController? video_url; - TextEditingController? tagsController; - List? steps; - List? tags; - List? stepDescriptions; - - @override - List get props => [recipeModelObj, recipe, title, description, video_url]; - - RecipeEditLoadedState copyWith({ - RecipeEditModel? recipeModelObj, - Map? recipe, - String? token, - TextEditingController? title, - TextEditingController? description, - TextEditingController? video_url, - TextEditingController? tagsController, - List? steps, - List? tags, - List? stepDescriptions, - }) { - return RecipeEditLoadedState( - recipeModelObj: recipeModelObj ?? this.recipeModelObj, - token: token ?? this.token, - recipe: recipe ?? this.recipe, - title: title ?? this.title, - description: description ?? this.description, - video_url: video_url ?? this.video_url, - tagsController: tagsController ?? this.tagsController, - steps: steps ?? this.steps, - tags: tags ?? this.tags, - stepDescriptions: stepDescriptions ?? this.stepDescriptions, - ); - } -} - -class RecipeEditErrorState extends RecipeEditState { - final String errorMessage; - - RecipeEditErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} - -class RecipeEditInitialState extends RecipeEditState { - RecipeEditInitialState({required RecipeEditModel recipeModelObj}) : super(recipeModelObj: recipeModelObj); -} diff --git a/lib/old/recipe/recipe_edit_screen/models/recipe_edit_model.dart b/lib/old/recipe/recipe_edit_screen/models/recipe_edit_model.dart deleted file mode 100644 index 72176186..00000000 --- a/lib/old/recipe/recipe_edit_screen/models/recipe_edit_model.dart +++ /dev/null @@ -1,19 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [recipe_edit_screen], -/// and is typically used to hold data that is passed between different parts of the application. - -class RecipeEditModel extends Equatable { - final String recipeID; - - RecipeEditModel({required String recipeID}) : recipeID = recipeID; - - RecipeEditModel copyWith(String recipeID) { - return RecipeEditModel(recipeID: recipeID); - } - - @override - List get props => [recipeID]; -} diff --git a/lib/old/recipe/recipe_edit_screen/recipe_edit_screen.dart b/lib/old/recipe/recipe_edit_screen/recipe_edit_screen.dart deleted file mode 100644 index 28e34909..00000000 --- a/lib/old/recipe/recipe_edit_screen/recipe_edit_screen.dart +++ /dev/null @@ -1,460 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:eatvio_app/theme/custom_button_style.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_leading_image.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_subtitle.dart'; -import 'package:eatvio_app/widgets/app_bar/custom_app_bar.dart'; -import 'package:eatvio_app/widgets/custom_outlined_button.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/recipe_edit_bloc.dart'; -import 'models/recipe_edit_model.dart'; - -class RecipeEditScreen extends StatelessWidget { - const RecipeEditScreen({Key? key}) : super(key: key); - - static Widget builder(BuildContext context) { - final recipeID = ModalRoute.of(context)!.settings.arguments; - return BlocProvider( - create: (context) => RecipeEditBloc(RecipeEditState(recipeModelObj: RecipeEditModel(recipeID: recipeID.toString())))..add(RecipeEditInitialEvent()), - child: RecipeEditScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is RecipeEditInitialState) { - // Это начальное состояние, данные ещё не загружены. - return Container( - color: Colors.white, - ); - } else if (state is RecipeEditLoadedState) { - // Данные загружены, можно строить экран. - return _buildRecipeEdit(context, state); - } else if (state is RecipeEditErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildRecipeEdit(BuildContext context, RecipeEditLoadedState state) { - List steps = []; - if (state.steps != null) { - for (int i = 0; i < state.steps!.length; i++) { - steps.add(_buildStep(context, state, i)); - } - } - - return RefreshIndicator( - onRefresh: refreshPage(context), - child: Scaffold( - appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, - ), - resizeToAvoidBottomInset: false, - body: SafeArea( - child: Container( - width: double.maxFinite, - decoration: BoxDecoration(color: Colors.grey[200]), - child: ListView( - children: [ - _buldAppBar(context), - SizedBox(height: 20), - _buildRecipeInfo(state, context), - SizedBox(height: 20), - Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: steps, - ), - SizedBox(height: 20), - _buildAdditional(context, state), - ], - ), - ), - ), - ), - ); - } - - _buldAppBar(BuildContext context) { - return Container( - margin: EdgeInsets.all(16), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: CustomAppBar( - height: 54, - leadingWidth: 28, - leading: AppbarLeadingImage( - imagePath: ImageConstant.imgArrowLeft, - margin: EdgeInsets.only(left: 16, top: 15, bottom: 15), - onTap: onTapBack(context), - ), - title: Align( - alignment: Alignment.center, - child: AppbarSubtitle( - text: "Редактирование рецепта", - ), - ), - ), - ); - } - - _buildRecipeInfo(RecipeEditLoadedState state, BuildContext context) { - return Container( - margin: EdgeInsets.only( - left: 16, - right: 16, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - SizedBox(height: 16.0), - Align(alignment: Alignment.centerLeft, child: Text("Изображение")), - if (state.recipe?['image'] != null) - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (state.recipe?['image']), - width: double.infinity, - // Установите ширину равной ширине родительского элемента - height: 200.0, - fit: BoxFit.cover, - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => Icon(Icons.error), - ) - else - _buildAddPhoto(context, state), - SizedBox(height: 16.0), - Align(alignment: Alignment.centerLeft, child: Text("Название рецепта")), - CustomTextFormField( - controller: state.title, - hintText: "Введите название рецепта", - fillColor: appTheme.gray50, - borderDecoration: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: BorderSide( - color: appTheme.gray50, - width: 1, - ), - ), - ), - SizedBox(height: 16.0), - Align(alignment: Alignment.centerLeft, child: Text("Описание")), - CustomTextFormField( - controller: state.description, - hintText: "Введите описание рецепта", - maxLines: 4, - fillColor: appTheme.gray50, - borderDecoration: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: BorderSide( - color: appTheme.gray50, - width: 1, - ), - ), - ), - SizedBox(height: 16.0), - ], - ), - ); - } - - refreshPage(BuildContext context) { - return () async { - context.read().add(ReloadScreen()); - }; - } - - _buildAddPhoto(BuildContext context, RecipeEditLoadedState state) { - bool isLoading = false; - return GestureDetector( - child: Stack( - children: [ - if (!isLoading) - Container( - padding: EdgeInsets.symmetric( - horizontal: 40, - vertical: 80, - ), - decoration: AppDecoration.fillGray.copyWith( - borderRadius: BorderRadiusStyle.roundedBorder5, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: EdgeInsets.only( - left: 7, - top: 5, - ), - child: Text( - "Добавить фото", - selectionColor: appTheme.blueA400, - ), - ), - Spacer(), - Icon( - Icons.photo_library, - color: appTheme.blueGray300, - ), - ], - ), - ), - /*if (isLoading) - Container( - margin: EdgeInsets.symmetric(horizontal: 10), - padding: EdgeInsets.symmetric( - horizontal: 40, - vertical: 80.v, - ), - decoration: AppDecoration.fillGray.copyWith( - borderRadius: BorderRadiusStyle.roundedBorder5, - ), - child: Center( - child: CircularProgressIndicator( - color: appTheme - .blueGray300), // Замените на свой прелоадер при необходимости - ), - ),*/ - ], - ), - ); - } - - _buildStep(BuildContext context, RecipeEditLoadedState state, int i) { - bool isLastStep = i == state.steps!.length - 1; - bool isFirstStep = i == 0; - - return Container( - margin: EdgeInsets.only( - left: 16, - right: 16, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Align( - alignment: Alignment.centerLeft, - child: Text( - "Шаг ${i + 1}", - style: CustomTextStyles.titleMediumSemiBold, - ), - ), - SizedBox(height: 8.0), - CustomTextFormField( - controller: state.stepDescriptions?[i], - hintText: "Введите описание шага", - maxLines: 4, - fillColor: appTheme.gray50, - borderDecoration: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: BorderSide( - color: appTheme.gray50, - width: 1, - ), - ), - ), - SizedBox(height: 16.0), - if (state.steps?[i]['image'] != null) - CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + (state.steps?[i]['image']), - width: double.infinity, - // Установите ширину равной ширине родительского элемента - height: 200.0, - // Задайте постоянную высоту элемента - fit: BoxFit.cover, - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => Icon(Icons.error), - ) - else - _buildAddPhoto(context, state), - SizedBox(height: 16.0), - if (isFirstStep && isLastStep) - CustomOutlinedButton( - onPressed: () => context.read().add(AddStep()), - text: "Добавить шаг", - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - if (isLastStep && !isFirstStep) // Добавляем кнопку "Добавить шаг" только для последнего шага - Column( - children: [ - SizedBox(height: 16.0), - Row( - children: [ - Flexible( - flex: 5, - child: CustomOutlinedButton( - onPressed: () => context.read().add(AddStep()), - text: "Добавить шаг", - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - ), - SizedBox(width: 8), // Add some spacing between the buttons - Flexible( - flex: 1, - child: CustomOutlinedButton( - text: "х", - onPressed: () => context.read().add(RemoveStep(i)), - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - ), - ], - ), - ], - ), - if (!isLastStep && !isFirstStep) - CustomOutlinedButton( - onPressed: () => context.read().add(RemoveStep(i)), - text: "x", - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - ], - ), - ); - } - - _buildAdditional(BuildContext context, RecipeEditLoadedState state) { - return Container( - margin: EdgeInsets.only( - left: 16, - right: 16, - bottom: 10, - ), - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Align(alignment: Alignment.centerLeft, child: Text("Теги")), - _buildEditableTags(state.tags), - SizedBox(height: 8.0), - Align(alignment: Alignment.centerLeft, child: Text("Ссылка на видео (необязательно)")), - CustomTextFormField( - controller: state.video_url, - hintText: "YouTube", - fillColor: appTheme.gray50, - borderDecoration: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: BorderSide( - color: appTheme.gray50, - width: 1, - ), - ), - ), - SizedBox(height: 16.0), - CustomOutlinedButton( - text: "Добавить рецепт", - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - ], - ), - ); - } - - _buildEditableTags(List? tags) { - String initialText = tags!.map((tag) => tag['name']).join(', '); - - return CustomTextFormField( - initialValue: initialText, - fillColor: appTheme.gray50, - borderDecoration: OutlineInputBorder( - borderRadius: BorderRadius.circular(5), - borderSide: BorderSide( - color: appTheme.gray50, - width: 1, - ), - ), - onChanged: _trimTags, - ); - } - - void _trimTags(newValue) { - List newTagNames = newValue!.split(',').map((tag) => tag.trim()).toList(); - newTagNames.map((tagName) => {'name': tagName}).toList(); - } - - Function onTapBack(BuildContext context) { - return () { - onTapArrowLeft(context); - }; - } - - onTapArrowLeft(BuildContext context) { - GoRouter.of(context).pop(); - } -} diff --git a/lib/old/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart b/lib/old/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart deleted file mode 100644 index 6353c7a7..00000000 --- a/lib/old/recipe/recipe_select_screen/bloc/recipe_select_bloc.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'dart:async'; - -import 'package:dio/dio.dart'; -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/old/recipe/recipe_select_screen/models/recipe_select_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:image_picker/image_picker.dart'; - -part 'recipe_select_event.dart'; -part 'recipe_select_state.dart'; - -/// A bloc that manages the state of a RecipeSelect according to the event that is dispatched to it. -class RecipeSelectBloc extends Bloc { - RecipeSelectBloc(RecipeSelectState initialState) : super(initialState) { - on(_onInitialize); - } - - Future _onInitialize( - RecipeSelectInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final response = await sl().get(baseUrl + '/api/recipes/index'); - - if (response.statusCode == 200) { - final data = response.data['data']; - if (data is List) { - if (state is RecipeSelectLoadedState) { - var currentState = state as RecipeSelectLoadedState; - emit( - (currentState).copyWith( - posts: data, - myProfileModelObj: currentState.myProfileModelObj, - ), - ); - } else { - emit( - RecipeSelectLoadedState( - posts: data, - ), - ); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(RecipeSelectErrorState('Неверный формат ответа API.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(RecipeSelectErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(RecipeSelectErrorState('Ошибка при получении данных ленты: $e')); - } - } -} diff --git a/lib/old/recipe/recipe_select_screen/bloc/recipe_select_event.dart b/lib/old/recipe/recipe_select_screen/bloc/recipe_select_event.dart deleted file mode 100644 index 416e1f20..00000000 --- a/lib/old/recipe/recipe_select_screen/bloc/recipe_select_event.dart +++ /dev/null @@ -1,25 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'recipe_select_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///RecipeSelect widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class RecipeSelectEvent extends Equatable {} - -/// Event that is dispatched when the RecipeSelect widget is first created. -class RecipeSelectInitialEvent extends RecipeSelectEvent { - @override - List get props => []; -} - -class UploadAvatar extends RecipeSelectEvent { - UploadAvatar(this.image); - - final XFile image; - - @override - List get props => [image]; -} diff --git a/lib/old/recipe/recipe_select_screen/bloc/recipe_select_state.dart b/lib/old/recipe/recipe_select_screen/bloc/recipe_select_state.dart deleted file mode 100644 index 02b6a79e..00000000 --- a/lib/old/recipe/recipe_select_screen/bloc/recipe_select_state.dart +++ /dev/null @@ -1,49 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'recipe_select_bloc.dart'; - -class RecipeSelectState extends Equatable { - const RecipeSelectState({this.myProfileModelObj}); - - final RecipeSelectModel? myProfileModelObj; - - @override - List get props => [myProfileModelObj]; -} - -class RecipeSelectInitialState extends RecipeSelectState { - RecipeSelectInitialState({required RecipeSelectModel myProfileModelObj}) : super(myProfileModelObj: myProfileModelObj); -} - -/// Represents the state of RecipeSelect in the application. -class RecipeSelectLoadedState extends RecipeSelectState { - RecipeSelectLoadedState({this.myProfileModelObj, this.posts}) : super(myProfileModelObj: null); - - RecipeSelectModel? myProfileModelObj; - List? posts; - - @override - List get props => [ - myProfileModelObj, - posts, - ]; - - RecipeSelectLoadedState copyWith({ - RecipeSelectModel? myProfileModelObj, - List? posts, - }) { - return RecipeSelectLoadedState( - myProfileModelObj: myProfileModelObj ?? this.myProfileModelObj, - posts: posts ?? this.posts, - ); - } -} - -class RecipeSelectErrorState extends RecipeSelectState { - final String errorMessage; - - const RecipeSelectErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} diff --git a/lib/old/recipe/recipe_select_screen/models/recipe_select_model.dart b/lib/old/recipe/recipe_select_screen/models/recipe_select_model.dart deleted file mode 100644 index 1e9a1d2d..00000000 --- a/lib/old/recipe/recipe_select_screen/models/recipe_select_model.dart +++ /dev/null @@ -1,16 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [k0_page], -/// and is typically used to hold data that is passed between different parts of the application. -class RecipeSelectModel extends Equatable { - RecipeSelectModel(); - - RecipeSelectModel copyWith() { - return RecipeSelectModel(); - } - - @override - List get props => []; -} diff --git a/lib/old/recipe/recipe_select_screen/recipe_select_screen.dart b/lib/old/recipe/recipe_select_screen/recipe_select_screen.dart deleted file mode 100644 index 2d181146..00000000 --- a/lib/old/recipe/recipe_select_screen/recipe_select_screen.dart +++ /dev/null @@ -1,201 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_leading_image.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_subtitle.dart'; -import 'package:eatvio_app/widgets/app_bar/custom_app_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; - -import 'bloc/recipe_select_bloc.dart'; -import 'models/recipe_select_model.dart'; - -class RecipeSelectScreen extends StatelessWidget { - static Widget builder(BuildContext context) { - return BlocProvider( - create: (context) => RecipeSelectBloc(RecipeSelectState(myProfileModelObj: RecipeSelectModel()))..add(RecipeSelectInitialEvent()), - child: RecipeSelectScreen(), - ); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is RecipeSelectInitialState) { - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } else if (state is RecipeSelectLoadedState) { - // Данные загружены, можно строить экран. - return _buildRecipeScreen(context, state); - } else { - return Scaffold( - body: Center( - child: SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - ), - ); - } - }, - ); - } - - _buildRecipeScreen(BuildContext context, RecipeSelectLoadedState state) { - return Scaffold( - appBar: AppBar( - toolbarHeight: 0, - automaticallyImplyLeading: false, - ), - backgroundColor: Colors.grey[200], - resizeToAvoidBottomInset: true, - body: SingleChildScrollView( - child: Container( - width: double.maxFinite, - decoration: BoxDecoration(color: Colors.grey[200]), - child: Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: 10), - Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: CustomAppBar( - height: 54, - leadingWidth: 28, - leading: AppbarLeadingImage( - imagePath: ImageConstant.imgArrowLeft, - margin: EdgeInsets.only(left: 16, top: 15, bottom: 15), - onTap: () => GoRouter.of(context).pop(), - ), - title: Padding( - padding: EdgeInsets.only(left: 20), - child: Row( - children: [ - AppbarSubtitle( - text: "Рецепты", - margin: EdgeInsets.only(left: 80, top: 12, bottom: 9), - ), - Spacer(), - Padding( - padding: const EdgeInsets.only(right: 20.0), - child: GestureDetector( - onTap: () => GoRouter.of(context).pushNamed('recipeCreateScreen'), - child: Icon(Icons.create_outlined), - ), - ), - ], - ), - ), - ), - ), - SizedBox(height: 20), - _buildRecipeList(context, state), - ], - ), - ), - ), - ), - ); - } - - _buildRecipeList(BuildContext context, RecipeSelectLoadedState state) { - return ListView.builder( - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, // Add this line - itemCount: state.posts?.length ?? 0, - itemBuilder: (context, index) { - final post = state.posts?[index]; - return Container( - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: ListTile( - leading: CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + post['image'], - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - title: Text( - post?['title'] ?? '', - style: CustomTextStyles.titleMediumSemiBold, - ), - subtitle: Text(post?['description'] ?? ''), - onTap: () => GoRouter.of(context).goNamed( - 'recipeScreen', - extra: post?['id'].toString(), - ), - trailing: GestureDetector( - onTap: () => GoRouter.of(context).pushNamed( - 'recipeEditScreen', - extra: post?['slug'].toString(), - ), - child: Icon(Icons.edit), - ), - ), - ); - }, - ); - } - - Function onTapBack(BuildContext context) { - return () { - onTapArrowLeft(context); - }; - } - - onTapArrowLeft(BuildContext context) { - GoRouter.of(context).pop(); - } -} diff --git a/lib/old/users/subscribers_screen/bloc/subscribers_bloc.dart b/lib/old/users/subscribers_screen/bloc/subscribers_bloc.dart deleted file mode 100644 index ef52c077..00000000 --- a/lib/old/users/subscribers_screen/bloc/subscribers_bloc.dart +++ /dev/null @@ -1,66 +0,0 @@ -//import 'package:eatvio_app/old/auth/auth_screen/auth_screen.dart'; -import 'dart:async'; -import 'dart:convert'; - -import 'package:eatvio_app/app_router.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/old/users/subscribers_screen/models/subscribers_model.dart'; -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; - -part 'subscribers_event.dart'; -part 'subscribers_state.dart'; - -/// A bloc that manages the state of a Subscribers according to the event that is dispatched to it. -class SubscribersBloc extends Bloc { - SubscribersBloc(SubscribersState initialState) : super(initialState) { - on(_onInitialize); - } - - Future _onInitialize( - SubscribersInitialEvent event, - Emitter emit, - ) async { - try { - if (!await TokenStorage.haveTokenInStorage()) { - AppRouter.navigatorKey.currentContext?.goNamed('authScreen'); - } - final response = await http.get( - Uri.parse(baseUrl + '/api/profile/subscribers'), - headers: { - 'Authorization': 'Bearer ${await TokenStorage.getTokenFromStorage()}', - }, - ); - - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - if (data is List) { - if (state is SubscribersLoadedState) { - var currentState = state as SubscribersLoadedState; - emit((currentState).copyWith( - subscribers: data, - myProfileModelObj: currentState.myProfileModelObj, - ),); - } else { - emit(SubscribersLoadedState( - subscribers: data, - ),); - } - } else { - // Один или несколько ключевых полей отсутствуют, обрабатываем ошибку - emit(SubscribersErrorState('Неверный формат ответа API.')); - } - } else { - // Статус ответа не равен 200, обрабатываем ошибку - emit(SubscribersErrorState('Ошибка сервера: ${response.statusCode}')); - } - } catch (e) { - // Ошибка при декодировании JSON или другая ошибка выполнения - emit(SubscribersErrorState('Ошибка при получении данных ленты: $e')); - } - } -} diff --git a/lib/old/users/subscribers_screen/bloc/subscribers_event.dart b/lib/old/users/subscribers_screen/bloc/subscribers_event.dart deleted file mode 100644 index 3034e630..00000000 --- a/lib/old/users/subscribers_screen/bloc/subscribers_event.dart +++ /dev/null @@ -1,16 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'subscribers_bloc.dart'; - -/// Abstract class for all events that can be dispatched from the -///Subscribers widget. -/// -/// Events must be immutable and implement the [Equatable] interface. -@immutable -abstract class SubscribersEvent extends Equatable {} - -/// Event that is dispatched when the Subscribers widget is first created. -class SubscribersInitialEvent extends SubscribersEvent { - @override - List get props => []; -} diff --git a/lib/old/users/subscribers_screen/bloc/subscribers_state.dart b/lib/old/users/subscribers_screen/bloc/subscribers_state.dart deleted file mode 100644 index 2b34e5b9..00000000 --- a/lib/old/users/subscribers_screen/bloc/subscribers_state.dart +++ /dev/null @@ -1,49 +0,0 @@ -// ignore_for_file: must_be_immutable - -part of 'subscribers_bloc.dart'; - -class SubscribersState extends Equatable { - const SubscribersState({this.myProfileModelObj}); - - final SubscribersModel? myProfileModelObj; - - @override - List get props => [myProfileModelObj]; -} - -class SubscribersInitialState extends SubscribersState { - SubscribersInitialState({required SubscribersModel myProfileModelObj}) : super(myProfileModelObj: myProfileModelObj); -} - -/// Represents the state of Subscribers in the application. -class SubscribersLoadedState extends SubscribersState { - SubscribersLoadedState({this.myProfileModelObj, this.subscribers}) : super(myProfileModelObj: null); - - SubscribersModel? myProfileModelObj; - dynamic subscribers; - - @override - List get props => [ - myProfileModelObj, - subscribers, - ]; - - SubscribersLoadedState copyWith({ - SubscribersModel? myProfileModelObj, - dynamic subscribers, - }) { - return SubscribersLoadedState( - myProfileModelObj: myProfileModelObj ?? this.myProfileModelObj, - subscribers: subscribers ?? this.subscribers, - ); - } -} - -class SubscribersErrorState extends SubscribersState { - final String errorMessage; - - const SubscribersErrorState(this.errorMessage); - - @override - List get props => [errorMessage]; -} diff --git a/lib/old/users/subscribers_screen/models/subscribers_model.dart b/lib/old/users/subscribers_screen/models/subscribers_model.dart deleted file mode 100644 index f7d0cdab..00000000 --- a/lib/old/users/subscribers_screen/models/subscribers_model.dart +++ /dev/null @@ -1,16 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'package:equatable/equatable.dart'; - -/// This class defines the variables used in the [k0_page], -/// and is typically used to hold data that is passed between different parts of the application. -class SubscribersModel extends Equatable { - SubscribersModel(); - - SubscribersModel copyWith() { - return SubscribersModel(); - } - - @override - List get props => []; -} diff --git a/lib/old/users/subscribers_screen/subscribers_screen.dart b/lib/old/users/subscribers_screen/subscribers_screen.dart deleted file mode 100644 index efdc730c..00000000 --- a/lib/old/users/subscribers_screen/subscribers_screen.dart +++ /dev/null @@ -1,217 +0,0 @@ -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/theme/custom_button_style.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_leading_image.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_subtitle.dart'; -import 'package:eatvio_app/widgets/app_bar/custom_app_bar.dart'; -import 'package:eatvio_app/widgets/custom_outlined_button.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart' as rive; -import 'package:rive/rive.dart'; - -import 'bloc/subscribers_bloc.dart'; -import 'models/subscribers_model.dart'; - -class SubscribersScreen extends StatelessWidget { - static Widget builder(BuildContext context) { - return BlocProvider( - create: (context) => SubscribersBloc(SubscribersState(myProfileModelObj: SubscribersModel()))..add(SubscribersInitialEvent()), - child: SubscribersScreen(),); - } - - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state is SubscribersInitialState) { - // Это начальное состояние, данные ещё не загружены. - return SizedBox( - height: 32, - width: 32, - child: rive.RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ); - } else if (state is SubscribersLoadedState) { - // Данные загружены, можно строить экран. - return _buildSubscribersScreen(context, state); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ); - } - - _buildSubscribersScreen(BuildContext context, SubscribersLoadedState state) { - return Scaffold( - backgroundColor: Colors.grey[200], - resizeToAvoidBottomInset: true, - body: SingleChildScrollView( - child: Container( - width: double.maxFinite, - decoration: BoxDecoration(color: Colors.grey[200]), - child: Padding( - padding: EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox(height: 10), - Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: CustomAppBar( - height: 54, - leadingWidth: 28, - leading: AppbarLeadingImage( - imagePath: ImageConstant.imgArrowLeft, - margin: EdgeInsets.only(left: 16, top: 15, bottom: 15), - onTap: () => GoRouter.of(context).pop(), - ), - title: Padding( - padding: EdgeInsets.only(left: 20), - child: Row( - children: [ - AppbarSubtitle( - text: "Мои подписчики", - margin: EdgeInsets.only(left: 80, top: 12, bottom: 9), - ), - Spacer(), - Padding( - padding: const EdgeInsets.only(right: 20.0), - child: GestureDetector(child: Icon(Icons.create_outlined)), - ), - ], - ), - ), - ), - ), - _buildSearch(context), - SizedBox(height: 16), - _buildSubscribersList(context, state), - ], - ), - ), - ), - ), - ); - } - - _buildSearch(BuildContext context) { - return Container( - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Column( - children: [ - SizedBox(height: 10), - Row( - children: [ - Flexible( - flex: 5, - child: CustomOutlinedButton( - text: "Найти", - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - ), - SizedBox(width: 8), // Add some spacing between the buttons - Flexible( - flex: 1, - child: CustomOutlinedButton( - text: "+", - onPressed: () => GoRouter.of(context).pushNamed('blogPostCreateScreen'), - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - ), - ), - ], - ), - ], - ), - ), - ); - } - - _buildSubscribersList(BuildContext context, SubscribersLoadedState state) { - List subscriberWidgets = []; - - if (state.subscribers != null) { - for (var subscriber in state.subscribers!) { - subscriberWidgets.add(_buildSubscriberEntry(subscriber, context)); - } - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: subscriberWidgets, - ); - } - - _buildSubscriberEntry(BuildContext context, subscriber) { - return Container( - margin: EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 2, - blurRadius: 5, - offset: Offset(0, 3), - ), - ], - ), - child: ListTile( - leading: CachedNetworkImage( - imageUrl: baseUrl + '/storage/' + subscriber['image'], - imageBuilder: (context, imageProvider) => CircleAvatar( - backgroundImage: imageProvider, - radius: 25, - ), - placeholder: (context, url) => SizedBox( - height: 32, - width: 32, - child: RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ), - errorWidget: (context, url, error) => CircleAvatar( - child: Icon(Icons.person), - backgroundColor: Colors.white, - radius: 25, - ), - ), - title: Text( - subscriber?['title'] ?? '', - style: CustomTextStyles.titleMediumSemiBold, - ), - subtitle: Text(subscriber?['description'] ?? ''), - trailing: GestureDetector(child: Icon(Icons.edit)), - ),); - } -} diff --git a/lib/widgets/custom_expandable_list.dart b/lib/widgets/custom_expandable_list.dart deleted file mode 100644 index ff29bc86..00000000 --- a/lib/widgets/custom_expandable_list.dart +++ /dev/null @@ -1,466 +0,0 @@ -import 'dart:convert'; - -import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/core/token_storage.dart'; -import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/old/profile/my_profile_screen/bloc/my_profile_bloc.dart'; -import 'package:eatvio_app/theme/custom_button_style.dart'; -import 'package:eatvio_app/widgets/custom_hyper_switch.dart'; -import 'package:eatvio_app/widgets/custom_hypo_switch.dart'; -import 'package:eatvio_app/widgets/next_step_button.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:http/http.dart' as http; -import 'package:intl/intl.dart'; -import 'package:rive/rive.dart' as rive; - -class ExpandableList extends StatefulWidget { - final String title; - - ExpandableList(this.title); - - @override - _ExpandableListState createState() => _ExpandableListState(); -} - -class _ExpandableListState extends State { - bool isExpanded = false; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - GestureDetector( - onTap: toggleExpand(), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - widget.title, - style: TextStyle( - color: Colors.black, - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - Icon(isExpanded ? Icons.arrow_drop_up : Icons.arrow_drop_down), - ], - ), - ), - if (isExpanded) - Padding( - padding: const EdgeInsets.only(left: 16.0), - child: BlocBuilder( - builder: (context, state) { - if (state is MyProfileInitialState) { - // Это начальное состояние, данные ещё не загружены. - return SizedBox( - height: 32, - width: 32, - child: rive.RiveAnimation.asset( - 'assets/rive_animations/loading.riv', - ), - ); - } else if (state is MyProfileLoadedState) { - // Данные загружены, можно строить форму. - return _buildForm(context, state); - } else if (state is MyProfileErrorState) { - // Произошла ошибка при загрузке данных. - return Center(child: Text(state.errorMessage)); - } else { - // Другие состояния, если они есть. - return Container(); // Пустой контейнер для необработанных состояний. - } - }, - ), - ), - Divider(), - ], - ); - } - - toggleExpand() { - return () { - setState(() { - isExpanded = !isExpanded; - }); - }; - } - - _buildForm(BuildContext context, MyProfileLoadedState state) { - final s = S.of(context); - List cities = [ - 'Москва', - 'Санкт-Петербург', - 'Новосибирск', - 'Екатеринбург', - 'Нижний Новгород', - 'Казань', - 'Челябинск', - 'Омск', - 'Самара', - 'Ростов-на-Дону', - 'Уфа', - 'Красноярск', - 'Воронеж', - 'Пермь', - 'Волгоград', - 'Краснодар', - 'Саратов', - 'Тюмень', - 'Тольятти', - 'Ижевск', - 'Барнаул', - 'Ульяновск', - 'Иркутск', - 'Хабаровск', - 'Ярославль', - 'Владивосток', - 'Махачкала', - 'Томск', - 'Оренбург', - 'Кемерово', - ]; - List countries = [ - 'Россия', - ]; - List activities = [ - 'сидячий', - 'низкий (1-3 тренировки в неделю по 20 мин)', - 'умеренный (3-4 тренировки в неделю по 30-60 мин)', - 'высокий (5-7 тренировок по 30-60 мин)', - 'экстремальный (несколько интенсивных тренировок в день)', - ]; - final digitsOnly = FilteringTextInputFormatter.digitsOnly; - return Column( - children: [ - TextField( - controller: state.firstNameFormController, - decoration: InputDecoration(labelText: s.first_name), - ), - TextField( - controller: state.lastNameFormController, - decoration: InputDecoration(labelText: s.last_name), - ), - TextField( - decoration: InputDecoration(labelText: s.date_of_birth), - controller: state.dateFormController, - onTap: inputTime(context, state), - ), - DropdownButtonFormField( - value: state.selectedCountry, - hint: Text(state.selectedCountry ?? "Не выбрано"), - onChanged: setCountry(state), - items: countries.map>((String value) { - return DropdownMenuItem( - value: value, - child: Text(value), - ); - }).toList(), - decoration: InputDecoration(labelText: s.country), - ), - DropdownButtonFormField( - hint: Text(state.selectedCity ?? "Не выбрано"), - value: state.selectedCity, - onChanged: setCity(state), - items: cities.map>((String value) { - return DropdownMenuItem( - value: value, - child: Text(value), - ); - }).toList(), - decoration: InputDecoration(labelText: s.city_of_living), - ), - TextField( - controller: state.weightFormController, - decoration: InputDecoration(labelText: s.weight_measurements), - keyboardType: TextInputType.number, - inputFormatters: [digitsOnly], - ), - TextField( - controller: state.heightFormController, - decoration: InputDecoration(labelText: s.height_measurements), - keyboardType: TextInputType.number, - inputFormatters: [digitsOnly], - ), - TextField( - controller: state.chestCircumferenceFormController, - decoration: InputDecoration(labelText: s.chest_circumference), - keyboardType: TextInputType.number, - inputFormatters: [digitsOnly], - ), - TextField( - controller: state.waistCircumferenceFormController, - decoration: InputDecoration(labelText: s.waist_circumference), - keyboardType: TextInputType.number, - inputFormatters: [digitsOnly], - ), - TextField( - controller: state.hipCircumferenceFormController, - decoration: InputDecoration(labelText: s.hip_circumference), - keyboardType: TextInputType.number, - inputFormatters: [digitsOnly], - ), - TextField( - controller: state.upPressureFormController, - decoration: InputDecoration(labelText: s.up_pressure), - keyboardType: TextInputType.number, - inputFormatters: [digitsOnly], - ), - TextField( - controller: state.downPressureFormController, - decoration: InputDecoration(labelText: s.down_pressure), - keyboardType: TextInputType.number, - inputFormatters: [digitsOnly], - ), - TextField( - controller: state.allergiesFormController, - decoration: InputDecoration(labelText: s.allergies_presence), - maxLines: null, - ), - TextField( - controller: state.pillsFormController, - decoration: InputDecoration(labelText: s.do_you_take_pills), - maxLines: null, - ), - TextField( - controller: state.sportsFormController, - decoration: InputDecoration(labelText: s.your_favorite_sports), - maxLines: null, - ), - TextField( - controller: state.favoriteFormController, - decoration: InputDecoration(labelText: s.favorite_foods), - maxLines: null, - ), - TextField( - controller: state.unfavoriteFormController, - decoration: InputDecoration(labelText: s.unfavorite_foods), - maxLines: null, - ), - TextField( - controller: state.additionalFormController, - decoration: InputDecoration(labelText: s.additional_information), - maxLines: null, - ), - DropdownButtonFormField( - hint: Text(state.selectedActivity ?? "Не выбрано"), - value: state.selectedActivity, - onChanged: setActivity(state), - items: activities.map>((String value) { - return DropdownMenuItem( - value: value, - child: SizedBox( - // Используем SizedBox для ограничения ширины элемента списка - width: MediaQuery.of(context).size.width * 0.8, // Устанавливаем желаемую ширину элемента списка - child: Text(value), - ), - ); - }).toList(), - isExpanded: true, - // Расширяем список на всю доступную ширину - decoration: InputDecoration(labelText: 'Активность'), - ), - Row( - children: [ - HypoSwitch(s.do_you_have_hypotension_tendency, state), - ], - ), - Row( - children: [ - HyperSwitch(s.do_you_have_hypertension_tendency, state), - ], - ), - NextStepButton( - onPressed: () => sendProfileData(state), - buttonStyle: CustomButtonStyles.outlinePrimaryTL15, - text: s.save.toUpperCase(), - margin: EdgeInsets.only(top: 20, bottom: 20), - ), - ], - ); - } - - sendData(MyProfileLoadedState state) { - return () { - sendProfileData(state); - }; - } - - setCity(MyProfileLoadedState state) { - return (newValue) { - // Обработчик изменения выбранного города - setSelectedCity(state, newValue); - }; - } - - setCountry(MyProfileLoadedState state) { - return (newValue) { - // Обработчик изменения выбранной страны - setSelectedCountry(state, newValue); - }; - } - - setActivity(MyProfileLoadedState state) { - return (newValue) { - // Обработчик изменения выбранной страны - setSelectedActivity(state, newValue); - }; - } - - inputTime(BuildContext context, MyProfileLoadedState state) { - return () { - showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: DateTime(1900), - lastDate: DateTime.now(), - ).then((selectedDate) { - if (selectedDate != null) { - setState(() { - state.dateFormController!.text = DateFormat('dd-MM-yyyy').format(selectedDate); - }); - } - }); - }; - } - - void setSelectedCity(MyProfileLoadedState? state, String? newValue) { - setState(() { - state!.selectedCity = newValue; - }); - } - - void setSelectedCountry(MyProfileLoadedState? state, String? newValue) { - setState(() { - state!.selectedCountry = newValue; - }); - } - - void setSelectedActivity(MyProfileLoadedState? state, String? newValue) { - setState(() { - state!.selectedActivity = newValue; - }); - } - - Future sendProfileData(MyProfileLoadedState? state) async { - try { - final profileData = _createProfileData(state); - final token = await _getTokenFromBox(); - final apiUrl = _buildApiUrl(); - final response = await _sendHttpRequest(profileData, apiUrl, token); - - if (response.statusCode == 200) { - _navigateToProfilePage(); - } else { - final errorMessage = _getErrorMessage(response); - _showErrorDialog(errorMessage); - throw Exception('Ошибка при отправке данных профиля'); - } - } catch (error) { - throw Exception('Ошибка при отправке данных профиля: $error'); - } - } - - Map _createProfileData(MyProfileLoadedState? state) { - return { - 'first_name': state?.firstNameFormController?.text, - 'last_name': state?.lastNameFormController?.text, - 'chest_circumference': state?.chestCircumferenceFormController?.text, - 'waist_circumference': state?.waistCircumferenceFormController?.text, - 'hip_circumference': state?.hipCircumferenceFormController?.text, - 'birthdate': state?.dateFormController?.text, - 'height': state?.heightFormController?.text, - 'weight': state?.weightFormController?.text, - 'blood_pressure_up': state?.upPressureFormController?.text, - 'blood_pressure_down': state?.downPressureFormController?.text, - 'about_alergy': state?.allergiesFormController?.text ?? 'Нет аллергий', - 'about_taking_pils': state?.pillsFormController?.text, - 'about_sport_hobbies': state?.sportsFormController?.text, - 'favorite_foods': state?.favoriteFormController?.text, - 'unfavorite_foods': state?.unfavoriteFormController?.text, - 'additional_info': state?.additionalFormController?.text, - 'country': state?.selectedCountry ?? 'Россия', - 'city': state?.selectedCity ?? 'Москва', - 'has_hypo': state?.hypoFormController, - 'has_hyper': state?.hyperFormController, - 'activity_coefficient': determineActivityFactor(state?.selectedActivity ?? 'сидячий'), - }; - } - - Future _getTokenFromBox() async { - return await TokenStorage.getTokenFromStorage(); - } - - String _buildApiUrl() { - return baseUrl + '/api/profile/update'; - } - - Future _sendHttpRequest( - Map profileData, - String apiUrl, - String? token, - ) { - return http.post( - Uri.parse(apiUrl), - body: json.encode(profileData), - encoding: utf8, - headers: { - 'Content-Type': 'application/json', - 'Accept': 'application/json', - 'Authorization': 'Bearer $token', - }, - ); - } - - void _navigateToProfilePage() { - GoRouter.of(context).go('/my-profile-screen'); - } - - String _getErrorMessage(http.Response response) { - final res = jsonDecode(response.body); - return res['message']; - } - - void _showErrorDialog(String errorMessage) { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text('Ошибка'), - content: Text(errorMessage), - actions: [ - TextButton( - onPressed: onTapOk(context), - child: Text('OK'), - ), - ], - ), - ); - } - - onTapOk(BuildContext context) { - return () { - Navigator.pop(context); - }; - } - - double determineActivityFactor(String activityLevel) { - switch (activityLevel) { - case "сидячий": - return 1.2; - case "низкий (1-3 тренировки в неделю по 20 мин)": - return 1.375; - case "умеренный (3-4 тренировки в неделю по 30-60 мин)": - return 1.55; - case "высокий (5-7 тренировок по 30-60 мин)": - return 1.7; - case "экстремальный (несколько интенсивных тренировок в день)": - return 1.9; - default: - return 1.2; // Возвращаемое значение по умолчанию, если уровень активности не распознан - } - } -} diff --git a/lib/widgets/custom_hyper_switch.dart b/lib/widgets/custom_hyper_switch.dart deleted file mode 100644 index 93b1a340..00000000 --- a/lib/widgets/custom_hyper_switch.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:eatvio_app/old/profile/my_profile_screen/bloc/my_profile_bloc.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:flutter/material.dart'; - -class HyperSwitch extends StatefulWidget { - final String title; - final MyProfileLoadedState? state; - - HyperSwitch(this.title, this.state); - - @override - _HyperState createState() => _HyperState(); -} - -class _HyperState extends State { - bool switchValue = false; - - @override - void initState() { - super.initState(); - if (widget.state?.hyperFormController == '1') { - switchValue = true; - } - } - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - widget.title, - style: TextStyle( - color: Colors.black, - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - Switch( - value: switchValue, - onChanged: toggleSwitch(), - inactiveThumbColor: appTheme.blueA400, - inactiveTrackColor: Colors.white, - activeTrackColor: appTheme.blueA400, - activeColor: Colors.white, - ), - ], - ); - } - - toggleSwitch() { - return (value) { - setState(() { - switchValue = value; - widget.state!.hyperFormController = value ? "1" : "0"; - }); - }; - } -} diff --git a/lib/widgets/custom_hypo_switch.dart b/lib/widgets/custom_hypo_switch.dart deleted file mode 100644 index ab5e11ab..00000000 --- a/lib/widgets/custom_hypo_switch.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:eatvio_app/old/profile/my_profile_screen/bloc/my_profile_bloc.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:flutter/material.dart'; - -class HypoSwitch extends StatefulWidget { - final String title; - final MyProfileLoadedState? state; - - HypoSwitch(this.title, this.state); - - @override - _HypoState createState() => _HypoState(); -} - -class _HypoState extends State { - bool switchValue = false; - - @override - void initState() { - super.initState(); - if (widget.state?.hypoFormController == '1') { - switchValue = true; - } - } - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - widget.title, - style: TextStyle( - color: Colors.black, - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - Switch( - value: switchValue, - onChanged: toggleSwitch(), - inactiveThumbColor: appTheme.blueA400, - inactiveTrackColor: Colors.white, - activeTrackColor: appTheme.blueA400, - activeColor: Colors.white, - ), - ], - ); - } - - toggleSwitch() { - return (value) { - setState(() { - switchValue = value; - widget.state!.hypoFormController = value ? "1" : "0"; - }); - }; - } -} diff --git a/test/auth_test.dart b/test/auth_test.dart index bd789695..5058e6aa 100644 --- a/test/auth_test.dart +++ b/test/auth_test.dart @@ -1,7 +1,7 @@ +import 'package:eatvio_app/features/auth/auth_screen/auth_screen.dart'; +import 'package:eatvio_app/features/auth/auth_screen/bloc/auth_bloc.dart'; +import 'package:eatvio_app/features/auth/auth_screen/models/auth_model.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/old/auth/auth_screen/auth_screen.dart'; -import 'package:eatvio_app/old/auth/auth_screen/bloc/auth_bloc.dart'; -import 'package:eatvio_app/old/auth/auth_screen/models/auth_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; From 537ced583ee9fdc0b0fd2fd3bfc5f49e626b8da3 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 20 Nov 2024 14:20:15 +0300 Subject: [PATCH 3/6] fix: remove old unused features and widgets --- .../selection_popup_model.dart | 0 .../selection_popup_model.freezed.dart | 0 .../auth/auth_screen/auth_screen.dart | 7 +- .../stepper_become_consultant_screen.dart | 7 +- .../bloc/recipe_create_cubit.dart | 2 +- .../bloc/recipe_create_state.dart | 4 +- .../pages/blood_pressure_screen.dart | 11 +- .../pages/city_of_living_screen.dart | 2 +- .../pages/language_select_screen.dart | 2 +- .../pages/registration_screen.dart | 11 +- .../pages/general_info_screen.dart | 2 +- .../presentation/pages/pressure_screen.dart | 2 +- lib/widgets/app_bar/appbar_leading_image.dart | 34 ---- lib/widgets/app_bar/appbar_subtitle.dart | 30 ---- lib/widgets/app_bar/appbar_title_image.dart | 17 -- lib/widgets/app_bar/custom_app_bar.dart | 39 ----- lib/widgets/custom_about_list.dart | 58 ------- lib/widgets/custom_drop_down.dart | 2 +- lib/widgets/custom_image_view.dart | 162 ------------------ lib/widgets/custom_language_drop_down.dart | 49 ------ lib/widgets/custom_notification_screen.dart | 48 ------ lib/widgets/custom_scale_element.dart | 28 --- lib/widgets/custom_section_title.dart | 19 -- lib/widgets/next_step_button.dart | 89 ---------- 24 files changed, 29 insertions(+), 596 deletions(-) rename lib/{data/models => core/data}/selectionPopupModel/selection_popup_model.dart (100%) rename lib/{data/models => core/data}/selectionPopupModel/selection_popup_model.freezed.dart (100%) delete mode 100644 lib/widgets/app_bar/appbar_leading_image.dart delete mode 100644 lib/widgets/app_bar/appbar_subtitle.dart delete mode 100644 lib/widgets/app_bar/appbar_title_image.dart delete mode 100644 lib/widgets/app_bar/custom_app_bar.dart delete mode 100644 lib/widgets/custom_about_list.dart delete mode 100644 lib/widgets/custom_image_view.dart delete mode 100644 lib/widgets/custom_language_drop_down.dart delete mode 100644 lib/widgets/custom_notification_screen.dart delete mode 100644 lib/widgets/custom_scale_element.dart delete mode 100644 lib/widgets/custom_section_title.dart delete mode 100644 lib/widgets/next_step_button.dart diff --git a/lib/data/models/selectionPopupModel/selection_popup_model.dart b/lib/core/data/selectionPopupModel/selection_popup_model.dart similarity index 100% rename from lib/data/models/selectionPopupModel/selection_popup_model.dart rename to lib/core/data/selectionPopupModel/selection_popup_model.dart diff --git a/lib/data/models/selectionPopupModel/selection_popup_model.freezed.dart b/lib/core/data/selectionPopupModel/selection_popup_model.freezed.dart similarity index 100% rename from lib/data/models/selectionPopupModel/selection_popup_model.freezed.dart rename to lib/core/data/selectionPopupModel/selection_popup_model.freezed.dart diff --git a/lib/features/auth/auth_screen/auth_screen.dart b/lib/features/auth/auth_screen/auth_screen.dart index da510bd8..998b6ac0 100644 --- a/lib/features/auth/auth_screen/auth_screen.dart +++ b/lib/features/auth/auth_screen/auth_screen.dart @@ -5,7 +5,6 @@ import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/core/utils/image_constant.dart'; import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_title_image.dart'; import 'package:eatvio_app/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -45,7 +44,11 @@ class _AuthScreenState extends State { return Scaffold( appBar: AppBar( centerTitle: true, - title: AppbarTitleImage(imagePath: ImageConstant.imgLogoEatvio), + title: Image.asset( + ImageConstant.imgLogoEatvio, + height: 48, + fit: BoxFit.contain, + ), ), body: SafeArea( child: Padding( diff --git a/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart index 3d970a01..eb1358ea 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart @@ -8,7 +8,6 @@ import 'package:eatvio_app/features/consultant/become_consultant/presentation/pa import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/social_networks_screen.dart'; import 'package:eatvio_app/locator_service.dart'; import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_title_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; @@ -215,7 +214,11 @@ class _StepperBecomeConsultantScreenState extends State { decoration: BoxDecoration( borderRadius: BorderRadius.circular(4), ), - child: CustomImageView( - imagePath: ImageConstant.imgFavorite, + child: Image.asset( + ImageConstant.imgFavorite, height: 16, width: 16, ), @@ -119,8 +118,8 @@ class _BloodPressureScreenState extends State { decoration: BoxDecoration( borderRadius: BorderRadius.circular(4), ), - child: CustomImageView( - imagePath: ImageConstant.imgFavorite, + child: Image.asset( + ImageConstant.imgFavorite, height: 16, width: 16, ), diff --git a/lib/features/registration/presentation/pages/city_of_living_screen.dart b/lib/features/registration/presentation/pages/city_of_living_screen.dart index bae25803..1f2755e0 100644 --- a/lib/features/registration/presentation/pages/city_of_living_screen.dart +++ b/lib/features/registration/presentation/pages/city_of_living_screen.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; +import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/theme/theme_helper.dart'; diff --git a/lib/features/registration/presentation/pages/language_select_screen.dart b/lib/features/registration/presentation/pages/language_select_screen.dart index ed167fc1..638a207e 100644 --- a/lib/features/registration/presentation/pages/language_select_screen.dart +++ b/lib/features/registration/presentation/pages/language_select_screen.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; +import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; diff --git a/lib/features/registration/presentation/pages/registration_screen.dart b/lib/features/registration/presentation/pages/registration_screen.dart index b47212ba..c5cc8826 100644 --- a/lib/features/registration/presentation/pages/registration_screen.dart +++ b/lib/features/registration/presentation/pages/registration_screen.dart @@ -19,11 +19,10 @@ import 'package:eatvio_app/features/registration/presentation/pages/weight_scree import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/locator_service.dart'; import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/app_bar/appbar_title_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; -import 'package:rive/rive.dart'; +import 'package:rive/rive.dart' as rive; import 'package:validators/validators.dart'; class RegistrationScreen extends StatefulWidget { @@ -116,7 +115,11 @@ class _RegistrationScreenState extends State { ), ), centerTitle: true, - title: AppbarTitleImage(imagePath: ImageConstant.imgLogoEatvio), + title: Image.asset( + ImageConstant.imgLogoEatvio, + height: 48, + fit: BoxFit.contain, + ), actions: [ Padding( padding: const EdgeInsets.only(right: 16), @@ -322,7 +325,7 @@ class _RegistrationScreenState extends State { child: SizedBox( height: 32, width: 32, - child: RiveAnimation.asset( + child: rive.RiveAnimation.asset( 'assets/rive_animations/loading.riv', ), ), diff --git a/lib/features/settings/presentation/pages/general_info_screen.dart b/lib/features/settings/presentation/pages/general_info_screen.dart index 4ad9e084..693e909d 100644 --- a/lib/features/settings/presentation/pages/general_info_screen.dart +++ b/lib/features/settings/presentation/pages/general_info_screen.dart @@ -1,5 +1,5 @@ +import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/core/utils/date_time_utils.dart'; -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; diff --git a/lib/features/settings/presentation/pages/pressure_screen.dart b/lib/features/settings/presentation/pages/pressure_screen.dart index 7c1ee72a..9a7538dc 100644 --- a/lib/features/settings/presentation/pages/pressure_screen.dart +++ b/lib/features/settings/presentation/pages/pressure_screen.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; +import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; diff --git a/lib/widgets/app_bar/appbar_leading_image.dart b/lib/widgets/app_bar/appbar_leading_image.dart deleted file mode 100644 index 0f930dcb..00000000 --- a/lib/widgets/app_bar/appbar_leading_image.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:eatvio_app/widgets/custom_image_view.dart'; -import 'package:flutter/material.dart'; - -class AppbarLeadingImage extends StatelessWidget { - const AppbarLeadingImage({ - this.imagePath, - this.margin, - this.onTap, - }); - - final String? imagePath; - final EdgeInsetsGeometry? margin; - final Function? onTap; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onTapCall, - child: Padding( - padding: margin ?? EdgeInsets.zero, - child: CustomImageView( - imagePath: imagePath, - height: 26, - width: 13, - fit: BoxFit.contain, - ), - ), - ); - } - - void onTapCall() { - onTap!.call(); - } -} diff --git a/lib/widgets/app_bar/appbar_subtitle.dart b/lib/widgets/app_bar/appbar_subtitle.dart deleted file mode 100644 index ff1325f7..00000000 --- a/lib/widgets/app_bar/appbar_subtitle.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:flutter/material.dart'; - -class AppbarSubtitle extends StatelessWidget { - const AppbarSubtitle({ - required this.text, - this.margin, - this.onTap, - }); - - final String text; - final EdgeInsetsGeometry? margin; - final Function? onTap; - - @override - Widget build(BuildContext context) { - return GestureDetector( - child: Padding( - padding: margin ?? EdgeInsets.zero, - child: Text( - text, - style: CustomTextStyles.titleMediumBlack.copyWith( - color: appTheme.black900, - ), - ), - ), - ); - } -} diff --git a/lib/widgets/app_bar/appbar_title_image.dart b/lib/widgets/app_bar/appbar_title_image.dart deleted file mode 100644 index cf7fedcf..00000000 --- a/lib/widgets/app_bar/appbar_title_image.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:eatvio_app/widgets/custom_image_view.dart'; -import 'package:flutter/material.dart'; - -class AppbarTitleImage extends StatelessWidget { - const AppbarTitleImage({required this.imagePath, super.key}); - - final String? imagePath; - - @override - Widget build(BuildContext context) { - return CustomImageView( - imagePath: imagePath, - height: 48, - fit: BoxFit.contain, - ); - } -} diff --git a/lib/widgets/app_bar/custom_app_bar.dart b/lib/widgets/app_bar/custom_app_bar.dart deleted file mode 100644 index ce58516a..00000000 --- a/lib/widgets/app_bar/custom_app_bar.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; - -// ignore: must_be_immutable -class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { - CustomAppBar({ - Key? key, - this.height, - this.leadingWidth, - this.leading, - this.title, - this.centerTitle, - this.actions, - }) : super(key: key); - - final double? height; - final double? leadingWidth; - final Widget? leading; - final Widget? title; - final bool? centerTitle; - final List? actions; - - @override - Widget build(BuildContext context) { - return AppBar( - toolbarHeight: height ?? 56, - automaticallyImplyLeading: false, - backgroundColor: Colors.transparent, - leadingWidth: leadingWidth ?? 0, - leading: leading, - title: title, - titleSpacing: 0, - centerTitle: centerTitle ?? false, - actions: actions, - ); - } - - @override - Size get preferredSize => Size(double.infinity, height ?? 56); -} diff --git a/lib/widgets/custom_about_list.dart b/lib/widgets/custom_about_list.dart deleted file mode 100644 index 90b1d3d0..00000000 --- a/lib/widgets/custom_about_list.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; - -class AboutList extends StatefulWidget { - final String title; - final List items; - - AboutList(this.title, this.items); - - @override - _AboutListState createState() => _AboutListState(); -} - -class _AboutListState extends State { - bool isExpanded = false; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - GestureDetector( - onTap: toggleList(), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - widget.title, - style: TextStyle( - color: Colors.black, - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - Icon(isExpanded ? Icons.arrow_drop_up : Icons.arrow_drop_down), - ], - ), - ), - if (isExpanded) - Padding( - padding: const EdgeInsets.only(left: 16.0), - child: Column( - //children: widget.items.map((item) => Text(item)).toList(), - children: [Text(widget.items.join('\n'))], - ), - ), - Divider(), - ], - ); - } - - toggleList() { - return () { - setState(() { - isExpanded = !isExpanded; - }); - }; - } -} diff --git a/lib/widgets/custom_drop_down.dart b/lib/widgets/custom_drop_down.dart index 7522893a..887f4597 100644 --- a/lib/widgets/custom_drop_down.dart +++ b/lib/widgets/custom_drop_down.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/data/models/selectionPopupModel/selection_popup_model.dart'; +import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:flutter/material.dart'; class CustomDropDown extends StatelessWidget { diff --git a/lib/widgets/custom_image_view.dart b/lib/widgets/custom_image_view.dart deleted file mode 100644 index 07b9a5d9..00000000 --- a/lib/widgets/custom_image_view.dart +++ /dev/null @@ -1,162 +0,0 @@ -// ignore_for_file: must_be_immutable - -import 'dart:io'; - -import 'package:cached_network_image/cached_network_image.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -class CustomImageView extends StatelessWidget { - ///[imagePath] is required parameter for showing image - String? imagePath; - - double? height; - double? width; - Color? color; - BoxFit? fit; - final String placeHolder; - Alignment? alignment; - VoidCallback? onTap; - EdgeInsetsGeometry? margin; - BorderRadius? radius; - BoxBorder? border; - - ///a [CustomImageView] it can be used for showing any type of images - /// it will shows the placeholder image if image is not found on network image - CustomImageView({ - this.imagePath, - this.height, - this.width, - this.color, - this.fit, - this.alignment, - this.onTap, - this.radius, - this.margin, - this.border, - this.placeHolder = 'assets/images/image_not_found.png', - }); - - @override - Widget build(BuildContext context) { - return alignment != null - ? Align( - alignment: alignment!, - child: Padding( - padding: margin ?? EdgeInsets.zero, - child: InkWell( - onTap: onTap, - child: _buildCircleImage(), - ), - ), - ) - : Padding( - padding: margin ?? EdgeInsets.zero, - child: InkWell( - onTap: onTap, - child: _buildCircleImage(), - ), - ); - } - - ///build the image with border radius - _buildCircleImage() { - if (radius != null) { - return ClipRRect( - borderRadius: radius ?? BorderRadius.zero, - child: _buildImageWithBorder(), - ); - } else { - return _buildImageWithBorder(); - } - } - - ///build the image with border and border radius style - _buildImageWithBorder() { - if (border != null) { - return Container( - decoration: BoxDecoration( - border: border, - borderRadius: radius, - ), - child: _buildImageView(), - ); - } else { - return _buildImageView(); - } - } - - _buildImageView() { - if (imagePath != null) { - switch (imagePath!.imageType) { - case ImageType.svg: - return Container( - height: height, - width: width, - child: SvgPicture.asset( - imagePath!, - height: height, - width: width, - fit: fit ?? BoxFit.contain, - ), - ); - case ImageType.file: - return Image.file( - File(imagePath!), - height: height, - width: width, - fit: fit ?? BoxFit.cover, - color: color, - ); - case ImageType.network: - return CachedNetworkImage( - height: height, - width: width, - fit: fit, - imageUrl: imagePath!, - color: color, - placeholder: (context, url) => Container( - height: 30, - width: 30, - child: LinearProgressIndicator( - color: Colors.grey.shade200, - backgroundColor: Colors.grey.shade100, - ), - ), - errorWidget: (context, url, error) => Image.asset( - placeHolder, - height: height, - width: width, - fit: fit ?? BoxFit.cover, - ), - ); - case ImageType.png: - default: - return Image.asset( - imagePath!, - height: height, - width: width, - fit: fit ?? BoxFit.cover, - color: color, - ); - } - } - return SizedBox(); - } -} - -extension ImageTypeExtension on String { - ImageType get imageType { - if (this.startsWith('http') || this.startsWith('https')) { - return ImageType.network; - } else if (this.endsWith('.svg')) { - return ImageType.svg; - } else if (this.startsWith('file://')) { - return ImageType.file; - } else { - return ImageType.png; - } - } -} - -enum ImageType { svg, png, network, file, unknown } diff --git a/lib/widgets/custom_language_drop_down.dart b/lib/widgets/custom_language_drop_down.dart deleted file mode 100644 index f04a703a..00000000 --- a/lib/widgets/custom_language_drop_down.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -class LanguageDropdown extends StatefulWidget { - @override - _LanguageDropdownState createState() => _LanguageDropdownState(); -} - -class _LanguageDropdownState extends State { - String selectedLanguage = 'Русский'; - - @override - Widget build(BuildContext context) { - return DropdownButton( - value: selectedLanguage, - onChanged: selectLanguage(), - isDense: false, - // Установите isDense в false - selectedItemBuilder: getList(), - items: ['Русский'].map((String language) { - return DropdownMenuItem( - value: language, - child: Text(language), - ); - }).toList(), - ); - } - - getList() { - return (BuildContext context) { - return ['Русский'].map((String language) { - return Align( - alignment: Alignment.center, // Выравнивание текста по центру - child: Text( - language, - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ); - }).toList(); - }; - } - - selectLanguage() { - return (newValue) { - setState(() { - selectedLanguage = newValue!; - }); - }; - } -} diff --git a/lib/widgets/custom_notification_screen.dart b/lib/widgets/custom_notification_screen.dart deleted file mode 100644 index 20c2055b..00000000 --- a/lib/widgets/custom_notification_screen.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:flutter/material.dart'; - -class NotificationSwitch extends StatefulWidget { - final String title; - - NotificationSwitch(this.title); - - @override - _NotificationSwitchState createState() => _NotificationSwitchState(); -} - -class _NotificationSwitchState extends State { - bool switchValue = false; - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - widget.title, - style: TextStyle( - color: Colors.black, - fontSize: 14, - fontWeight: FontWeight.bold, - ), - ), - Switch( - value: switchValue, - onChanged: toggleSwitch(), - inactiveThumbColor: appTheme.blueA400, - inactiveTrackColor: Colors.white, - activeTrackColor: appTheme.blueA400, - activeColor: Colors.white, - ), - ], - ); - } - - toggleSwitch() { - return (value) { - setState(() { - switchValue = value; - }); - }; - } -} diff --git a/lib/widgets/custom_scale_element.dart b/lib/widgets/custom_scale_element.dart deleted file mode 100644 index 531c95ef..00000000 --- a/lib/widgets/custom_scale_element.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'package:flutter/material.dart'; - -class ScaleElement extends StatelessWidget { - final Color color; - final bool isSelected; - final VoidCallback onTap; - - const ScaleElement({ - required this.color, - required this.isSelected, - required this.onTap, - }); - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - width: isSelected ? 40 : 20, - height: isSelected ? 40 : 20, - decoration: BoxDecoration( - color: color, - shape: BoxShape.circle, - ), - ), - ); - } -} diff --git a/lib/widgets/custom_section_title.dart b/lib/widgets/custom_section_title.dart deleted file mode 100644 index 282f3d6a..00000000 --- a/lib/widgets/custom_section_title.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter/material.dart'; - -class SectionTitle extends StatelessWidget { - final String title; - - SectionTitle(this.title); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Text( - title, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 18), - ), - ); - } -} diff --git a/lib/widgets/next_step_button.dart b/lib/widgets/next_step_button.dart deleted file mode 100644 index 05332f15..00000000 --- a/lib/widgets/next_step_button.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/base_button.dart'; -import 'package:flutter/material.dart'; - -class NextStepButton extends BaseButton { - NextStepButton({ - Key? key, - this.decoration, - this.leftIcon, - this.rightIcon, - this.label, - VoidCallback? onPressed, - ButtonStyle? buttonStyle, - TextStyle? buttonTextStyle, - bool? isDisabled, - Alignment? alignment, - double? height, - double? width, - EdgeInsets? margin, - required String text, - }) : super( - text: text, - onPressed: onPressed, - buttonStyle: buttonStyle, - isDisabled: isDisabled, - buttonTextStyle: buttonTextStyle, - height: height, - alignment: alignment, - width: width, - margin: margin, - ); - - final BoxDecoration? decoration; - final Widget? leftIcon; - final Widget? rightIcon; - final Widget? label; - - @override - Widget build(BuildContext context) { - return (alignment != null) - ? Align( - alignment: alignment!, - child: Container( - height: this.height ?? 30, - width: this.width ?? double.maxFinite, - margin: margin, - decoration: decoration, - child: OutlinedButton( - style: buttonStyle, - onPressed: isDisabled ?? false ? null : onPressed ?? () {}, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - leftIcon ?? const SizedBox.shrink(), - Text( - text, - style: buttonTextStyle ?? theme.textTheme.titleSmall, - ), - rightIcon ?? const SizedBox.shrink(), - ], - ), - ), - ), - ) - : Container( - height: this.height ?? 30, - width: this.width ?? double.maxFinite, - margin: margin, - decoration: decoration, - child: OutlinedButton( - style: buttonStyle, - onPressed: isDisabled ?? false ? null : onPressed ?? () {}, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - leftIcon ?? const SizedBox.shrink(), - Text( - text, - style: buttonTextStyle ?? theme.textTheme.titleSmall, - ), - rightIcon ?? const SizedBox.shrink(), - ], - ), - ), - ); - } -} From b4aed3d3fdba17b209cd3091c88883fa2b3441f0 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 20 Nov 2024 14:30:48 +0300 Subject: [PATCH 4/6] fix: refactor files --- lib/{ => core}/app_router.dart | 0 .../initialization_cubit/initialization_cubit.dart | 2 +- lib/{ => core}/locator_service.dart | 0 lib/{ => core}/theme/app_decoration.dart | 2 +- lib/{ => core}/theme/custom_button_style.dart | 2 +- lib/{ => core}/theme/custom_text_style.dart | 2 +- lib/{ => core}/theme/theme_helper.dart | 0 lib/core/token_storage.dart | 2 +- lib/core/utils/toasts.dart | 2 +- lib/{ => core}/widgets/base_button.dart | 0 lib/core/widgets/bookmark_button.dart | 2 +- lib/core/widgets/bottom_sheet_handler_bar.dart | 2 +- lib/core/widgets/custom_divider.dart | 2 +- lib/{ => core}/widgets/custom_drop_down.dart | 0 lib/{ => core}/widgets/custom_outlined_button.dart | 4 ++-- lib/{ => core}/widgets/custom_text_form_field.dart | 2 +- lib/core/widgets/diet_info_row.dart | 4 ++-- lib/core/widgets/feed_icon_button.dart | 4 ++-- lib/features/auth/auth_screen/auth_screen.dart | 4 ++-- .../presentation/pages/blog_post_screen.dart | 4 ++-- .../presentation/pages/blog_post_create_screen.dart | 8 ++++---- .../widgets/bottom_navigation_bar_widget.dart | 4 ++-- .../calendar/presentation/pages/calendar_screen.dart | 8 ++++---- .../chat/presentation/pages/chat_screen.dart | 6 +++--- .../chat/presentation/pages/chat_select_screen.dart | 2 +- .../chat/presentation/pages/photo_view_screen.dart | 2 +- .../chat/presentation/widgets/chat_entry_widget.dart | 4 ++-- .../presentation/widgets/chat_search_bar_widget.dart | 4 ++-- .../pages/additional_settings_screen.dart | 2 +- .../presentation/pages/become_consultant_screen.dart | 2 +- .../pages/certificates_and_diplomas_screen.dart | 2 +- .../presentation/pages/last_step_screen.dart | 2 +- .../presentation/pages/photo_or_scans_screen.dart | 2 +- .../presentation/pages/registration_as_screen.dart | 2 +- .../presentation/pages/social_networks_screen.dart | 2 +- .../pages/stepper_become_consultant_screen.dart | 4 ++-- .../diary/presentation/pages/diary_screen.dart | 6 +++--- .../widgets/finish_day_button_widget.dart | 2 +- .../glossary_moderation_request_modal_widget.dart | 4 ++-- .../diets/presentation/pages/about_diet_screen.dart | 6 +++--- .../diets/presentation/widgets/author_card.dart | 4 ++-- .../diets/presentation/widgets/calendar_widget.dart | 2 +- .../diets/presentation/widgets/cpfc_container.dart | 4 ++-- .../diets/presentation/widgets/expandable_text.dart | 4 ++-- .../diets/presentation/widgets/info_bouble.dart | 2 +- .../presentation/widgets/main_background_bouble.dart | 2 +- .../diets/presentation/widgets/more_options.dart | 4 ++-- .../widgets/start_diet_bottom_sheet.dart | 6 +++--- .../diets/presentation/widgets/type_badges.dart | 4 ++-- .../feed/presentation/pages/feed_screen.dart | 4 ++-- .../feed/presentation/widgets/blog_post_widget.dart | 2 +- .../presentation/widgets/choice_chip_widget.dart | 2 +- .../feed/presentation/widgets/comments_widget.dart | 2 +- .../widgets/diet_filter_bottom_sheet.dart | 4 ++-- .../feed/presentation/widgets/diets_widget.dart | 4 ++-- .../feed/presentation/widgets/filter_badge.dart | 2 +- .../feed/presentation/widgets/recipes_widget.dart | 2 +- .../widgets/sorting_drop_down_filter.dart | 2 +- .../feed/presentation/widgets/tags_modal_widget.dart | 2 +- .../menu/presentation/pages/menu_screen.dart | 4 ++-- .../profile/presentation/pages/profile_screen.dart | 4 ++-- .../widgets/circumference_chart_widget.dart | 2 +- .../presentation/widgets/imt_chart_widget.dart | 2 +- .../presentation/widgets/weight_chart_widget.dart | 2 +- .../presentation/pages/about_recipes_screen.dart | 4 ++-- .../presentation/pages/recipe_create_screen.dart | 12 ++++++------ .../presentation/pages/recipe_edit_screen.dart | 10 +++++----- .../bloc/registration_cubit/registration_cubit.dart | 2 +- .../pages/additional_information_screen.dart | 2 +- .../presentation/pages/allergies_screen.dart | 2 +- .../presentation/pages/blood_pressure_screen.dart | 4 ++-- .../pages/body_circumferences_screen.dart | 2 +- .../presentation/pages/city_of_living_screen.dart | 4 ++-- .../presentation/pages/credentials_screen.dart | 2 +- .../presentation/pages/date_of_birth_screen.dart | 2 +- .../presentation/pages/favorite_foods_screen.dart | 2 +- .../presentation/pages/favorite_sports_screen.dart | 2 +- .../presentation/pages/height_screen.dart | 2 +- .../presentation/pages/language_select_screen.dart | 2 +- .../presentation/pages/medicine_intake_screen.dart | 2 +- .../registration/presentation/pages/name_screen.dart | 2 +- .../presentation/pages/registration_screen.dart | 4 ++-- .../presentation/pages/weight_screen.dart | 2 +- .../presentation/pages/general_info_screen.dart | 6 +++--- .../presentation/pages/other_info_screen.dart | 4 ++-- .../presentation/pages/physical_activity_screen.dart | 2 +- .../presentation/pages/physical_form_screen.dart | 4 ++-- .../settings/presentation/pages/pressure_screen.dart | 6 +++--- .../settings/presentation/pages/settings_screen.dart | 4 ++-- lib/main.dart | 8 ++++---- 90 files changed, 142 insertions(+), 142 deletions(-) rename lib/{ => core}/app_router.dart (100%) rename lib/{ => core}/locator_service.dart (100%) rename lib/{ => core}/theme/app_decoration.dart (98%) rename lib/{ => core}/theme/custom_button_style.dart (92%) rename lib/{ => core}/theme/custom_text_style.dart (99%) rename lib/{ => core}/theme/theme_helper.dart (100%) rename lib/{ => core}/widgets/base_button.dart (100%) rename lib/{ => core}/widgets/custom_drop_down.dart (100%) rename lib/{ => core}/widgets/custom_outlined_button.dart (96%) rename lib/{ => core}/widgets/custom_text_form_field.dart (98%) diff --git a/lib/app_router.dart b/lib/core/app_router.dart similarity index 100% rename from lib/app_router.dart rename to lib/core/app_router.dart diff --git a/lib/core/initialization_cubit/initialization_cubit.dart b/lib/core/initialization_cubit/initialization_cubit.dart index 93e02a47..aedcc3cd 100644 --- a/lib/core/initialization_cubit/initialization_cubit.dart +++ b/lib/core/initialization_cubit/initialization_cubit.dart @@ -5,7 +5,7 @@ import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/features/chat/repositories/chat_repository.dart'; -import 'package:eatvio_app/locator_service.dart'; +import 'package:eatvio_app/core/locator_service.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class InitializationCubit extends Cubit { diff --git a/lib/locator_service.dart b/lib/core/locator_service.dart similarity index 100% rename from lib/locator_service.dart rename to lib/core/locator_service.dart diff --git a/lib/theme/app_decoration.dart b/lib/core/theme/app_decoration.dart similarity index 98% rename from lib/theme/app_decoration.dart rename to lib/core/theme/app_decoration.dart index b84dc7fe..eb2c4372 100644 --- a/lib/theme/app_decoration.dart +++ b/lib/core/theme/app_decoration.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class AppDecoration { diff --git a/lib/theme/custom_button_style.dart b/lib/core/theme/custom_button_style.dart similarity index 92% rename from lib/theme/custom_button_style.dart rename to lib/core/theme/custom_button_style.dart index 57e3ca9e..50b9d186 100644 --- a/lib/theme/custom_button_style.dart +++ b/lib/core/theme/custom_button_style.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; /// A class that offers pre-defined button styles for customizing button appearance. diff --git a/lib/theme/custom_text_style.dart b/lib/core/theme/custom_text_style.dart similarity index 99% rename from lib/theme/custom_text_style.dart rename to lib/core/theme/custom_text_style.dart index dcc15aea..91ddffa2 100644 --- a/lib/theme/custom_text_style.dart +++ b/lib/core/theme/custom_text_style.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; /// A collection of pre-defined text styles for customizing text appearance, diff --git a/lib/theme/theme_helper.dart b/lib/core/theme/theme_helper.dart similarity index 100% rename from lib/theme/theme_helper.dart rename to lib/core/theme/theme_helper.dart diff --git a/lib/core/token_storage.dart b/lib/core/token_storage.dart index c73e2aba..bc795829 100644 --- a/lib/core/token_storage.dart +++ b/lib/core/token_storage.dart @@ -1,5 +1,5 @@ import 'package:dio/dio.dart'; -import 'package:eatvio_app/locator_service.dart'; +import 'package:eatvio_app/core/locator_service.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; abstract class TokenStorage { diff --git a/lib/core/utils/toasts.dart b/lib/core/utils/toasts.dart index 18195ccd..2f86daa9 100644 --- a/lib/core/utils/toasts.dart +++ b/lib/core/utils/toasts.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:fluttertoast/fluttertoast.dart'; const int _toastDuration = 2; diff --git a/lib/widgets/base_button.dart b/lib/core/widgets/base_button.dart similarity index 100% rename from lib/widgets/base_button.dart rename to lib/core/widgets/base_button.dart diff --git a/lib/core/widgets/bookmark_button.dart b/lib/core/widgets/bookmark_button.dart index b8d767ac..c9e939c4 100644 --- a/lib/core/widgets/bookmark_button.dart +++ b/lib/core/widgets/bookmark_button.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class BookmarkButton extends StatelessWidget { diff --git a/lib/core/widgets/bottom_sheet_handler_bar.dart b/lib/core/widgets/bottom_sheet_handler_bar.dart index 1645fda5..ceaf2bca 100644 --- a/lib/core/widgets/bottom_sheet_handler_bar.dart +++ b/lib/core/widgets/bottom_sheet_handler_bar.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class BottomSheetHandlerBar extends StatelessWidget { diff --git a/lib/core/widgets/custom_divider.dart b/lib/core/widgets/custom_divider.dart index 8262ee4a..7bf88514 100644 --- a/lib/core/widgets/custom_divider.dart +++ b/lib/core/widgets/custom_divider.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class CustomDivider extends StatelessWidget { diff --git a/lib/widgets/custom_drop_down.dart b/lib/core/widgets/custom_drop_down.dart similarity index 100% rename from lib/widgets/custom_drop_down.dart rename to lib/core/widgets/custom_drop_down.dart diff --git a/lib/widgets/custom_outlined_button.dart b/lib/core/widgets/custom_outlined_button.dart similarity index 96% rename from lib/widgets/custom_outlined_button.dart rename to lib/core/widgets/custom_outlined_button.dart index 549052f8..38a9be27 100644 --- a/lib/widgets/custom_outlined_button.dart +++ b/lib/core/widgets/custom_outlined_button.dart @@ -1,5 +1,5 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/widgets/base_button.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/widgets/base_button.dart'; import 'package:flutter/material.dart'; class CustomOutlinedButton extends BaseButton { diff --git a/lib/widgets/custom_text_form_field.dart b/lib/core/widgets/custom_text_form_field.dart similarity index 98% rename from lib/widgets/custom_text_form_field.dart rename to lib/core/widgets/custom_text_form_field.dart index 6054079f..2ce5a525 100644 --- a/lib/widgets/custom_text_form_field.dart +++ b/lib/core/widgets/custom_text_form_field.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/core/widgets/diet_info_row.dart b/lib/core/widgets/diet_info_row.dart index bf365a5d..06c910bb 100644 --- a/lib/core/widgets/diet_info_row.dart +++ b/lib/core/widgets/diet_info_row.dart @@ -1,10 +1,10 @@ +import 'package:eatvio_app/core/theme/custom_text_style.dart'; import 'package:eatvio_app/core/utils/localization_utils.dart'; import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart'; import 'package:eatvio_app/features/diets/presentation/widgets/type_badges.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; diff --git a/lib/core/widgets/feed_icon_button.dart b/lib/core/widgets/feed_icon_button.dart index e3744f9c..c6e5a70d 100644 --- a/lib/core/widgets/feed_icon_button.dart +++ b/lib/core/widgets/feed_icon_button.dart @@ -1,5 +1,5 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; diff --git a/lib/features/auth/auth_screen/auth_screen.dart b/lib/features/auth/auth_screen/auth_screen.dart index 998b6ac0..1820c227 100644 --- a/lib/features/auth/auth_screen/auth_screen.dart +++ b/lib/features/auth/auth_screen/auth_screen.dart @@ -3,9 +3,9 @@ import 'dart:convert'; import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/core/utils/image_constant.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart index 7c27ab09..a1dd837f 100644 --- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart +++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart @@ -7,8 +7,8 @@ import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/commen import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_state.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/comments_widget.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_html/flutter_html.dart'; diff --git a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart index c09cbf94..2dce271e 100644 --- a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart +++ b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart @@ -1,11 +1,11 @@ import 'dart:async'; import 'dart:io'; +import 'package:eatvio_app/core/theme/app_decoration.dart'; import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_cubit.dart'; import 'package:eatvio_app/features/blog_post_create/bloc/blog_post_create_cubit/blog_post_create_state.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart b/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart index ebab1850..fc7c278e 100644 --- a/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart +++ b/lib/features/bottom_navigation_bar/presentation/widgets/bottom_navigation_bar_widget.dart @@ -7,8 +7,8 @@ import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/noti import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_cubit.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/profile_avatar_cubit/profile_avatar_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; diff --git a/lib/features/calendar/presentation/pages/calendar_screen.dart b/lib/features/calendar/presentation/pages/calendar_screen.dart index 329ad7ec..495c08df 100644 --- a/lib/features/calendar/presentation/pages/calendar_screen.dart +++ b/lib/features/calendar/presentation/pages/calendar_screen.dart @@ -1,9 +1,9 @@ +import 'package:eatvio_app/core/theme/app_decoration.dart'; import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_cubit.dart'; import 'package:eatvio_app/features/calendar/presentation/bloc/calendar_state.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; diff --git a/lib/features/chat/presentation/pages/chat_screen.dart b/lib/features/chat/presentation/pages/chat_screen.dart index 65dfd03d..a0d598a3 100644 --- a/lib/features/chat/presentation/pages/chat_screen.dart +++ b/lib/features/chat/presentation/pages/chat_screen.dart @@ -3,9 +3,9 @@ import 'dart:io'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_cubit.dart'; import 'package:eatvio_app/features/chat/presentation/bloc/chat_room_cubit/chat_room_state.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/chat_bubble_widget.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/chat/presentation/pages/chat_select_screen.dart b/lib/features/chat/presentation/pages/chat_select_screen.dart index b4660cf2..0da5dfda 100644 --- a/lib/features/chat/presentation/pages/chat_select_screen.dart +++ b/lib/features/chat/presentation/pages/chat_select_screen.dart @@ -3,7 +3,7 @@ import 'package:eatvio_app/features/chat/presentation/bloc/chat_select_cubit/cha import 'package:eatvio_app/features/chat/presentation/bloc/chat_select_cubit/chat_select_state.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/chat_entry_widget.dart'; import 'package:eatvio_app/features/chat/presentation/widgets/chat_search_bar_widget.dart'; -import 'package:eatvio_app/locator_service.dart'; +import 'package:eatvio_app/core/locator_service.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:rive/rive.dart'; diff --git a/lib/features/chat/presentation/pages/photo_view_screen.dart b/lib/features/chat/presentation/pages/photo_view_screen.dart index 6148c52c..383a538b 100644 --- a/lib/features/chat/presentation/pages/photo_view_screen.dart +++ b/lib/features/chat/presentation/pages/photo_view_screen.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:dismissible_page/dismissible_page.dart'; import 'package:eatvio_app/core/const.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; +import 'package:eatvio_app/core/theme/app_decoration.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:photo_view/photo_view.dart'; diff --git a/lib/features/chat/presentation/widgets/chat_entry_widget.dart b/lib/features/chat/presentation/widgets/chat_entry_widget.dart index 19c69160..389c53a7 100644 --- a/lib/features/chat/presentation/widgets/chat_entry_widget.dart +++ b/lib/features/chat/presentation/widgets/chat_entry_widget.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/core/utils/date_time_utils.dart'; import 'package:eatvio_app/features/chat/models/chat_room_preview_model.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart b/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart index 3480c923..90db1fca 100644 --- a/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart +++ b/lib/features/chat/presentation/widgets/chat_search_bar_widget.dart @@ -1,5 +1,5 @@ -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class ChatSearchBarWidget extends StatelessWidget { diff --git a/lib/features/consultant/become_consultant/presentation/pages/additional_settings_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/additional_settings_screen.dart index e51aff3a..da799a5e 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/additional_settings_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/additional_settings_screen.dart @@ -1,5 +1,5 @@ import 'package:eatvio_app/features/consultant/become_consultant/presentation/bloc/register_consultant_cubit/register_consultant_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart index c125ac1d..8b4f969b 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/become_consultant_screen.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/consultant/become_consultant/presentation/pages/certificates_and_diplomas_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/certificates_and_diplomas_screen.dart index 27a4aa71..cef02ded 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/certificates_and_diplomas_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/certificates_and_diplomas_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/consultant/become_consultant/entities/diploma_entity.dart'; import 'package:eatvio_app/features/consultant/become_consultant/models/consultant_profile_model.dart'; import 'package:eatvio_app/features/consultant/become_consultant/presentation/bloc/register_consultant_cubit/register_consultant_cubit.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:eatvio_app/core/utils/date_time_utils.dart'; diff --git a/lib/features/consultant/become_consultant/presentation/pages/last_step_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/last_step_screen.dart index d24f205a..54f66c55 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/last_step_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/last_step_screen.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/features/consultant/become_consultant/presentation/bloc/register_consultant_cubit/register_consultant_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/features/consultant/become_consultant/presentation/pages/photo_or_scans_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/photo_or_scans_screen.dart index eae359c2..5a547050 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/photo_or_scans_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/photo_or_scans_screen.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:dismissible_page/dismissible_page.dart'; import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; import 'package:eatvio_app/features/consultant/become_consultant/presentation/bloc/register_consultant_cubit/register_consultant_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:image_picker/image_picker.dart'; diff --git a/lib/features/consultant/become_consultant/presentation/pages/registration_as_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/registration_as_screen.dart index 764f1653..8320381d 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/registration_as_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/registration_as_screen.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class RegistrationAsScreen extends StatefulWidget { diff --git a/lib/features/consultant/become_consultant/presentation/pages/social_networks_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/social_networks_screen.dart index fb62e42d..ed754c67 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/social_networks_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/social_networks_screen.dart @@ -1,5 +1,5 @@ import 'package:eatvio_app/features/consultant/become_consultant/presentation/bloc/register_consultant_cubit/register_consultant_cubit.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; diff --git a/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart index eb1358ea..a526d233 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart @@ -6,8 +6,8 @@ import 'package:eatvio_app/features/consultant/become_consultant/presentation/pa import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/photo_or_scans_screen.dart'; import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/registration_as_screen.dart'; import 'package:eatvio_app/features/consultant/become_consultant/presentation/pages/social_networks_screen.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/diary/presentation/pages/diary_screen.dart b/lib/features/diary/presentation/pages/diary_screen.dart index 6c19ceb6..c8c4740e 100644 --- a/lib/features/diary/presentation/pages/diary_screen.dart +++ b/lib/features/diary/presentation/pages/diary_screen.dart @@ -9,9 +9,9 @@ import 'package:eatvio_app/features/diary/presentation/widgets/finish_day_button import 'package:eatvio_app/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart'; import 'package:eatvio_app/features/diary/presentation/widgets/satiety_rating_widget.dart'; import 'package:eatvio_app/features/glossary/models/glossary_model.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/diary/presentation/widgets/finish_day_button_widget.dart b/lib/features/diary/presentation/widgets/finish_day_button_widget.dart index 1b6d0a3f..35a272a0 100644 --- a/lib/features/diary/presentation/widgets/finish_day_button_widget.dart +++ b/lib/features/diary/presentation/widgets/finish_day_button_widget.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/features/diary/models/diary_day_model.dart'; import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart b/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart index 57896321..1fb44138 100644 --- a/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart +++ b/lib/features/diary/presentation/widgets/glossary_moderation_request_modal_widget.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/features/diary/presentation/bloc/diary_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:lottie/lottie.dart'; diff --git a/lib/features/diets/presentation/pages/about_diet_screen.dart b/lib/features/diets/presentation/pages/about_diet_screen.dart index 8173f15a..e3053468 100644 --- a/lib/features/diets/presentation/pages/about_diet_screen.dart +++ b/lib/features/diets/presentation/pages/about_diet_screen.dart @@ -21,9 +21,9 @@ import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/commen import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_state.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/comments_widget.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_portal/flutter_portal.dart'; diff --git a/lib/features/diets/presentation/widgets/author_card.dart b/lib/features/diets/presentation/widgets/author_card.dart index c277ef30..b3e0ea92 100644 --- a/lib/features/diets/presentation/widgets/author_card.dart +++ b/lib/features/diets/presentation/widgets/author_card.dart @@ -1,8 +1,8 @@ import 'package:eatvio_app/features/diets/presentation/widgets/info_bouble.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/diets/presentation/widgets/calendar_widget.dart b/lib/features/diets/presentation/widgets/calendar_widget.dart index 4c156035..c3ff1ee1 100644 --- a/lib/features/diets/presentation/widgets/calendar_widget.dart +++ b/lib/features/diets/presentation/widgets/calendar_widget.dart @@ -1,5 +1,5 @@ import 'package:eatvio_app/core/utils/string_extentions.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:table_calendar/table_calendar.dart'; diff --git a/lib/features/diets/presentation/widgets/cpfc_container.dart b/lib/features/diets/presentation/widgets/cpfc_container.dart index bd211b21..113c689d 100644 --- a/lib/features/diets/presentation/widgets/cpfc_container.dart +++ b/lib/features/diets/presentation/widgets/cpfc_container.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class CpfcContainer extends StatelessWidget { diff --git a/lib/features/diets/presentation/widgets/expandable_text.dart b/lib/features/diets/presentation/widgets/expandable_text.dart index 80ecb6a3..c2decf4c 100644 --- a/lib/features/diets/presentation/widgets/expandable_text.dart +++ b/lib/features/diets/presentation/widgets/expandable_text.dart @@ -1,8 +1,8 @@ import 'dart:math' as math; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_svg/svg.dart'; diff --git a/lib/features/diets/presentation/widgets/info_bouble.dart b/lib/features/diets/presentation/widgets/info_bouble.dart index 870859dd..7f339420 100644 --- a/lib/features/diets/presentation/widgets/info_bouble.dart +++ b/lib/features/diets/presentation/widgets/info_bouble.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class InfoBouble extends StatelessWidget { diff --git a/lib/features/diets/presentation/widgets/main_background_bouble.dart b/lib/features/diets/presentation/widgets/main_background_bouble.dart index 8b94131e..46e13f09 100644 --- a/lib/features/diets/presentation/widgets/main_background_bouble.dart +++ b/lib/features/diets/presentation/widgets/main_background_bouble.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class MainBackgroundBouble extends StatelessWidget { diff --git a/lib/features/diets/presentation/widgets/more_options.dart b/lib/features/diets/presentation/widgets/more_options.dart index 675ecd7e..862405f2 100644 --- a/lib/features/diets/presentation/widgets/more_options.dart +++ b/lib/features/diets/presentation/widgets/more_options.dart @@ -3,8 +3,8 @@ import 'package:eatvio_app/core/utils/toasts.dart'; import 'package:eatvio_app/core/widgets/custom_divider.dart'; import 'package:eatvio_app/features/diets/presentation/widgets/main_background_bouble.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; diff --git a/lib/features/diets/presentation/widgets/start_diet_bottom_sheet.dart b/lib/features/diets/presentation/widgets/start_diet_bottom_sheet.dart index 63facccf..db2ecc95 100644 --- a/lib/features/diets/presentation/widgets/start_diet_bottom_sheet.dart +++ b/lib/features/diets/presentation/widgets/start_diet_bottom_sheet.dart @@ -2,9 +2,9 @@ import 'package:eatvio_app/core/widgets/bottom_sheet_handler_bar.dart'; import 'package:eatvio_app/core/widgets/custom_divider.dart'; import 'package:eatvio_app/features/diets/presentation/widgets/calendar_widget.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_outlined_button.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_outlined_button.dart'; import 'package:flutter/material.dart'; class StartDietBottomSheet extends StatelessWidget { diff --git a/lib/features/diets/presentation/widgets/type_badges.dart b/lib/features/diets/presentation/widgets/type_badges.dart index 6d7e2b73..b1d21fc4 100644 --- a/lib/features/diets/presentation/widgets/type_badges.dart +++ b/lib/features/diets/presentation/widgets/type_badges.dart @@ -1,8 +1,8 @@ import 'package:eatvio_app/features/diets/presentation/widgets/main_background_bouble.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_portal/flutter_portal.dart'; import 'package:flutter_svg/svg.dart'; diff --git a/lib/features/feed/presentation/pages/feed_screen.dart b/lib/features/feed/presentation/pages/feed_screen.dart index d55f6579..ca9fd146 100644 --- a/lib/features/feed/presentation/pages/feed_screen.dart +++ b/lib/features/feed/presentation/pages/feed_screen.dart @@ -15,8 +15,8 @@ import 'package:eatvio_app/features/feed/presentation/widgets/recipes_widget.dar import 'package:eatvio_app/features/feed/presentation/widgets/tags_modal_widget.dart'; import 'package:eatvio_app/features/plans/presentation/bloc/plans_cubit/plans_cubit.dart'; import 'package:eatvio_app/features/plans/presentation/bloc/plans_cubit/plans_state.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/feed/presentation/widgets/blog_post_widget.dart b/lib/features/feed/presentation/widgets/blog_post_widget.dart index ff7dc653..e10ff485 100644 --- a/lib/features/feed/presentation/widgets/blog_post_widget.dart +++ b/lib/features/feed/presentation/widgets/blog_post_widget.dart @@ -6,7 +6,7 @@ import 'package:eatvio_app/core/widgets/feed_icon_button.dart'; import 'package:eatvio_app/features/chat/presentation/pages/photo_view_screen.dart'; import 'package:eatvio_app/features/feed/models/feed_blog_post_model.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/feed_cubit/feed_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_html/flutter_html.dart'; diff --git a/lib/features/feed/presentation/widgets/choice_chip_widget.dart b/lib/features/feed/presentation/widgets/choice_chip_widget.dart index acadd0d7..d20a2dad 100644 --- a/lib/features/feed/presentation/widgets/choice_chip_widget.dart +++ b/lib/features/feed/presentation/widgets/choice_chip_widget.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class ChoiceChipWidget extends StatelessWidget { diff --git a/lib/features/feed/presentation/widgets/comments_widget.dart b/lib/features/feed/presentation/widgets/comments_widget.dart index 72be3b63..96391ca8 100644 --- a/lib/features/feed/presentation/widgets/comments_widget.dart +++ b/lib/features/feed/presentation/widgets/comments_widget.dart @@ -2,7 +2,7 @@ import 'package:eatvio_app/core/utils/date_time_utils.dart'; import 'package:eatvio_app/features/feed/models/comment_model.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/feed/presentation/widgets/diet_filter_bottom_sheet.dart b/lib/features/feed/presentation/widgets/diet_filter_bottom_sheet.dart index 6ebb2a20..37d720d3 100644 --- a/lib/features/feed/presentation/widgets/diet_filter_bottom_sheet.dart +++ b/lib/features/feed/presentation/widgets/diet_filter_bottom_sheet.dart @@ -3,8 +3,8 @@ import 'package:eatvio_app/core/widgets/custom_divider.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/sorting_drop_down_filter.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/type_choice_filter_widget.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; class DietFilterBottomSheet extends StatelessWidget { diff --git a/lib/features/feed/presentation/widgets/diets_widget.dart b/lib/features/feed/presentation/widgets/diets_widget.dart index b41bb869..7b51f7f4 100644 --- a/lib/features/feed/presentation/widgets/diets_widget.dart +++ b/lib/features/feed/presentation/widgets/diets_widget.dart @@ -5,8 +5,8 @@ import 'package:eatvio_app/core/widgets/diet_info_row.dart'; import 'package:eatvio_app/core/widgets/feed_icon_button.dart'; import 'package:eatvio_app/features/feed/models/diets_pagination_model.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/diets_cubit/diets_cubit.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_html/flutter_html.dart'; diff --git a/lib/features/feed/presentation/widgets/filter_badge.dart b/lib/features/feed/presentation/widgets/filter_badge.dart index 2b49e645..6f7f5d9f 100644 --- a/lib/features/feed/presentation/widgets/filter_badge.dart +++ b/lib/features/feed/presentation/widgets/filter_badge.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; diff --git a/lib/features/feed/presentation/widgets/recipes_widget.dart b/lib/features/feed/presentation/widgets/recipes_widget.dart index 348ac841..9e93074b 100644 --- a/lib/features/feed/presentation/widgets/recipes_widget.dart +++ b/lib/features/feed/presentation/widgets/recipes_widget.dart @@ -1,7 +1,7 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/features/feed/models/recipes_model.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/feed/presentation/widgets/sorting_drop_down_filter.dart b/lib/features/feed/presentation/widgets/sorting_drop_down_filter.dart index 3c6fea42..c9e21c1e 100644 --- a/lib/features/feed/presentation/widgets/sorting_drop_down_filter.dart +++ b/lib/features/feed/presentation/widgets/sorting_drop_down_filter.dart @@ -1,5 +1,5 @@ import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; diff --git a/lib/features/feed/presentation/widgets/tags_modal_widget.dart b/lib/features/feed/presentation/widgets/tags_modal_widget.dart index 21618511..51b2fca0 100644 --- a/lib/features/feed/presentation/widgets/tags_modal_widget.dart +++ b/lib/features/feed/presentation/widgets/tags_modal_widget.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/recipes_cubit/recipes_state.dart'; import 'package:eatvio_app/features/recipes/models/recipe_tag_model.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/menu/presentation/pages/menu_screen.dart b/lib/features/menu/presentation/pages/menu_screen.dart index 1ed46aec..58f0fea3 100644 --- a/lib/features/menu/presentation/pages/menu_screen.dart +++ b/lib/features/menu/presentation/pages/menu_screen.dart @@ -2,8 +2,8 @@ import 'package:dio/dio.dart'; import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/core/utils/image_constant.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/profile/presentation/pages/profile_screen.dart b/lib/features/profile/presentation/pages/profile_screen.dart index 48ace714..d84e7611 100644 --- a/lib/features/profile/presentation/pages/profile_screen.dart +++ b/lib/features/profile/presentation/pages/profile_screen.dart @@ -9,8 +9,8 @@ import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/prof import 'package:eatvio_app/features/profile/presentation/widgets/circumference_chart_widget.dart'; import 'package:eatvio_app/features/profile/presentation/widgets/imt_chart_widget.dart'; import 'package:eatvio_app/features/profile/presentation/widgets/weight_chart_widget.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/profile/presentation/widgets/circumference_chart_widget.dart b/lib/features/profile/presentation/widgets/circumference_chart_widget.dart index eb37ec13..f116ccf5 100644 --- a/lib/features/profile/presentation/widgets/circumference_chart_widget.dart +++ b/lib/features/profile/presentation/widgets/circumference_chart_widget.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/features/profile/models/circumference_model.dart'; import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/features/profile/presentation/widgets/imt_chart_widget.dart b/lib/features/profile/presentation/widgets/imt_chart_widget.dart index abd8e05b..4738581d 100644 --- a/lib/features/profile/presentation/widgets/imt_chart_widget.dart +++ b/lib/features/profile/presentation/widgets/imt_chart_widget.dart @@ -1,5 +1,5 @@ import 'package:eatvio_app/features/profile/models/weight_model.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; import 'package:intl/intl.dart'; diff --git a/lib/features/profile/presentation/widgets/weight_chart_widget.dart b/lib/features/profile/presentation/widgets/weight_chart_widget.dart index b1c2b7db..79322426 100644 --- a/lib/features/profile/presentation/widgets/weight_chart_widget.dart +++ b/lib/features/profile/presentation/widgets/weight_chart_widget.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/features/profile/models/weight_model.dart'; import 'package:eatvio_app/features/profile/presentation/bloc/profile_cubit/profile_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/features/recipes/presentation/pages/about_recipes_screen.dart b/lib/features/recipes/presentation/pages/about_recipes_screen.dart index b54fed1f..4fd97a0f 100644 --- a/lib/features/recipes/presentation/pages/about_recipes_screen.dart +++ b/lib/features/recipes/presentation/pages/about_recipes_screen.dart @@ -7,8 +7,8 @@ import 'package:eatvio_app/features/feed/models/recipes_model.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_cubit.dart'; import 'package:eatvio_app/features/feed/presentation/bloc/comments_cubit/comments_state.dart'; import 'package:eatvio_app/features/feed/presentation/widgets/comments_widget.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_html/flutter_html.dart'; diff --git a/lib/features/recipes/presentation/pages/recipe_create_screen.dart b/lib/features/recipes/presentation/pages/recipe_create_screen.dart index 669caca3..6c7b51fc 100644 --- a/lib/features/recipes/presentation/pages/recipe_create_screen.dart +++ b/lib/features/recipes/presentation/pages/recipe_create_screen.dart @@ -1,16 +1,16 @@ import 'dart:io'; +import 'package:eatvio_app/core/theme/app_decoration.dart'; +import 'package:eatvio_app/core/widgets/custom_drop_down.dart'; import 'package:eatvio_app/features/recipes/models/product.dart'; import 'package:eatvio_app/features/recipes/models/ingredient.dart'; import 'package:eatvio_app/features/recipes/models/recipe_model.dart'; import 'package:eatvio_app/features/recipes/models/step.dart' as step; import 'package:eatvio_app/features/recipes/presentation/bloc/recipe_create_cubit.dart'; import 'package:eatvio_app/features/recipes/presentation/bloc/recipe_create_state.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/recipes/presentation/pages/recipe_edit_screen.dart b/lib/features/recipes/presentation/pages/recipe_edit_screen.dart index 174c0e99..0f0c88f8 100644 --- a/lib/features/recipes/presentation/pages/recipe_edit_screen.dart +++ b/lib/features/recipes/presentation/pages/recipe_edit_screen.dart @@ -1,15 +1,15 @@ import 'package:eatvio_app/core/const.dart'; +import 'package:eatvio_app/core/theme/app_decoration.dart'; +import 'package:eatvio_app/core/widgets/custom_drop_down.dart'; import 'package:eatvio_app/features/recipes/models/product.dart'; import 'package:eatvio_app/features/recipes/models/ingredient.dart'; import 'package:eatvio_app/features/recipes/models/recipe_model.dart'; import 'package:eatvio_app/features/recipes/models/step.dart' as step; import 'package:eatvio_app/features/recipes/presentation/bloc/recipe_create_cubit.dart'; import 'package:eatvio_app/features/recipes/presentation/bloc/recipe_create_state.dart'; -import 'package:eatvio_app/theme/app_decoration.dart'; -import 'package:eatvio_app/theme/custom_text_style.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/custom_text_style.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart b/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart index 52c1c039..78af9980 100644 --- a/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart +++ b/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart @@ -1,4 +1,4 @@ -import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/app_router.dart'; import 'package:eatvio_app/core/token_storage.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; diff --git a/lib/features/registration/presentation/pages/additional_information_screen.dart b/lib/features/registration/presentation/pages/additional_information_screen.dart index c3d70fc4..dc8e9b3d 100644 --- a/lib/features/registration/presentation/pages/additional_information_screen.dart +++ b/lib/features/registration/presentation/pages/additional_information_screen.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/allergies_screen.dart b/lib/features/registration/presentation/pages/allergies_screen.dart index 430c4438..d87df3d0 100644 --- a/lib/features/registration/presentation/pages/allergies_screen.dart +++ b/lib/features/registration/presentation/pages/allergies_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/blood_pressure_screen.dart b/lib/features/registration/presentation/pages/blood_pressure_screen.dart index 7e2b8c0c..cc8af83c 100644 --- a/lib/features/registration/presentation/pages/blood_pressure_screen.dart +++ b/lib/features/registration/presentation/pages/blood_pressure_screen.dart @@ -1,10 +1,10 @@ import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/core/utils/image_constant.dart'; +import 'package:eatvio_app/core/widgets/custom_drop_down.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/body_circumferences_screen.dart b/lib/features/registration/presentation/pages/body_circumferences_screen.dart index 0f6fc0f2..728ef182 100644 --- a/lib/features/registration/presentation/pages/body_circumferences_screen.dart +++ b/lib/features/registration/presentation/pages/body_circumferences_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/city_of_living_screen.dart b/lib/features/registration/presentation/pages/city_of_living_screen.dart index 1f2755e0..177c036f 100644 --- a/lib/features/registration/presentation/pages/city_of_living_screen.dart +++ b/lib/features/registration/presentation/pages/city_of_living_screen.dart @@ -1,8 +1,8 @@ import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/credentials_screen.dart b/lib/features/registration/presentation/pages/credentials_screen.dart index 325b3d89..b5aa404a 100644 --- a/lib/features/registration/presentation/pages/credentials_screen.dart +++ b/lib/features/registration/presentation/pages/credentials_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/date_of_birth_screen.dart b/lib/features/registration/presentation/pages/date_of_birth_screen.dart index 0ca4b3b9..6369c2c0 100644 --- a/lib/features/registration/presentation/pages/date_of_birth_screen.dart +++ b/lib/features/registration/presentation/pages/date_of_birth_screen.dart @@ -2,7 +2,7 @@ import 'package:eatvio_app/core/utils/date_time_utils.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/favorite_foods_screen.dart b/lib/features/registration/presentation/pages/favorite_foods_screen.dart index 2de9c71c..a7176ce5 100644 --- a/lib/features/registration/presentation/pages/favorite_foods_screen.dart +++ b/lib/features/registration/presentation/pages/favorite_foods_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/favorite_sports_screen.dart b/lib/features/registration/presentation/pages/favorite_sports_screen.dart index bf54612e..88af7f5a 100644 --- a/lib/features/registration/presentation/pages/favorite_sports_screen.dart +++ b/lib/features/registration/presentation/pages/favorite_sports_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/height_screen.dart b/lib/features/registration/presentation/pages/height_screen.dart index 93ab620b..4e43bea7 100644 --- a/lib/features/registration/presentation/pages/height_screen.dart +++ b/lib/features/registration/presentation/pages/height_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/language_select_screen.dart b/lib/features/registration/presentation/pages/language_select_screen.dart index 638a207e..2fac31d6 100644 --- a/lib/features/registration/presentation/pages/language_select_screen.dart +++ b/lib/features/registration/presentation/pages/language_select_screen.dart @@ -1,8 +1,8 @@ import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; +import 'package:eatvio_app/core/widgets/custom_drop_down.dart'; import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_drop_down.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/medicine_intake_screen.dart b/lib/features/registration/presentation/pages/medicine_intake_screen.dart index 2383bd16..f7069a49 100644 --- a/lib/features/registration/presentation/pages/medicine_intake_screen.dart +++ b/lib/features/registration/presentation/pages/medicine_intake_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/name_screen.dart b/lib/features/registration/presentation/pages/name_screen.dart index b2211961..1b7dd28e 100644 --- a/lib/features/registration/presentation/pages/name_screen.dart +++ b/lib/features/registration/presentation/pages/name_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/registration/presentation/pages/registration_screen.dart b/lib/features/registration/presentation/pages/registration_screen.dart index c5cc8826..f659a94e 100644 --- a/lib/features/registration/presentation/pages/registration_screen.dart +++ b/lib/features/registration/presentation/pages/registration_screen.dart @@ -17,8 +17,8 @@ import 'package:eatvio_app/features/registration/presentation/pages/medicine_int import 'package:eatvio_app/features/registration/presentation/pages/name_screen.dart'; import 'package:eatvio_app/features/registration/presentation/pages/weight_screen.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/registration/presentation/pages/weight_screen.dart b/lib/features/registration/presentation/pages/weight_screen.dart index 4f8e9b9f..364804d0 100644 --- a/lib/features/registration/presentation/pages/weight_screen.dart +++ b/lib/features/registration/presentation/pages/weight_screen.dart @@ -1,7 +1,7 @@ import 'package:eatvio_app/features/registration/models/user_registration_model.dart'; import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/features/settings/presentation/pages/general_info_screen.dart b/lib/features/settings/presentation/pages/general_info_screen.dart index 693e909d..df43e5b7 100644 --- a/lib/features/settings/presentation/pages/general_info_screen.dart +++ b/lib/features/settings/presentation/pages/general_info_screen.dart @@ -1,11 +1,11 @@ import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; import 'package:eatvio_app/core/utils/date_time_utils.dart'; +import 'package:eatvio_app/core/widgets/custom_drop_down.dart'; import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/settings/presentation/pages/other_info_screen.dart b/lib/features/settings/presentation/pages/other_info_screen.dart index 4cb62dc4..c322aacf 100644 --- a/lib/features/settings/presentation/pages/other_info_screen.dart +++ b/lib/features/settings/presentation/pages/other_info_screen.dart @@ -1,8 +1,8 @@ import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/settings/presentation/pages/physical_activity_screen.dart b/lib/features/settings/presentation/pages/physical_activity_screen.dart index 7718403d..0f1bfb5b 100644 --- a/lib/features/settings/presentation/pages/physical_activity_screen.dart +++ b/lib/features/settings/presentation/pages/physical_activity_screen.dart @@ -1,6 +1,6 @@ import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/settings/presentation/pages/physical_form_screen.dart b/lib/features/settings/presentation/pages/physical_form_screen.dart index 4bd34b94..6b712a45 100644 --- a/lib/features/settings/presentation/pages/physical_form_screen.dart +++ b/lib/features/settings/presentation/pages/physical_form_screen.dart @@ -1,8 +1,8 @@ import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/settings/presentation/pages/pressure_screen.dart b/lib/features/settings/presentation/pages/pressure_screen.dart index 9a7538dc..e71642fe 100644 --- a/lib/features/settings/presentation/pages/pressure_screen.dart +++ b/lib/features/settings/presentation/pages/pressure_screen.dart @@ -1,10 +1,10 @@ import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart'; +import 'package:eatvio_app/core/widgets/custom_drop_down.dart'; import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; -import 'package:eatvio_app/widgets/custom_drop_down.dart'; -import 'package:eatvio_app/widgets/custom_text_form_field.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; +import 'package:eatvio_app/core/widgets/custom_text_form_field.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; diff --git a/lib/features/settings/presentation/pages/settings_screen.dart b/lib/features/settings/presentation/pages/settings_screen.dart index e47a90fc..0cf68c10 100644 --- a/lib/features/settings/presentation/pages/settings_screen.dart +++ b/lib/features/settings/presentation/pages/settings_screen.dart @@ -2,8 +2,8 @@ import 'package:eatvio_app/core/const.dart'; import 'package:eatvio_app/features/settings/entities/settings_entity.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_cubit.dart'; import 'package:eatvio_app/features/settings/presentation/bloc/settings_cubit/settings_state.dart'; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; diff --git a/lib/main.dart b/lib/main.dart index 23b031a9..ddbacf93 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,11 @@ -import 'package:eatvio_app/app_router.dart'; +import 'package:eatvio_app/core/app_router.dart'; import 'package:eatvio_app/core/initialization_cubit/initialization_cubit.dart'; +import 'package:eatvio_app/core/locator_service.dart' as di; +import 'package:eatvio_app/core/locator_service.dart'; +import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/new_messages_cubit/new_messages_cubit.dart'; import 'package:eatvio_app/features/bottom_navigation_bar/presentation/bloc/notifications_cubit/notifications_cubit.dart'; import 'package:eatvio_app/generated/l10n.dart'; -import 'package:eatvio_app/locator_service.dart' as di; -import 'package:eatvio_app/locator_service.dart'; -import 'package:eatvio_app/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; From b3f08bd6407750946ef0fc944dfea49c320a7012 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 20 Nov 2024 14:34:04 +0300 Subject: [PATCH 5/6] fix: fix test --- lib/features/auth/auth_screen/auth_screen.dart | 3 ++- .../presentation/pages/stepper_become_consultant_screen.dart | 3 ++- .../registration/presentation/pages/registration_screen.dart | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/features/auth/auth_screen/auth_screen.dart b/lib/features/auth/auth_screen/auth_screen.dart index 1820c227..87bc13dd 100644 --- a/lib/features/auth/auth_screen/auth_screen.dart +++ b/lib/features/auth/auth_screen/auth_screen.dart @@ -8,6 +8,7 @@ import 'package:eatvio_app/generated/l10n.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:url_launcher/url_launcher.dart'; @@ -44,7 +45,7 @@ class _AuthScreenState extends State { return Scaffold( appBar: AppBar( centerTitle: true, - title: Image.asset( + title: SvgPicture.asset( ImageConstant.imgLogoEatvio, height: 48, fit: BoxFit.contain, diff --git a/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart b/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart index a526d233..e9aa8985 100644 --- a/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart +++ b/lib/features/consultant/become_consultant/presentation/pages/stepper_become_consultant_screen.dart @@ -10,6 +10,7 @@ import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/theme/theme_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; import 'package:lottie/lottie.dart'; @@ -214,7 +215,7 @@ class _StepperBecomeConsultantScreenState extends State { ), ), centerTitle: true, - title: Image.asset( + title: SvgPicture.asset( ImageConstant.imgLogoEatvio, height: 48, fit: BoxFit.contain, From 42491ccf1f5d371216c0bfb1994aa59a96433958 Mon Sep 17 00:00:00 2001 From: mso7nueh Date: Wed, 20 Nov 2024 14:40:46 +0300 Subject: [PATCH 6/6] fix: pubspec upd --- pubspec.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 5b2c8596..105c362a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,20 +16,20 @@ dependencies: flutter_secure_storage: ^9.2.2 flutter_bloc: ^8.1.6 cached_network_image: ^3.4.1 - flutter_svg: ^2.0.10+1 + flutter_svg: ^2.0.14 equatable: ^2.0.5 freezed_annotation: ^2.4.4 json_annotation: ^4.9.0 validators: ^3.0.0 - path_provider: ^2.1.4 - carousel_slider_plus: ^7.0.1 + path_provider: ^2.1.5 + carousel_slider_plus: ^7.0.2 flutter_form_builder: ^9.5.0 image_picker: ^1.1.2 flutter_typeahead: ^5.2.0 - go_router: ^14.3.0 + go_router: ^14.6.0 keyboard_dismisser: ^3.0.0 retrofit: ^4.4.1 - get_it: ^8.0.1 + get_it: ^8.0.2 dio: ^5.7.0 dart_pusher_channels: ^1.2.3 photo_view: ^0.15.0 @@ -39,16 +39,16 @@ dependencies: badges: ^3.1.2 google_fonts: ^6.2.1 location: ^7.0.1 - syncfusion_flutter_charts: ^27.1.55 - syncfusion_flutter_gauges: ^27.1.58 + syncfusion_flutter_charts: ^27.2.2 + syncfusion_flutter_gauges: ^27.2.2 table_calendar: ^3.1.2 flutter_keyboard_visibility: ^6.0.0 - share_plus: ^10.1.0 + share_plus: ^10.1.2 flutter_html: ^3.0.0-beta.2 - file_picker: ^8.1.3 + file_picker: ^8.1.4 audioplayers: ^6.1.0 intl: ^0.19.0 - rive: ^0.13.15 + rive: ^0.13.17 mask_text_input_formatter: ^2.9.0 lottie: ^3.1.3 flutter_portal: ^1.1.4 @@ -60,8 +60,8 @@ dependencies: dev_dependencies: build_runner: ^2.4.13 freezed: ^2.5.7 - json_serializable: ^6.8.0 - retrofit_generator: ^9.1.3 + json_serializable: ^6.9.0 + retrofit_generator: ^9.1.5 flutter_test: sdk: flutter