Files
QuizPlease/Assets/Scripts/Boot/States/MenuState.cs
T
horooko 6601c8ea22 feat(task-0006): implement menu restart button and signal coordination
- Update MenuUIViewModel with IMenuRestartSignal dependency and Restart() method
- Add RestartButton to MenuUIView with listener management in Initialize/Release
- Connect MenuUIView click handler to ViewModel.Restart() callback
- Fix race condition in MenuRestartSignal.RequestRestart() by nulling completion source first
- Wrap MenuState.WaitAsync() in try-catch for proper view cleanup on cancellation
- Update TASK-0006 status to Ready

Выполнена задача TASK-0006: реализована кнопка Restart и координация сигналов

- Обновлён MenuUIViewModel с зависимостью IMenuRestartSignal и методом Restart()
- Добавлена кнопка RestartButton в MenuUIView с управлением слушателями в Initialize/Release
- Подключен обработчик кликов MenuUIView к колбэку ViewModel.Restart()
- Исправлено состояние гонки в MenuRestartSignal.RequestRestart() путем обнуления completion source
- Обёрнут WaitAsync в MenuState в try-catch для корректной очистки view при отмене
- Обновлён статус TASK-0006 до Ready
2026-05-27 04:35:15 +07:00

44 lines
1.1 KiB
C#

using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using QuizPleaseTest.Boot.Flow;
using QuizPleaseTest.Boot.UI;
using QuizPleaseTest.Common.StateMachine;
namespace QuizPleaseTest.Boot.States
{
public class MenuState : IState
{
private readonly MenuUIView _view;
private readonly IMenuRestartSignal _restartSignal;
public MenuState(MenuUIView view, IMenuRestartSignal restartSignal)
{
_view = view;
_restartSignal = restartSignal;
}
public async UniTask EnterAsync(CancellationToken ct)
{
_view.Bind(new MenuUIViewModel(_restartSignal));
_view.Initialize();
try
{
await _restartSignal.WaitAsync(ct);
}
catch (OperationCanceledException) when (ct.IsCancellationRequested)
{
_view.Release();
throw;
}
}
public UniTask ExitAsync(CancellationToken ct)
{
_view.Release();
return UniTask.CompletedTask;
}
}
}