1diff --git a/shared/sendlog.go b/shared/sendlog.go
2index bd032df..fe4a01c 100644
3--- a/shared/sendlog.go
4+++ b/shared/sendlog.go
5@@ -378,6 +378,7 @@ func ConnectToLogs(ctx context.Context) (io.Reader, error) {
6
7 go func() {
8 <-ctx.Done()
9+ fmt.Println("CLOSE SSH CONNECT")
10 session.Close()
11 sshClient.Close()
12 }()
13diff --git a/tui/common/model.go b/tui/common/model.go
14index 0c30356..bcca05e 100644
15--- a/tui/common/model.go
16+++ b/tui/common/model.go
17@@ -1,6 +1,7 @@
18 package common
19
20 import (
21+ "context"
22 "log/slog"
23
24 "github.com/charmbracelet/ssh"
25@@ -19,4 +20,5 @@ type SharedModel struct {
26 Height int
27 HeaderHeight int
28 Styles Styles
29+ Ctx context.Context
30 }
31diff --git a/tui/logs/logs.go b/tui/logs/logs.go
32index e221ac6..a3c061b 100644
33--- a/tui/logs/logs.go
34+++ b/tui/logs/logs.go
35@@ -2,6 +2,7 @@ package logs
36
37 import (
38 "bufio"
39+ "context"
40 "encoding/json"
41 "fmt"
42 "strings"
43@@ -31,6 +32,8 @@ type Model struct {
44 viewport viewport.Model
45 input input.Model
46 sub chan map[string]any
47+ ctx context.Context
48+ done context.CancelFunc
49 }
50
51 func headerHeight(shrd common.SharedModel) int {
52@@ -59,6 +62,8 @@ func NewModel(shrd common.SharedModel) Model {
53 viewport.YPosition = hh
54 viewport.SetContent(defMsg)
55
56+ ctx, cancel := context.WithCancel(shrd.Session.Context())
57+
58 return Model{
59 shared: shrd,
60 state: stateReady,
61@@ -66,13 +71,15 @@ func NewModel(shrd common.SharedModel) Model {
62 logData: []map[string]any{},
63 input: im,
64 sub: make(chan map[string]any),
65+ ctx: ctx,
66+ done: cancel,
67 }
68 }
69
70 func (m Model) Init() tea.Cmd {
71 return tea.Batch(
72 m.connectLogs(m.sub),
73- waitForActivity(m.sub),
74+ m.waitForActivity(m.sub),
75 )
76 }
77
78@@ -86,6 +93,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
79 hh := headerHeight(m.shared)
80 m.viewport.Height = msg.Height - hh - inputHeight
81 m.viewport.SetContent(logsToStr(m.shared.Styles, m.logData, m.input.Value()))
82+
83 case logLineLoadedMsg:
84 m.logData = append(m.logData, msg)
85 lng := len(m.logData)
86@@ -100,7 +108,16 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
87 if wasAt {
88 m.viewport.GotoBottom()
89 }
90- cmds = append(cmds, waitForActivity(m.sub))
91+ cmds = append(cmds, m.waitForActivity(m.sub))
92+
93+ case pages.NavigateMsg:
94+ fmt.Println("NAV AWAY")
95+ // cancel activity logger
96+ m.done()
97+ // reset model
98+ next := NewModel(m.shared)
99+ return next, next.Init()
100+
101 case tea.KeyMsg:
102 switch msg.String() {
103 case "q", "esc":
104@@ -130,18 +147,22 @@ func (m Model) View() string {
105 return m.viewport.View() + "\n" + m.input.View()
106 }
107
108-func waitForActivity(sub chan map[string]any) tea.Cmd {
109+func (m Model) waitForActivity(sub chan map[string]any) tea.Cmd {
110 return func() tea.Msg {
111- result := <-sub
112- return logLineLoadedMsg(result)
113+ select {
114+ case result := <-sub:
115+ return logLineLoadedMsg(result)
116+ case <-m.ctx.Done():
117+ fmt.Println("CTX DONE")
118+ return nil
119+ }
120 }
121 }
122
123 func (m Model) connectLogs(sub chan map[string]any) tea.Cmd {
124 return func() tea.Msg {
125- stdoutPipe, err := shared.ConnectToLogs(m.shared.Session.Context())
126+ stdoutPipe, err := shared.ConnectToLogs(m.ctx)
127 if err != nil {
128- fmt.Println(err)
129 return nil
130 }
131