about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--bskyweb/cmd/bskyweb/server.go33
-rw-r--r--src/view/com/search/HeaderWithInput.tsx4
-rw-r--r--src/view/com/util/ViewHeader.tsx4
3 files changed, 35 insertions, 6 deletions
diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go
index 85fffd4b8..6daec493e 100644
--- a/bskyweb/cmd/bskyweb/server.go
+++ b/bskyweb/cmd/bskyweb/server.go
@@ -2,8 +2,10 @@ package main
 
 import (
 	"context"
+	"encoding/json"
 	"fmt"
 	"io/fs"
+	"io/ioutil"
 	"net/http"
 	"os"
 	"strings"
@@ -137,11 +139,36 @@ func serve(cctx *cli.Context) error {
 	e.GET("/profile/:handle/post/:rkey/reposted-by", server.WebGeneric)
 
 	// Mailmodo
-	e.POST("/waitlist", func(c echo.Context) error {
-		email := strings.TrimSpace(c.FormValue("email"))
-		if err := mailmodo.AddToList(c.Request().Context(), mailmodoListName, email); err != nil {
+	e.POST("/api/waitlist", func(c echo.Context) error {
+		type jsonError struct {
+			Error string `json:"error"`
+		}
+
+		// Read the API request.
+		type apiRequest struct {
+			Email string `json:"email"`
+		}
+
+		bodyReader := http.MaxBytesReader(c.Response(), c.Request().Body, 16*1024)
+		payload, err := ioutil.ReadAll(bodyReader)
+		if err != nil {
 			return err
 		}
+		var req apiRequest
+		if err := json.Unmarshal(payload, &req); err != nil {
+			return c.JSON(http.StatusBadRequest, jsonError{Error: "Invalid API request"})
+		}
+
+		if req.Email == "" {
+			return c.JSON(http.StatusBadRequest, jsonError{Error: "Please enter a valid email address."})
+		}
+
+		if err := mailmodo.AddToList(c.Request().Context(), mailmodoListName, req.Email); err != nil {
+			log.Errorf("adding email to waitlist failed: %s", err)
+			return c.JSON(http.StatusBadRequest, jsonError{
+				Error: "Storing email in waitlist failed. Please enter a valid email address.",
+			})
+		}
 		return c.JSON(http.StatusOK, map[string]bool{"success": true})
 	})
 
diff --git a/src/view/com/search/HeaderWithInput.tsx b/src/view/com/search/HeaderWithInput.tsx
index 90b5e37dc..d44673717 100644
--- a/src/view/com/search/HeaderWithInput.tsx
+++ b/src/view/com/search/HeaderWithInput.tsx
@@ -55,8 +55,8 @@ export function HeaderWithInput({
         hitSlop={MENU_HITSLOP}
         style={styles.headerMenuBtn}
         accessibilityRole="button"
-        accessibilityLabel="Back"
-        accessibilityHint="">
+        accessibilityLabel="Menu"
+        accessibilityHint="Access navigation links and settings">
         <FontAwesomeIcon icon="bars" size={18} color={pal.colors.textLight} />
       </TouchableOpacity>
       <View
diff --git a/src/view/com/util/ViewHeader.tsx b/src/view/com/util/ViewHeader.tsx
index cdbd555b8..732a46d06 100644
--- a/src/view/com/util/ViewHeader.tsx
+++ b/src/view/com/util/ViewHeader.tsx
@@ -66,7 +66,9 @@ export const ViewHeader = observer(function ({
           style={canGoBack ? styles.backBtn : styles.backBtnWide}
           accessibilityRole="button"
           accessibilityLabel={canGoBack ? 'Back' : 'Menu'}
-          accessibilityHint="">
+          accessibilityHint={
+            canGoBack ? '' : 'Access navigation links and settings'
+          }>
           {canGoBack ? (
             <FontAwesomeIcon
               size={18}