From 8a0a3a6487bafbbcd3e0ae630b7ba95bf8ce76ce Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 20 Feb 2020 00:25:16 +0200 Subject: Improve login view and add .well-known resolution --- ui/view-login.go | 64 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 21 deletions(-) (limited to 'ui') diff --git a/ui/view-login.go b/ui/view-login.go index 7fb61ea..b26fb3a 100644 --- a/ui/view-login.go +++ b/ui/view-login.go @@ -74,48 +74,73 @@ func (ui *GomuksUI) NewLoginView() mauview.Component { } hs := ui.gmx.Config().HS - view.homeserver.SetText(hs) - view.username.SetText(ui.gmx.Config().UserID) - view.password.SetMaskCharacter('*') + view.homeserver.SetPlaceholder("https://example.com").SetText(hs) + view.username.SetPlaceholder("@user:example.com").SetText(ui.gmx.Config().UserID) + view.password.SetPlaceholder("correct horse battery staple").SetMaskCharacter('*') view.quitButton.SetOnClick(func() { ui.gmx.Stop(true) }).SetBackgroundColor(tcell.ColorDarkCyan) view.loginButton.SetOnClick(view.Login).SetBackgroundColor(tcell.ColorDarkCyan) - view.SetColumns([]int{1, 10, 1, 9, 1, 9, 1, 10, 1}) - view.SetRows([]int{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}) - view.AddFormItem(view.username, 3, 1, 5, 1). - AddFormItem(view.password, 3, 3, 5, 1). - AddFormItem(view.homeserver, 3, 5, 5, 1). - AddFormItem(view.loginButton, 5, 7, 3, 1). - AddFormItem(view.quitButton, 1, 7, 3, 1). + view. + SetColumns([]int{1, 10, 1, 30, 1}). + SetRows([]int{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}) + view. + AddFormItem(view.username, 3, 1, 1, 1). + AddFormItem(view.password, 3, 3, 1, 1). + AddFormItem(view.homeserver, 3, 5, 1, 1). + AddFormItem(view.loginButton, 1, 7, 3, 1). + AddFormItem(view.quitButton, 1, 9, 3, 1). AddComponent(view.usernameLabel, 1, 1, 1, 1). AddComponent(view.passwordLabel, 1, 3, 1, 1). AddComponent(view.homeserverLabel, 1, 5, 1, 1) + view.SetOnFocusChanged(view.focusChanged) view.FocusNextItem() ui.loginView = view - view.container = mauview.Center(mauview.NewBox(view).SetTitle("Log in to Matrix"), 45, 11) + view.container = mauview.Center(mauview.NewBox(view).SetTitle("Log in to Matrix"), 45, 13) view.container.SetAlwaysFocusChild(true) return view.container } +func (view *LoginView) resolveWellKnown() { + _, homeserver, err := mautrix.ParseUserID(view.username.GetText()) + if err != nil { + return + } + view.homeserver.SetText("Resolving...") + resp, err := mautrix.DiscoverClientAPI(homeserver) + if err != nil { + view.homeserver.SetText("") + view.Error(err.Error()) + return + } + view.homeserver.SetText(resp.Homeserver.BaseURL) + view.parent.Render() +} + +func (view *LoginView) focusChanged(from, to mauview.Component) { + if from == view.username && view.homeserver.GetText() == "" { + go view.resolveWellKnown() + } +} + func (view *LoginView) Error(err string) { if len(err) == 0 && view.error != nil { debug.Print("Hiding error") view.RemoveComponent(view.error) - view.container.SetHeight(11) + view.container.SetHeight(13) view.SetRows([]int{1, 1, 1, 1, 1, 1, 1, 1, 1}) view.error = nil } else if len(err) > 0 { debug.Print("Showing error", err) if view.error == nil { view.error = mauview.NewTextView().SetTextColor(tcell.ColorRed) - view.AddComponent(view.error, 1, 9, 7, 1) + view.AddComponent(view.error, 1, 11, 3, 1) } view.error.SetText(err) errorHeight := int(math.Ceil(float64(mauview.StringWidth(err)) / 45)) - view.container.SetHeight(12 + errorHeight) - view.SetRow(9, errorHeight) + view.container.SetHeight(14 + errorHeight) + view.SetRow(11, errorHeight) } view.parent.Render() @@ -124,14 +149,11 @@ func (view *LoginView) Error(err string) { func (view *LoginView) actuallyLogin(hs, mxid, password string) { debug.Printf("Logging into %s as %s...", hs, mxid) view.config.HS = hs - err := view.matrix.InitClient() - if err != nil { + + if err := view.matrix.InitClient(); err != nil { debug.Print("Init error:", err) view.Error(err.Error()) - return - } - err = view.matrix.Login(mxid, password) - if err != nil { + } else if err = view.matrix.Login(mxid, password); err != nil { if httpErr, ok := err.(mautrix.HTTPError); ok { if httpErr.RespError != nil { view.Error(httpErr.RespError.Err) -- cgit v1.2.3