Files
tgex-backend/tg_bot/screens/creatives.go
Artem Tsyrulnikov 31b63e5a39 правки
2026-02-02 11:59:37 +03:00

146 lines
3.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 = `
<b>Креативы</b>
У вас пока нет креативов
<i>Креатив — это рекламный материал:</i>
‣ Текст объявления
‣ Медиа контент (фото, видео)
‣ Шаблон для автопостинга
‣ Варианты для A/B тестирования
Начните с добавления первого креатива
`
const msgCreatives = `
<b>Креативы</b>
Управление рекламными материалами
Выберите креатив
`
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
}
// Открываем CreativeView вместо CreativeDetails
b.SetState(&CreativeView{
CreativeID: creativeID,
ProjectID: s.ProjectID,
// Данные проекта для передачи в AddPurchase
ProjectTitle: s.ProjectTitle,
ProjectTelegramID: s.ProjectTelegramID,
ProjectUsername: s.ProjectUsername,
ProjectStatus: s.ProjectStatus,
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() {}