From af7174d02c858865f6ed9d143d86a69ed79f485b Mon Sep 17 00:00:00 2001 From: GokaPek Date: Sun, 20 Oct 2024 14:50:04 +0400 Subject: [PATCH] =?UTF-8?q?7=20=D0=B2=D1=80=D0=BE=D0=B4=D0=B5=20=D1=80?= =?UTF-8?q?=D0=BE=D0=B1=D0=B8=D1=82=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 2704 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 1861 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 3585 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 5419 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 6962 bytes assets/icon.png | Bin 0 -> 14726 bytes assets/svg/ru.svg | 19 ++ assets/svg/uk.svg | 23 ++ l10n.yaml | 6 + l10n/app_en.arb | 9 + l10n/app_ru.arb | 9 + lib/Presentation/common/svg_objects.dart | 34 +++ lib/Presentation/detailPage.dart | 4 +- lib/Presentation/home_page/bloc/bloc.dart | 2 +- lib/Presentation/home_page/bloc/events.dart | 2 +- lib/Presentation/home_page/bloc/state.dart | 28 +-- lib/Presentation/home_page/bloc/state.g.dart | 3 +- lib/Presentation/home_page/home_page.dart | 58 ++--- lib/Presentation/main.dart | 38 +-- lib/components/extensions/context_x.dart | 6 + lib/components/locale/l10n/app_locale.dart | 153 ++++++++++++ lib/components/locale/l10n/app_locale_en.dart | 20 ++ lib/components/locale/l10n/app_locale_ru.dart | 20 ++ lib/components/resources.g.dart | 10 + lib/components/util/Debounce.dart | 10 +- lib/data/dtos/foods_dto.dart | 3 +- lib/data/mappers/food_mapper.dart | 7 +- lib/domain/models/card.dart | 39 +-- lib/domain/models/home.dart | 3 +- lib/repositories/api_interface.dart | 3 +- lib/repositories/food_repository.dart | 15 +- makefile | 23 ++ pubspec.lock | 228 +++++++++++++++++- pubspec.yaml | 33 +-- 34 files changed, 684 insertions(+), 124 deletions(-) create mode 100644 assets/icon.png create mode 100644 assets/svg/ru.svg create mode 100644 assets/svg/uk.svg create mode 100644 l10n.yaml create mode 100644 l10n/app_en.arb create mode 100644 l10n/app_ru.arb create mode 100644 lib/Presentation/common/svg_objects.dart create mode 100644 lib/components/extensions/context_x.dart create mode 100644 lib/components/locale/l10n/app_locale.dart create mode 100644 lib/components/locale/l10n/app_locale_en.dart create mode 100644 lib/components/locale/l10n/app_locale_ru.dart create mode 100644 lib/components/resources.g.dart create mode 100644 makefile diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..8e19b5e2cfdb413819003e3cd61f3da8f90715f9 100644 GIT binary patch literal 2704 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 AQ2+n{ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..4b4ad5b1eaa5089a84d31f5683f38527fa070d2b 100644 GIT binary patch delta 1857 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..d2e38b5a13c73929f6400756e89913c32002b4e4 100644 GIT binary patch literal 5419 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 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..d305928a9ba15069db50f68031fb8c04b9530052 100644 GIT binary patch literal 6962 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 Kv`kn(@c#hhg-3<} literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6c516f71544b3b7028e570ba0756c149222749 GIT binary patch literal 14726 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 literal 0 HcmV?d00001 diff --git a/assets/svg/ru.svg b/assets/svg/ru.svg new file mode 100644 index 0000000..ae12982 --- /dev/null +++ b/assets/svg/ru.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/svg/uk.svg b/assets/svg/uk.svg new file mode 100644 index 0000000..88e2211 --- /dev/null +++ b/assets/svg/uk.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/l10n.yaml b/l10n.yaml new file mode 100644 index 0000000..d26d702 --- /dev/null +++ b/l10n.yaml @@ -0,0 +1,6 @@ +arb-dir: l10n +template-arb-file: app_ru.arb +output-localization-file: app_locale.dart +output-dir: lib/components/locale/l10n +output-class: AppLocale +synthetic-package: false \ No newline at end of file diff --git a/l10n/app_en.arb b/l10n/app_en.arb new file mode 100644 index 0000000..a01051c --- /dev/null +++ b/l10n/app_en.arb @@ -0,0 +1,9 @@ +{ + "@@locale": "en", + + "search": "Search", + "liked": "liked!", + "disliked": "disliked :(", + + "arbEnding": "Чтобы не забыть про отсутствие запятой :)" +} \ No newline at end of file diff --git a/l10n/app_ru.arb b/l10n/app_ru.arb new file mode 100644 index 0000000..c00dd02 --- /dev/null +++ b/l10n/app_ru.arb @@ -0,0 +1,9 @@ +{ + "@@locale": "ru", + + "search": "Поиск", + "liked": "Добавлено в понравившиеся :)", + "disliked": "Удалено из понравившегося :(", + + "arbEnding": "Чтобы не забыть про отсутствие запятой :)" +} \ No newline at end of file diff --git a/lib/Presentation/common/svg_objects.dart b/lib/Presentation/common/svg_objects.dart new file mode 100644 index 0000000..d15afce --- /dev/null +++ b/lib/Presentation/common/svg_objects.dart @@ -0,0 +1,34 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:labs_petrushin/components/resources.g.dart'; + +abstract class SvgObjects { + static void init() { + final pics = [ + R.ASSETS_SVG_RU_SVG, + R.ASSETS_SVG_UK_SVG, + ]; + for (final String p in pics) { + final loader = SvgAssetLoader(p); + svg.cache.putIfAbsent(loader.cacheKey(null), () => loader.loadBytes(null)); + } + } +} + +class SvgRu extends StatelessWidget { + const SvgRu({super.key}); + + @override + Widget build(BuildContext context) { + return SvgPicture.asset(R.ASSETS_SVG_RU_SVG); + } +} + +class SvgUk extends StatelessWidget { + const SvgUk({super.key}); + + @override + Widget build(BuildContext context) { + return SvgPicture.asset(R.ASSETS_SVG_UK_SVG); + } +} \ No newline at end of file diff --git a/lib/Presentation/detailPage.dart b/lib/Presentation/detailPage.dart index 2db1fab..7c0e05a 100644 --- a/lib/Presentation/detailPage.dart +++ b/lib/Presentation/detailPage.dart @@ -10,7 +10,7 @@ class DetailPage extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text('Информация о продукции'), + title: const Text(''), ), body: Padding( padding: const EdgeInsets.all(16.0), @@ -31,4 +31,4 @@ class DetailPage extends StatelessWidget { ), ); } -} \ No newline at end of file +} diff --git a/lib/Presentation/home_page/bloc/bloc.dart b/lib/Presentation/home_page/bloc/bloc.dart index 19efd8f..017c689 100644 --- a/lib/Presentation/home_page/bloc/bloc.dart +++ b/lib/Presentation/home_page/bloc/bloc.dart @@ -35,4 +35,4 @@ class HomeBloc extends Bloc { error: error, )); } -} \ No newline at end of file +} diff --git a/lib/Presentation/home_page/bloc/events.dart b/lib/Presentation/home_page/bloc/events.dart index 025c2b0..cefba70 100644 --- a/lib/Presentation/home_page/bloc/events.dart +++ b/lib/Presentation/home_page/bloc/events.dart @@ -7,4 +7,4 @@ class HomeLoadDataEvent extends HomeEvent { final int? nextPage; const HomeLoadDataEvent({this.search, this.nextPage}); -} \ No newline at end of file +} diff --git a/lib/Presentation/home_page/bloc/state.dart b/lib/Presentation/home_page/bloc/state.dart index cb7ed56..f51fb67 100644 --- a/lib/Presentation/home_page/bloc/state.dart +++ b/lib/Presentation/home_page/bloc/state.dart @@ -6,23 +6,23 @@ part 'state.g.dart'; @CopyWith() class HomeState extends Equatable { - final HomeData? data; - final bool isLoading; - final bool isPaginationLoading; - final String? error; + final HomeData? data; + final bool isLoading; + final bool isPaginationLoading; + final String? error; - const HomeState({ - this.data, - this.isLoading = false, - this.isPaginationLoading = false, - this.error, - }); + const HomeState({ + this.data, + this.isLoading = false, + this.isPaginationLoading = false, + this.error, + }); - @override - List get props => [ + @override + List get props => [ data, isLoading, isPaginationLoading, error, - ]; -} \ No newline at end of file + ]; +} diff --git a/lib/Presentation/home_page/bloc/state.g.dart b/lib/Presentation/home_page/bloc/state.g.dart index 114ac25..258a914 100644 --- a/lib/Presentation/home_page/bloc/state.g.dart +++ b/lib/Presentation/home_page/bloc/state.g.dart @@ -72,8 +72,7 @@ class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { // ignore: cast_nullable_to_non_nullable : isLoading as bool, isPaginationLoading: - isPaginationLoading == const $CopyWithPlaceholder() || - isPaginationLoading == null + isPaginationLoading == const $CopyWithPlaceholder() || isPaginationLoading == null ? _value.isPaginationLoading // ignore: cast_nullable_to_non_nullable : isPaginationLoading as bool, diff --git a/lib/Presentation/home_page/home_page.dart b/lib/Presentation/home_page/home_page.dart index 86bbb85..f48e881 100644 --- a/lib/Presentation/home_page/home_page.dart +++ b/lib/Presentation/home_page/home_page.dart @@ -4,6 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:labs_petrushin/Presentation/home_page/bloc/bloc.dart'; import 'package:labs_petrushin/Presentation/home_page/bloc/events.dart'; import 'package:labs_petrushin/Presentation/home_page/bloc/state.dart'; +import 'package:labs_petrushin/components/extensions/context_x.dart'; import '../../Presentation/detailPage.dart'; import '../../components/util/Debounce.dart'; import '../../repositories/food_repository.dart'; @@ -59,7 +60,6 @@ class BodyState extends State { } } - @override void dispose() { searchController.dispose(); @@ -85,32 +85,32 @@ class BodyState extends State { BlocBuilder( builder: (context, state) => state.error != null ? Text( - state.error ?? '', - style: Theme.of(context).textTheme.headlineSmall?.copyWith(color: Colors.red), - ) + state.error ?? '', + style: Theme.of(context).textTheme.headlineSmall?.copyWith(color: Colors.red), + ) : state.isLoading - ? const CircularProgressIndicator() - : Expanded( - child: RefreshIndicator( - onRefresh: _onRefresh, - child: ListView.builder( - controller: scrollController, - padding: EdgeInsets.zero, - itemCount: state.data?.data?.length ?? 0, - itemBuilder: (context, index) { - final data = state.data?.data?[index]; - return data != null - ? MyCard.fromData( - data, - onLike: (title, isLiked) => - _showSnackBar(context, title, isLiked), - onTap: () => _navToDetails(context, data), - ) - : const SizedBox.shrink(); - }, - ), - ), - ), + ? const CircularProgressIndicator() + : Expanded( + child: RefreshIndicator( + onRefresh: _onRefresh, + child: ListView.builder( + controller: scrollController, + padding: EdgeInsets.zero, + itemCount: state.data?.data?.length ?? 0, + itemBuilder: (context, index) { + final data = state.data?.data?[index]; + return data != null + ? MyCard.fromData( + data, + onLike: (title, isLiked) => + _showSnackBar(context, title, isLiked), + onTap: () => _navToDetails(context, data), + ) + : const SizedBox.shrink(); + }, + ), + ), + ), ), BlocBuilder( builder: (context, state) => state.isPaginationLoading @@ -130,7 +130,7 @@ class BodyState extends State { void _navToDetails(BuildContext context, CardData data) { Navigator.push( context, - CupertinoPageRoute(builder: (context) => DetailPage(info: data.info, imgUrl: data.urlImage)), + CupertinoPageRoute(builder: (context) => DetailPage(info: data.info, imgUrl: data.urlImage)), ); } @@ -138,7 +138,7 @@ class BodyState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text( - '$title ${isLiked ? 'liked!' : 'disliked'}', + '$title ${isLiked ? context.locale.liked : context.locale.disliked}', style: Theme.of(context).textTheme.bodyLarge, ), backgroundColor: Colors.redAccent, @@ -146,4 +146,4 @@ class BodyState extends State { )); }); } -} \ No newline at end of file +} diff --git a/lib/Presentation/main.dart b/lib/Presentation/main.dart index f7d578d..e300647 100644 --- a/lib/Presentation/main.dart +++ b/lib/Presentation/main.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:labs_petrushin/Presentation/home_page/bloc/bloc.dart'; +import 'package:labs_petrushin/components/locale/l10n/app_locale.dart'; import 'package:labs_petrushin/repositories/food_repository.dart'; import 'home_page/home_page.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; - void main() { runApp(const MyApp()); } @@ -15,23 +15,23 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Petrushin demo', - theme: ThemeData( - colorScheme: ColorScheme.fromSeed(seedColor: Colors.red), - useMaterial3: true, - ), - home: RepositoryProvider( - lazy: true, - create: (_) => FoodRepository(), - child: BlocProvider( - lazy: false, - create: (context) => HomeBloc(context.read()), - child: const MyHomePage(title: 'Петрушин Егор Александрович',), - ) - ) - ); + title: 'Petrushin demo', + localizationsDelegates: AppLocale.localizationsDelegates, + supportedLocales: AppLocale.supportedLocales, + debugShowCheckedModeBanner: false, + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.red), + useMaterial3: true, + ), + home: RepositoryProvider( + lazy: true, + create: (_) => FoodRepository(), + child: BlocProvider( + lazy: false, + create: (context) => HomeBloc(context.read()), + child: const MyHomePage( + title: 'Петрушин Егор Александрович', + ), + ))); } } - - - diff --git a/lib/components/extensions/context_x.dart b/lib/components/extensions/context_x.dart new file mode 100644 index 0000000..37fb2c3 --- /dev/null +++ b/lib/components/extensions/context_x.dart @@ -0,0 +1,6 @@ +import 'package:labs_petrushin/components/locale/l10n/app_locale.dart'; +import 'package:flutter/cupertino.dart'; + +extension LocalContextX on BuildContext { + AppLocale get locale => AppLocale.of(this)!; +} \ No newline at end of file diff --git a/lib/components/locale/l10n/app_locale.dart b/lib/components/locale/l10n/app_locale.dart new file mode 100644 index 0000000..bb28342 --- /dev/null +++ b/lib/components/locale/l10n/app_locale.dart @@ -0,0 +1,153 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart' as intl; + +import 'app_locale_en.dart'; +import 'app_locale_ru.dart'; + +// ignore_for_file: type=lint + +/// Callers can lookup localized strings with an instance of AppLocale +/// returned by `AppLocale.of(context)`. +/// +/// Applications need to include `AppLocale.delegate()` in their app's +/// `localizationDelegates` list, and the locales they support in the app's +/// `supportedLocales` list. For example: +/// +/// ```dart +/// import 'l10n/app_locale.dart'; +/// +/// return MaterialApp( +/// localizationsDelegates: AppLocale.localizationsDelegates, +/// supportedLocales: AppLocale.supportedLocales, +/// home: MyApplicationHome(), +/// ); +/// ``` +/// +/// ## Update pubspec.yaml +/// +/// Please make sure to update your pubspec.yaml to include the following +/// packages: +/// +/// ```yaml +/// dependencies: +/// # Internationalization support. +/// flutter_localizations: +/// sdk: flutter +/// intl: any # Use the pinned version from flutter_localizations +/// +/// # Rest of dependencies +/// ``` +/// +/// ## iOS Applications +/// +/// iOS applications define key application metadata, including supported +/// locales, in an Info.plist file that is built into the application bundle. +/// To configure the locales supported by your app, you’ll need to edit this +/// file. +/// +/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. +/// Then, in the Project Navigator, open the Info.plist file under the Runner +/// project’s Runner folder. +/// +/// Next, select the Information Property List item, select Add Item from the +/// Editor menu, then select Localizations from the pop-up menu. +/// +/// Select and expand the newly-created Localizations item then, for each +/// locale your application supports, add a new item and select the locale +/// you wish to add from the pop-up menu in the Value field. This list should +/// be consistent with the languages listed in the AppLocale.supportedLocales +/// property. +abstract class AppLocale { + AppLocale(String locale) : localeName = intl.Intl.canonicalizedLocale(locale.toString()); + + final String localeName; + + static AppLocale? of(BuildContext context) { + return Localizations.of(context, AppLocale); + } + + static const LocalizationsDelegate delegate = _AppLocaleDelegate(); + + /// A list of this localizations delegate along with the default localizations + /// delegates. + /// + /// Returns a list of localizations delegates containing this delegate along with + /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, + /// and GlobalWidgetsLocalizations.delegate. + /// + /// Additional delegates can be added by appending to this list in + /// MaterialApp. This list does not have to be used at all if a custom list + /// of delegates is preferred or required. + static const List> localizationsDelegates = >[ + delegate, + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ]; + + /// A list of this localizations delegate's supported locales. + static const List supportedLocales = [ + Locale('en'), + Locale('ru') + ]; + + /// No description provided for @search. + /// + /// In ru, this message translates to: + /// **'Поиск'** + String get search; + + /// No description provided for @liked. + /// + /// In ru, this message translates to: + /// **'Добавлено в понравившиеся :)'** + String get liked; + + /// No description provided for @disliked. + /// + /// In ru, this message translates to: + /// **'Удалено из понравившегося :('** + String get disliked; + + /// No description provided for @arbEnding. + /// + /// In ru, this message translates to: + /// **'Чтобы не забыть про отсутствие запятой :)'** + String get arbEnding; +} + +class _AppLocaleDelegate extends LocalizationsDelegate { + const _AppLocaleDelegate(); + + @override + Future load(Locale locale) { + return SynchronousFuture(lookupAppLocale(locale)); + } + + @override + bool isSupported(Locale locale) => ['en', 'ru'].contains(locale.languageCode); + + @override + bool shouldReload(_AppLocaleDelegate old) => false; +} + +AppLocale lookupAppLocale(Locale locale) { + + + // Lookup logic when only language code is specified. + switch (locale.languageCode) { + case 'en': return AppLocaleEn(); + case 'ru': return AppLocaleRu(); + } + + throw FlutterError( + 'AppLocale.delegate failed to load unsupported locale "$locale". This is likely ' + 'an issue with the localizations generation tool. Please file an issue ' + 'on GitHub with a reproducible sample app and the gen-l10n configuration ' + 'that was used.' + ); +} diff --git a/lib/components/locale/l10n/app_locale_en.dart b/lib/components/locale/l10n/app_locale_en.dart new file mode 100644 index 0000000..599548c --- /dev/null +++ b/lib/components/locale/l10n/app_locale_en.dart @@ -0,0 +1,20 @@ +import 'app_locale.dart'; + +// ignore_for_file: type=lint + +/// The translations for English (`en`). +class AppLocaleEn extends AppLocale { + AppLocaleEn([String locale = 'en']) : super(locale); + + @override + String get search => 'Search'; + + @override + String get liked => 'liked!'; + + @override + String get disliked => 'disliked :('; + + @override + String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)'; +} diff --git a/lib/components/locale/l10n/app_locale_ru.dart b/lib/components/locale/l10n/app_locale_ru.dart new file mode 100644 index 0000000..fbd2661 --- /dev/null +++ b/lib/components/locale/l10n/app_locale_ru.dart @@ -0,0 +1,20 @@ +import 'app_locale.dart'; + +// ignore_for_file: type=lint + +/// The translations for Russian (`ru`). +class AppLocaleRu extends AppLocale { + AppLocaleRu([String locale = 'ru']) : super(locale); + + @override + String get search => 'Поиск'; + + @override + String get liked => 'Добавлено в понравившиеся :)'; + + @override + String get disliked => 'Удалено из понравившегося :('; + + @override + String get arbEnding => 'Чтобы не забыть про отсутствие запятой :)'; +} diff --git a/lib/components/resources.g.dart b/lib/components/resources.g.dart new file mode 100644 index 0000000..9645894 --- /dev/null +++ b/lib/components/resources.g.dart @@ -0,0 +1,10 @@ +/// Generate by [asset_generator](https://github.com/fluttercandies/flutter_asset_generator) library. +/// PLEASE DO NOT EDIT MANUALLY. +// ignore_for_file: constant_identifier_names +class R { + const R._(); + + static const String ASSETS_SVG_RU_SVG = 'assets/svg/ru.svg'; + + static const String ASSETS_SVG_UK_SVG = 'assets/svg/uk.svg'; +} diff --git a/lib/components/util/Debounce.dart b/lib/components/util/Debounce.dart index b4e1f35..6e1c470 100644 --- a/lib/components/util/Debounce.dart +++ b/lib/components/util/Debounce.dart @@ -10,11 +10,11 @@ class Debounce { static Timer? _timer; - static void run ( - VoidCallback action, { - Duration delay = const Duration(milliseconds: 500), - }) { + static void run( + VoidCallback action, { + Duration delay = const Duration(milliseconds: 500), + }) { _timer?.cancel(); _timer = Timer(delay, action); } -} \ No newline at end of file +} diff --git a/lib/data/dtos/foods_dto.dart b/lib/data/dtos/foods_dto.dart index 9c63744..842370e 100644 --- a/lib/data/dtos/foods_dto.dart +++ b/lib/data/dtos/foods_dto.dart @@ -14,7 +14,6 @@ class FoodsDto { const FoodsDto({this.foods, this.currentPage, this.totalPages}); factory FoodsDto.fromJson(Map json) => _$FoodsDtoFromJson(json); - } @JsonSerializable(createToJson: false) @@ -27,4 +26,4 @@ class FoodDataDto { const FoodDataDto({this.fdcId, this.brandName, this.description, this.image}); factory FoodDataDto.fromJson(Map json) => _$FoodDataDtoFromJson(json); -} \ No newline at end of file +} diff --git a/lib/data/mappers/food_mapper.dart b/lib/data/mappers/food_mapper.dart index 86d049e..e5bc0ad 100644 --- a/lib/data/mappers/food_mapper.dart +++ b/lib/data/mappers/food_mapper.dart @@ -1,4 +1,3 @@ - import 'package:labs_petrushin/Presentation/home_page/home_page.dart'; import 'package:labs_petrushin/data/dtos/foods_dto.dart'; @@ -6,9 +5,7 @@ import '../../domain/models/home.dart'; extension CharacterDataDtoToModel on FoodDataDto { CardData toDomain() => CardData( - text: brandName ?? "Просто хлэп", - info: description ?? "Очень кусьна", - urlImage: image); + text: brandName ?? "Просто хлэп", info: description ?? "Очень кусьна", urlImage: image); } extension CharactersDtoToModel on FoodsDto { @@ -24,4 +21,4 @@ extension CharactersDtoToModel on FoodsDto { nextPage: nextPage, ); } -} \ No newline at end of file +} diff --git a/lib/domain/models/card.dart b/lib/domain/models/card.dart index e93be9b..91d2ff3 100644 --- a/lib/domain/models/card.dart +++ b/lib/domain/models/card.dart @@ -17,15 +17,21 @@ class MyCard extends StatefulWidget { final OnLikeCallback onLike; final VoidCallback? onTap; - const MyCard({super.key, required this.text, required this.info, required this.urlImage, this.onLike, this.onTap}); + const MyCard( + {super.key, + required this.text, + required this.info, + required this.urlImage, + this.onLike, + this.onTap}); factory MyCard.fromData(CardData data, {OnLikeCallback onLike, VoidCallback? onTap}) => MyCard( - text: data.text, - info: data.info, - urlImage: data.urlImage, - onLike: onLike, - onTap: onTap, - ); + text: data.text, + info: data.info, + urlImage: data.urlImage, + onLike: onLike, + onTap: onTap, + ); @override State createState() => _MyCardState(); @@ -59,7 +65,8 @@ class _MyCardState extends State { height: double.infinity, width: 160, child: Image.network( - widget.urlImage ?? 'https://hlebzavod3.ru/images/virtuemart/product/011_IMG_9657.jpg', + widget.urlImage ?? + 'https://hlebzavod3.ru/images/virtuemart/product/011_IMG_9657.jpg', fit: BoxFit.cover, errorBuilder: (_, __, ___) => const Placeholder(), ), @@ -102,14 +109,14 @@ class _MyCardState extends State { duration: const Duration(milliseconds: 300), child: isLiked ? const Icon( - Icons.favorite, - color: Colors.redAccent, - key: ValueKey(0), - ) + Icons.favorite, + color: Colors.redAccent, + key: ValueKey(0), + ) : const Icon( - Icons.favorite_border, - key: ValueKey(1), - ), + Icons.favorite_border, + key: ValueKey(1), + ), ), ), ), @@ -120,4 +127,4 @@ class _MyCardState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/domain/models/home.dart b/lib/domain/models/home.dart index 2003426..3ffc102 100644 --- a/lib/domain/models/home.dart +++ b/lib/domain/models/home.dart @@ -1,4 +1,3 @@ - import '../../Presentation/home_page/home_page.dart'; class HomeData { @@ -6,4 +5,4 @@ class HomeData { final int? nextPage; HomeData({this.data, this.nextPage}); -} \ No newline at end of file +} diff --git a/lib/repositories/api_interface.dart b/lib/repositories/api_interface.dart index 5ea086a..6e0bfc7 100644 --- a/lib/repositories/api_interface.dart +++ b/lib/repositories/api_interface.dart @@ -1,8 +1,7 @@ - import 'package:labs_petrushin/Presentation/home_page/home_page.dart'; import '../domain/models/home.dart'; abstract class ApiInterface { Future loadData(); -} \ No newline at end of file +} diff --git a/lib/repositories/food_repository.dart b/lib/repositories/food_repository.dart index 116187e..4422c60 100644 --- a/lib/repositories/food_repository.dart +++ b/lib/repositories/food_repository.dart @@ -1,4 +1,3 @@ - import 'package:dio/dio.dart'; import 'package:labs_petrushin/Presentation/home_page/home_page.dart'; import 'package:labs_petrushin/data/dtos/foods_dto.dart'; @@ -10,11 +9,10 @@ import '../domain/models/home.dart'; class FoodRepository extends ApiInterface { static final Dio _dio = Dio() - ..interceptors.add( - PrettyDioLogger( - requestHeader: true, - requestBody: true, - )); + ..interceptors.add(PrettyDioLogger( + requestHeader: true, + requestBody: true, + )); // 91xPcWwfSGljSRMuoS8IH0GP4hM9QqwwtgSzqJMw static const String _baseUrl = 'https://api.nal.usda.gov'; @@ -23,7 +21,8 @@ class FoodRepository extends ApiInterface { Future loadData({String? q, int page = 1, int pageSize = 10}) async { try { final String searchQuery = q ?? ''; // Используем 'food' как значение по умолчанию - final String url = '$_baseUrl/fdc/v1/foods/search?api_key=91xPcWwfSGljSRMuoS8IH0GP4hM9QqwwtgSzqJMw&query=$searchQuery&pageNumber=$page&pageSize=$pageSize'; + final String url = + '$_baseUrl/fdc/v1/foods/search?api_key=91xPcWwfSGljSRMuoS8IH0GP4hM9QqwwtgSzqJMw&query=$searchQuery&pageNumber=$page&pageSize=$pageSize'; final Response response = await _dio.get>(url); @@ -36,4 +35,4 @@ class FoodRepository extends ApiInterface { return null; } } -} \ No newline at end of file +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..cb6377b --- /dev/null +++ b/makefile @@ -0,0 +1,23 @@ +gen: + flutter pub run build_runner build --delete-conflicting-outputs + +hello: + echo "Hi!"; \ + echo "I'm makefile"; \ + echo "^_^" + +icon: + flutter pub run flutter_launcher_icons:main + +init_res: + dart pub global activate flutter_asset_generator + +format: + dart format . --line-length 100 + +res: + fgen --output lib/components/resources.g.dart --no-watch --no-preview; \ + make format + +loc: + flutter gen-l10n \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index f962be0..d736713 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -22,6 +22,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.7.0" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" args: dependency: transitive description: @@ -134,6 +142,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" + source: hosted + version: "0.4.1" clock: dependency: transitive description: @@ -238,6 +254,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" file: dependency: transitive description: @@ -267,6 +291,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.6" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" + url: "https://pub.dev" + source: hosted + version: "0.13.1" flutter_lints: dependency: "direct dev" description: @@ -275,11 +307,29 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338" + url: "https://pub.dev" + source: hosted + version: "2.0.7" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" frontend_server_client: dependency: transitive description: @@ -304,6 +354,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + http: + dependency: transitive + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" http_multi_server: dependency: transitive description: @@ -320,6 +378,22 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d + url: "https://pub.dev" + source: hosted + version: "4.3.0" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" io: dependency: transitive description: @@ -456,6 +530,62 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" + source: hosted + version: "1.0.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" pool: dependency: transitive description: @@ -496,6 +626,62 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab" + url: "https://pub.dev" + source: hosted + version: "2.3.3" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e + url: "https://pub.dev" + source: hosted + version: "2.4.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" shelf: dependency: transitive description: @@ -605,6 +791,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" vector_math: dependency: transitive description: @@ -653,6 +863,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" yaml: dependency: transitive description: @@ -663,4 +889,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.5.2 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index bcc4f56..a00c2ab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: labs_petrushin description: "A new Flutter project." publish_to: 'none' # Remove this line if you wish to publish to pub.dev - +version: 1.0.0+1 environment: sdk: ^3.5.2 @@ -16,9 +16,14 @@ dependencies: equatable: ^2.0.5 flutter_bloc: ^8.1.5 copy_with_extension_gen: ^5.0.4 - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 + flutter_svg: 2.0.7 + + flutter_localizations: + sdk: flutter + intl: ^0.19.0 + + shared_preferences: 2.2.3 dev_dependencies: flutter_test: @@ -26,20 +31,18 @@ dev_dependencies: build_runner: ^2.4.9 json_serializable: ^6.7.1 - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^4.0.0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec + flutter_launcher_icons: 0.13.1 + +flutter_icons: + android: "ic_launcher" + ios: false + image_path: "assets/icon.png" + min_sdk_android: 21 -# The following section is specific to Flutter packages. flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. uses-material-design: true + generate: true + assets: + - assets/svg/