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() {}