using System.Collections.Generic; using System.Threading.Tasks; using TelegramBotBase.Args; using TelegramBotBase.Base; namespace TelegramBotBase.Controls.Hybrid; /// /// This Control is for having a basic form content switching control. /// public abstract class MultiView : ControlBase { private int _mISelectedViewIndex; /// /// Hold if the View has been rendered already. /// private bool _rendered; public MultiView() { Messages = new List(); } /// /// Index of the current View. /// public int SelectedViewIndex { get => _mISelectedViewIndex; set { _mISelectedViewIndex = value; //Already rendered? Re-Render if (_rendered) { ForceRender().Wait(); } } } private List Messages { get; } private Task Device_MessageSent(object sender, MessageSentEventArgs e) { if (e.Origin == null || !e.Origin.IsSubclassOf(typeof(MultiView))) { return Task.CompletedTask; } Messages.Add(e.MessageId); return Task.CompletedTask; } public override void Init() { Device.MessageSent += Device_MessageSent; } public override Task Load(MessageResult result) { _rendered = false; return Task.CompletedTask; } public override async Task Render(MessageResult result) { //When already rendered, skip rendering if (_rendered) { return; } await CleanUpView(); await RenderView(new RenderViewEventArgs(SelectedViewIndex)); _rendered = true; } /// /// Will get invoked on rendering the current controls view. /// /// public virtual Task RenderView(RenderViewEventArgs e) { return Task.CompletedTask; } private async Task CleanUpView() { var tasks = new List(); foreach (var msg in Messages) { tasks.Add(Device.DeleteMessage(msg)); } await Task.WhenAll(tasks); Messages.Clear(); } /// /// Forces render of control contents. /// public async Task ForceRender() { await CleanUpView(); await RenderView(new RenderViewEventArgs(SelectedViewIndex)); _rendered = true; } public override async Task Cleanup() { Device.MessageSent -= Device_MessageSent; await CleanUpView(); } }