summaryrefslogtreecommitdiff
path: root/tui.go
blob: c131110282c5780402b2a383ee80d0d9bfcc3d64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package main

import (
	"os"

	tea "github.com/charmbracelet/bubbletea"
	"github.com/charmbracelet/bubbles/viewport"
)

type TUIModel struct {
	State *BrowserState
	Viewport viewport.Model
	inited bool
}

func NewTUIModel(state *BrowserState) *TUIModel {
	return &TUIModel{State: state}
}

func (model *TUIModel) Init() tea.Cmd {
	return nil
}

func (model *TUIModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
	switch msg := msg.(type) {
	case tea.KeyMsg:
		switch msg.String() {
		case "ctrl+c", "q":
			return model, tea.Quit
		case "g":
			model.Viewport.GotoTop()
			return model, nil
		case "G":
			model.Viewport.GotoBottom()
			return model, nil
		}
	case tea.WindowSizeMsg:
		model.inited = true
		model.Viewport.Width = msg.Width
		model.Viewport.Height = msg.Height - 1
	}

	var cmd tea.Cmd
	model.Viewport, cmd = model.Viewport.Update(msg)

	return model, cmd
}

func (model *TUIModel) View() string {
	return model.Viewport.View()
}

func runTUI(state *BrowserState, args []string) {
	model := NewTUIModel(state)
	state.Printer = (*TUIPrinter)(model)

	if len(args) > 0 {
		if err := Go(state, args[0]); err != nil {
			writeError(err.Error())
		}
	}

	p := tea.NewProgram(model, tea.WithAltScreen())
	if _, err := p.Run(); err != nil {
		writeError(err.Error())
		os.Exit(1)
	}
}

type TUIPrinter TUIModel

func (p *TUIPrinter) PrintModal(state *BrowserState, contents []byte) error {
	(*TUIModel)(p).Viewport.SetContent(string(contents))
	return nil
}

func (p *TUIPrinter) PrintPage(state *BrowserState, body string) error {
	(*TUIModel)(p).Viewport.SetContent(body)
	return nil
}