package screens import ( "context" "fmt" "strings" "example.com/m/bot" "github.com/NicoNex/echotron/v3" "github.com/rs/zerolog/log" ) type SelectWorkspace struct { ChannelID string BackState bot.State } func (s *SelectWorkspace) Enter(b *bot.Bot, mode bot.RenderMode) { jwt, err := s.ensureJWT(b) if err != nil { log.Error().Err(err).Msg("Failed to get JWT") b.SendNew("❌ Ошибка авторизации. Попробуйте /start", bot.Keyboard()) return } workspaces, err := b.Backend.GetWorkspaces(context.Background(), jwt) if err != nil { log.Error().Err(err).Msg("Failed to get workspaces") b.SendNew("❌ Не удалось загрузить список workspace'ов", bot.Keyboard()) return } if len(workspaces) == 0 { b.SendNew("У вас пока нет workspace'ов", bot.Keyboard( bot.Row(bot.Button("🏠 Главное меню", "back")), )) return } text := "📁 Выбор workspace для канала\n\n" text += "В какой workspace добавить канал?" var buttons [][]echotron.InlineKeyboardButton // Создаем кнопки для каждого workspace for _, ws := range workspaces { buttons = append(buttons, bot.Row( bot.Button(ws.Name, fmt.Sprintf("select_workspace:%s", ws.ID)), )) } // Кнопка отмены buttons = append(buttons, bot.Row(bot.Button("❌ Отмена", "cancel"))) keyboard := bot.Keyboard(buttons...) b.Render(text, keyboard, mode) } func (s *SelectWorkspace) ensureJWT(b *bot.Bot) (string, error) { // Проверяем, есть ли JWT в сессии if b.Session.JWT != "" { return b.Session.JWT, nil } // Если нет, запрашиваем новый jwt, err := b.Backend.GetJWTByTelegramID(context.Background(), b.ChatID) if err != nil { return "", err } // Сохраняем в сессию b.Session.JWT = jwt return jwt, nil } func (s *SelectWorkspace) HandleCallback(b *bot.Bot, u *echotron.Update) { if u.CallbackQuery == nil || u.CallbackQuery.Data == "" { return } data := u.CallbackQuery.Data switch { case data == "cancel", data == "back": if s.BackState != nil { b.SetState(s.BackState, bot.NewMessage) } case strings.HasPrefix(data, "select_workspace:"): // Извлекаем workspace_id parts := strings.Split(data, ":") if len(parts) != 2 { log.Error().Str("callback_data", data).Msg("Invalid callback data format") return } workspaceID := parts[1] // Показываем индикатор загрузки b.Edit("⏳ Добавляем канал в workspace...", bot.Keyboard()) // Вызываем API для привязки канала к workspace project, err := b.Backend.AttachChannelToWorkspace( context.Background(), s.ChannelID, workspaceID, b.ChatID, ) if err != nil { log.Error().Err(err).Str("channel_id", s.ChannelID).Str("workspace_id", workspaceID).Msg("Failed to attach channel to workspace") b.Edit("❌ Не удалось добавить канал в workspace", bot.Keyboard( bot.Row(bot.Button("← Назад", "back_to_select")), )) return } // Показываем успешное сообщение successText := fmt.Sprintf("✅ Канал успешно добавлен!\n\n"+ "📊 Проект ID: %s\n"+ "📝 Название: %s\n"+ "🏷 Статус: %s", project.ID, project.Title, project.Status, ) b.Edit(successText, bot.Keyboard( bot.Row(bot.Button("📋 Мои проекты", "my_projects")), bot.Row(bot.Button("🏠 Главное меню", "main_menu")), )) case data == "back_to_select": s.Enter(b, bot.EditMessage) case data == "my_projects": b.SetState(&MyProjects{}, bot.NewMessage) case data == "main_menu": b.SetState(&MainMenu{}, bot.NewMessage) default: s.Enter(b, bot.NewMessage) } return } func (s *SelectWorkspace) HandleMessage(_ *bot.Bot, _ *echotron.Update) { return } func (s *SelectWorkspace) Handle(_ *bot.Bot, _ *echotron.Update) { return }