stuff
Some checks failed
Web App CI / test (push) Has been cancelled
Deploy Mnemo Cards / Deploy Backend (push) Has been cancelled
Web App CI / build (push) Has been cancelled
Deploy Mnemo Cards / Deploy Web App (push) Has been cancelled
Deploy Mnemo Cards / Final Verification (push) Has been cancelled
Some checks failed
Web App CI / test (push) Has been cancelled
Deploy Mnemo Cards / Deploy Backend (push) Has been cancelled
Web App CI / build (push) Has been cancelled
Deploy Mnemo Cards / Deploy Web App (push) Has been cancelled
Deploy Mnemo Cards / Final Verification (push) Has been cancelled
This commit is contained in:
parent
1b644296a4
commit
4e783c83b6
5 changed files with 65 additions and 20 deletions
|
|
@ -1,5 +1,7 @@
|
|||
import 'package:yx_scope/yx_scope.dart';
|
||||
|
||||
import 'package:game_tests/game_tests.dart';
|
||||
|
||||
import '../../../domain/services/game_session_manager.dart';
|
||||
import '../../../domain/services/game_sound_service.dart';
|
||||
import '../../../domain/services/test_manager.dart';
|
||||
|
|
@ -27,12 +29,18 @@ class TestsModule extends ScopeModule<UserScopeContainer> {
|
|||
() => GameSoundService(),
|
||||
);
|
||||
|
||||
// Game test settings
|
||||
late final gameTestSettingsDep = dep(
|
||||
() => const GameTestSettings(),
|
||||
);
|
||||
|
||||
// Tests State Manager
|
||||
late final testsStateManagerDep = dep(
|
||||
() => TestsStateManager(
|
||||
testManager: testManagerDep.get,
|
||||
gameSessionManager: gameSessionManagerDep.get,
|
||||
gameSoundService: gameSoundServiceDep.get,
|
||||
settings: gameTestSettingsDep.get,
|
||||
),
|
||||
);
|
||||
|
||||
|
|
@ -40,4 +48,5 @@ class TestsModule extends ScopeModule<UserScopeContainer> {
|
|||
GameSoundService get gameSoundService => gameSoundServiceDep.get;
|
||||
TestManager get testManager => testManagerDep.get;
|
||||
TestsStateManager get testsStateManager => testsStateManagerDep.get;
|
||||
GameTestSettings get gameTestSettings => gameTestSettingsDep.get;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:game_tests/game_tests.dart';
|
||||
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
|
||||
import 'package:yx_state/yx_state.dart';
|
||||
|
||||
import '../models/game_question.dart';
|
||||
|
|
@ -51,14 +52,21 @@ class TestsStateManager extends StateManager<TestsState> {
|
|||
required TestManager testManager,
|
||||
required GameSessionManager gameSessionManager,
|
||||
required GameSoundService gameSoundService,
|
||||
GameTestSettings settings = const GameTestSettings(),
|
||||
}) : _testManager = testManager,
|
||||
_gameSessionManager = gameSessionManager,
|
||||
_gameSoundService = gameSoundService,
|
||||
super(const TestsState.loading());
|
||||
_settings = settings,
|
||||
super(const TestsState.loading()) {
|
||||
_gameSessionManager.configureDelays(
|
||||
answerFeedbackDelay: () => _settings.feedbackDelay,
|
||||
);
|
||||
}
|
||||
|
||||
final TestManager _testManager;
|
||||
final GameSessionManager _gameSessionManager;
|
||||
final GameSoundService _gameSoundService;
|
||||
final GameTestSettings _settings;
|
||||
String? _currentPackId;
|
||||
TestDto? _currentTest;
|
||||
|
||||
|
|
@ -158,26 +166,34 @@ class TestsStateManager extends StateManager<TestsState> {
|
|||
|
||||
final isCorrect = _gameSessionManager.getQuestionResult(questionId)?.isCorrect ?? false;
|
||||
|
||||
// Play sound based on answer correctness
|
||||
if (isCorrect) {
|
||||
await _gameSoundService.playCorrectAnswer();
|
||||
await HapticFeedback.lightImpact();
|
||||
} else {
|
||||
await _gameSoundService.playWrongAnswer();
|
||||
await HapticFeedback.mediumImpact();
|
||||
// Play sound/haptics based on settings
|
||||
if (_settings.enableSounds) {
|
||||
if (isCorrect) {
|
||||
await _gameSoundService.playCorrectAnswer();
|
||||
} else {
|
||||
await _gameSoundService.playWrongAnswer();
|
||||
}
|
||||
}
|
||||
|
||||
if (_settings.enableHaptics) {
|
||||
if (isCorrect) {
|
||||
await HapticFeedback.lightImpact();
|
||||
} else {
|
||||
await HapticFeedback.mediumImpact();
|
||||
}
|
||||
}
|
||||
|
||||
// Update state with answer feedback
|
||||
emit(currentState.copyWith(
|
||||
isAnswerSubmitted: true,
|
||||
isCorrect: isCorrect,
|
||||
answerFeedbackDelay: _gameSessionManager.feedbackDelay,
|
||||
answerFeedbackDelay: _settings.feedbackDelay,
|
||||
questionResults: _gameSessionManager.questionResults,
|
||||
));
|
||||
|
||||
// Auto-advance after delay if correct, or allow manual navigation
|
||||
if (isCorrect) {
|
||||
await Future<void>.delayed(const Duration(milliseconds: 1500));
|
||||
await Future<void>.delayed(_settings.feedbackDelay);
|
||||
await _nextQuestion.call(emit);
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -671,6 +671,13 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
game_tests:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "../games/packages/game_tests"
|
||||
relative: true
|
||||
source: path
|
||||
version: "0.0.1"
|
||||
get_it:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -78,6 +78,8 @@ dependencies:
|
|||
path: ../games/packages/payloads_shared
|
||||
bridge_core:
|
||||
path: ../games/packages/bridge_core
|
||||
game_tests:
|
||||
path: ../games/packages/game_tests
|
||||
|
||||
collection: any
|
||||
copy_with_extension: any
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mocktail/mocktail.dart';
|
||||
import 'package:game_tests/game_tests.dart';
|
||||
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
|
||||
import 'package:mnemo_cards_web_v2/domain/models/game_question.dart';
|
||||
import 'package:mnemo_cards_web_v2/domain/services/game_session_manager.dart';
|
||||
import 'package:mnemo_cards_web_v2/domain/services/game_sound_service.dart';
|
||||
import 'package:mnemo_cards_web_v2/domain/services/test_manager.dart';
|
||||
import 'package:mnemo_cards_web_v2/domain/state/tests_state_manager.dart';
|
||||
|
||||
|
|
@ -11,17 +13,26 @@ class MockTestManager extends Mock implements TestManager {}
|
|||
|
||||
class MockGameSessionManager extends Mock implements GameSessionManager {}
|
||||
|
||||
class MockGameSoundService extends Mock implements GameSoundService {}
|
||||
|
||||
void main() {
|
||||
late MockTestManager mockTestManager;
|
||||
late MockGameSessionManager mockGameSessionManager;
|
||||
late MockGameSoundService mockGameSoundService;
|
||||
late TestsStateManager testsStateManager;
|
||||
|
||||
setUp(() {
|
||||
mockTestManager = MockTestManager();
|
||||
mockGameSessionManager = MockGameSessionManager();
|
||||
mockGameSoundService = MockGameSoundService();
|
||||
testsStateManager = TestsStateManager(
|
||||
testManager: mockTestManager,
|
||||
gameSessionManager: mockGameSessionManager,
|
||||
gameSoundService: mockGameSoundService,
|
||||
settings: const GameTestSettings(
|
||||
enableHaptics: false,
|
||||
enableSounds: false,
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
|
|
@ -35,12 +46,12 @@ void main() {
|
|||
name: 'Test Game',
|
||||
questions: [
|
||||
SimpleTestQuestionBody(
|
||||
id: 'q1',
|
||||
id: 1,
|
||||
text: 'What is 2+2?',
|
||||
buttons: [
|
||||
TestButtonDto(id: '3', text: '3'),
|
||||
TestButtonDto(id: '4', text: '4'),
|
||||
TestButtonDto(id: '5', text: '5'),
|
||||
TestButtonDto.text('3', '3'),
|
||||
TestButtonDto.text('4', '4'),
|
||||
TestButtonDto.text('5', '5'),
|
||||
],
|
||||
answer: '4',
|
||||
word: 'four',
|
||||
|
|
@ -96,16 +107,16 @@ void main() {
|
|||
name: 'Multi Question Test',
|
||||
questions: [
|
||||
SimpleTestQuestionBody(
|
||||
id: 'q1',
|
||||
id: 1,
|
||||
text: 'Q1?',
|
||||
buttons: [TestButtonDto(id: 'A', text: 'A')],
|
||||
buttons: [TestButtonDto.text('A', 'A')],
|
||||
answer: 'A',
|
||||
word: 'one',
|
||||
),
|
||||
SimpleTestQuestionBody(
|
||||
id: 'q2',
|
||||
id: 2,
|
||||
text: 'Q2?',
|
||||
buttons: [TestButtonDto(id: 'B', text: 'B')],
|
||||
buttons: [TestButtonDto.text('B', 'B')],
|
||||
answer: 'B',
|
||||
word: 'two',
|
||||
),
|
||||
|
|
|
|||
Loading…
Reference in a new issue