diff --git a/frontend/src/customer/AuthForm.tsx b/frontend/src/customer/AuthForm.tsx
index b357f35..2f1b51f 100644
--- a/frontend/src/customer/AuthForm.tsx
+++ b/frontend/src/customer/AuthForm.tsx
@@ -233,6 +233,27 @@ export default function AuthForm({ mode, onModeChange, onForgotPassword, onSucce
By creating an account you agree to our{' '}
Privacy Policy.
+
+ {/* On this tab too, and its absence here was a bug (#345).
+ A passkey belongs only on Log In, because you cannot
+ register an account with one — but creating an account is
+ exactly what a new customer reaches for Google to do, so
+ leaving it off the sign-up tab hid the feature from the
+ people it helps most.
+
+ The two consent boxes above are not carried across. Google
+ takes the customer off this site entirely, and a tick that
+ survived that round trip would be a consent recorded from a
+ form nobody submitted. They are asked again, with the same
+ wording, on the step they land on (#342). */}
+ {googleEnabled && (
+ <>
+
+ or
+
+
+ >
+ )}
)
},
diff --git a/frontend/src/customer/GoogleSignInButton.tsx b/frontend/src/customer/GoogleSignInButton.tsx
index 4ce5d4b..9cddcb9 100644
--- a/frontend/src/customer/GoogleSignInButton.tsx
+++ b/frontend/src/customer/GoogleSignInButton.tsx
@@ -37,6 +37,17 @@ function GoogleMark() {
type Props = Readonly<{
/** Where to send the customer back to. Validated again on the server. */
returnTo: string;
+ /**
+ * Which tab this sits on, which changes only the wording.
+ *
+ * One endpoint serves both: it signs in a known identity, links a verified
+ * address, or creates an account. The customer does not know or care which
+ * of those will happen, so the label matches what they came to the tab to
+ * do rather than what the server ends up doing.
+ *
+ * Both spellings are in Google identity guidelines alongside the mark.
+ */
+ intent?: 'sign-in' | 'sign-up';
}>;
/**
@@ -51,7 +62,7 @@ type Props = Readonly<{
* here. It has to be, since anyone can type the URL, and doing it in one place
* beats doing it in two languages. See `google/returnTo.ts`.
*/
-export default function GoogleSignInButton({ returnTo }: Props) {
+export default function GoogleSignInButton({ returnTo, intent = 'sign-in' }: Props) {
return (
);
}
diff --git a/frontend/tests/e2e/auth.spec.ts b/frontend/tests/e2e/auth.spec.ts
index 2cd733d..7abb059 100755
--- a/frontend/tests/e2e/auth.spec.ts
+++ b/frontend/tests/e2e/auth.spec.ts
@@ -124,6 +124,23 @@ test.describe('Customer accounts', () => {
// So the button being ABSENT is the behaviour under test here, and it is the
// one that matters: a control that appears and then fails at Google is worse
// than one that was never offered.
+ // The sign-up tab, which #345 left it off entirely. A passkey belongs only on
+ // Log In, because you cannot register an account with one — but creating an
+ // account is exactly what a new customer reaches for Google to do, so its
+ // absence there hid the feature from the people it helps most.
+ //
+ // Asserted as absent for the same reason as the login one: local and QA have
+ // no credentials, so absence is the behaviour that actually runs here.
+ test('offers no Google button on the sign-up tab either, when unconfigured', async ({
+ authModal
+ }) => {
+ await authModal.gotoRegister();
+
+ await expect(
+ authModal.registerDialog.getByRole('button', { name: /with Google/i })
+ ).toHaveCount(0);
+ });
+
test('offers no Google button when the environment is not configured for it', async ({
authModal,
accountModal,