134 lines
3.5 KiB
Go
134 lines
3.5 KiB
Go
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 уже создан в Bot.Update(), просто берем из сессии
|
||
jwt := b.Session.JWT
|
||
if jwt == "" {
|
||
log.Error().Msg("JWT is empty in session")
|
||
b.SendNew("❌ Ошибка авторизации. Попробуйте /start", 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'ов", Keyboard())
|
||
return
|
||
}
|
||
|
||
if len(workspaces) == 0 {
|
||
b.SendNew("У вас пока нет workspace'ов", Keyboard(
|
||
Row(Button("🏠 Главное меню", "back")),
|
||
))
|
||
return
|
||
}
|
||
|
||
text := "📁 Выбор workspace для канала\n\n"
|
||
text += "В какой workspace добавить канал?"
|
||
|
||
var buttons [][]echotron.InlineKeyboardButton
|
||
|
||
// Создаем кнопки для каждого workspace
|
||
for _, ws := range workspaces {
|
||
buttons = append(buttons, Row(
|
||
Button(ws.Name, fmt.Sprintf("select_workspace:%s", ws.ID)),
|
||
))
|
||
}
|
||
|
||
// Кнопка отмены
|
||
buttons = append(buttons, Row(Button("❌ Отмена", "cancel")))
|
||
|
||
keyboard := Keyboard(buttons...)
|
||
b.Render(text, keyboard, mode)
|
||
}
|
||
|
||
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...", 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", Keyboard(
|
||
Row(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, Keyboard(
|
||
Row(Button("📋 Мои проекты", "my_projects")),
|
||
Row(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 }
|