diff --git a/shared/sendlog.go b/shared/sendlog.go index bd032df..fe4a01c 100644 --- a/shared/sendlog.go +++ b/shared/sendlog.go @@ -378,6 +378,7 @@ func ConnectToLogs(ctx context.Context) (io.Reader, error) { go func() { <-ctx.Done() + fmt.Println("CLOSE SSH CONNECT") session.Close() sshClient.Close() }() diff --git a/tui/common/model.go b/tui/common/model.go index 0c30356..bcca05e 100644 --- a/tui/common/model.go +++ b/tui/common/model.go @@ -1,6 +1,7 @@ package common import ( + "context" "log/slog" "github.com/charmbracelet/ssh" @@ -19,4 +20,5 @@ type SharedModel struct { Height int HeaderHeight int Styles Styles + Ctx context.Context } diff --git a/tui/logs/logs.go b/tui/logs/logs.go index e221ac6..a3c061b 100644 --- a/tui/logs/logs.go +++ b/tui/logs/logs.go @@ -2,6 +2,7 @@ package logs import ( "bufio" + "context" "encoding/json" "fmt" "strings" @@ -31,6 +32,8 @@ type Model struct { viewport viewport.Model input input.Model sub chan map[string]any + ctx context.Context + done context.CancelFunc } func headerHeight(shrd common.SharedModel) int { @@ -59,6 +62,8 @@ func NewModel(shrd common.SharedModel) Model { viewport.YPosition = hh viewport.SetContent(defMsg) + ctx, cancel := context.WithCancel(shrd.Session.Context()) + return Model{ shared: shrd, state: stateReady, @@ -66,13 +71,15 @@ func NewModel(shrd common.SharedModel) Model { logData: []map[string]any{}, input: im, sub: make(chan map[string]any), + ctx: ctx, + done: cancel, } } func (m Model) Init() tea.Cmd { return tea.Batch( m.connectLogs(m.sub), - waitForActivity(m.sub), + m.waitForActivity(m.sub), ) } @@ -86,6 +93,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { hh := headerHeight(m.shared) m.viewport.Height = msg.Height - hh - inputHeight m.viewport.SetContent(logsToStr(m.shared.Styles, m.logData, m.input.Value())) + case logLineLoadedMsg: m.logData = append(m.logData, msg) lng := len(m.logData) @@ -100,7 +108,16 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { if wasAt { m.viewport.GotoBottom() } - cmds = append(cmds, waitForActivity(m.sub)) + cmds = append(cmds, m.waitForActivity(m.sub)) + + case pages.NavigateMsg: + fmt.Println("NAV AWAY") + // cancel activity logger + m.done() + // reset model + next := NewModel(m.shared) + return next, next.Init() + case tea.KeyMsg: switch msg.String() { case "q", "esc": @@ -130,18 +147,22 @@ func (m Model) View() string { return m.viewport.View() + "\n" + m.input.View() } -func waitForActivity(sub chan map[string]any) tea.Cmd { +func (m Model) waitForActivity(sub chan map[string]any) tea.Cmd { return func() tea.Msg { - result := <-sub - return logLineLoadedMsg(result) + select { + case result := <-sub: + return logLineLoadedMsg(result) + case <-m.ctx.Done(): + fmt.Println("CTX DONE") + return nil + } } } func (m Model) connectLogs(sub chan map[string]any) tea.Cmd { return func() tea.Msg { - stdoutPipe, err := shared.ConnectToLogs(m.shared.Session.Context()) + stdoutPipe, err := shared.ConnectToLogs(m.ctx) if err != nil { - fmt.Println(err) return nil }