package app import ( "os" "git.brettb.xyz/goinv/client/internal/api" "git.brettb.xyz/goinv/client/internal/ui/assets" "git.brettb.xyz/goinv/client/internal/ui/help" "git.brettb.xyz/goinv/client/internal/ui/utils" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" "go.uber.org/zap" ) type App struct { *tview.Application APIClient *api.APIClient pages *tview.Pages logger *zap.Logger help *help.Help assets *assets.Assets menu *tview.TextView currentPage string needInitUI bool } func NewApp(name, version, host string, logger *zap.Logger) *App { sugar := logger.Sugar() sugar.Debug("creating app") app := App{ Application: tview.NewApplication(), APIClient: api.NewAPIClient(host), pages: tview.NewPages(), logger: logger, needInitUI: false, } app.assets = assets.NewAssets(logger, app.APIClient) app.help = help.NewHelp(name, version) menuItems := [][]string{ {utils.HelpScreenKey.Label(), app.help.GetTitle()}, {utils.AssetsScreenKey.Label(), app.assets.GetTitle()}, } app.menu = makeMenu(menuItems) app.pages.AddPage(app.help.GetTitle(), app.help, true, false) app.pages.AddPage(app.assets.GetTitle(), app.assets, true, false) return &app } func (app *App) Run() error { app.logger.Info("starting app") flex := tview.NewFlex(). SetDirection(tview.FlexRow). AddItem(app.pages, 0, 1, false). AddItem(app.menu, 1, 1, false) app.initUI() app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == utils.AppExitKey.Key { app.logger.Info("stopping app") app.Stop() os.Exit(0) } if !app.frontScreenHasActiveDialog() { event = utils.ParseKeyEventKey(app.logger, event) // Next & Previous Screen switch event.Rune() { case utils.NextScreenKey.Rune(): app.switchToNextScreen() return nil case utils.PreviousScreenKey.Rune(): app.switchToPreviousScreen() } // Normal page key switch switch event.Key() { case utils.HelpScreenKey.EventKey(): app.switchToScreen(app.help.GetTitle()) return nil case utils.AssetsScreenKey.EventKey(): app.switchToScreen(app.assets.GetTitle()) return nil } } return event }) app.currentPage = app.assets.GetTitle() app.pages.SwitchToPage(app.currentPage) // start the refresh loop go app.refresh() if err := app.SetRoot(flex, true).SetFocus(app.assets).EnableMouse(false).Run(); err != nil { return err } return nil }