Lifecycle (presenter)

ํฐ ๊ฐœ๋…

WillPushEnterAsync ์—์„œ view์—์„œ ๋ณด์ด๋Š” ๋ถ€๋ถ„์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

  • ํ™”๋ฉด์ด ์ „ํ™˜๋˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋„์ค‘์—๋„ ๋นˆ ํ™”๋ฉด์ด ๋‚˜์˜ค๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ˆ˜์น˜๋“ฑ์ด ํ‘œ์‹œ๋˜๋Š” ์ผ์ด ์—†๋„๋กํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

  • View์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•  ๋‚ด์šฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Model์—์„œ ๋ชจ๋‘ ๋ฐ›์•„์™€์„œ Presenter์—์„œ View์™€ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

  • Model์˜ ๋ฐ์ดํ„ฐ ๊ฐ’๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ reactiveํ•˜๊ฒŒ ์กด์žฌํ•œ๋‹ค.

DidPushEnter ์—์„œ view์˜ ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•œ behaviour๋ฅผ ์ •์˜ํ•œ๋‹ค.

  • DidPushEnter๋Š” ๋ชจ๋“  ์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚œ ํ›„ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๋ชจ๋“  ์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚œ ํ›„ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ๋“ฑ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž ์•ก์…˜ ์ฒ˜๋ฆฌ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์ด์œ ๋Š”:

    • ์ „ํ™˜ ๋„์ค‘์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉด ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋ฐœ์ƒํ•œ๋‹ค.

    • ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ „ํ™˜ ๋„์ค‘์— ๋ฒ„ํŠผ ํด๋ฆญ๋“ฑ์˜ ์ธํ„ฐ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•˜๋ƒ ์—ฌ๋ถ€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค.

    • ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋„์ค‘์— ๋นˆํ™”๋ฉด์ด๋‚˜ ๋œ ์™„์„ฑ๋œ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜๋Š” ๋“ฑ์˜ ์ƒํ™ฉ์ด ๋” ์‹ ๊ฒฝ์“ฐ์ด๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ์ด๋Š” WillPushEnterAsync์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ๋‹ค.

Asset์˜ ํ‚ค๊ฐ’์„ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ๋„ฃ๋Š”๋‹ค.

AssetName ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์—์…‹ ํ‚ค๊ฐ’์„ ๋„ฃ๋Š”๋‹ค. ๋‚˜๋Š” ๋ชจ๋“  ์—์…‹๋“ค์€ Addressable๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์€ Resources ํด๋”์— ํ”„๋ฆฌํŽฉ์„ ๋„ฃ๊ณ  ์ด๋ฅผ ํ‚ค๊ฐ’์œผ๋กœ ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ UnityScreenNavigator ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ณต์‹ Readme ์ฐธ๊ณ .

์™„์„ฑ๋œ ์ฝ”๋“œ

[AssetName("MainUI/Modal/SignInModal.prefab")]
public class SignInModalLifecycle : LifecycleModalBase
{
    private string _currentId = string.Empty;
    private string _currentPassword = string.Empty;
    
    private readonly SignInModalView _view;
    private readonly ModalManager _modalManager;
    private readonly ISignInUseCase _signInUseCase;
    private readonly PageEventPublisher _pageEventPublisher;

    [Inject]
    public SignInModalLifecycle(SignInModalView view, ModalManager modalManager, ISignInUseCase signInUseCase, PageEventPublisher pageEventPublisher) : base(view)
    {
        _view = view;
        _modalManager = modalManager;
        _signInUseCase = signInUseCase;
        _pageEventPublisher = pageEventPublisher;
    }

    protected override UniTask WillPushEnterAsync(CancellationToken cancellationToken)
    {
        base.WillPushEnterAsync(cancellationToken);

        var model = new SignInModalModel();
        _view.SetView(model);
        return UniTask.CompletedTask;
    }

    public override void DidPushEnter()
    {
        base.DidPushEnter();
        
        var currentId = string.Empty;
        var currentPassword = string.Empty;
        
        // Disable the sign-in button
        _view.SetSignInButtonInteractable(false);
        
        // ID input event processing
        _view.OnIdInputFieldEditAsync
            .ForEachAwaitAsync(async id =>
            {
                currentId = id;
                UpdateButtonState(currentId, currentPassword);

                await UniTask.CompletedTask;
            }, ExitCancellationToken)
            .Forget();

        // Password input event processing
        _view.OnPasswordInputFieldEditAsync
            .ForEachAwaitAsync(async password =>
            {
                currentPassword = password;
                UpdateButtonState(currentId, currentPassword);
                
                await UniTask.CompletedTask;
            }, ExitCancellationToken)
            .Forget();
        
        _view.OnSignInButtonClickedAsync
            .ForEachAwaitAsync(async _ =>
            {
                await OnSignInButtonClicked();
            }, ExitCancellationToken)
            .Forget();
    }

    // If both id and password are not empty, enable the sign-in button
    private void UpdateButtonState(string id, string password)
    {
        bool isInteractable = !string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(password);
        _view.SetSignInButtonInteractable(isInteractable);
    }

    // When the sign-in button is clicked, send a sign-in request
    private async UniTask OnSignInButtonClicked()
    {
        var logInInfo = _view.GetCurrentInput();
        var response = await _signInUseCase.SignIn(new ISignInUseCase.SignInRequestData(logInInfo.ID, logInInfo.Password));
            
        // If the sign-in is successful, close the modal
        if (response.IsSuccess)
        {
            _pageEventPublisher.SendPushEvent(new EntryPageBuilder(true, true));
            await _modalManager.Pop(true, ExitCancellationToken);
        }
    }
}

Last updated