From 598689c1e625eee8c9f2bb99fdbe50f5934d64e4 Mon Sep 17 00:00:00 2001 From: Piotr Monwid-Olechnowicz Date: Tue, 8 Apr 2025 15:09:05 +0200 Subject: [PATCH] Display a shorter success message and proper color (#6711) --- .../blog/components/newsletter-form-card.tsx | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/packages/web/docs/src/app/blog/components/newsletter-form-card.tsx b/packages/web/docs/src/app/blog/components/newsletter-form-card.tsx index 8c6d1b0fa..5a9c56bdc 100644 --- a/packages/web/docs/src/app/blog/components/newsletter-form-card.tsx +++ b/packages/web/docs/src/app/blog/components/newsletter-form-card.tsx @@ -1,20 +1,22 @@ 'use client'; -import { useRef, useState } from 'react'; +import { useState } from 'react'; import { CallToAction, cn, Heading, Input } from '@theguild/components'; export function NewsletterFormCard(props: React.HTMLAttributes) { type Idle = undefined; - type Pending = { status: 'pending'; message?: never }; + type Pending = { + status: 'pending'; + /** + * potentially revious error message to reduce layout shift + */ + message: string | undefined; + }; type Success = { status: 'success'; message: string }; type Error = { status: 'error'; message: string }; type State = Idle | Pending | Success | Error; const [state, setState] = useState(); - // we don't want to blink a message on retries when request is pending - const lastErrorMessage = useRef(); - lastErrorMessage.current = state?.message || lastErrorMessage.current; - return (
) { return; } - setState({ status: 'pending' }); + setState(s => ({ + status: 'pending', + message: s?.status === 'error' ? 'Retrying...' : undefined, + })); try { const response = await fetch('https://utils.the-guild.dev/api/newsletter-subscribe', { @@ -57,8 +62,7 @@ export function NewsletterFormCard(props: React.HTMLAttributes) { const json = await response.json(); if (json.status === 'success') { - lastErrorMessage.current = undefined; - setState({ status: 'success', message: json.message }); + setState({ status: 'success', message: 'Please check your email to confirm.' }); } else { setState({ status: 'error', message: json.message }); } @@ -78,12 +82,21 @@ export function NewsletterFormCard(props: React.HTMLAttributes) { setState({ status: 'error', message: 'Something went wrong. Please let us know.' }); } }} + onReset={() => { + setState(undefined); + }} > {!state || state.status === 'error' ? ( @@ -103,13 +116,6 @@ export function NewsletterFormCard(props: React.HTMLAttributes) { type="reset" variant="secondary-inverted" className="group/button mt-2 !w-full before:absolute" - onClick={() => { - // the default behavior of