Skip to content

Commit dbeefe4

Browse files
committed
Merge remote-tracking branch 'origin/main' into implement-template-build-details-page-eng-3335
2 parents 910e8c8 + b9f668d commit dbeefe4

File tree

11 files changed

+543
-162
lines changed

11 files changed

+543
-162
lines changed

bun.lock

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
"micromatch": "^4.0.8",
7878
"motion": "^12.18.1",
7979
"nanoid": "^5.0.9",
80-
"next": "^16.0.7",
80+
"next": "16.0.10",
8181
"next-safe-action": "^8.0.11",
8282
"next-themes": "^0.4.6",
8383
"nuqs": "^2.7.0",
@@ -86,9 +86,9 @@
8686
"pino": "^9.7.0",
8787
"postgres": "^3.4.5",
8888
"posthog-js": "^1.268.1",
89-
"react": "^19.2.1",
89+
"react": "19.2.3",
9090
"react-day-picker": "^9.9.0",
91-
"react-dom": "^19.2.1",
91+
"react-dom": "19.2.3",
9292
"react-error-boundary": "^5.0.0",
9393
"react-hook-form": "^7.66.0",
9494
"react-icons": "^5.4.0",
@@ -126,8 +126,8 @@
126126
"@types/bun": "^1.2.5",
127127
"@types/node": "22.10.10",
128128
"@types/pg": "^8.11.11",
129-
"@types/react": "^19.2.2",
130-
"@types/react-dom": "^19.2.2",
129+
"@types/react": "19.2.3",
130+
"@types/react-dom": "19.2.3",
131131
"@types/semver": "^7.7.0",
132132
"@vitest/coverage-v8": "^3.0.7",
133133
"@vitest/ui": "3.0.7",
@@ -157,11 +157,11 @@
157157
},
158158
},
159159
"overrides": {
160+
"@nodelib/fs.scandir": "2.1.5",
161+
"@nodelib/fs.stat": "2.0.5",
160162
"@shikijs/core": "2.3.2",
161163
"@shikijs/themes": "2.3.2",
162164
"shiki": "2.3.2",
163-
"@nodelib/fs.stat": "2.0.5",
164-
"@nodelib/fs.scandir": "2.1.5",
165165
"whatwg-url": "^13",
166166
},
167167
"packages": {
@@ -461,25 +461,25 @@
461461

462462
"@next-safe-action/adapter-react-hook-form": ["@next-safe-action/[email protected]", "", { "peerDependencies": { "@hookform/resolvers": ">= 5.0.0", "next": ">= 14.0.0", "next-safe-action": ">= 8.0.0", "react": ">= 18.2.0", "react-dom": ">= 18.2.0", "react-hook-form": ">= 7.0.0" } }, "sha512-vp3KAd5NKnBBCF/3b8kDxEYj0+BUYVjlSZOWHikz/Y2O+yLheRmtj8Vcm379itlqGUKcLV5O2o/dwKHvH8pYog=="],
463463

464-
"@next/env": ["@next/[email protected].7", "", {}, "sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw=="],
464+
"@next/env": ["@next/[email protected].10", "", {}, "sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang=="],
465465

466466
"@next/eslint-plugin-next": ["@next/[email protected]", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-YxDvsT2fwy1j5gMqk3ppXlsgDopHnkM4BoxSVASbvvgh5zgsK8lvWerDzPip8k3WVzsTZ1O7A7si1KNfN4OZfQ=="],
467467

468-
"@next/swc-darwin-arm64": ["@next/[email protected].7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg=="],
468+
"@next/swc-darwin-arm64": ["@next/[email protected].10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4XgdKtdVsaflErz+B5XeG0T5PeXKDdruDf3CRpnhN+8UebNa5N2H58+3GDgpn/9GBurrQ1uWW768FfscwYkJRg=="],
469469

470-
"@next/swc-darwin-x64": ["@next/[email protected].7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA=="],
470+
"@next/swc-darwin-x64": ["@next/[email protected].10", "", { "os": "darwin", "cpu": "x64" }, "sha512-spbEObMvRKkQ3CkYVOME+ocPDFo5UqHb8EMTS78/0mQ+O1nqE8toHJVioZo4TvebATxgA8XMTHHrScPrn68OGw=="],
471471

472-
"@next/swc-linux-arm64-gnu": ["@next/[email protected].7", "", { "os": "linux", "cpu": "arm64" }, "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww=="],
472+
"@next/swc-linux-arm64-gnu": ["@next/[email protected].10", "", { "os": "linux", "cpu": "arm64" }, "sha512-uQtWE3X0iGB8apTIskOMi2w/MKONrPOUCi5yLO+v3O8Mb5c7K4Q5KD1jvTpTF5gJKa3VH/ijKjKUq9O9UhwOYw=="],
473473

474-
"@next/swc-linux-arm64-musl": ["@next/[email protected].7", "", { "os": "linux", "cpu": "arm64" }, "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g=="],
474+
"@next/swc-linux-arm64-musl": ["@next/[email protected].10", "", { "os": "linux", "cpu": "arm64" }, "sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw=="],
475475

476-
"@next/swc-linux-x64-gnu": ["@next/[email protected].7", "", { "os": "linux", "cpu": "x64" }, "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA=="],
476+
"@next/swc-linux-x64-gnu": ["@next/[email protected].10", "", { "os": "linux", "cpu": "x64" }, "sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA=="],
477477

478-
"@next/swc-linux-x64-musl": ["@next/[email protected].7", "", { "os": "linux", "cpu": "x64" }, "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w=="],
478+
"@next/swc-linux-x64-musl": ["@next/[email protected].10", "", { "os": "linux", "cpu": "x64" }, "sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g=="],
479479

480-
"@next/swc-win32-arm64-msvc": ["@next/[email protected].7", "", { "os": "win32", "cpu": "arm64" }, "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q=="],
480+
"@next/swc-win32-arm64-msvc": ["@next/[email protected].10", "", { "os": "win32", "cpu": "arm64" }, "sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg=="],
481481

482-
"@next/swc-win32-x64-msvc": ["@next/[email protected].7", "", { "os": "win32", "cpu": "x64" }, "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug=="],
482+
"@next/swc-win32-x64-msvc": ["@next/[email protected].10", "", { "os": "win32", "cpu": "x64" }, "sha512-E+njfCoFLb01RAFEnGZn6ERoOqhK1Gl3Lfz1Kjnj0Ulfu7oJbuMyvBKNj/bw8XZnenHDASlygTjZICQW+rYW1Q=="],
483483

484484
"@nodelib/fs.scandir": ["@nodelib/[email protected]", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
485485

@@ -1107,9 +1107,9 @@
11071107

11081108
"@types/prop-types": ["@types/[email protected]", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="],
11091109

1110-
"@types/react": ["@types/[email protected].2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],
1110+
"@types/react": ["@types/[email protected].3", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg=="],
11111111

1112-
"@types/react-dom": ["@types/[email protected].2", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw=="],
1112+
"@types/react-dom": ["@types/[email protected].3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
11131113

11141114
"@types/react-reconciler": ["@types/[email protected]", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
11151115

@@ -2233,7 +2233,7 @@
22332233

22342234
"neo-async": ["[email protected]", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
22352235

2236-
"next": ["[email protected]", "", { "dependencies": { "@next/env": "16.0.7", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.0.7", "@next/swc-darwin-x64": "16.0.7", "@next/swc-linux-arm64-gnu": "16.0.7", "@next/swc-linux-arm64-musl": "16.0.7", "@next/swc-linux-x64-gnu": "16.0.7", "@next/swc-linux-x64-musl": "16.0.7", "@next/swc-win32-arm64-msvc": "16.0.7", "@next/swc-win32-x64-msvc": "16.0.7", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A=="],
2236+
"next": ["[email protected]", "", { "dependencies": { "@next/env": "16.0.10", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.0.10", "@next/swc-darwin-x64": "16.0.10", "@next/swc-linux-arm64-gnu": "16.0.10", "@next/swc-linux-arm64-musl": "16.0.10", "@next/swc-linux-x64-gnu": "16.0.10", "@next/swc-linux-x64-musl": "16.0.10", "@next/swc-win32-arm64-msvc": "16.0.10", "@next/swc-win32-x64-msvc": "16.0.10", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-RtWh5PUgI+vxlV3HdR+IfWA1UUHu0+Ram/JBO4vWB54cVPentCD0e+lxyAYEsDTqGGMg7qpjhKh6dc6aW7W/sA=="],
22372237

22382238
"next-safe-action": ["[email protected]", "", { "peerDependencies": { "next": ">= 14.0.0", "react": ">= 18.2.0", "react-dom": ">= 18.2.0" } }, "sha512-gqJLmnQLAoFCq1kRBopN46New+vx1n9J9Y/qDQLXpv/VqU40AWxDakvshwwnWAt8R0kLvlakNYNLX5PqlXWSMg=="],
22392239

@@ -2421,11 +2421,11 @@
24212421

24222422
"randombytes": ["[email protected]", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="],
24232423

2424-
"react": ["[email protected].1", "", {}, "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw=="],
2424+
"react": ["[email protected].3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="],
24252425

24262426
"react-day-picker": ["[email protected]", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0", "date-fns-jalali": "^4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-l3ub6o8NlchqIjPKrRFUCkTUEq6KwemQlfv3XZzzwpUeGwmDJ+0u0Upmt38hJyd7D/vn2dQoOoLV/qAp0o3uUw=="],
24272427

2428-
"react-dom": ["[email protected].1", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.1" } }, "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg=="],
2428+
"react-dom": ["[email protected].3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="],
24292429

24302430
"react-error-boundary": ["[email protected]", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "react": ">=16.13.1" } }, "sha512-tnjAxG+IkpLephNcePNA7v6F/QpWLH8He65+DmedchDwg162JZqx4NmbXj0mlAYVVEd81OW7aFhmbsScYfiAFQ=="],
24312431

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
"micromatch": "^4.0.8",
115115
"motion": "^12.18.1",
116116
"nanoid": "^5.0.9",
117-
"next": "^16.0.7",
117+
"next": "16.0.10",
118118
"next-safe-action": "^8.0.11",
119119
"next-themes": "^0.4.6",
120120
"nuqs": "^2.7.0",
@@ -123,9 +123,9 @@
123123
"pino": "^9.7.0",
124124
"postgres": "^3.4.5",
125125
"posthog-js": "^1.268.1",
126-
"react": "^19.2.1",
126+
"react": "19.2.3",
127127
"react-day-picker": "^9.9.0",
128-
"react-dom": "^19.2.1",
128+
"react-dom": "19.2.3",
129129
"react-error-boundary": "^5.0.0",
130130
"react-hook-form": "^7.66.0",
131131
"react-icons": "^5.4.0",
@@ -163,8 +163,8 @@
163163
"@types/bun": "^1.2.5",
164164
"@types/node": "22.10.10",
165165
"@types/pg": "^8.11.11",
166-
"@types/react": "^19.2.2",
167-
"@types/react-dom": "^19.2.2",
166+
"@types/react": "19.2.3",
167+
"@types/react-dom": "19.2.3",
168168
"@types/semver": "^7.7.0",
169169
"@vitest/coverage-v8": "^3.0.7",
170170
"@vitest/ui": "3.0.7",

src/app/(auth)/confirm/page.tsx

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
'use client'
2+
3+
import { AUTH_URLS } from '@/configs/urls'
4+
import { AuthFormMessage } from '@/features/auth/form-message'
5+
import {
6+
ConfirmEmailInputSchema,
7+
OtpTypeSchema,
8+
type ConfirmEmailInput,
9+
type OtpType,
10+
} from '@/server/api/models/auth.models'
11+
import { Button } from '@/ui/primitives/button'
12+
import { useMutation } from '@tanstack/react-query'
13+
import { useRouter, useSearchParams } from 'next/navigation'
14+
import { useMemo, useTransition } from 'react'
15+
16+
const OTP_TYPE_LABELS: Record<OtpType, string> = {
17+
signup: 'Welcome to E2B',
18+
recovery: 'Password Recovery',
19+
invite: 'Team Invitation',
20+
magiclink: 'Sign In',
21+
email: 'Verify Email',
22+
email_change: 'Confirm Email Change',
23+
}
24+
25+
const OTP_TYPE_DESCRIPTIONS: Record<OtpType, string> = {
26+
signup: 'Click below to verify your email and create your account.',
27+
recovery:
28+
'Click below to sign in. You will be forwarded to the account settings page where you can change your password.',
29+
invite: 'Click below to accept the invitation and join the team.',
30+
magiclink: 'Click below to sign in to your account.',
31+
email: 'Click below to verify your email address.',
32+
email_change: 'Click below to confirm your new email address.',
33+
}
34+
35+
const OTP_TYPE_BUTTON_LABELS: Record<OtpType, string> = {
36+
signup: 'Create Account',
37+
recovery: 'Sign In',
38+
invite: 'Join Team',
39+
magiclink: 'Sign In',
40+
email: 'Verify Email',
41+
email_change: 'Confirm Email',
42+
}
43+
44+
interface VerifyOtpResponse {
45+
redirectUrl: string
46+
}
47+
48+
/**
49+
* Verifies OTP and returns a redirect URL.
50+
* The API always returns a redirectUrl - errors redirect to sign-in with encoded error params.
51+
*/
52+
async function verifyOtp(input: ConfirmEmailInput): Promise<VerifyOtpResponse> {
53+
const response = await fetch('/api/auth/verify-otp', {
54+
method: 'POST',
55+
headers: { 'Content-Type': 'application/json' },
56+
body: JSON.stringify(input),
57+
})
58+
59+
return response.json()
60+
}
61+
62+
export default function ConfirmPage() {
63+
const router = useRouter()
64+
const searchParams = useSearchParams()
65+
const [isPending, startTransition] = useTransition()
66+
67+
const params = useMemo(() => {
68+
const tokenHash = searchParams.get('token_hash') ?? ''
69+
const typeParam = searchParams.get('type')
70+
const typeResult = OtpTypeSchema.safeParse(typeParam)
71+
const type: OtpType | null = typeResult.success ? typeResult.data : null
72+
const next = searchParams.get('next') ?? ''
73+
74+
return { tokenHash, type, next }
75+
}, [searchParams])
76+
77+
const isValidParams = ConfirmEmailInputSchema.safeParse({
78+
token_hash: params.tokenHash,
79+
type: params.type,
80+
next: params.next,
81+
}).success
82+
83+
const typeLabel = params.type ? OTP_TYPE_LABELS[params.type] : 'Verification'
84+
const typeDescription = params.type
85+
? OTP_TYPE_DESCRIPTIONS[params.type]
86+
: 'Confirm your action'
87+
const buttonLabel = params.type
88+
? OTP_TYPE_BUTTON_LABELS[params.type]
89+
: 'Continue'
90+
91+
const mutation = useMutation({
92+
mutationFn: verifyOtp,
93+
onSuccess: (data) => {
94+
startTransition(() => {
95+
router.push(data.redirectUrl)
96+
})
97+
},
98+
})
99+
100+
const handleConfirm = () => {
101+
if (!isValidParams || !params.type) return
102+
103+
mutation.mutate({
104+
token_hash: params.tokenHash,
105+
type: params.type,
106+
next: params.next,
107+
})
108+
}
109+
110+
return (
111+
<div className="flex w-full flex-col">
112+
<h1>{typeLabel}</h1>
113+
<p className="text-fg-secondary leading-6 mt-1">{typeDescription}</p>
114+
115+
<div className="mt-5">
116+
<Button
117+
onClick={handleConfirm}
118+
loading={mutation.isPending || isPending}
119+
disabled={!isValidParams}
120+
className="w-full"
121+
>
122+
{buttonLabel}
123+
</Button>
124+
</div>
125+
126+
<p className="text-fg-secondary mt-3 leading-6">
127+
Changed your mind?{' '}
128+
<button
129+
type="button"
130+
onClick={() => router.push(AUTH_URLS.SIGN_IN)}
131+
className="text-fg underline"
132+
>
133+
Back to sign in
134+
</button>
135+
.
136+
</p>
137+
138+
{!isValidParams && (
139+
<AuthFormMessage
140+
className="mt-4"
141+
message={{
142+
error: 'Invalid verification link. Please request a new one.',
143+
}}
144+
/>
145+
)}
146+
</div>
147+
)
148+
}

0 commit comments

Comments
 (0)