Logs
Range-diff rd-106
- title
- refactor(tui): use vaxis
- description
-
Patch equal - old #1
9033000- new #1
9033000
- title
- chore(tui): setup page navigation
- description
-
Patch added - old #0
(none)- new #2
e191f12
1: 9033000 = 1: 9033000 refactor(tui): use vaxis
-: ------- > 2: e191f12 chore(tui): setup page navigation
old
new
old:
go.mod
new:go.mod
// replace git.sr.ht/~delthas/senpai => ../../senpai -// replace git.sr.ht/~rockorager/vaxis => ../../vaxis +replace git.sr.ht/~rockorager/vaxis => ../../../src/vaxis // replace github.com/charmbracelet/wish => ../../wish replace git.sr.ht/~delthas/senpai => github.com/antoniomika/senpai v0.0.0-20250114180426-3061ddccec76 -replace git.sr.ht/~rockorager/vaxis => github.com/antoniomika/vaxis v0.0.0-20250114030546-8524674789ca +// replace git.sr.ht/~rockorager/vaxis => github.com/antoniomika/vaxis v0.0.0-20250114030546-8524674789ca require ( git.sr.ht/~delthas/senpai v0.3.1-0.20240425235039-206be659439e - git.sr.ht/~rockorager/vaxis v0.10.3 + git.sr.ht/~rockorager/vaxis v0.12.1-0.20250219164615-8231ece877f3 github.com/alecthomas/chroma/v2 v2.14.0 github.com/antoniomika/syncmap v1.0.0 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de
old
new
old:
go.sum
new:go.sum
github.com/antoniomika/senpai v0.0.0-20250114180426-3061ddccec76/go.mod h1:HIPY7uPDy44ep6xKwfsW6JTmDUTiC5DXh0l4yZP/aT4= github.com/antoniomika/syncmap v1.0.0 h1:iFSfbQFQOvHZILFZF+hqWosO0no+W9+uF4y2VEyMKWU= github.com/antoniomika/syncmap v1.0.0/go.mod h1:fK2829foEYnO4riNfyUn0SHQZt4ue3DStYjGU+sJj38= -github.com/antoniomika/vaxis v0.0.0-20250114030546-8524674789ca h1:vD1Ioetf2ikrlkvHu7FIpbPgtMIJpaU16YRR+HA+/2Y= -github.com/antoniomika/vaxis v0.0.0-20250114030546-8524674789ca/go.mod h1:h94aKek3frIV1hJbdXjqnBqaLkbWXvV+UxAsQHg9bns= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
old
new
old:
pico/ssh_vaxis.go
new:pico/ssh_vaxis.go
"github.com/charmbracelet/wish" "github.com/picosh/pico/db/postgres" "github.com/picosh/pico/shared" + "github.com/picosh/pico/tui/common" "github.com/picosh/pico/tuivax" wsh "github.com/picosh/pico/wish" "github.com/picosh/send/auth" ) func createRouterVaxis(cfg *shared.ConfigSite, handler *UploadHandler, cliHandler *CliHandler) proxy.Router { - return func(sh ssh.Handler, s ssh.Session) []wish.Middleware { + return func(sh ssh.Handler, sesh ssh.Session) []wish.Middleware { + shrd := &common.SharedModel{ + Session: sesh, + Cfg: cfg, + Dbpool: handler.DBPool, + Width: 80, + Height: 24, + Logger: cfg.Logger, + } return []wish.Middleware{ pipe.Middleware(handler, ""), list.Middleware(handler), scp.Middleware(handler), wishrsync.Middleware(handler), auth.Middleware(handler), - wsh.PtyMdw(createTui()), + wsh.PtyMdw(createTui(shrd)), WishMiddleware(cliHandler), wsh.LogMiddleware(handler.GetLogger()), } } } -func createTui() wish.Middleware { +func createTui(shrd *common.SharedModel) wish.Middleware { return func(next ssh.Handler) ssh.Handler { return func(sesh ssh.Session) { vty, err := shared.NewVConsole(sesh) opts := vaxis.Options{ WithConsole: vty, } - tuivax.NewTui(opts) + tuivax.NewTui(opts, shrd) } } }
old
new
old:
tui/pages/pages.go
new:tui/pages/pages.go
package pages -import tea "github.com/charmbracelet/bubbletea" +import ( + "git.sr.ht/~rockorager/vaxis/vxfw" + tea "github.com/charmbracelet/bubbletea" +) type Page int } } +func NavigateVx(page Page) vxfw.Command { + return NavigateMsg{page} +} + func ToTitle(page Page) string { switch page { case CreateAccountPage:
old
new
old:
tuivax/ui.go
new:tuivax/ui.go
package tuivax import ( + "fmt" + "git.sr.ht/~rockorager/vaxis" + "git.sr.ht/~rockorager/vaxis/widgets/list" + "github.com/picosh/pico/tui/common" ) -func NewTui(opts vaxis.Options) { +var menuChoices = []string{ + "pubkeys", + "tokens", + "settings", + "logs", + "analytics", + "chat", + "pico+", +} + +type UIVx struct { + shared *common.SharedModel + vx *vaxis.Vaxis + + page string + quit bool + menu list.List +} + +type Navigate struct { + To string +} + +type Quit struct{} + +func (ui *UIVx) menuPage(win vaxis.Window, ev vaxis.Event) { + switch msg := ev.(type) { + case vaxis.Key: + switch msg.String() { + case "Ctrl+c", "q", "Escape": + ui.quit = true + case "Down", "j": + ui.menu.Down() + case "Up", "k": + ui.menu.Up() + case "Enter": + ui.page = menuChoices[ui.menu.Index()] + } + } + ui.menu.Draw(win) +} + +func (ui *UIVx) keysPage(win vaxis.Window, ev vaxis.Event) { + switch msg := ev.(type) { + case vaxis.Key: + switch msg.String() { + case "Ctrl+c": + ui.quit = true + case "q", "Escape": + ui.page = "menu" + } + } + win.Print(vaxis.Segment{Text: "Hello, World!"}) +} + +func NewTui(opts vaxis.Options, shared *common.SharedModel) { vx, err := vaxis.New(opts) if err != nil { panic(err) } defer vx.Close() + + ui := UIVx{ + shared: shared, + vx: vx, + + page: "menu", + menu: list.New(menuChoices), + } + for ev := range vx.Events() { - switch ev := ev.(type) { - case vaxis.Key: - switch ev.String() { - case "Ctrl+c": - return - case "q": - return - case "Escape": - return - } - } win := vx.Window() win.Clear() - win.Print(vaxis.Segment{Text: "Hello, World!"}) + + // header + win.Print(vaxis.Segment{ + Text: fmt.Sprintf("pico.sh • %s", ui.page), + }) + + // page window + width, height := win.Size() + pageWin := win.New(0, 2, width, height-2) + + switch ui.page { + case "menu": + ui.menuPage(pageWin, ev) + case "pubkeys": + ui.keysPage(pageWin, ev) + } + + if ui.quit { + return + } + vx.Render() } }