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 := `➕ Создать закуп Шаг 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(`⚠️ Сначала выберите проект Для выбора креатива необходимо сначала выбрать проект, так как креативы привязаны к проектам.`, 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 }