diff options
-rw-r--r-- | bskyweb/cmd/bskyweb/server.go | 33 | ||||
-rw-r--r-- | src/view/com/search/HeaderWithInput.tsx | 4 | ||||
-rw-r--r-- | src/view/com/util/ViewHeader.tsx | 4 |
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} |