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