package screens import ( "context" "strings" "github.com/NicoNex/echotron/v3" "github.com/TelegramExchange/tgex-backend/tg_bot/backend" "github.com/TelegramExchange/tgex-backend/tg_bot/bot" "github.com/TelegramExchange/tgex-backend/tg_bot/screens/ui" "github.com/rs/zerolog/log" ) type Creatives struct { CurrentPage int ProjectID string ProjectTitle string ProjectTelegramID int64 ProjectUsername string ProjectStatus string BackState bot.State } const creativesPerPage = 6 const creativesPerRow = 2 const msgNoCreatives = ` Креативы У вас пока нет креативов Креатив — это рекламный материал: ‣ Текст объявления ‣ Медиа контент (фото, видео) ‣ Шаблон для автопостинга ‣ Варианты для A/B тестирования Начните с добавления первого креатива ` const msgCreatives = ` Креативы Управление рекламными материалами Выберите креатив ` func (s *Creatives) Enter(b *bot.Bot, mode bot.RenderMode) { page, err := b.Backend.GetCreatives(context.Background(), b.Session.JWT, b.Session.WorkspaceID, &s.ProjectID, false, s.CurrentPage+1, creativesPerPage) if err != nil { log.Error().Err(err).Msg("Failed to get creatives") b.SendNew("❌ Не удалось загрузить креативы", refreshKeyboard) return } text := msgCreatives if len(page.Items) == 0 { text = msgNoCreatives } var kbRows [][]echotron.InlineKeyboardButton rowsGrid := ui.BuildGrid(page.Items, creativesPerRow, creativesPerPage, page.Pages, func(creative backend.Creative) (string, string) { return creative.Name, "creative:" + creative.ID }, ) kbRows = append(kbRows, rowsGrid...) if navRow := ui.BuildNavigationRow(ui.PaginationConfig{ CurrentPage: s.CurrentPage, TotalPages: page.Pages, MiddleButtons: Row(Button("+ Добавить", "add_creative")), }); navRow != nil { kbRows = append(kbRows, navRow) } kbRows = append(kbRows, Row(Button("← Назад", "back"), Button("≡ Архив", "archive"))) kb := Keyboard(kbRows...) b.Render(text, kb, mode) updateProjectHeaderMedia(b, b.LastMessageID, text, kb, s.ProjectTelegramID, s.ProjectTitle, s.ProjectUsername, s.ProjectStatus) } func (s *Creatives) HandleCallback(b *bot.Bot, u *echotron.Update) { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { return } data := u.CallbackQuery.Data switch { case data == "prev": if s.CurrentPage > 0 { s.CurrentPage-- } s.Enter(b, bot.EditMessage) case data == "next": s.CurrentPage++ s.Enter(b, bot.EditMessage) case data == "back": if s.BackState != nil { b.SetState(s.BackState, bot.EditMessage) } case data == "archive": b.Edit("📦 Архив креативов\n\nЭта функция в разработке", Keyboard(Row(Button("← Назад", "back")))) case data == "add_creative": b.SetState(&AddCreativeStart{Ctx: &AddCreativeCtx{ ProjectID: s.ProjectID, BackState: s, }}, bot.EditMessage) case strings.HasPrefix(data, "creative:"): creativeID, ok := strings.CutPrefix(data, "creative:") if !ok || creativeID == "" { return } b.SetState(&CreativeDetails{ CreativeID: creativeID, ProjectID: s.ProjectID, BackState: s, }, bot.NewMessage) default: s.Enter(b, bot.NewMessage) } return } func (s *Creatives) HandleMessage(_ *bot.Bot, _ *echotron.Update) {} func (s *Creatives) Handle(_ *bot.Bot, _ *echotron.Update) {} func (s *Creatives) Exit() {}