123 lines
3.4 KiB
Go
123 lines
3.4 KiB
Go
package screens
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"example.com/m/adapter/backend"
|
||
"example.com/m/bot"
|
||
"github.com/NicoNex/echotron/v3"
|
||
)
|
||
|
||
type AddPlacement struct {
|
||
WorkspaceID string
|
||
BackState bot.State
|
||
|
||
// Выбранные данные
|
||
SelectedProject *backend.Project
|
||
SelectedCreative *backend.Creative
|
||
}
|
||
|
||
func (s *AddPlacement) Enter(b *bot.Bot, mode bot.RenderMode) {
|
||
text := `<b>➕ Создать закуп</b>
|
||
|
||
Шаг 1: Выберите проект и креатив
|
||
|
||
Нажмите на кнопки ниже для выбора:`
|
||
|
||
var buttons [][]echotron.InlineKeyboardButton
|
||
|
||
// Кнопка выбора проекта
|
||
projectButtonText := "Проект: Не выбран"
|
||
if s.SelectedProject != nil {
|
||
projectButtonText = fmt.Sprintf("Проект: %s", s.SelectedProject.Title)
|
||
}
|
||
buttons = append(buttons, bot.Row(
|
||
bot.Button(projectButtonText, "select_project"),
|
||
))
|
||
|
||
// Кнопка выбора креатива
|
||
creativeButtonText := "Креатив: Не выбран"
|
||
if s.SelectedCreative != nil {
|
||
creativeButtonText = fmt.Sprintf("Креатив: %s", s.SelectedCreative.Name)
|
||
}
|
||
buttons = append(buttons, bot.Row(
|
||
bot.Button(creativeButtonText, "select_creative"),
|
||
))
|
||
|
||
// Кнопки навигации
|
||
var navRow []echotron.InlineKeyboardButton
|
||
navRow = append(navRow, bot.Button("« Назад", "cancel"))
|
||
|
||
// Кнопка "Далее" активна только если выбран проект
|
||
if s.SelectedProject != nil {
|
||
navRow = append(navRow, bot.Button("Далее →", "next"))
|
||
}
|
||
|
||
buttons = append(buttons, navRow)
|
||
|
||
keyboard := bot.Keyboard(buttons...)
|
||
b.Render(text, keyboard, mode)
|
||
}
|
||
|
||
func (s *AddPlacement) HandleCallback(b *bot.Bot, u *echotron.Update) {
|
||
if u.CallbackQuery == nil || u.CallbackQuery.Data == "" {
|
||
return
|
||
}
|
||
|
||
data := u.CallbackQuery.Data
|
||
|
||
switch data {
|
||
case "cancel":
|
||
if s.BackState != nil {
|
||
b.SetState(s.BackState, bot.EditMessage)
|
||
}
|
||
|
||
case "select_project":
|
||
// Переходим к выбору проекта
|
||
b.SetState(&SelectProjectForPlacement{
|
||
WorkspaceID: s.WorkspaceID,
|
||
AddPlacementState: s,
|
||
}, bot.NewMessage)
|
||
|
||
case "select_creative":
|
||
if s.SelectedProject == nil {
|
||
// Если проект не выбран, показываем предупреждение
|
||
b.Edit(`<b>⚠️ Сначала выберите проект</b>
|
||
|
||
Для выбора креатива необходимо сначала выбрать проект, так как креативы привязаны к проектам.`, bot.Keyboard(
|
||
bot.Row(bot.Button("« Назад", "back_to_add_placement")),
|
||
))
|
||
return
|
||
}
|
||
|
||
// Переходим к выбору креатива
|
||
b.SetState(&SelectCreativeForPlacement{
|
||
WorkspaceID: s.WorkspaceID,
|
||
ProjectID: s.SelectedProject.ID,
|
||
AddPlacementState: s,
|
||
}, bot.NewMessage)
|
||
|
||
case "back_to_add_placement":
|
||
s.Enter(b, bot.EditMessage)
|
||
|
||
case "next":
|
||
if s.SelectedProject == nil {
|
||
return
|
||
}
|
||
|
||
// Переходим к управлению планом закупа (добавление/удаление каналов)
|
||
b.SetState(&PlacementPurchasePlan{
|
||
WorkspaceID: s.WorkspaceID,
|
||
ProjectID: s.SelectedProject.ID,
|
||
AddPlacementState: s,
|
||
}, bot.EditMessage)
|
||
|
||
default:
|
||
s.Enter(b, bot.NewMessage)
|
||
}
|
||
}
|
||
|
||
func (s *AddPlacement) HandleMessage(_ *bot.Bot, _ *echotron.Update) { return }
|
||
|
||
func (s *AddPlacement) Handle(_ *bot.Bot, _ *echotron.Update) { return }
|