Skip to content

Commit ff7b4a7

Browse files
committed
Add spinner for signin
1 parent 9e70a5f commit ff7b4a7

File tree

4 files changed

+74
-32
lines changed

4 files changed

+74
-32
lines changed

internal/view/method_call.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,14 +300,13 @@ func (d *MethodCallDialog) callMethod() {
300300
}
301301

302302
d.app.QueueUpdateDraw(func() {
303-
// stop spinner
304-
d.spinner.StopAndHide()
305-
306303
if err != nil {
304+
d.spinner.StopAndHide() // must stop spinner before show error message
307305
log.Error("Method call is failed", "name", methodName, "args", args, "error", err)
308306
d.app.root.NotifyError(format.FineErrorMessage("Cannot call contract method '%s'.", methodName, err))
309307
} else {
310308
d.result.SetText(fmt.Sprint(res...))
309+
d.spinner.StopAndHide()
311310
}
312311
})
313312
}()

internal/view/query.go

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,28 +50,28 @@ func (d *QueryDialog) handleKey(key tcell.Key) {
5050
switch key {
5151
case tcell.KeyEnter:
5252
// start spinner
53-
d.setSpinnerRect()
54-
d.spinner.StartAndShow()
53+
d.Loading()
5554

5655
address := d.GetText()
56+
if address == "" {
57+
return
58+
}
59+
5760
go func() {
58-
if address != "" {
59-
account, err := d.app.service.GetAccount(address)
60-
d.app.QueueUpdateDraw(func() {
61-
// stop spinner
62-
d.spinner.StopAndHide()
63-
d.Hide()
64-
65-
if err != nil {
66-
log.Error("Failed to fetch account of given address",
67-
"address", address, "error", err)
68-
d.app.root.NotifyError(format.FineErrorMessage(
69-
"Failed to fetch account of address %s", address, err))
70-
} else {
71-
d.app.root.ShowAccountPage(account)
72-
}
73-
})
74-
}
61+
account, err := d.app.service.GetAccount(address)
62+
d.app.QueueUpdateDraw(func() {
63+
if err != nil {
64+
d.Finished() // must stop loading animation before show error message
65+
log.Error("Failed to fetch account of given address",
66+
"address", address, "error", err)
67+
d.app.root.NotifyError(format.FineErrorMessage(
68+
"Failed to fetch account of address %s", address, err))
69+
} else {
70+
d.app.root.ShowAccountPage(account)
71+
d.Finished()
72+
}
73+
74+
})
7575
}()
7676
case tcell.KeyEsc:
7777
d.Hide()
@@ -91,6 +91,18 @@ func (d *QueryDialog) Hide() {
9191
d.app.SetFocus(d.lastFocus)
9292
}
9393

94+
// Loading will set the location of spinner and show it
95+
func (d *QueryDialog) Loading() {
96+
d.setSpinnerRect()
97+
d.spinner.StartAndShow()
98+
}
99+
100+
// Finished will stop and hide spinner, as well as close current dialog
101+
func (d *QueryDialog) Finished() {
102+
d.spinner.StopAndHide()
103+
d.Hide()
104+
}
105+
94106
func (d *QueryDialog) Clear() {
95107
d.InputField.SetText("")
96108
}

internal/view/signin.go

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package view
33
import (
44
"github.com/dyng/ramen/internal/view/format"
55
"github.com/dyng/ramen/internal/view/style"
6+
"github.com/dyng/ramen/internal/view/util"
67
"github.com/ethereum/go-ethereum/log"
78
"github.com/gdamore/tcell/v2"
89
"github.com/rivo/tview"
@@ -13,12 +14,14 @@ type SignInDialog struct {
1314
app *App
1415
display bool
1516
lastFocus tview.Primitive
17+
spinner *util.Spinner
1618
}
1719

1820
func NewSignInDialog(app *App) *SignInDialog {
1921
d := &SignInDialog{
2022
app: app,
2123
display: false,
24+
spinner: util.NewSpinner(app.Application),
2225
}
2326

2427
// setup layout
@@ -46,19 +49,27 @@ func (d *SignInDialog) initLayout() {
4649
func (d *SignInDialog) handleKey(key tcell.Key) {
4750
switch key {
4851
case tcell.KeyEnter:
49-
// close dialog at first
50-
d.Hide()
52+
// start spinner
53+
d.Loading()
5154

5255
privateKey := d.GetText()
53-
if privateKey != "" {
54-
signer, err := d.app.service.GetSigner(privateKey)
55-
if err != nil {
56-
log.Error("Failed to create signer", "error", err)
57-
d.app.root.NotifyError(format.FineErrorMessage("Failed to create signer", err))
58-
} else {
59-
d.app.root.SignIn(signer)
60-
}
56+
if privateKey == "" {
57+
return
6158
}
59+
60+
go func() {
61+
signer, err := d.app.service.GetSigner(privateKey)
62+
d.app.QueueUpdateDraw(func() {
63+
if err != nil {
64+
d.Finished()
65+
log.Error("Failed to create signer", "error", err)
66+
d.app.root.NotifyError(format.FineErrorMessage("Failed to create signer", err))
67+
} else {
68+
d.app.root.SignIn(signer)
69+
d.Finished()
70+
}
71+
})
72+
}()
6273
case tcell.KeyEsc:
6374
d.Hide()
6475
}
@@ -77,6 +88,18 @@ func (d *SignInDialog) Hide() {
7788
d.app.SetFocus(d.lastFocus)
7889
}
7990

91+
// Loading will set the location of spinner and show it
92+
func (d *SignInDialog) Loading() {
93+
d.setSpinnerRect()
94+
d.spinner.StartAndShow()
95+
}
96+
97+
// Finished will stop and hide spinner, as well as close current dialog
98+
func (d *SignInDialog) Finished() {
99+
d.spinner.StopAndHide()
100+
d.Hide()
101+
}
102+
80103
func (d *SignInDialog) Clear() {
81104
d.InputField.SetText("")
82105
}
@@ -94,6 +117,7 @@ func (d *SignInDialog) Draw(screen tcell.Screen) {
94117
if d.display {
95118
d.InputField.Draw(screen)
96119
}
120+
d.spinner.Draw(screen)
97121
}
98122

99123
func (d *SignInDialog) SetCentral(x int, y int, width int, height int) {
@@ -114,3 +138,9 @@ func (d *SignInDialog) inputSize() (int, int) {
114138
height := d.GetFieldHeight() + 2
115139
return width, height
116140
}
141+
142+
func (d *SignInDialog) setSpinnerRect() {
143+
x, y, _, _ := d.GetInnerRect()
144+
sx := x + len(d.GetText()) + 1
145+
d.spinner.SetRect(sx, y, 0, 0)
146+
}

internal/view/util/spinner.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,6 @@ func (s *Spinner) Draw(screen tcell.Screen) {
103103
s.Box.DrawForSubclass(screen, s)
104104
x, y, _, _ := s.Box.GetInnerRect()
105105
frame := string(frames[s.counter])
106+
screen.HideCursor()
106107
tview.Print(screen, frame, x, y, 1, tview.AlignLeft, tcell.ColorDefault)
107108
}

0 commit comments

Comments
 (0)