dashboard / erock/pico / refactor(tui): use vaxis #48 rss

accepted · opened on 2025-02-24T12:55:08Z by erock
Help
checkout latest patchset:
ssh pr.pico.sh print pr-48 | git am -3
checkout any patchset in a patch request:
ssh pr.pico.sh print ps-X | git am -3
add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 48
add review to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add --review 48
accept PR:
ssh pr.pico.sh pr accept 48
close PR:
ssh pr.pico.sh pr close 48

Logs

erock created pr with ps-105 on 2025-02-24T12:55:08Z
erock added ps-106 on 2025-02-25T01:16:25Z
erock changed status on 2025-03-13T14:53:20Z {"status":"accepted"}

Patchsets

ps-105 by erock on 2025-02-24T12:55:08Z
Range Diff ↕ rd-106
1: 9033000 = 1: 9033000 refactor(tui): use vaxis
-: ------- > 2: e191f12 chore(tui): setup page navigation
ps-106 by erock on 2025-02-25T01:16:25Z

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
Back to top
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()
 	}
 }