@@ -23,8 +23,6 @@ import (
2323 "strings"
2424
2525 "github.com/charmbracelet/huh"
26- "github.com/charmbracelet/huh/spinner"
27- "github.com/charmbracelet/lipgloss"
2826 "github.com/livekit/livekit-cli/v2/pkg/bootstrap"
2927 "github.com/livekit/livekit-cli/v2/pkg/config"
3028 "github.com/livekit/livekit-cli/v2/pkg/util"
@@ -146,54 +144,61 @@ func requireProject(ctx context.Context, cmd *cli.Command) (context.Context, err
146144 if project != nil {
147145 return ctx , nil
148146 }
147+ if _ , err = loadProjectConfig (ctx , cmd ); err != nil {
148+ // something is wrong with config file
149+ return nil , err
150+ }
149151 if project , err = loadProjectDetails (cmd ); err != nil {
150152 if errors .Is (err , config .ErrInvalidConfig ) {
151153 return ctx , err
152154 }
153- if _ , err = loadProjectConfig (ctx , cmd ); err != nil {
154- // something is wrong with config file
155+ // choose from existing credentials or authenticate
156+ return selectProject (ctx , cmd )
157+ }
158+
159+ return nil , err
160+ }
161+
162+ func selectProject (ctx context.Context , cmd * cli.Command ) (context.Context , error ) {
163+ var err error
164+
165+ if cliConfig != nil && len (cliConfig .Projects ) > 0 {
166+ var options []huh.Option [* config.ProjectConfig ]
167+ for _ , p := range cliConfig .Projects {
168+ options = append (options , huh .NewOption (p .Name + " [" + util .ExtractSubdomain (p .URL )+ "]" , & p ))
169+ }
170+ if err = huh .NewForm (
171+ huh .NewGroup (huh .NewSelect [* config.ProjectConfig ]().
172+ Title ("Select a project to use for this action" ).
173+ Description ("To use a different project, run `lk cloud auth` to add credentials" ).
174+ Options (options ... ).
175+ Value (& project ).
176+ WithTheme (util .Theme ))).
177+ Run (); err != nil {
155178 return nil , err
156179 }
157-
158- // choose from existing credentials or authenticate
159- if len (cliConfig .Projects ) > 0 {
160- var options []huh.Option [* config.ProjectConfig ]
161- for _ , p := range cliConfig .Projects {
162- options = append (options , huh .NewOption (p .Name + " [" + util .ExtractSubdomain (p .URL )+ "]" , & p ))
163- }
164- if err = huh .NewForm (
165- huh .NewGroup (huh .NewSelect [* config.ProjectConfig ]().
166- Title ("Select a project to use for this action" ).
167- Description ("To use a different project, run `lk cloud auth` to add credentials" ).
168- Options (options ... ).
169- Value (& project ).
170- WithTheme (util .Theme ))).
171- Run (); err != nil {
180+ } else {
181+ shouldAuth := true
182+ if err = huh .NewConfirm ().
183+ Title ("No local projects found. Authenticate one?" ).
184+ Inline (true ).
185+ Value (& shouldAuth ).
186+ WithTheme (util .Theme ).
187+ Run (); err != nil {
188+ return nil , err
189+ }
190+ if shouldAuth {
191+ initAuth (ctx , cmd )
192+ if err = tryAuthIfNeeded (ctx , cmd ); err != nil {
172193 return nil , err
173194 }
195+ return requireProject (ctx , cmd )
174196 } else {
175- shouldAuth := true
176- if err = huh .NewConfirm ().
177- Title ("No local projects found. Authenticate one?" ).
178- Inline (true ).
179- Value (& shouldAuth ).
180- WithTheme (util .Theme ).
181- Run (); err != nil {
182- return nil , err
183- }
184- if shouldAuth {
185- initAuth (ctx , cmd )
186- if err = tryAuthIfNeeded (ctx , cmd ); err != nil {
187- return nil , err
188- }
189- return requireProject (ctx , cmd )
190- } else {
191- return nil , ErrNoProjectSelected
192- }
197+ return nil , ErrNoProjectSelected
193198 }
194199 }
195200
196- return nil , err
201+ return ctx , nil
197202}
198203
199204func listTemplates (ctx context.Context , cmd * cli.Command ) error {
@@ -376,13 +381,12 @@ func cloneTemplate(_ context.Context, cmd *cli.Command, url, appName string) err
376381 tempName , relocate , cleanup := util .UseTempPath (appName )
377382 defer cleanup ()
378383
379- if err := spinner . New ().
380- Title ( "Cloning template from " + url ).
381- Action ( func () {
384+ if err := util . Await (
385+ "Cloning template from " + url ,
386+ func () {
382387 stdout , stderr , cmdErr = bootstrap .CloneTemplate (url , tempName )
383- }).
384- Style (util .Theme .Focused .Title ).
385- Run (); err != nil {
388+ },
389+ ); err != nil {
386390 return err
387391 }
388392
@@ -484,13 +488,10 @@ func doPostCreate(ctx context.Context, _ *cli.Command, rootPath string, verbose
484488 }
485489
486490 var cmdErr error
487- if err := spinner .New ().
488- Title ("Cleaning up..." ).
489- TitleStyle (lipgloss .NewStyle ()).
490- Style (lipgloss .NewStyle ()).
491- Action (func () { cmdErr = task () }).
492- Accessible (true ).
493- Run (); err != nil {
491+ if err := util .Await (
492+ "Cleaning up..." ,
493+ func () { cmdErr = task () },
494+ ); err != nil {
494495 return err
495496 }
496497 return cmdErr
@@ -508,12 +509,10 @@ func doInstall(ctx context.Context, task bootstrap.KnownTask, rootPath string, v
508509 }
509510
510511 var cmdErr error
511- if err := spinner .New ().
512- Title ("Installing..." ).
513- Action (func () { cmdErr = install () }).
514- Style (util .Theme .Focused .Title ).
515- Accessible (true ).
516- Run (); err != nil {
512+ if err := util .Await (
513+ "Installing..." ,
514+ func () { cmdErr = install () },
515+ ); err != nil {
517516 return err
518517 }
519518 return cmdErr
@@ -550,12 +549,10 @@ func runTask(ctx context.Context, cmd *cli.Command) error {
550549 return err
551550 }
552551 var cmdErr error
553- if err := spinner .New ().
554- Title ("Running task " + taskName + "..." ).
555- Action (func () { cmdErr = task () }).
556- Style (util .Theme .Focused .Title ).
557- Accessible (verbose ).
558- Run (); err != nil {
552+ if err := util .Await (
553+ "Running task " + taskName + "..." ,
554+ func () { cmdErr = task () },
555+ ); err != nil {
559556 return err
560557 }
561558 return cmdErr
0 commit comments