commit aef839d11464e817837a9d596f50f0cb918223e5
parent 70cc2629365b9c4fd2fd948eceeb5c6b3c894bad
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Tue, 12 Dec 2023 16:49:22 +0100
Prettify UI
Diffstat:
5 files changed, 79 insertions(+), 47 deletions(-)
diff --git a/pkg/rest/gnsregistrar.go b/pkg/rest/gnsregistrar.go
@@ -113,6 +113,9 @@ type Registrar struct {
// Registration expiration (NOT record expiration!)
RelativeRegistrationExpiration time.Duration
+ // Registration expiration days count
+ RegistrationExpirationDaysCount uint64
+
// Payment expiration (time you have to pay for registration)
PaymentExpiration time.Duration
@@ -415,13 +418,17 @@ func (t *Registrar) editRegistration(w http.ResponseWriter, r *http.Request) {
value = record.Value
}
}
- registeredUntil := time.UnixMicro(int64(regMetadata.Expiration)).Format(time.DateTime)
- extendedExpiration := time.UnixMicro(int64(regMetadata.Expiration)).Add(t.RelativeRegistrationExpiration).Format(time.DateTime)
+ registeredUntil := time.UnixMicro(int64(regMetadata.Expiration))
+ registeredUntilStr := registeredUntil.Format(time.DateTime)
+ remainingDays := int64(time.Until(registeredUntil).Hours() / 24)
+ extendedExpiration := time.UnixMicro(int64(regMetadata.Expiration)).Add(t.RelativeRegistrationExpiration).Format(time.DateTime)
fullData := map[string]interface{}{
"label": vars["label"],
"zkey": value,
"extendedExpiration": extendedExpiration,
- "registeredUntil": registeredUntil,
+ "extensionDaysCount": t.RegistrationExpirationDaysCount,
+ "remainingDays": remainingDays,
+ "registeredUntil": registeredUntilStr,
"token": r.URL.Query().Get("token"),
"error": r.URL.Query().Get("error"),
"cost": t.localizedAmountString(),
@@ -541,6 +548,7 @@ func (t *Registrar) buyPage(w http.ResponseWriter, r *http.Request) {
"qrCode": template.URL("data:image/png;base64," + encodedPng),
"payto": template.URL(payto),
"fulfillmentUrl": template.URL(t.BaseUrl + "/name/" + vars["label"] + "/edit?token=" + regId),
+ "registrationId": regId,
"label": vars["label"],
"error": errorMsg,
"cost": t.localizedAmountString(),
@@ -648,8 +656,9 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
var value = ""
- var registeredUntil = ""
+ var registeredUntilStr = ""
var regMetadata *RegistrationMetadata
+ var remainingDays int64
var registered = r.URL.Query().Get("registered") == "true"
// FIXME redirect back if label empty
client := &http.Client{}
@@ -694,7 +703,9 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) {
}
if regMetadata != nil {
if time.Now().Before(time.UnixMicro(int64(regMetadata.Expiration))) {
- registeredUntil = time.UnixMicro(int64(regMetadata.Expiration)).Format(time.DateTime)
+ registeredUntil := time.UnixMicro(int64(regMetadata.Expiration))
+ registeredUntilStr = registeredUntil.Format(time.DateTime)
+ remainingDays = int64(time.Until(registeredUntil).Hours() / 24)
}
}
fullData := map[string]interface{}{
@@ -704,7 +715,9 @@ func (t *Registrar) namePage(w http.ResponseWriter, r *http.Request) {
"available": regMetadata == nil,
"currentValue": value,
"suffixHint": t.SuffixHint,
- "registeredUntil": registeredUntil,
+ "registrationDaysCount": t.RegistrationExpirationDaysCount,
+ "registeredUntil": registeredUntilStr,
+ "remainingDays": remainingDays,
"registrationSuccess": registered,
}
t.NameTpl.Execute(w, fullData)
@@ -766,8 +779,8 @@ func (t *Registrar) Initialize(cfgfile string) {
}
paymentExp := t.Cfg.Section("gns-registrar").Key("payment_required_expiration").MustString("1h")
recordExp := t.Cfg.Section("gns-registrar").Key("relative_delegation_expiration").MustString("24h")
- registrationExpDays := t.Cfg.Section("gns-registrar").Key("registration_duration_days").MustUint64(5)
- t.RelativeRegistrationExpiration, _ = time.ParseDuration(fmt.Sprintf("%dh", registrationExpDays * 24))
+ t.RegistrationExpirationDaysCount = t.Cfg.Section("gns-registrar").Key("registration_duration_days").MustUint64(5)
+ t.RelativeRegistrationExpiration, _ = time.ParseDuration(fmt.Sprintf("%dh", t.RegistrationExpirationDaysCount * 24))
t.RelativeDelegationExpiration, _ = time.ParseDuration(recordExp)
t.PaymentExpiration, _ = time.ParseDuration(paymentExp)
fmt.Println(t.RelativeDelegationExpiration)
diff --git a/web/templates/buy.html b/web/templates/buy.html
@@ -8,15 +8,24 @@
<title>Buy</title>
</head>
<body>
- <div class ="container text-center mt-5">
- <h1 class="mb-3">To register your name <i class="text-primary">{{.label}}</i>.<i class="text-secondary">{{.suffixHint}}</i> please pay here:</h1>
-
- <a href="{{.payto}}" class="btn btn-success mb-3">Pay with TALER</a><br/>
- Alternatively, you can pay using your mobile wallet by scanning the QR code below:<br/>
- <a href="{{.fulfillmentUrl}}">
- <img class="qr" src="{{.qrCode}}"/>
- </a><br/>
- After you pay with a mobile wallet, please click on the QR code to finalize your registration.
+ <div class ="container">
+ <div class ="text-center mt-5">
+ <h1 class="mb-3">To complete the registration of <i class="text-primary">{{.label}}</i>:</h1>
+
+ <a href="{{.payto}}" class="btn btn-success mb-3">Pay {{.cost}} with TALER</a><br/>
+ Alternatively, you can pay using your mobile wallet by scanning the QR code below:<br/>
+ <a href="{{.fulfillmentUrl}}">
+ <img class="qr" src="{{.qrCode}}"/>
+ </a><br/>
+ </div>
+ <div class="alert alert-warning">
+ <h4>Important</h4>
+ After you pay with a mobile wallet, please click on the QR code to finalize your registration or visit <a href="{{.fulfillmentUrl}}">your registration management page</a>.
+ <br/>
+ Your unique registration identifier is <b>{{.registrationId}}</b>.
+ <br/>
+ We recommend that you save this identifier, for example by printing this page.
+ </div>
<hr/>
<a class="btn btn-secondary" href="/">Back</a>
</div>
diff --git a/web/templates/edit.html b/web/templates/edit.html
@@ -17,33 +17,46 @@
</div>
</div>
{{end}}
+ {{if eq .remainingDays 0}}
+ <div class="container pt-5">
+ <div class="alert alert-danger" role="alert">
+ <h4 class="alert-heading">Registration inactive!</h4>
+ <hr>
+ <p class="mb-0">Your registration is not yet active. Have you completed the payment yet?</p>
+ </div>
+ </div>
+ {{end}}
<div class="container pt-5">
<h1 class="mb-5">Manage registration for <i class="text-primary">{{.label}}</i></h1>
<form action="/name/{{.label}}/edit" method="post" class="align-items-center mb-5">
<div class="row">
- <div class="col-lg-12">
+ <div class="col-md-12 alert alert-light">
+ <h4>Zone information</h4>
<input type="hidden" value="{{.token}}" name="token">
<div class="form-floating mb-3">
- <input name="zkey" id="zkeyInput" class="form-control" value="{{.zkey}}" maxlength="63" type="text" placeholder="Enter your zone key here!" required autofocus>
- <label for="zkeyInput">Zone key</label>
+ <input name="zkey" id="zkeyInput" class="form-control" value="{{.zkey}}" disabled={{eq .remainingDays 0}} maxlength="63" type="text" placeholder="Enter your zone key here!" required autofocus>
+ <label for="zkeyInput">Enter your PKEY or EDKEY here</label>
</div>
- <input class="btn btn-primary" type="submit" value="Update zone key">
+ <input class="btn btn-primary" type="submit" disabled={{eq .remainingDays 0}} value="Update zone key">
</div>
</div>
</form>
+ {{if ne .remainingDays 0}}
<div class="row mt-1">
- <div class="col-md-12">
+ <div class="col-md-12 alert alert-light">
+ <h4>Extension and cancellation</h4>
<div class="form-floating mb-3">
<input disabled="true" id="expInput" class="form-control" value="{{.registeredUntil}}" type="text" required autofocus>
- <label for="expInput">Registration expires</label>
+ <label for="expInput">Registration expires in {{.remainingDays}} days:</label>
</div>
- </div>
- <div class="col-md-12">
- <a class="btn btn-primary" href="/name/{{.label}}/buy">Extend registration until <b>{{.extendedExpiration}}</b> for <b>{{.cost}}</b></a>
+ <a class="btn btn-primary" href="/name/{{.label}}/buy">Extend registration for {{.extensionDaysCount}} days until <b>{{.extendedExpiration}}</b> for <b>{{.cost}}</b></a>
+ <br/>
+ <a class="btn btn-danger mt-2 disabled" href="/name/{{.label}}/refund">Cancel registration and refund remaining {{.remainingDays}} days for <b>{{.cost}}</b></a>
</div>
</div>
<hr/>
<a class="btn btn-secondary" href="/">Back</a>
</div>
+ {{end}}
</body>
</html>
diff --git a/web/templates/landing.html b/web/templates/landing.html
@@ -21,25 +21,17 @@
</div>
</div>
{{end}}
- <form action="/search" method="get" class="row">
+ <form action="/search" method="get">
<div class="row">
- <div class="col-lg-6 offset-lg-3">
- <label for="label" class="form-label">Check name availability:</label>
- <div class="input-group mb-2">
- <input id="label" name="label" class="form-control text-center" maxlength="63" type="text" aria-describedby="reg-suffix" required autofocus>
- <input class="btn btn-primary" type="submit" value="Check!">
+ <div class="col-lg-6 offset-lg-3 text-center">
+ <div class="form-floating mb-3">
+ <input id="labelInput" name="label" class="form-control text-center" placeholder="" maxlength="63" type="text" aria-describedby="reg-suffix" required autofocus>
+ <label for="labelInput">Your name. e.g. alice</label>
</div>
+ <input class="btn btn-primary" type="submit" value="Check availability!">
</div>
</div>
</form>
</div>
- <div class="container pt-5">
- <div class="alert alert-light" role="alert">
- <h4 class="alert-heading">The .{{.suffixHint}} Zone!</h4>
- <p>If you do not have our zone configured in your <i>Start Zones</i>, we suggest to do it as:</p>
- <hr>
- <p class="mb-0">.{{.suffixHint}} = {{.zoneKey}}</p>
- </div>
- </div>
</body>
</html>
diff --git a/web/templates/name.html b/web/templates/name.html
@@ -31,38 +31,43 @@
<h1 class="mb-5"><i class="text-primary">{{.label}}</i> is <span class="text-success">available</span> for registration.</h1>
<form action="/name/{{.label}}/buy" method="get" class="align-items-center">
<div class="row">
- <div class="col-lg-12">
+ <div class="col-md-12 alert alert-light">
+ <h4>Zone information</h4>
<div class="form-floating mb-3">
<input name="zkey" id="zkeyInput" class="form-control" maxlength="63" type="text" placeholder="Enter your zone key here!" required autofocus>
- <label for="zkeyInput">Zone key</label>
+ <label for="zkeyInput">Enter your PKEY or EDKEY here</label>
</div>
- <input class="btn btn-primary" type="submit" value="Register for {{.cost}}">
+ <input class="btn btn-primary" type="submit" value="Register for a duration of {{.registrationDaysCount}} days for {{.cost}}">
</div>
</div>
</form>
{{else}}
- {{if eq .registeredUntil ""}}
+ {{if eq .remainingDays 0}}
<h1 class="mb-5"><i class="text-primary">{{.label}}</i> is <span class="text-secondary">reserved</span>!</h1>
{{else}}
<h1 class="mb-5"><i class="text-primary">{{.label}}</i> is <span class="text-danger">taken</span>!</h1>
{{end}}
<div class="row">
- <div class="col-lg-12">
+ <div class="col-md-12 alert alert-light">
+ <h4>Zone information</h4>
<div class="form-floating mb-3">
<input name="zkey" id="zkeyInput" class="form-control" maxlength="63" type="text" value="{{.currentValue}}" disabled="true" required autofocus>
<label for="zkeyInput">Zone key</label>
</div>
</div>
</div>
+ {{if ne .remainingDays 0}}
<div class="row">
- <div class="col-lg-12">
+ <div class="col-md-12 alert alert-light">
+ <h4>Registration info</h4>
<div class="form-floating mb-3">
<input name="reg" id="regInput" class="form-control" type="text" value="{{.registeredUntil}}" disabled="true" required autofocus>
- <label for="regInput">Registration expires</label>
+ <label for="regInput">Registration expires in {{.remainingDays}} days:</label>
</div>
</div>
</div>
{{end}}
+ {{end}}
<hr/>
<a class="btn btn-secondary" href="/">Back</a>
</div>