Skip to content

Commit 83fb7c5

Browse files
committed
feat(tui): implement single-package update task and shortcut (u)
1 parent d5fbe5d commit 83fb7c5

1 file changed

Lines changed: 78 additions & 5 deletions

File tree

go/tui/tui.go

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -841,10 +841,17 @@ func (m TuiModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
841841
}
842842
}
843843
case "u":
844-
m.loading = true
845-
m.statusMsg = "Checking for updates…"
846-
m.checkingUpdates = true
847-
return m, m.checkForUpdatesCmd()
844+
items := m.getActiveItems()
845+
if len(items) > 0 && m.selectedIndex < len(items) {
846+
pkg := items[m.selectedIndex]
847+
if pkg.Installed && !m.taskActive {
848+
m.taskActive = true
849+
m.statusMsg = fmt.Sprintf("Updating %s…", pkg.ShortName)
850+
if Program != nil {
851+
m.RunUpdatePackageTask(pkg.Name, pkg.ShortName, pkg.Kind, pkg.LocalSource, Program)
852+
}
853+
}
854+
}
848855
case "g":
849856
if m.ctx != nil {
850857
m.settingsInstallMode = m.ctx.Settings.InstallMode
@@ -2513,7 +2520,6 @@ func (m TuiModel) renderStatusBar(w int) string {
25132520
line1Parts = append(line1Parts, barKeyStyle.Render("s") + barStyle.Render(" save changes · "))
25142521
}
25152522
line1Parts = append(line1Parts,
2516-
barKeyStyle.Render("u") + barStyle.Render(" updates · "),
25172523
barKeyStyle.Render("g") + barStyle.Render(" settings"),
25182524
)
25192525

@@ -2540,6 +2546,18 @@ func (m TuiModel) renderStatusBar(w int) string {
25402546
barKeyStyle.Render("↑↓") + barStyle.Render(" move"),
25412547
barKeyStyle.Render("Space") + barStyle.Render(" toggle"),
25422548
barKeyStyle.Render("c") + barStyle.Render(" manage"),
2549+
)
2550+
2551+
items := m.getActiveItems()
2552+
hasHoveredInstalled := false
2553+
if len(items) > 0 && m.selectedIndex < len(items) {
2554+
hasHoveredInstalled = items[m.selectedIndex].Installed
2555+
}
2556+
if hasHoveredInstalled {
2557+
shortcutParts = append(shortcutParts, barKeyStyle.Render("u") + barStyle.Render(" update"))
2558+
}
2559+
2560+
shortcutParts = append(shortcutParts,
25432561
serverShortcut,
25442562
barKeyStyle.Render("r") + barStyle.Render(" refresh"),
25452563
barKeyStyle.Render("q") + barStyle.Render(" quit"),
@@ -3129,6 +3147,61 @@ func (m *TuiModel) RunSetupTask(adds map[string]string, p *tea.Program) {
31293147
}()
31303148
}
31313149

3150+
func (m *TuiModel) RunUpdatePackageTask(pkgName string, shortName string, kind string, isLocalSource bool, p *tea.Program) {
3151+
go func() {
3152+
p.Send(clearLogsMsg{})
3153+
p.Send(logLineMsg(fmt.Sprintf(">>> Starting update for %s…", shortName)))
3154+
3155+
desktopJs := filepath.Join(m.workspaceRoot, "packages", "cli", "bin", "desktop.js")
3156+
3157+
if isLocalSource {
3158+
kindDir := ""
3159+
switch kind {
3160+
case "app":
3161+
kindDir = "apps"
3162+
case "module":
3163+
kindDir = "packages"
3164+
case "theme":
3165+
kindDir = "themes"
3166+
}
3167+
3168+
if kindDir != "" {
3169+
pkgPath := filepath.Join(m.workspaceRoot, kindDir, shortName)
3170+
p.Send(logLineMsg(fmt.Sprintf(">>> Running git pull in %s…", pkgPath)))
3171+
if err := runProcessAndStreamLogsSilent(pkgPath, "git", []string{"pull"}, p); err != nil {
3172+
p.Send(logLineMsg(fmt.Sprintf(">>> Git pull failed: %v", err)))
3173+
p.Send(taskFinishedMsg{Success: false, Err: err})
3174+
return
3175+
}
3176+
}
3177+
} else {
3178+
p.Send(logLineMsg(fmt.Sprintf(">>> Re-installing %s from NPM to get latest version…", shortName)))
3179+
args := []string{desktopJs, "add", shortName, "--npm"}
3180+
if err := runProcessAndStreamLogsSilent(m.workspaceRoot, "node", args, p); err != nil {
3181+
p.Send(logLineMsg(fmt.Sprintf(">>> NPM update failed: %v", err)))
3182+
p.Send(taskFinishedMsg{Success: false, Err: err})
3183+
return
3184+
}
3185+
}
3186+
3187+
// Run pnpm install
3188+
p.Send(logLineMsg(">>> Running pnpm install (syncing workspace)…"))
3189+
if err := runProcessAndStreamLogsSilent(m.workspaceRoot, "pnpm", []string{"install"}, p); err != nil {
3190+
p.Send(taskFinishedMsg{Success: false, Err: err})
3191+
return
3192+
}
3193+
3194+
// Rebuild stubs
3195+
p.Send(logLineMsg(">>> Rebuilding stubs…"))
3196+
if err := runProcessAndStreamLogsSilent(m.workspaceRoot, "pnpm", []string{"run", "prepare:modules"}, p); err != nil {
3197+
p.Send(taskFinishedMsg{Success: false, Err: err})
3198+
return
3199+
}
3200+
3201+
p.Send(taskFinishedMsg{Success: true})
3202+
}()
3203+
}
3204+
31323205
func (m *TuiModel) RunServeTask(p *tea.Program) {
31333206
go func() {
31343207
if m.ctx == nil {

0 commit comments

Comments
 (0)