From ef478c37c5822da3fed0fc0dd00ef156fdae639b Mon Sep 17 00:00:00 2001 From: John Ballesteros Date: Fri, 30 Aug 2024 22:43:38 +0800 Subject: [PATCH 1/3] chore: add toast deps --- package.json | 1 + pnpm-lock.yaml | 27 +++++++++++++++++++++++++++ src/app/layout.tsx | 5 ++++- src/grants/components/toaster.tsx | 21 +++++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/grants/components/toaster.tsx diff --git a/package.json b/package.json index 44ae9aa..e776bbd 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^4.0.13", + "react-hot-toast": "^2.4.1", "react-intersection-observer": "^9.10.2", "react-markdown": "^9.0.1", "react-use-draggable-scroll": "^0.4.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9fd347a..d84b121 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: react-error-boundary: specifier: ^4.0.13 version: 4.0.13(react@18.3.1) + react-hot-toast: + specifier: ^2.4.1 + version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-intersection-observer: specifier: ^9.10.2 version: 9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -4783,6 +4786,11 @@ packages: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} + goober@2.1.14: + resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + peerDependencies: + csstype: ^3.0.10 + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -6273,6 +6281,13 @@ packages: peerDependencies: react: '>=16.13.1' + react-hot-toast@2.4.1: + resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + react-dom: '>=16' + react-intersection-observer@9.13.0: resolution: {integrity: sha512-y0UvBfjDiXqC8h0EWccyaj4dVBWMxgEx0t5RGNzQsvkfvZwugnKwxpu70StY4ivzYuMajavwUDjH4LJyIki9Lw==} peerDependencies: @@ -13749,6 +13764,10 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.1.0 + goober@2.1.14(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -15380,6 +15399,14 @@ snapshots: '@babel/runtime': 7.25.0 react: 18.3.1 + react-hot-toast@2.4.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + goober: 2.1.14(csstype@3.1.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - csstype + react-intersection-observer@9.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d83198d..754419c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,7 +2,7 @@ import './globals.css'; import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/pagination'; -import './swiper.css'; +import './swiper.css'; import type { Metadata } from 'next'; import { Inter } from 'next/font/google'; @@ -14,6 +14,8 @@ import { PageScrollDisabler } from '@/shared/components/page-scroll-disabler'; import { NextUIProvider } from '@/shared/providers/next-ui-provider'; import { ReactQueryProvider } from '@/shared/providers/react-query-provider'; +import { Toaster } from '@/grants/components/toaster'; + const inter = Inter({ subsets: ['latin'] }); export const metadata: Metadata = { @@ -40,6 +42,7 @@ const RootLayout: React.FC = ({ children }) => ( + ); diff --git a/src/grants/components/toaster.tsx b/src/grants/components/toaster.tsx new file mode 100644 index 0000000..b04b201 --- /dev/null +++ b/src/grants/components/toaster.tsx @@ -0,0 +1,21 @@ +'use client'; + +import { Toaster as BaseToaster } from 'react-hot-toast'; + +export const Toaster = () => { + return ( + + ); +}; From ba6d8f1b5a9d63180febdd024989abf4344018a2 Mon Sep 17 00:00:00 2001 From: John Ballesteros Date: Fri, 30 Aug 2024 22:44:01 +0800 Subject: [PATCH 2/3] refactor: add mw-post util fn --- src/shared/utils/mw-post.ts | 71 +++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/shared/utils/mw-post.ts diff --git a/src/shared/utils/mw-post.ts b/src/shared/utils/mw-post.ts new file mode 100644 index 0000000..dc1edb9 --- /dev/null +++ b/src/shared/utils/mw-post.ts @@ -0,0 +1,71 @@ +import { z } from 'zod'; + +import { errMsg, ResponseError } from '@/shared/core/errors'; +import { sentryMessage } from '@/shared/utils/sentry-message'; + +interface Props { + url: string; + label: string; + payload: z.infer

; + payloadSchema: P; + responseSchema: R; + options?: RequestInit; +} + +export const mwPOST = async ( + props: Props, +) => { + if (typeof window !== 'undefined' && !window.navigator.onLine) { + throw new Error(errMsg.OFFLINE); + } + + const { url, payload, payloadSchema, responseSchema, options, label } = props; + + const payloadResult = payloadSchema.safeParse(payload); + if (!payloadResult.success) { + throw new Error(payloadResult.error.errors[0].message); + } + + try { + const res = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payloadResult.data), + ...options, + }); + + if (!res.ok) { + throw new ResponseError(errMsg.ERR_RESPONSE, res); + } + + const jsonData = await res.json(); + const result = responseSchema.safeParse(jsonData); + if (!result.success) { + throw new ResponseError( + errMsg.INVALID_RESPONSE_SCHEMA, + res, + JSON.stringify({ details: result.error.issues }), + ); + } + + return result.data as z.infer; + } catch (err: unknown) { + if (err instanceof ResponseError) { + sentryMessage(label, JSON.stringify({ url, ...(await err.toJSON()) })); + + if (err.res.status === 400) { + const jsonRes = await err.res.json(); + throw new Error(jsonRes.message || errMsg.ERR_BAD_REQUEST); + } + } else { + sentryMessage( + label, + JSON.stringify({ url, msg: (err as Error).message }), + ); + } + + throw new Error(errMsg.INTERNAL); + } +}; From a91cbe1306e0c1826f793ecc1b2878298849a17c Mon Sep 17 00:00:00 2001 From: John Ballesteros Date: Fri, 30 Aug 2024 22:44:26 +0800 Subject: [PATCH 3/3] feat: add-to-waitlist form --- public/rocket.png | Bin 39176 -> 0 bytes src/app/coming-soon/coming-soon-form.tsx | 132 +++++++++++++++++++++++ src/app/coming-soon/coming-soon-text.tsx | 4 +- src/app/coming-soon/page.tsx | 22 ++-- src/app/globals.css | 1 + src/shared/hooks/use-add-to-waitlist.ts | 41 +++++++ 6 files changed, 188 insertions(+), 12 deletions(-) delete mode 100644 public/rocket.png create mode 100644 src/app/coming-soon/coming-soon-form.tsx create mode 100644 src/shared/hooks/use-add-to-waitlist.ts diff --git a/public/rocket.png b/public/rocket.png deleted file mode 100644 index a9eb8488aea058b2966f908ac91333d4f5109f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39176 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 oCOV diff --git a/src/app/coming-soon/coming-soon-form.tsx b/src/app/coming-soon/coming-soon-form.tsx new file mode 100644 index 0000000..5c62672 --- /dev/null +++ b/src/app/coming-soon/coming-soon-form.tsx @@ -0,0 +1,132 @@ +'use client'; + +import { useState } from 'react'; + +import { Button, Input } from '@nextui-org/react'; + +import { useAddToWaitlist } from '@/shared/hooks/use-add-to-waitlist'; + +const EmailIcon = () => ( + +); + +const CompanyIcon = () => ( + +); + +const RoleIcon = () => ( + +); + +const inputs = [ + { + name: 'email', + placeholder: 'Email', + icon: , + }, + { + name: 'company', + placeholder: 'Company', + icon: , + }, + { + name: 'role', + placeholder: 'Role', + icon: , + }, +]; + +const DEFAULT_FORM_STATE = { + email: '', + company: '', + role: '', +}; + +export const ComingSoonForm = () => { + const [formState, setFormState] = useState(DEFAULT_FORM_STATE); + + const handleChange = (e: React.ChangeEvent) => { + const { name, value } = e.target; + setFormState((prevState) => ({ + ...prevState, + [name]: value, + })); + }; + + const { mutate, isPending } = useAddToWaitlist(); + + const handleSubmit = () => { + mutate(formState, { onSuccess: () => setFormState(DEFAULT_FORM_STATE) }); + }; + + return ( +

+ {inputs.map((input) => ( + + ))} +
+ +
+
+ ); +}; diff --git a/src/app/coming-soon/coming-soon-text.tsx b/src/app/coming-soon/coming-soon-text.tsx index 01678ee..35cdadf 100644 --- a/src/app/coming-soon/coming-soon-text.tsx +++ b/src/app/coming-soon/coming-soon-text.tsx @@ -1,10 +1,10 @@ import React from 'react'; -const TEXT = 'Coming Soon'; +const TEXT = 'Coming Soon!'; export const ComingSoonText = () => { return ( -
+
{Array.from({ length: 3 }).map((_, index) => ( { return (
- {'Coming +
+

+ Join our waitlist! +

+ + Connect with Web3 leaders, get paid as a verified rep, and enjoy + dynamic fees that match demand. + + + +
); }; diff --git a/src/app/globals.css b/src/app/globals.css index b378a4d..b03607b 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -100,6 +100,7 @@ html { } .stack span { + font-size: 4.0rem; grid-row-start: 1; grid-column-start: 1; --stack-height: calc(100% / 3 - 1px); diff --git a/src/shared/hooks/use-add-to-waitlist.ts b/src/shared/hooks/use-add-to-waitlist.ts new file mode 100644 index 0000000..167ea53 --- /dev/null +++ b/src/shared/hooks/use-add-to-waitlist.ts @@ -0,0 +1,41 @@ +import toast from 'react-hot-toast'; + +import { useMutation } from '@tanstack/react-query'; +import { z } from 'zod'; + +import { MW_URL } from '@/shared/core/envs'; +import { genericResponseSchema } from '@/shared/core/schemas'; +import { mwPOST } from '@/shared/utils/mw-post'; + +const waitlistPayloadSchema = z.object({ + email: z + .string() + .min(1, { message: 'Email is required' }) + .email({ message: 'Invalid email address' }), + company: z.string().min(1, { message: 'Company is required' }), + role: z.string().min(1, { message: 'Role is required' }), +}); +type WaitlistPayload = z.infer; + +const addToWaitlist = async (payload: WaitlistPayload) => { + const { success, message } = await mwPOST({ + url: `${MW_URL}/grants/mail`, + label: 'addToWaitlist', + payload, + payloadSchema: waitlistPayloadSchema, + responseSchema: genericResponseSchema, + }); + + if (!success) { + throw new Error(message); + } + + return { message }; +}; + +export const useAddToWaitlist = () => + useMutation({ + mutationFn: (payload: WaitlistPayload) => addToWaitlist(payload), + onSuccess: () => toast.success('You have been added to the waitlist!'), + onError: (error) => toast.error(error.message), + });