diff --git a/tg_bot/screens/main_menu.go b/tg_bot/screens/main_menu.go index f8d00b9..011f48e 100644 --- a/tg_bot/screens/main_menu.go +++ b/tg_bot/screens/main_menu.go @@ -14,7 +14,7 @@ type MainMenu struct{} const msgAbout = ` Главное меню -
++ Чтобы делать закупы, добавьте канал и креатив: /addchannel — новый канал diff --git a/tg_bot/screens/purchase_optional_details.go b/tg_bot/screens/purchase_optional_details.go index 66c833a..a5f2ab8 100644 --- a/tg_bot/screens/purchase_optional_details.go +++ b/tg_bot/screens/purchase_optional_details.go @@ -252,15 +252,17 @@ func (s *PurchaseOptionalDetails) HandleCallback(b *bot.Bot, u *echotron.Update) s.Enter(b, bot.EditMessage) case "back": + // Сохраняем текущее состояние перед возвратом назад b.SetState(&SelectChannelsForPurchase{ - ProjectID: s.ProjectID, - ProjectTitle: s.ProjectTitle, - CreativeID: s.CreativeID, - CreativeTitle: s.CreativeTitle, - Channels: s.Channels, - Duplicates: []string{}, - ParsingErrors: []ParseError{}, - BackState: s.BackState, + ProjectID: s.ProjectID, + ProjectTitle: s.ProjectTitle, + CreativeID: s.CreativeID, + CreativeTitle: s.CreativeTitle, + Channels: s.Channels, + Duplicates: []string{}, + ParsingErrors: []ParseError{}, + OptionalDetailsState: s, // Сохраняем текущее состояние + BackState: s.BackState, }, bot.EditMessage) case "next": jwt := b.Session.JWT @@ -2234,6 +2236,12 @@ func (s *PurchaseOptionalDetails) createPurchase(b *bot.Bot, jwt string) { } } + // Очищаем сохранённое состояние после успешного создания + // Находим SelectChannelsForPurchase в BackState и очищаем его OptionalDetailsState + if selectState, ok := s.BackState.(*SelectChannelsForPurchase); ok { + selectState.OptionalDetailsState = nil + } + b.SetState(&Placements{ ProjectID: s.ProjectID, ProjectTitle: s.ProjectTitle, diff --git a/tg_bot/screens/select_channels_for_purchase.go b/tg_bot/screens/select_channels_for_purchase.go index f683d59..e4b0038 100644 --- a/tg_bot/screens/select_channels_for_purchase.go +++ b/tg_bot/screens/select_channels_for_purchase.go @@ -22,19 +22,20 @@ type PurchaseChannelInput struct { } type SelectChannelsForPurchase struct { - ProjectID string - ProjectTitle string - ProjectTelegramID int64 - ProjectUsername string - ProjectStatus string - CreativeID string - CreativeTitle string - Channels []PurchaseChannelInput - CurrentPage int - InvalidUsernames []string - Duplicates []string // дубликаты каналов - ParsingErrors []ParseError // ошибки парсинга с предложениями - BackState bot.State + ProjectID string + ProjectTitle string + ProjectTelegramID int64 + ProjectUsername string + ProjectStatus string + CreativeID string + CreativeTitle string + Channels []PurchaseChannelInput + CurrentPage int + InvalidUsernames []string + Duplicates []string // дубликаты каналов + ParsingErrors []ParseError // ошибки парсинга с предложениями + OptionalDetailsState *PurchaseOptionalDetails // сохранённое состояние деталей + BackState bot.State } // ParseError представляет ошибку парсинга с предложением исправления @@ -216,14 +217,23 @@ func (s *SelectChannelsForPurchase) HandleCallback(b *bot.Bot, u *echotron.Updat } // Каналы уже резолвлены в HandleMessage, переходим к следующему шагу - b.SetState(&PurchaseOptionalDetails{ - ProjectID: s.ProjectID, - ProjectTitle: s.ProjectTitle, - CreativeID: s.CreativeID, - CreativeTitle: s.CreativeTitle, - Channels: s.Channels, - BackState: s.BackState, - }, bot.EditMessage) + // Если есть сохранённое состояние - используем его, иначе создаём новое + var optionalDetails *PurchaseOptionalDetails + if s.OptionalDetailsState != nil { + optionalDetails = s.OptionalDetailsState + // Обновляем каналы на случай если они изменились + optionalDetails.Channels = s.Channels + } else { + optionalDetails = &PurchaseOptionalDetails{ + ProjectID: s.ProjectID, + ProjectTitle: s.ProjectTitle, + CreativeID: s.CreativeID, + CreativeTitle: s.CreativeTitle, + Channels: s.Channels, + BackState: s, + } + } + b.SetState(optionalDetails, bot.EditMessage) case "back_to_select": s.Enter(b, bot.EditMessage)За что отвечает каждая кнопка в этом окне: • Рабочее пространство — Одно можно использовать для своих проектов, а другое, например, для проектов, где вы являетесь закупщиком. @@ -26,7 +26,7 @@ const msgAbout = ` • Веб-платформа — Используйте функционал нашего сервиса на все 100%: планируйте размещения, просматривайте аналитику, следите за показателями проектов. • Помощь — Изучите инструкции, как пользоваться нашим сервисом или напишите в поддержку, если возникли какие-то вопросы. -