From c8af4f3f4e968fb3a52a36c5e2b54a245b5744c1 Mon Sep 17 00:00:00 2001 From: Benjamin Akar Date: Sat, 4 Jun 2022 10:58:11 +0200 Subject: [PATCH 01/13] feat: implement waitlist --- apps/landing/package.json | 2 + apps/landing/src/components/HomeCTA.tsx | 237 +++++++++++++----- .../interface/src/components/icons/Alert.tsx | 26 ++ .../interface/src/components/icons/Info.tsx | 26 ++ pnpm-lock.yaml | Bin 637747 -> 619932 bytes 5 files changed, 231 insertions(+), 60 deletions(-) create mode 100644 packages/interface/src/components/icons/Alert.tsx create mode 100644 packages/interface/src/components/icons/Info.tsx diff --git a/apps/landing/package.json b/apps/landing/package.json index 7ba04d9cc..0adef90bb 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -12,6 +12,7 @@ "@headlessui/react": "^1.6.4", "@heroicons/react": "^1.0.6", "@icons-pack/react-simple-icons": "^4.7.0", + "@radix-ui/react-context-menu": "^0.1.6", "@sd/client": "workspace:*", "@sd/core": "workspace:*", "@sd/interface": "workspace:*", @@ -25,6 +26,7 @@ "phosphor-react": "^1.4.1", "prismjs": "^1.28.0", "react": "^18.1.0", + "react-canvas-confetti": "^1.3.0", "react-device-detect": "^2.2.2", "react-dom": "^18.1.0", "react-helmet": "^6.1.0", diff --git a/apps/landing/src/components/HomeCTA.tsx b/apps/landing/src/components/HomeCTA.tsx index f3300d872..41e7e3836 100644 --- a/apps/landing/src/components/HomeCTA.tsx +++ b/apps/landing/src/components/HomeCTA.tsx @@ -1,86 +1,203 @@ -import { Apple, Github, Linux, Windows } from '@icons-pack/react-simple-icons'; +import { Github } from '@icons-pack/react-simple-icons'; import { Button, Input } from '@sd/ui'; -// import clsx from 'clsx'; -import React, { useEffect } from 'react'; -import { useState } from 'react'; +import clsx from 'clsx'; +import React, { FormEvent, useState } from 'react'; +import ReactCanvasConfetti from 'react-canvas-confetti'; + +import { Alert } from '../../../../packages/interface/src/components/icons/Alert'; +import { Info } from '../../../../packages/interface/src/components/icons/Info'; export function HomeCTA() { - // const [showWaitlistInput, setShowWaitlistInput] = useState(false); - // const [waitlistEmail, setWaitlistEmail] = useState(''); + const [showWaitlistInput, setShowWaitlistInput] = useState(false); + const [loading, setLoading] = useState(false); + const [waitlistError, setWaitlistError] = useState(''); + const [waitlistSubmitted, setWaitlistSubmitted] = useState(false); + const [waitlistEmail, setWaitlistEmail] = useState(''); + const [fire, setFire] = useState(false); + + async function handleWaitlistSubmit(e: FormEvent) { + e.preventDefault(); + if (!waitlistEmail.trim().length) return; + + setLoading(true); + + const req = await fetch('https://waitlist-api.spacedrive.com/api/waitlist', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + email: waitlistEmail + }) + }); + + if (req.status === 200) { + setWaitlistError(''); + setFire(Math.random()); + setWaitlistSubmitted(true); + setLoading(false); + } else if (req.status >= 400 && req.status < 500) { + const res = await req.json(); + setWaitlistError(res.message); + + // Remove error after a few seconds + setTimeout(() => { + setWaitlistError(''); + }, 5000); + } + + setLoading(false); + } + return ( <> +
- {/* {showWaitlistInput ? ( */} - {/* <> + {!showWaitlistInput ? ( + <> */} - - {/* + + + ) : ( -
{ - e.preventDefault(); - fetch('https://waitlist-api.spacedrive.com/api/expression-of-interest', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - email: waitlistEmail - }) - }); - }} - > -
- setWaitlistEmail(e.target.value)} - placeholder="Enter your email" - className="rounded-r-none" - /> - + +
+ {(waitlistError || waitlistSubmitted) && ( +
+ {waitlistError ? ( + + ) : ( + + )} +

+ {waitlistError || 'You have been added to the waitlist'} +

+
+ )} +
+ setWaitlistEmail(e.target.value)} + placeholder="Enter your email" + className={clsx({ + 'hidden': waitlistSubmitted, + 'rounded-r-none': !waitlistSubmitted + })} + disabled={waitlistSubmitted} + /> + {!waitlistSubmitted && ( + + )} +
)} - */}
-

- {/* {showWaitlistInput ? ( +

+ {showWaitlistInput ? ( <> We'll keep your place in the queue for early access.

+ ) : waitlistSubmitted ? ( + <> + You have been added to the waitlist. +
+
+ ) : ( - <>*/} - Coming soon on macOS, Windows and Linux. -
- Shortly after to iOS & Android. - {/* )} -

*/} + <> + Coming soon on macOS, Windows and Linux. +
+ Shortly after to iOS & Android. + + )}

); diff --git a/packages/interface/src/components/icons/Alert.tsx b/packages/interface/src/components/icons/Alert.tsx new file mode 100644 index 000000000..ec8773c88 --- /dev/null +++ b/packages/interface/src/components/icons/Alert.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +interface AlertProps { + /** + * Add additional classes to the SVG element + */ + className?: string; +} + +export function Alert(props: AlertProps) { + return ( + + + + ); +} diff --git a/packages/interface/src/components/icons/Info.tsx b/packages/interface/src/components/icons/Info.tsx new file mode 100644 index 000000000..82a388eee --- /dev/null +++ b/packages/interface/src/components/icons/Info.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +interface InfoProps { + /** + * Add additional classes to the SVG element + */ + className?: string; +} + +export function Info(props: InfoProps) { + return ( + + + + ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ce8730b5aba2548e1584d547609f6bf71ea02a6e..e7e90045ca5a404c6fa19beeea4890f2e9223066 100644 GIT binary patch delta 18450 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 delta 26566 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 From 409ebc0acdb124b913381f0d6200546c1df54a22 Mon Sep 17 00:00:00 2001 From: Benjamin Akar Date: Sat, 4 Jun 2022 10:59:20 +0200 Subject: [PATCH 02/13] chore: remove radix from landing --- apps/landing/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/landing/package.json b/apps/landing/package.json index 0adef90bb..fba03a22f 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -12,7 +12,6 @@ "@headlessui/react": "^1.6.4", "@heroicons/react": "^1.0.6", "@icons-pack/react-simple-icons": "^4.7.0", - "@radix-ui/react-context-menu": "^0.1.6", "@sd/client": "workspace:*", "@sd/core": "workspace:*", "@sd/interface": "workspace:*", From 8fdcb0c1a43ebecc802a0b8d525dd38f7fca8558 Mon Sep 17 00:00:00 2001 From: Benjamin Akar Date: Sat, 4 Jun 2022 11:40:40 +0200 Subject: [PATCH 03/13] chore: implement unsubscribe from waitlist on landing --- apps/landing/src/components/Bubbles.tsx | 4 +-- apps/landing/src/pages/index.tsx | 44 +++++++++++++++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/apps/landing/src/components/Bubbles.tsx b/apps/landing/src/components/Bubbles.tsx index 1e6ff5030..0ecd0c9cf 100644 --- a/apps/landing/src/components/Bubbles.tsx +++ b/apps/landing/src/components/Bubbles.tsx @@ -4,12 +4,12 @@ import { loadFull } from 'tsparticles'; export const Bubbles = () => { const particlesInit = async (main: any) => { - console.log(main); + // console.log(main); await loadFull(main); }; const particlesLoaded = (container: any) => { - console.log(container); + // console.log(container); }; return ( diff --git a/apps/landing/src/pages/index.tsx b/apps/landing/src/pages/index.tsx index de26c2974..77db7d322 100644 --- a/apps/landing/src/pages/index.tsx +++ b/apps/landing/src/pages/index.tsx @@ -1,15 +1,11 @@ -import { Apple, Github, Linux, Windows } from '@icons-pack/react-simple-icons'; -import { Button, Input } from '@sd/ui'; import clsx from 'clsx'; -import React, { useEffect } from 'react'; -import { useState } from 'react'; +import React, { useEffect, useState } from 'react'; +import { useSearchParams } from 'react-router-dom'; +import { Info } from '../../../../packages/interface/src/components/icons/Info'; import AppEmbed from '../components/AppEmbed'; import { Bubbles } from '../components/Bubbles'; -import { Footer } from '../components/Footer'; import HomeCTA from '../components/HomeCTA'; -import NavBar from '../components/NavBar'; -import NewBanner from '../components/NewBanner'; interface SectionProps { orientation: 'left' | 'right'; @@ -44,6 +40,29 @@ function Section(props: SectionProps = { orientation: 'left' }) { } function Page() { + const [searchParams, setSearchParams] = useSearchParams(); + const [unsubscribedFromWaitlist, setUnsubscribedFromWaitlist] = useState(false); + + useEffect(() => { + if (!window) return; + + const cuid = searchParams.get('wunsub'); + if (!cuid) return; + + (async () => { + const req = await fetch(`https://waitlist-api.spacedrive.com/api/waitlist?i=${cuid}`, { + method: 'DELETE' + }); + + if (req.status === 200) { + setUnsubscribedFromWaitlist(true); + window.history.replaceState({}, '', 'https://spacedrive.com/'); + } else if (req.status >= 400 && req.status < 500) { + alert('An error occurred while unsubscribing from waitlist'); + } + })(); + }, []); + return ( <>