Skip to content

Commit d0d17cb

Browse files
Show tutorial bubble when clicking try it now from portal
ref #1905
2 parents ab20035 + 11fefee commit d0d17cb

File tree

25 files changed

+284
-2
lines changed

25 files changed

+284
-2
lines changed

pkg/auth/deps.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@ var DependencySet = wire.NewSet(
5555

5656
wire.Bind(new(webapp.GraphService), new(*interaction.Service)),
5757
wire.Bind(new(webapp.CookieManager), new(*httputil.CookieManager)),
58+
wire.Bind(new(webapp.TutorialMiddlewareTutorialCookie), new(*httputil.TutorialCookie)),
5859
wire.Bind(new(handlerwebapp.CookieManager), new(*httputil.CookieManager)),
5960
wire.Bind(new(oauthhandler.CookieManager), new(*httputil.CookieManager)),
61+
wire.Bind(new(handlerwebapp.TutorialCookie), new(*httputil.TutorialCookie)),
6062

6163
wire.Bind(new(handlerwebapp.SelectAccountAuthenticationInfoService), new(*authenticationinfo.StoreRedis)),
6264

pkg/auth/handler/webapp/login.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ func ConfigureLoginRoute(route httproute.Route) httproute.Route {
3737
WithPathPattern("/login")
3838
}
3939

40+
type TutorialCookie interface {
41+
Pop(r *http.Request, rw http.ResponseWriter, name httputil.TutorialCookieName) bool
42+
}
43+
4044
type LoginViewModel struct {
4145
AllowLoginOnly bool
4246
}
@@ -47,6 +51,7 @@ type LoginHandler struct {
4751
FormPrefiller *FormPrefiller
4852
Renderer Renderer
4953
AnalyticService AnalyticService
54+
TutorialCookie TutorialCookie
5055
}
5156

5257
func (h *LoginHandler) GetData(r *http.Request, rw http.ResponseWriter, graph *interaction.Graph, allowLoginOnly bool) (map[string]interface{}, error) {
@@ -56,6 +61,9 @@ func (h *LoginHandler) GetData(r *http.Request, rw http.ResponseWriter, graph *i
5661
AllowLoginOnly: allowLoginOnly,
5762
}
5863
viewmodels.EmbedForm(data, r.Form)
64+
if h.TutorialCookie.Pop(r, rw, httputil.SignupLoginTutorialCookieName) {
65+
baseViewModel.SetTutorial(httputil.SignupLoginTutorialCookieName)
66+
}
5967
viewmodels.Embed(data, baseViewModel)
6068
authenticationViewModel := viewmodels.NewAuthenticationViewModelWithGraph(graph)
6169
viewmodels.Embed(data, authenticationViewModel)

pkg/auth/handler/webapp/settings.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ type SettingsHandler struct {
6262
Identities SettingsIdentityService
6363
Verification SettingsVerificationService
6464
AccountDeletion *config.AccountDeletionConfig
65+
TutorialCookie TutorialCookie
6566
}
6667

6768
func (h *SettingsHandler) GetData(r *http.Request, rw http.ResponseWriter) (map[string]interface{}, error) {
@@ -71,6 +72,9 @@ func (h *SettingsHandler) GetData(r *http.Request, rw http.ResponseWriter) (map[
7172

7273
// BaseViewModel
7374
baseViewModel := h.BaseViewModel.ViewModel(r, rw)
75+
if h.TutorialCookie.Pop(r, rw, httputil.SettingsTutorialCookieName) {
76+
baseViewModel.SetTutorial(httputil.SettingsTutorialCookieName)
77+
}
7478
viewmodels.Embed(data, baseViewModel)
7579

7680
// SettingsViewModel

pkg/auth/handler/webapp/signup.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,16 @@ type SignupHandler struct {
4949
FormPrefiller *FormPrefiller
5050
Renderer Renderer
5151
AnalyticService AnalyticService
52+
TutorialCookie TutorialCookie
5253
}
5354

5455
func (h *SignupHandler) GetData(r *http.Request, rw http.ResponseWriter, graph *interaction.Graph) (map[string]interface{}, error) {
5556
data := make(map[string]interface{})
5657
baseViewModel := h.BaseViewModel.ViewModel(r, rw)
5758
viewmodels.EmbedForm(data, r.Form)
59+
if h.TutorialCookie.Pop(r, rw, httputil.SignupLoginTutorialCookieName) {
60+
baseViewModel.SetTutorial(httputil.SignupLoginTutorialCookieName)
61+
}
5862
viewmodels.Embed(data, baseViewModel)
5963
authenticationViewModel := viewmodels.NewAuthenticationViewModelWithGraph(graph)
6064
viewmodels.Embed(data, authenticationViewModel)

pkg/auth/handler/webapp/template.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ var TemplateWebWatermarkHTML = template.RegisterHTML("web/__watermark.html")
1919
var TemplateWebRecoveryCodeHTML = template.RegisterHTML("web/__recovery_code.html")
2020
var TemplateWebPasswordInputHTML = template.RegisterHTML("web/__password_input.html")
2121
var TemplateWebPasswordStrengthMeterHTML = template.RegisterHTML("web/__password_strength_meter.html")
22+
var TemplateWebTutorialHTML = template.RegisterHTML("web/__tutorial.html")
2223

2324
var components = []*template.HTML{
2425
TemplateWebHTMLHeadHTML,
@@ -36,6 +37,7 @@ var components = []*template.HTML{
3637
TemplateWebRecoveryCodeHTML,
3738
TemplateWebPasswordInputHTML,
3839
TemplateWebPasswordStrengthMeterHTML,
40+
TemplateWebTutorialHTML,
3941
}
4042

4143
var TemplateWebRecoveryCodeTXT = template.RegisterPlainText("web/__recovery_code.txt")

pkg/auth/handler/webapp/viewmodels/base.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ type BaseViewModel struct {
5858
// IsSupportedMobilePlatform is true when the user agent is iOS or Android.
5959
IsSupportedMobilePlatform bool
6060
GoogleTagManagerContainerID string
61+
TutorialMessageType string
6162
}
6263

6364
func (m *BaseViewModel) SetError(err error) {
@@ -92,6 +93,10 @@ func (m *BaseViewModel) SetFormJSON(form url.Values) {
9293
m.FormJSON = string(b)
9394
}
9495

96+
func (m *BaseViewModel) SetTutorial(name httputil.TutorialCookieName) {
97+
m.TutorialMessageType = string(name)
98+
}
99+
95100
type StaticAssetResolver interface {
96101
StaticAssetURL(id string) (url string, err error)
97102
}

pkg/auth/routes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ func NewRouter(p *deps.RootProvider, configSource *configsource.ConfigSource) *h
8383
p.Middleware(newWebAppUILocalesMiddleware),
8484
p.Middleware(newWebAppWeChatRedirectURIMiddleware),
8585
p.Middleware(newWebAppClientIDMiddleware),
86+
p.Middleware(newTutorialMiddleware),
8687
)
8788
webappSSOCallbackChain := httproute.Chain(
8889
webappChain,

pkg/auth/webapp/deps.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ var DependencySet = wire.NewSet(
2626
wire.Struct(new(VisitorIDMiddleware), "*"),
2727
wire.Struct(new(SettingsSubRoutesMiddleware), "*"),
2828
wire.Struct(new(SuccessPageMiddleware), "*"),
29+
wire.Struct(new(TutorialMiddleware), "*"),
2930

3031
NewPublicOriginMiddlewareLogger,
3132
wire.Struct(new(PublicOriginMiddleware), "*"),
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package webapp
2+
3+
import (
4+
"net/http"
5+
)
6+
7+
//go:generate mockgen -source=tutorial_middleware.go -destination=tutorial_middleware_mock_test.go -package webapp
8+
9+
type TutorialMiddlewareTutorialCookie interface {
10+
SetAll(rw http.ResponseWriter)
11+
}
12+
13+
type TutorialMiddleware struct {
14+
TutorialCookie TutorialMiddlewareTutorialCookie
15+
}
16+
17+
func (m *TutorialMiddleware) Handle(next http.Handler) http.Handler {
18+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
19+
q := r.URL.Query()
20+
if q.Get("x_tutorial") == "true" {
21+
q.Del("x_tutorial")
22+
r.URL.RawQuery = q.Encode()
23+
m.TutorialCookie.SetAll(w)
24+
}
25+
26+
next.ServeHTTP(w, r)
27+
})
28+
}

pkg/auth/webapp/tutorial_middleware_mock_test.go

Lines changed: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)