@@ -13,6 +13,7 @@ import (
1313 "time"
1414
1515 "github.com/charmbracelet/bubbles/key"
16+ "github.com/charmbracelet/bubbles/viewport"
1617 tea "github.com/charmbracelet/bubbletea"
1718 "github.com/charmbracelet/lipgloss"
1819 "github.com/charmbracelet/lipgloss/table"
@@ -55,6 +56,7 @@ type model struct {
5556 expandedFields map [string ]struct {}
5657 ongoingUserAction bool
5758 currentTime time.Time
59+ viewport viewport.Model
5860 addDeviceModal AddDeviceModel
5961 confirmRevertLocalChangesModal ConfirmRevertLocalAdditions
6062 putConfig PutConfig
@@ -161,7 +163,7 @@ var quitKeys = key.NewBinding(
161163 key .WithHelp ("" , "press q to quit" ),
162164)
163165
164- func NewModel (appVersion string ) model {
166+ func New (appVersion string ) model {
165167 var dump * os.File
166168 if _ , ok := os .LookupEnv ("DEBUG" ); ok {
167169 var err error
@@ -198,6 +200,7 @@ func NewModel(appVersion string) model {
198200 dump : dump ,
199201 appVersion : appVersion ,
200202 err : err ,
203+ viewport : viewport .New (0 , 0 ),
201204 expandedFields : make (map [string ]struct {}),
202205 pendingDevices : make (map [string ]PendingDevice ),
203206 currentTime : time .Now (),
@@ -287,6 +290,12 @@ type FetchedPendingDevices struct {
287290}
288291
289292func (m model ) Update (msg tea.Msg ) (tea.Model , tea.Cmd ) {
293+ m , cmd := Update (m , msg )
294+ m .viewport .SetContent (m .ViewPortContent ())
295+ return m , cmd
296+ }
297+
298+ func Update (m model , msg tea.Msg ) (model , tea.Cmd ) {
290299 if m .dump != nil {
291300 spew .Fdump (m .dump , msg )
292301 }
@@ -307,7 +316,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
307316 case key .Matches (msg , quitKeys ):
308317 return m , tea .Quit
309318 default :
310- return m , nil
319+ var cmd tea.Cmd
320+ m .viewport , cmd = m .viewport .Update (msg )
321+ return m , cmd
311322 }
312323 case tea.MouseMsg :
313324 if m .addDeviceModal .Show {
@@ -323,10 +334,14 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
323334 return handleMouseLeftClick (m , msg )
324335 }
325336
326- return m , nil
337+ var cmd tea.Cmd
338+ m .viewport , cmd = m .viewport .Update (msg )
339+ return m , cmd
327340 case tea.WindowSizeMsg :
328341 m .width = msg .Width
329342 m .height = msg .Height
343+ m .viewport .Height = msg .Height
344+ m .viewport .Width = msg .Width
330345 return m , nil
331346 case FetchedEventsMsg :
332347 if msg .err != nil {
@@ -814,24 +829,7 @@ func (m model) View() string {
814829 return m .err .Error ()
815830 }
816831
817- pendingDevices := lo .Values (m .pendingDevices )
818- sort .Sort (PendingDeviceList (pendingDevices ))
819-
820- main := lipgloss .NewStyle ().MaxHeight (m .height ).Render (
821- lipgloss .JoinVertical (lipgloss .Center ,
822- viewPendingDevices (pendingDevices ),
823- lipgloss .JoinHorizontal (lipgloss .Top ,
824- viewFolders (m .folders , m .expandedFields ),
825- lipgloss .JoinVertical (lipgloss .Left ,
826- viewStatus (
827- m .thisDeviceStatus ,
828- m .folders ,
829- m .version ,
830- m .appVersion ,
831- ),
832-
833- viewDevices (m .devices , m .currentTime , m .expandedFields ),
834- ))))
832+ main := m .viewport .View ()
835833
836834 if m .addDeviceModal .Show {
837835 modal := m .addDeviceModal .View ()
@@ -854,6 +852,29 @@ func (m model) View() string {
854852 return zone .Scan (main )
855853}
856854
855+ func (m model ) ViewPortContent () string {
856+ pendingDevices := lo .Values (m .pendingDevices )
857+ sort .Sort (PendingDeviceList (pendingDevices ))
858+
859+ main := lipgloss .NewStyle ().Render (
860+ lipgloss .JoinVertical (lipgloss .Center ,
861+ viewPendingDevices (pendingDevices ),
862+ lipgloss .JoinHorizontal (lipgloss .Top ,
863+ viewFolders (m .folders , m .expandedFields ),
864+ lipgloss .JoinVertical (lipgloss .Left ,
865+ viewStatus (
866+ m .thisDeviceStatus ,
867+ m .folders ,
868+ m .version ,
869+ m .appVersion ,
870+ ),
871+
872+ viewDevices (m .devices , m .currentTime , m .expandedFields ),
873+ ))))
874+
875+ return main
876+ }
877+
857878func viewConfirmRevertLocalChangesFolder () string {
858879 width := 60 // TODO VERIFY MODAL WIDTH
859880 header := lipgloss .NewStyle ().
0 commit comments