From 208f755ad685fb3b9e98813539077d41b7b0fb0c Mon Sep 17 00:00:00 2001 From: antoc0der <1@DESKTOP-K1L8ND3> Date: Fri, 20 Dec 2024 11:41:02 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BA=D1=83=D1=80=D1=81=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devtools_options.yaml | 3 + lib/components/locale/l10n/app_locale.dart | 159 ++++++++++++++++++ lib/components/locale/l10n/app_locale_en.dart | 23 +++ lib/components/locale/l10n/app_locale_ru.dart | 23 +++ lib/components/resources/resources.g.dart | 10 ++ lib/presentation/home_page/bloc/state.g.dart | 92 ++++++++++ .../likes_bloc/likes_state.g.dart | 56 ++++++ .../locale_bloc/locale_state.g.dart | 58 +++++++ web/icons/icon-192.png | Bin 0 -> 6811 bytes web/icons/icon-512.png | Bin 0 -> 23815 bytes 10 files changed, 424 insertions(+) create mode 100644 devtools_options.yaml 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/resources.g.dart create mode 100644 lib/presentation/home_page/bloc/state.g.dart create mode 100644 lib/presentation/likes_bloc/likes_state.g.dart create mode 100644 lib/presentation/locale_bloc/locale_state.g.dart create mode 100644 web/icons/icon-192.png create mode 100644 web/icons/icon-512.png diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/components/locale/l10n/app_locale.dart b/lib/components/locale/l10n/app_locale.dart new file mode 100644 index 0000000..a253231 --- /dev/null +++ b/lib/components/locale/l10n/app_locale.dart @@ -0,0 +1,159 @@ +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; + + /// No description provided for @goToLink. + /// + /// In ru, this message translates to: + /// **'Перейти на сайт'** + String get goToLink; +} + +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..2605449 --- /dev/null +++ b/lib/components/locale/l10n/app_locale_en.dart @@ -0,0 +1,23 @@ +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 => 'Чтобы не забыть про отсутствие запятой :)'; + + @override + String get goToLink => 'Go to website'; +} 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..023ba48 --- /dev/null +++ b/lib/components/locale/l10n/app_locale_ru.dart @@ -0,0 +1,23 @@ +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 => 'Чтобы не забыть про отсутствие запятой :)'; + + @override + String get goToLink => 'Перейти на сайт'; +} diff --git a/lib/components/resources/resources.g.dart b/lib/components/resources/resources.g.dart new file mode 100644 index 0000000..9645894 --- /dev/null +++ b/lib/components/resources/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/presentation/home_page/bloc/state.g.dart b/lib/presentation/home_page/bloc/state.g.dart new file mode 100644 index 0000000..114ac25 --- /dev/null +++ b/lib/presentation/home_page/bloc/state.g.dart @@ -0,0 +1,92 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'state.dart'; + +// ************************************************************************** +// CopyWithGenerator +// ************************************************************************** + +abstract class _$HomeStateCWProxy { + HomeState data(HomeData? data); + + HomeState isLoading(bool isLoading); + + HomeState isPaginationLoading(bool isPaginationLoading); + + HomeState error(String? error); + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `HomeState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// HomeState(...).copyWith(id: 12, name: "My name") + /// ```` + HomeState call({ + HomeData? data, + bool? isLoading, + bool? isPaginationLoading, + String? error, + }); +} + +/// Proxy class for `copyWith` functionality. This is a callable class and can be used as follows: `instanceOfHomeState.copyWith(...)`. Additionally contains functions for specific fields e.g. `instanceOfHomeState.copyWith.fieldName(...)` +class _$HomeStateCWProxyImpl implements _$HomeStateCWProxy { + const _$HomeStateCWProxyImpl(this._value); + + final HomeState _value; + + @override + HomeState data(HomeData? data) => this(data: data); + + @override + HomeState isLoading(bool isLoading) => this(isLoading: isLoading); + + @override + HomeState isPaginationLoading(bool isPaginationLoading) => + this(isPaginationLoading: isPaginationLoading); + + @override + HomeState error(String? error) => this(error: error); + + @override + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `HomeState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// HomeState(...).copyWith(id: 12, name: "My name") + /// ```` + HomeState call({ + Object? data = const $CopyWithPlaceholder(), + Object? isLoading = const $CopyWithPlaceholder(), + Object? isPaginationLoading = const $CopyWithPlaceholder(), + Object? error = const $CopyWithPlaceholder(), + }) { + return HomeState( + data: data == const $CopyWithPlaceholder() + ? _value.data + // ignore: cast_nullable_to_non_nullable + : data as HomeData?, + isLoading: isLoading == const $CopyWithPlaceholder() || isLoading == null + ? _value.isLoading + // ignore: cast_nullable_to_non_nullable + : isLoading as bool, + isPaginationLoading: + isPaginationLoading == const $CopyWithPlaceholder() || + isPaginationLoading == null + ? _value.isPaginationLoading + // ignore: cast_nullable_to_non_nullable + : isPaginationLoading as bool, + error: error == const $CopyWithPlaceholder() + ? _value.error + // ignore: cast_nullable_to_non_nullable + : error as String?, + ); + } +} + +extension $HomeStateCopyWith on HomeState { + /// Returns a callable class that can be used as follows: `instanceOfHomeState.copyWith(...)` or like so:`instanceOfHomeState.copyWith.fieldName(...)`. + // ignore: library_private_types_in_public_api + _$HomeStateCWProxy get copyWith => _$HomeStateCWProxyImpl(this); +} diff --git a/lib/presentation/likes_bloc/likes_state.g.dart b/lib/presentation/likes_bloc/likes_state.g.dart new file mode 100644 index 0000000..2912544 --- /dev/null +++ b/lib/presentation/likes_bloc/likes_state.g.dart @@ -0,0 +1,56 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'likes_state.dart'; + +// ************************************************************************** +// CopyWithGenerator +// ************************************************************************** + +abstract class _$LikeStateCWProxy { + LikeState likedIds(List? likedIds); + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LikeState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LikeState(...).copyWith(id: 12, name: "My name") + /// ```` + LikeState call({ + List? likedIds, + }); +} + +/// Proxy class for `copyWith` functionality. This is a callable class and can be used as follows: `instanceOfLikeState.copyWith(...)`. Additionally contains functions for specific fields e.g. `instanceOfLikeState.copyWith.fieldName(...)` +class _$LikeStateCWProxyImpl implements _$LikeStateCWProxy { + const _$LikeStateCWProxyImpl(this._value); + + final LikeState _value; + + @override + LikeState likedIds(List? likedIds) => this(likedIds: likedIds); + + @override + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LikeState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LikeState(...).copyWith(id: 12, name: "My name") + /// ```` + LikeState call({ + Object? likedIds = const $CopyWithPlaceholder(), + }) { + return LikeState( + likedIds: likedIds == const $CopyWithPlaceholder() + ? _value.likedIds + // ignore: cast_nullable_to_non_nullable + : likedIds as List?, + ); + } +} + +extension $LikeStateCopyWith on LikeState { + /// Returns a callable class that can be used as follows: `instanceOfLikeState.copyWith(...)` or like so:`instanceOfLikeState.copyWith.fieldName(...)`. + // ignore: library_private_types_in_public_api + _$LikeStateCWProxy get copyWith => _$LikeStateCWProxyImpl(this); +} diff --git a/lib/presentation/locale_bloc/locale_state.g.dart b/lib/presentation/locale_bloc/locale_state.g.dart new file mode 100644 index 0000000..e374db6 --- /dev/null +++ b/lib/presentation/locale_bloc/locale_state.g.dart @@ -0,0 +1,58 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'locale_state.dart'; + +// ************************************************************************** +// CopyWithGenerator +// ************************************************************************** + +abstract class _$LocaleStateCWProxy { + LocaleState currentLocale(Locale currentLocale); + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LocaleState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LocaleState(...).copyWith(id: 12, name: "My name") + /// ```` + LocaleState call({ + Locale? currentLocale, + }); +} + +/// Proxy class for `copyWith` functionality. This is a callable class and can be used as follows: `instanceOfLocaleState.copyWith(...)`. Additionally contains functions for specific fields e.g. `instanceOfLocaleState.copyWith.fieldName(...)` +class _$LocaleStateCWProxyImpl implements _$LocaleStateCWProxy { + const _$LocaleStateCWProxyImpl(this._value); + + final LocaleState _value; + + @override + LocaleState currentLocale(Locale currentLocale) => + this(currentLocale: currentLocale); + + @override + + /// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `LocaleState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support. + /// + /// Usage + /// ```dart + /// LocaleState(...).copyWith(id: 12, name: "My name") + /// ```` + LocaleState call({ + Object? currentLocale = const $CopyWithPlaceholder(), + }) { + return LocaleState( + currentLocale: + currentLocale == const $CopyWithPlaceholder() || currentLocale == null + ? _value.currentLocale + // ignore: cast_nullable_to_non_nullable + : currentLocale as Locale, + ); + } +} + +extension $LocaleStateCopyWith on LocaleState { + /// Returns a callable class that can be used as follows: `instanceOfLocaleState.copyWith(...)` or like so:`instanceOfLocaleState.copyWith.fieldName(...)`. + // ignore: library_private_types_in_public_api + _$LocaleStateCWProxy get copyWith => _$LocaleStateCWProxyImpl(this); +} diff --git a/web/icons/icon-192.png b/web/icons/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..01e3c6f88b1d6ca574b057829aa73ac07ea5de8b GIT binary patch literal 6811 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 literal 0 HcmV?d00001 diff --git a/web/icons/icon-512.png b/web/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..a0afe29a59d5075279018249891a6950603ba764 GIT binary patch literal 23815 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 Nw)q5Xs@=#q`F|_eu#^A* literal 0 HcmV?d00001