Доработано Demo
All checks were successful
CI / build-test (push) Successful in 30s

This commit is contained in:
2025-12-05 13:33:25 +03:00
parent d817417a69
commit e6e5459280
10 changed files with 103 additions and 15 deletions

View File

@@ -1,27 +1,57 @@
using BotPages.Core;
using BotPages.Core.Messaging;
using System.Xml;
namespace Demo.Pages;
/// <summary>
/// Страница ввода деталей заявки.
/// Страница с параметрами и сохранением состояния.
/// </summary>
public sealed class DetailsPage : StatefullPage<DetailsArgs>
{
[Statefull("Request")]
private Models.Request Request;
public override Task OnEnter(PageContext ctx, DetailsArgs args, CancellationToken ct)
=> new MessageBuilder(ctx)
{
Request = new()
{
Title = args.Title,
};
return new MessageBuilder(ctx)
.Text($"Заголовок: {args.Title}\nДобавьте детали или нажмите Далее.")
.Inline(new InlineButton("Далее", "next"), new InlineButton("Назад", "back"))
.Reply("Отмена")
.SendAsync(ct);
}
public override Task OnButton(PageContext ctx, string payload, CancellationToken ct)
=> payload switch
public override async Task OnButton(PageContext ctx, string payload, CancellationToken ct)
{
switch (payload)
{
"next" => ctx.Navigation.GoToAsync<FilesPage>(ctx, ct),
"back" => ctx.Navigation.GoToAsync<TitlePage>(ctx, ct),
_ => Task.CompletedTask
case "next":
{
await SaveState(ctx, ct);
await ctx.Navigation.GoToAsync<FilesPage>(ctx, ct);
break;
}
case "back":
{
await ctx.Navigation.GoToAsync<TitlePage>(ctx, ct);
break;
}
};
}
public override async Task OnText(PageContext ctx, string text, CancellationToken ct)
{
Request.Details = text;
await SaveState(ctx, ct);
await ctx.Navigation.GoToAsync<FilesPage>(ctx, ct);
}
}
/// <summary>

View File

@@ -6,8 +6,9 @@ namespace Demo.Pages;
/// <summary>
/// Страница загрузки файлов.
/// Обычная страница с полученим и сохранением состояния.
/// </summary>
public sealed class FilesPage : Page
public sealed class FilesPage : SingletonPage
{
public override Task OnEnter(PageContext ctx, CancellationToken ct)
=> new MessageBuilder(ctx)
@@ -22,6 +23,12 @@ public sealed class FilesPage : Page
await ctx.SendFileAsync(file, $"Файл '{file.Name}' получен и отправлен обратно.", ct);
}
//Обращение через Storage
var request = await ctx.StateStorage.GetAsync<Models.Request>(ctx.SessionKey, "Request", ct);
request.FilesCount = files.Count;
//Обращение через Context
await ctx.SetStorageAsync("Request", request, ct);
await new MessageBuilder(ctx)
.Text($"Получено файлов: {files.Count}", MessageFormat.Plain)
.Inline("Далее", "next")

View File

@@ -5,14 +5,25 @@ using BotPages.Core.Messaging;
namespace Demo.Pages;
/// <summary>
/// Страница ввода заголовка заявки.
/// Обычная страница вводом текста.
/// </summary>
public sealed class TitlePage : SingletonPage
{
public override Task OnEnter(PageContext ctx, CancellationToken ct)
=> new MessageBuilder(ctx)
.Text("Введите заголовок заявки:", MessageFormat.Markdown)
.Reply("Меню")
.SendAsync(ct);
public override Task OnText(PageContext ctx, string text, CancellationToken ct)
=> ctx.Navigation.GoToAsync<DetailsPage, DetailsArgs>(ctx, new DetailsArgs { Title = text }, ct);
{
if (text == "Меню")
{
return ctx.Navigation.GoToHome(ctx, ct);
}
else
{
return ctx.Navigation.GoToAsync<DetailsPage, DetailsArgs>(ctx, new DetailsArgs { Title = text }, ct);
}
}
}

View File

@@ -6,16 +6,21 @@ namespace Demo.Pages;
/// <summary>
/// Стартовая страница демо‑бота.
/// Обычная страница с кнопками
/// </summary>
public sealed class WelcomePage : SingletonPage
{
public override Task OnEnter(PageContext ctx, CancellationToken ct)
=> new MessageBuilder(ctx)
public override async Task OnEnter(PageContext ctx, CancellationToken ct)
{
await ctx.ClearStorageAsync(ct);
await new MessageBuilder(ctx)
.Text("Добро пожаловать! 🚀")
.Reply(WelcomePageButtons.CreateRequest)
.Reply(WelcomePageButtons.Help)
.Reply(WelcomePageButtons.SendFile)
.SendAsync(ct);
}
public override Task OnText(PageContext ctx, string text, CancellationToken ct)
{