From 0b505995d1db2c0f34a91092a4fdbc8d8c8c518e Mon Sep 17 00:00:00 2001 From: AmirrezaChegini Date: Tue, 11 Nov 2025 10:26:59 +0330 Subject: [PATCH] add: topic page --- assets/svg/icon_art.svg | 3 + assets/svg/icon_random.svg | 3 + lib/common_ui/resources/my_assets.dart | 2 + lib/core/params/topic_params.dart | 13 +++ lib/core/routers/my_routes.dart | 8 ++ .../controller/battle_league_controller.dart | 4 + .../presentation/ui/battle_league_page.dart | 4 +- .../data/datasource/topic_datasource.dart | 28 +++++ .../topic/data/model/topic_model.dart | 13 +++ .../topic_repository_impl.dart | 29 +++++ .../topic/domain/entity/topic_entity.dart | 14 +++ .../domain/repository/topic_repository.dart | 8 ++ .../domain/usecases/get_topic_usecase.dart | 19 +++ .../presentation/binding/topic_binding.dart | 20 ++++ .../controller/topic_controller.dart | 54 +++++++++ .../topic/presentation/ui/topic_page.dart | 110 ++++++++++++++++++ .../ui/widgets/battle_grey_button.dart | 57 +++++++++ .../presentation/ui/widgets/topic_widget.dart | 64 ++++++++++ lib/init_bindings.dart | 9 ++ lib/l10n/app_en.arb | 9 +- lib/l10n/app_localizations.dart | 42 +++++++ lib/l10n/app_localizations_en.dart | 21 ++++ 22 files changed, 531 insertions(+), 3 deletions(-) create mode 100644 assets/svg/icon_art.svg create mode 100644 assets/svg/icon_random.svg create mode 100644 lib/core/params/topic_params.dart create mode 100644 lib/features/topic/data/datasource/topic_datasource.dart create mode 100644 lib/features/topic/data/model/topic_model.dart create mode 100644 lib/features/topic/data/repository_impl/topic_repository_impl.dart create mode 100644 lib/features/topic/domain/entity/topic_entity.dart create mode 100644 lib/features/topic/domain/repository/topic_repository.dart create mode 100644 lib/features/topic/domain/usecases/get_topic_usecase.dart create mode 100644 lib/features/topic/presentation/binding/topic_binding.dart create mode 100644 lib/features/topic/presentation/controller/topic_controller.dart create mode 100644 lib/features/topic/presentation/ui/topic_page.dart create mode 100644 lib/features/topic/presentation/ui/widgets/battle_grey_button.dart create mode 100644 lib/features/topic/presentation/ui/widgets/topic_widget.dart diff --git a/assets/svg/icon_art.svg b/assets/svg/icon_art.svg new file mode 100644 index 0000000..2914269 --- /dev/null +++ b/assets/svg/icon_art.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/svg/icon_random.svg b/assets/svg/icon_random.svg new file mode 100644 index 0000000..db4e364 --- /dev/null +++ b/assets/svg/icon_random.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/common_ui/resources/my_assets.dart b/lib/common_ui/resources/my_assets.dart index 28c55cd..41d9662 100644 --- a/lib/common_ui/resources/my_assets.dart +++ b/lib/common_ui/resources/my_assets.dart @@ -62,6 +62,8 @@ class MyAssets { static const String iconDiamond = 'assets/svg/icon_diamond.svg'; static const String mic = 'assets/svg/mic.svg'; static const String micBLur = 'assets/svg/mic_blur.svg'; + static const String iconArt = 'assets/svg/icon_art.svg'; + static const String iconRandom = 'assets/svg/icon_random.svg'; /// ----- Audios ----- static const String sampleAudio = 'assets/audios/sample.mp3'; diff --git a/lib/core/params/topic_params.dart b/lib/core/params/topic_params.dart new file mode 100644 index 0000000..edf044f --- /dev/null +++ b/lib/core/params/topic_params.dart @@ -0,0 +1,13 @@ +class TopicParams { + int? id; + + TopicParams({this.id}); + + TopicParams copyWith({ + int? id, + }) { + return TopicParams( + id: id ?? this.id, + ); + } +} diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart index b8d60ee..528cf69 100644 --- a/lib/core/routers/my_routes.dart +++ b/lib/core/routers/my_routes.dart @@ -15,6 +15,8 @@ import 'package:shia_game_flutter/features/battle_league/presentation/ui/battle_ import 'package:get/get.dart'; import 'package:shia_game_flutter/features/shop/presentation/binding/shop_binding.dart'; import 'package:shia_game_flutter/features/shop/presentation/ui/shop_page.dart'; +import 'package:shia_game_flutter/features/topic/presentation/binding/topic_binding.dart'; +import 'package:shia_game_flutter/features/topic/presentation/ui/topic_page.dart'; class Routes { static const Routes _i = Routes._internal(); @@ -29,6 +31,7 @@ class Routes { static const String awardsPage = '/awards_page'; static const String profilePage = '/profile_page'; static const String battleLeaguePage = '/battle_league_page'; + static const String topicPage = '/topic_page'; } final List appPages = [ @@ -74,4 +77,9 @@ final List appPages = [ page: () => const BattleLeaguePage(), binding: BattleLeagueBinding(), ), + GetPage( + name: Routes.topicPage, + page: () => const TopicPage(), + binding: TopicBinding(), + ), ]; diff --git a/lib/features/battle_league/presentation/controller/battle_league_controller.dart b/lib/features/battle_league/presentation/controller/battle_league_controller.dart index 242cfc9..55786f4 100644 --- a/lib/features/battle_league/presentation/controller/battle_league_controller.dart +++ b/lib/features/battle_league/presentation/controller/battle_league_controller.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:shia_game_flutter/core/params/sample_params.dart'; +import 'package:shia_game_flutter/core/routers/my_routes.dart'; import 'package:shia_game_flutter/core/status/base_status.dart'; import 'package:shia_game_flutter/features/battle_league/domain/entity/battle_league_entity.dart'; import 'package:shia_game_flutter/features/battle_league/domain/usecases/get_battle_league_usecase.dart'; @@ -38,6 +39,9 @@ class BattleLeagueController extends GetxController final Rx getBattleLeagueStatus = Rx(const BaseInit()); /// ------ Functions ------ + void goToTopicPage(){ + Get.toNamed(Routes.topicPage); + } /// ------ Api Calls ------ Future getBattleLeague() async { diff --git a/lib/features/battle_league/presentation/ui/battle_league_page.dart b/lib/features/battle_league/presentation/ui/battle_league_page.dart index 51c01bc..0b335dc 100644 --- a/lib/features/battle_league/presentation/ui/battle_league_page.dart +++ b/lib/features/battle_league/presentation/ui/battle_league_page.dart @@ -33,7 +33,7 @@ class BattleLeaguePage extends GetView { _tabBars(context), 12.h.gapHeight, _tabViews(), - 56.0.gapHeight, + 56.h.gapHeight, _startButton(context), ], ), @@ -77,7 +77,7 @@ class BattleLeaguePage extends GetView { padding: const EdgeInsets.symmetric(horizontal: 30), child: BattleLeagueStartButton( title: context.translate.play_now, - onTap: () {}, + onTap: controller.goToTopicPage, ), ); } diff --git a/lib/features/topic/data/datasource/topic_datasource.dart b/lib/features/topic/data/datasource/topic_datasource.dart new file mode 100644 index 0000000..6f94800 --- /dev/null +++ b/lib/features/topic/data/datasource/topic_datasource.dart @@ -0,0 +1,28 @@ +import 'package:shia_game_flutter/core/constants/my_api.dart'; +import 'package:shia_game_flutter/core/network/http_request.dart'; +import 'package:shia_game_flutter/core/params/topic_params.dart'; +import 'package:shia_game_flutter/core/response/base_response.dart'; +import 'package:shia_game_flutter/features/topic/data/model/topic_model.dart'; +import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; + +abstract class ITopicDatasource { + Future getData({required TopicParams params}); +} + +class TopicDatasourceImpl implements ITopicDatasource { + final IHttpRequest httpRequest; + + const TopicDatasourceImpl(this.httpRequest); + + @override + Future getData({required TopicParams params}) async { + final response = await httpRequest.get( + path: MyApi.baseUrl, + ); + + return BaseResponse.getData( + response?['data'], + (json) => TopicModel.fromJson(json), + ); + } +} diff --git a/lib/features/topic/data/model/topic_model.dart b/lib/features/topic/data/model/topic_model.dart new file mode 100644 index 0000000..e7d152c --- /dev/null +++ b/lib/features/topic/data/model/topic_model.dart @@ -0,0 +1,13 @@ +import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; + +class TopicModel extends TopicEntity { + const TopicModel({ + super.id, + }); + + factory TopicModel.fromJson(Map json) { + return TopicModel( + id: json['id'], + ); + } +} diff --git a/lib/features/topic/data/repository_impl/topic_repository_impl.dart b/lib/features/topic/data/repository_impl/topic_repository_impl.dart new file mode 100644 index 0000000..46870f7 --- /dev/null +++ b/lib/features/topic/data/repository_impl/topic_repository_impl.dart @@ -0,0 +1,29 @@ +import 'package:flutter/foundation.dart'; +import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; +import 'package:shia_game_flutter/core/params/topic_params.dart'; +import 'package:shia_game_flutter/core/utils/data_state.dart'; +import 'package:shia_game_flutter/features/topic/data/datasource/topic_datasource.dart'; +import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; +import 'package:shia_game_flutter/features/topic/domain/repository/topic_repository.dart'; + +class TopicRepositoryImpl implements ITopicRepository { + final ITopicDatasource datasource; + + const TopicRepositoryImpl(this.datasource); + + @override + Future> getData({required TopicParams params}) async { + try { + final TopicEntity response = await datasource.getData(params: params); + return DataState.success(response); + } on MyException catch (e) { + return DataState.error(e); + } catch (e) { + if (kDebugMode) { + rethrow; + } else { + return DataState.error(MyException(errorMessage: '$e')); + } + } + } +} diff --git a/lib/features/topic/domain/entity/topic_entity.dart b/lib/features/topic/domain/entity/topic_entity.dart new file mode 100644 index 0000000..d6e6e85 --- /dev/null +++ b/lib/features/topic/domain/entity/topic_entity.dart @@ -0,0 +1,14 @@ +import 'package:equatable/equatable.dart'; + +class TopicEntity extends Equatable { + final int? id; + + const TopicEntity({ + this.id, + }); + + @override + List get props => [ + id, + ]; +} diff --git a/lib/features/topic/domain/repository/topic_repository.dart b/lib/features/topic/domain/repository/topic_repository.dart new file mode 100644 index 0000000..0b591dd --- /dev/null +++ b/lib/features/topic/domain/repository/topic_repository.dart @@ -0,0 +1,8 @@ +import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; +import 'package:shia_game_flutter/core/params/topic_params.dart'; +import 'package:shia_game_flutter/core/utils/data_state.dart'; +import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; + +abstract class ITopicRepository { + Future> getData({required TopicParams params}); +} diff --git a/lib/features/topic/domain/usecases/get_topic_usecase.dart b/lib/features/topic/domain/usecases/get_topic_usecase.dart new file mode 100644 index 0000000..3c16333 --- /dev/null +++ b/lib/features/topic/domain/usecases/get_topic_usecase.dart @@ -0,0 +1,19 @@ +import 'package:shia_game_flutter/core/error_handler/my_exception.dart'; +import 'package:shia_game_flutter/core/params/topic_params.dart'; +import 'package:shia_game_flutter/core/usecase/usecase.dart'; +import 'package:shia_game_flutter/core/utils/data_state.dart'; +import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; +import 'package:shia_game_flutter/features/topic/domain/repository/topic_repository.dart'; + +class GetTopicUseCase implements UseCase { + final ITopicRepository repository; + + const GetTopicUseCase(this.repository); + + @override + Future> call(TopicParams params) { + return repository.getData(params: params); + } +} + + diff --git a/lib/features/topic/presentation/binding/topic_binding.dart b/lib/features/topic/presentation/binding/topic_binding.dart new file mode 100644 index 0000000..9b1b6da --- /dev/null +++ b/lib/features/topic/presentation/binding/topic_binding.dart @@ -0,0 +1,20 @@ +import 'package:shia_game_flutter/features/topic/presentation/controller/topic_controller.dart'; +import 'package:get/get.dart'; + +class TopicBinding extends Bindings { + @override + void dependencies() { + Get.put(TopicController(Get.find())); + } + + Future deleteBindings() async { + await Future.wait([ + Get.delete(), + ]); + } + + Future refreshBinding() async { + await deleteBindings(); + dependencies(); + } +} diff --git a/lib/features/topic/presentation/controller/topic_controller.dart b/lib/features/topic/presentation/controller/topic_controller.dart new file mode 100644 index 0000000..cb1fd82 --- /dev/null +++ b/lib/features/topic/presentation/controller/topic_controller.dart @@ -0,0 +1,54 @@ +import 'package:flutter/cupertino.dart'; +import 'package:shia_game_flutter/core/params/topic_params.dart'; +import 'package:shia_game_flutter/core/status/base_status.dart'; +import 'package:shia_game_flutter/features/topic/domain/entity/topic_entity.dart'; +import 'package:shia_game_flutter/features/topic/domain/usecases/get_topic_usecase.dart'; +import 'package:get/get.dart'; + +class TopicController extends GetxController with StateMixin { + /// ----- Constructor ----- + TopicController(this.getTopicUseCase); + + @override + void onInit() { + super.onInit(); + change('', status: RxStatus.success()); + } + + @override + void onClose() { + textEditingController.dispose(); + super.onClose(); + } + + /// ----- UseCases ----- + final GetTopicUseCase getTopicUseCase; + + /// ----- Variables ----- + final Rx topicParams = Rx(TopicParams()); + final Rx topicEntity = Rx(const TopicEntity()); + + /// ------ Controllers ------ + final TextEditingController textEditingController = TextEditingController(); + + /// ------ Statuses ------ + final Rx getTopicStatus = Rx(const BaseInit()); + + /// ------ Functions ------ + + /// ------ Api Calls ------ + Future getTopic() async { + change('', status: RxStatus.loading()); + await getTopicUseCase(topicParams.value).then( + (value) => value.fold( + (data) { + topicEntity.value = data; + change('', status: RxStatus.success()); + }, + (error) { + change('', status: RxStatus.error(error.errorMessage)); + }, + ), + ); + } +} diff --git a/lib/features/topic/presentation/ui/topic_page.dart b/lib/features/topic/presentation/ui/topic_page.dart new file mode 100644 index 0000000..1fc7a4b --- /dev/null +++ b/lib/features/topic/presentation/ui/topic_page.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:shia_game_flutter/common_ui/resources/my_assets.dart'; +import 'package:shia_game_flutter/common_ui/resources/my_colors.dart'; +import 'package:shia_game_flutter/common_ui/resources/my_text_style.dart'; +import 'package:shia_game_flutter/core/utils/gap.dart'; +import 'package:shia_game_flutter/core/utils/my_localization.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/app_bar/enums/app_bar_type.dart'; +import 'package:shia_game_flutter/core/widgets/app_bar/my_app_bar.dart'; +import 'package:shia_game_flutter/features/battle_league/presentation/ui/widgets/battle_league_start_button.dart'; +import 'package:shia_game_flutter/features/topic/presentation/controller/topic_controller.dart'; +import 'package:shia_game_flutter/features/topic/presentation/ui/widgets/battle_grey_button.dart'; +import 'package:shia_game_flutter/features/topic/presentation/ui/widgets/topic_widget.dart'; + +class TopicPage extends GetView { + const TopicPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: MyColors.battleLeagueBackgroundColor, + appBar: MyAppBar( + backgroundColor: MyColors.transparent, + type: AppBarType.battleLeague, + title: context.translate.choose_3_topics, + ), + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + 20.h.gapHeight, + _title(context), + 27.h.gapHeight, + _topicList(context), + 20.h.gapHeight, + _randomButton(context), + const Spacer(), + _startButton(context), + ], + ), + ), + ); + } + + Text _title(BuildContext context) { + return Text.rich( + TextSpan( + text: '${context.translate.choose} ', + style: Lexend.regular.copyWith(fontSize: 12.sp), + children: [ + TextSpan( + text: '${context.translate.three_topics} ', + style: Lexend.regular.copyWith( + fontSize: 12.sp, + color: const Color(0xFF9858FF), + ), + ), + TextSpan(text: '${context.translate.or} '), + TextSpan( + text: '${context.translate.random.toLowerCase()} ', + style: Lexend.regular.copyWith( + fontSize: 12.sp, + color: const Color(0xFF9858FF), + ), + ), + TextSpan(text: context.translate.selection_option), + ], + ), + ); + } + + SizedBox _topicList(BuildContext context) { + return SizedBox( + width: context.widthScreen, + child: Wrap( + spacing: 20, + runSpacing: 14, + direction: Axis.horizontal, + alignment: WrapAlignment.center, + children: List.generate( + 10, + (index) => TopicWidget( + label: context.translate.art, + image: MyAssets.iconArt, + onTap: () {}, + ), + ), + ), + ); + } + + Padding _randomButton(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: BattleGreyButton( + label: context.translate.random, + image: MyAssets.iconRandom, + onTap: () {}, + ), + ); + } + + Widget _startButton(BuildContext context) { + return const Padding( + padding: EdgeInsets.symmetric(horizontal: 30), + child: BattleLeagueStartButton(title: 'Start Finding'), + ); + } +} diff --git a/lib/features/topic/presentation/ui/widgets/battle_grey_button.dart b/lib/features/topic/presentation/ui/widgets/battle_grey_button.dart new file mode 100644 index 0000000..b683bd9 --- /dev/null +++ b/lib/features/topic/presentation/ui/widgets/battle_grey_button.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:shia_game_flutter/common_ui/resources/my_text_style.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/container/my_container.dart'; +import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; + +class BattleGreyButton extends StatelessWidget { + const BattleGreyButton({ + super.key, + this.onTap, + this.label, + this.image, + }); + + final VoidCallback? onTap; + final String? label; + final String? image; + + @override + Widget build(BuildContext context) { + return MyContainer( + onTap: onTap, + height: 48.h, + width: context.widthScreen, + borderRadius: const BorderRadius.all(Radius.circular(12)), + borderColor: const Color(0XFF8C9FAC), + gradient: const RadialGradient( + center: Alignment.center, + radius: 4.5, + colors: [ + Color(0XFF8296A4), + Color(0XFF51636E), + ], + ), + boxShadow: [ + BoxShadow( + offset: const Offset(0, 3.53), + blurRadius: 15.02, + color: const Color(0XFF94A3B8).withValues(alpha: 0.05), + ), + ], + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 6, + children: [ + MyImage( + asset: image ?? '', + ), + Text( + label ?? '', + style: Lexend.medium.copyWith(fontSize: 12.sp), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/features/topic/presentation/ui/widgets/topic_widget.dart b/lib/features/topic/presentation/ui/widgets/topic_widget.dart new file mode 100644 index 0000000..c2a88b6 --- /dev/null +++ b/lib/features/topic/presentation/ui/widgets/topic_widget.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:shia_game_flutter/common_ui/resources/my_text_style.dart'; +import 'package:shia_game_flutter/core/utils/screen_size.dart'; +import 'package:shia_game_flutter/core/widgets/container/my_container.dart'; +import 'package:shia_game_flutter/core/widgets/image/my_image.dart'; + +class TopicWidget extends StatelessWidget { + const TopicWidget({ + super.key, + this.onTap, + this.label, + this.image, + }); + + final VoidCallback? onTap; + final String? label; + final String? image; + + @override + Widget build(BuildContext context) { + return MyContainer( + onTap: onTap, + height: 48.h, + width: 148.w, + borderRadius: const BorderRadius.all(Radius.circular(12)), + borderGradient: LinearGradient( + begin: AlignmentDirectional.centerStart, + end: AlignmentDirectional.centerEnd, + colors: [ + const Color(0XFFAA76FF), + const Color(0XFFAA76FF).withValues(alpha: 0), + ], + ), + gradient: const RadialGradient( + center: Alignment.center, + radius: 3, + colors: [ + Color(0XFF9858FF), + Color(0XFF792BF3), + ], + ), + boxShadow: [ + BoxShadow( + offset: const Offset(0, 3.53), + blurRadius: 15.02, + color: const Color(0XFF94A3B8).withValues(alpha: 0.05), + ), + ], + child: Row( + mainAxisSize: MainAxisSize.min, + spacing: 4, + children: [ + MyImage( + asset: image ?? '', + ), + Text( + label ?? '', + style: Lexend.medium.copyWith(fontSize: 12.sp), + ), + ], + ), + ); + } +} diff --git a/lib/init_bindings.dart b/lib/init_bindings.dart index fc3a664..2401e9f 100644 --- a/lib/init_bindings.dart +++ b/lib/init_bindings.dart @@ -33,6 +33,10 @@ import 'package:shia_game_flutter/features/shop/data/datasource/shop_datasource. import 'package:shia_game_flutter/features/shop/data/repository_impl/shop_repository_impl.dart'; import 'package:shia_game_flutter/features/shop/domain/repository/shop_repository.dart'; import 'package:shia_game_flutter/features/shop/domain/usecases/get_shop_usecase.dart'; +import 'package:shia_game_flutter/features/topic/data/datasource/topic_datasource.dart'; +import 'package:shia_game_flutter/features/topic/data/repository_impl/topic_repository_impl.dart'; +import 'package:shia_game_flutter/features/topic/domain/repository/topic_repository.dart'; +import 'package:shia_game_flutter/features/topic/domain/usecases/get_topic_usecase.dart'; void initBindings() { /// ----- Classes ----- @@ -77,4 +81,9 @@ void initBindings() { Get.lazyPut(() => BattleLeagueDatasourceImpl(Get.find()), fenix: true); Get.lazyPut(() => BattleLeagueRepositoryImpl(Get.find()), fenix: true); Get.lazyPut(() => GetBattleLeagueUseCase(Get.find()), fenix: true); + + /// ----- Topic Feature ----- + Get.lazyPut(() => TopicDatasourceImpl(Get.find()), fenix: true); + Get.lazyPut(() => TopicRepositoryImpl(Get.find()), fenix: true); + Get.lazyPut(() => GetTopicUseCase(Get.find()), fenix: true); } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 1363b7c..1637a54 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -36,5 +36,12 @@ "play_now": "Play Now", "country": "Country", "city": "City", - "region": "Region" + "region": "Region", + "choose_3_topics": "Choose 3 topics", + "choose": "Choose", + "three_topics": "3 topics", + "or": "or", + "random": "Random", + "selection_option": "selection option", + "art": "Art" } \ No newline at end of file diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 4076f4a..221c12e 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -315,6 +315,48 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Region'** String get region; + + /// No description provided for @choose_3_topics. + /// + /// In en, this message translates to: + /// **'Choose 3 topics'** + String get choose_3_topics; + + /// No description provided for @choose. + /// + /// In en, this message translates to: + /// **'Choose'** + String get choose; + + /// No description provided for @three_topics. + /// + /// In en, this message translates to: + /// **'3 topics'** + String get three_topics; + + /// No description provided for @or. + /// + /// In en, this message translates to: + /// **'or'** + String get or; + + /// No description provided for @random. + /// + /// In en, this message translates to: + /// **'Random'** + String get random; + + /// No description provided for @selection_option. + /// + /// In en, this message translates to: + /// **'selection option'** + String get selection_option; + + /// No description provided for @art. + /// + /// In en, this message translates to: + /// **'Art'** + String get art; } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 0b5f8e8..d318215 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -118,4 +118,25 @@ class AppLocalizationsEn extends AppLocalizations { @override String get region => 'Region'; + + @override + String get choose_3_topics => 'Choose 3 topics'; + + @override + String get choose => 'Choose'; + + @override + String get three_topics => '3 topics'; + + @override + String get or => 'or'; + + @override + String get random => 'Random'; + + @override + String get selection_option => 'selection option'; + + @override + String get art => 'Art'; }