feat: done working on join room

This commit is contained in:
akhdanre 2025-05-07 10:08:20 +07:00
parent 49e33d00a9
commit 7e126e24a6
11 changed files with 161 additions and 9 deletions

View File

@ -6,6 +6,8 @@ import 'package:quiz_app/feature/history/view/detail_history_view.dart';
import 'package:quiz_app/feature/home/binding/home_binding.dart'; import 'package:quiz_app/feature/home/binding/home_binding.dart';
import 'package:quiz_app/feature/home/view/home_page.dart'; import 'package:quiz_app/feature/home/view/home_page.dart';
import 'package:quiz_app/feature/detail_quiz/binding/detail_quiz_binding.dart'; import 'package:quiz_app/feature/detail_quiz/binding/detail_quiz_binding.dart';
import 'package:quiz_app/feature/join_room/binding/join_room_binding.dart';
import 'package:quiz_app/feature/join_room/view/join_room_view.dart';
import 'package:quiz_app/feature/library/binding/library_binding.dart'; import 'package:quiz_app/feature/library/binding/library_binding.dart';
import 'package:quiz_app/feature/detail_quiz/view/detail_quix_view.dart'; import 'package:quiz_app/feature/detail_quiz/view/detail_quix_view.dart';
import 'package:quiz_app/feature/listing_quiz/binding/listing_quiz_binding.dart'; import 'package:quiz_app/feature/listing_quiz/binding/listing_quiz_binding.dart';
@ -113,6 +115,11 @@ class AppPages {
name: AppRoutes.waitRoomPage, name: AppRoutes.waitRoomPage,
page: () => WaitingRoomView(), page: () => WaitingRoomView(),
binding: WaitingRoomBinding(), binding: WaitingRoomBinding(),
),
GetPage(
name: AppRoutes.joinRoomPage,
page: () => JoinRoomView(),
binding: JoinRoomBinding(),
) )
]; ];
} }

View File

@ -19,5 +19,6 @@ abstract class AppRoutes {
static const detailHistoryPage = "/history/detail"; static const detailHistoryPage = "/history/detail";
static const roomPage = "/room/quiz"; static const roomPage = "/room/quiz";
static const joinRoomPage = "/room/quiz/join";
static const waitRoomPage = "/room/quiz/waiting"; static const waitRoomPage = "/room/quiz/waiting";
} }

View File

@ -52,6 +52,8 @@ class HomeController extends GetxController {
void goToRoomMaker() => Get.toNamed(AppRoutes.roomPage); void goToRoomMaker() => Get.toNamed(AppRoutes.roomPage);
void goToJoinRoom() => Get.toNamed(AppRoutes.joinRoomPage);
void goToSearch() { void goToSearch() {
final navController = Get.find<NavigationController>(); final navController = Get.find<NavigationController>();
navController.changePage(1); navController.changePage(1);

View File

@ -36,7 +36,7 @@ class HomeView extends GetView<HomeController> {
ButtonOption( ButtonOption(
onCreate: controller.goToQuizCreation, onCreate: controller.goToQuizCreation,
onCreateRoom: controller.goToRoomMaker, onCreateRoom: controller.goToRoomMaker,
onJoinRoom: () {}, onJoinRoom: controller.goToJoinRoom,
), ),
Padding( Padding(
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),

View File

@ -0,0 +1,13 @@
import 'package:get/get.dart';
import 'package:quiz_app/data/controllers/user_controller.dart';
import 'package:quiz_app/data/services/socket_service.dart';
import 'package:quiz_app/feature/join_room/controller/join_room_controller.dart';
class JoinRoomBinding extends Bindings {
@override
void dependencies() {
Get.put(SocketService());
Get.lazyPut(() => JoinRoomController(Get.find<SocketService>(), Get.find<UserController>()));
}
}

View File

@ -0,0 +1,39 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:quiz_app/app/routes/app_pages.dart';
import 'package:quiz_app/data/controllers/user_controller.dart';
import 'package:quiz_app/data/dto/waiting_room_dto.dart';
import 'package:quiz_app/data/models/session/session_response_model.dart';
import 'package:quiz_app/data/services/socket_service.dart';
class JoinRoomController extends GetxController {
final SocketService _socketService;
final UserController _userController;
JoinRoomController(this._socketService, this._userController);
final TextEditingController codeController = TextEditingController();
void joinRoom() {
final code = codeController.text.trim();
if (code.isEmpty) {
Get.snackbar(
"Error",
"Kode room dan nama harus diisi",
backgroundColor: Get.theme.colorScheme.error.withOpacity(0.9),
colorText: Colors.white,
);
return;
}
_socketService.initSocketConnection();
_socketService.joinRoom(sessionCode: code, userId: _userController.userData!.id);
Get.toNamed(AppRoutes.waitRoomPage, arguments: WaitingRoomDTO(false, SessionResponseModel(sessionId: "", sessionCode: code)));
}
@override
void onClose() {
codeController.dispose();
super.onClose();
}
}

View File

@ -0,0 +1,77 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:quiz_app/app/const/colors/app_colors.dart';
import 'package:quiz_app/component/global_button.dart';
import 'package:quiz_app/component/global_text_field.dart';
import 'package:quiz_app/feature/join_room/controller/join_room_controller.dart';
class JoinRoomView extends GetView<JoinRoomController> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.background,
appBar: AppBar(
backgroundColor: AppColors.background,
elevation: 0,
leading: IconButton(
icon: const Icon(Icons.arrow_back_ios_new, color: Colors.black87),
onPressed: () => Get.back(),
),
),
body: SafeArea(
child: Center(
child: SingleChildScrollView(
padding: const EdgeInsets.all(24.0),
child: Container(
width: double.infinity,
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.06),
blurRadius: 14,
offset: const Offset(0, 6),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Masukkan Kode Room",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w700,
color: Colors.black87,
),
),
const SizedBox(height: 16),
GlobalTextField(
controller: controller.codeController,
hintText: "AB123C",
textInputType: TextInputType.text,
// Uncomment if needed:
// maxLength: 6,
// inputFormatters: [
// FilteringTextInputFormatter.allow(RegExp(r'[A-Z0-9]')),
// UpperCaseTextFormatter(),
// ],
),
const SizedBox(height: 30),
GlobalButton(
text: "Gabung Sekarang",
onPressed: controller.joinRoom,
),
],
),
),
),
),
),
);
}
}

View File

@ -1,12 +1,18 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:quiz_app/data/controllers/user_controller.dart'; import 'package:quiz_app/data/controllers/user_controller.dart';
import 'package:quiz_app/data/services/session_service.dart'; import 'package:quiz_app/data/services/session_service.dart';
import 'package:quiz_app/data/services/socket_service.dart';
import 'package:quiz_app/feature/room_maker/controller/room_maker_controller.dart'; import 'package:quiz_app/feature/room_maker/controller/room_maker_controller.dart';
class RoomMakerBinding extends Bindings { class RoomMakerBinding extends Bindings {
@override @override
void dependencies() { void dependencies() {
Get.lazyPut(() => SessionService()); Get.lazyPut(() => SessionService());
Get.lazyPut(() => RoomMakerController(Get.find<SessionService>(), Get.find<UserController>())); Get.put(SocketService());
Get.lazyPut(() => RoomMakerController(
Get.find<SessionService>(),
Get.find<UserController>(),
Get.find<SocketService>(),
));
} }
} }

View File

@ -6,12 +6,18 @@ import 'package:quiz_app/data/dto/waiting_room_dto.dart';
import 'package:quiz_app/data/models/quiz/quiz_listing_model.dart'; import 'package:quiz_app/data/models/quiz/quiz_listing_model.dart';
import 'package:quiz_app/data/models/session/session_request_model.dart'; import 'package:quiz_app/data/models/session/session_request_model.dart';
import 'package:quiz_app/data/services/session_service.dart'; import 'package:quiz_app/data/services/session_service.dart';
import 'package:quiz_app/data/services/socket_service.dart';
class RoomMakerController extends GetxController { class RoomMakerController extends GetxController {
final SessionService _sessionService; final SessionService _sessionService;
final UserController _userController; final UserController _userController;
final SocketService _socketService;
RoomMakerController(this._sessionService, this._userController); RoomMakerController(
this._sessionService,
this._userController,
this._socketService,
);
// final roomName = ''.obs; // final roomName = ''.obs;
final selectedQuiz = Rxn<QuizListingModel>(); final selectedQuiz = Rxn<QuizListingModel>();
@ -45,7 +51,6 @@ class RoomMakerController extends GetxController {
].obs; ].obs;
void onCreateRoom() async { void onCreateRoom() async {
print("room ${nameTC.text} || ${selectedQuiz.value}");
if (nameTC.text.trim().isEmpty || selectedQuiz.value == null) { if (nameTC.text.trim().isEmpty || selectedQuiz.value == null) {
Get.snackbar("Gagal", "Nama room dan kuis harus dipilih."); Get.snackbar("Gagal", "Nama room dan kuis harus dipilih.");
return; return;
@ -61,7 +66,12 @@ class RoomMakerController extends GetxController {
), ),
); );
if (response != null) Get.toNamed(AppRoutes.waitRoomPage, arguments: WaitingRoomDTO(true, response.data!)); if (response != null) {
_socketService.initSocketConnection();
_socketService.joinRoom(sessionCode: response.data!.sessionCode, userId: _userController.userData!.id);
Get.toNamed(AppRoutes.waitRoomPage, arguments: WaitingRoomDTO(true, response.data!));
}
} }
void onQuizSourceChange(bool base) { void onQuizSourceChange(bool base) {

View File

@ -6,7 +6,7 @@ import 'package:quiz_app/feature/waiting_room/controller/waiting_room_controller
class WaitingRoomBinding extends Bindings { class WaitingRoomBinding extends Bindings {
@override @override
void dependencies() { void dependencies() {
Get.put(SocketService()); if (!Get.isRegistered<SocketService>()) Get.put(SocketService());
Get.lazyPut<WaitingRoomController>(() => WaitingRoomController( Get.lazyPut<WaitingRoomController>(() => WaitingRoomController(
Get.find<SocketService>(), Get.find<SocketService>(),
Get.find<UserController>(), Get.find<UserController>(),

View File

@ -31,9 +31,6 @@ class WaitingRoomController extends GetxController {
SessionResponseModel? roomData = data.data; SessionResponseModel? roomData = data.data;
isAdmin.value = data.isAdmin; isAdmin.value = data.isAdmin;
_socketService.initSocketConnection();
_socketService.joinRoom(sessionCode: roomData.sessionCode, userId: _userController.userData!.id);
_socketService.roomMessages.listen((data) { _socketService.roomMessages.listen((data) {
final user = data["data"]; final user = data["data"];
joinedUsers.assign(UserModel(id: user['user_id'], name: user['username'])); joinedUsers.assign(UserModel(id: user['user_id'], name: user['username']));