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