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
This commit is contained in:
2026-05-27 04:35:05 +07:00
parent fda094dd44
commit 6601c8ea22
6 changed files with 109 additions and 3 deletions
+31
View File
@@ -1,8 +1,39 @@
using QuizPleaseTest.Common.UI;
using UnityEngine;
using UnityEngine.UI;
namespace QuizPleaseTest.Boot.UI
{
public class MenuUIView : UIView<MenuUIViewModel>
{
[field: SerializeField] public Button RestartButton { get; private set; }
public override void Initialize()
{
base.Initialize();
if (RestartButton == null)
{
return;
}
RestartButton.onClick.RemoveListener(OnRestartClicked);
RestartButton.onClick.AddListener(OnRestartClicked);
}
public override void Release()
{
if (RestartButton != null)
{
RestartButton.onClick.RemoveListener(OnRestartClicked);
}
base.Release();
}
private void OnRestartClicked()
{
ViewModel.Restart();
}
}
}
+13
View File
@@ -1,8 +1,21 @@
using System;
using QuizPleaseTest.Boot.Flow;
using QuizPleaseTest.Common.UI;
namespace QuizPleaseTest.Boot.UI
{
public class MenuUIViewModel : IUIViewModel
{
private readonly IMenuRestartSignal _restartSignal;
public MenuUIViewModel(IMenuRestartSignal restartSignal)
{
_restartSignal = restartSignal ?? throw new ArgumentNullException(nameof(restartSignal));
}
public void Restart()
{
_restartSignal.RequestRestart();
}
}
}