From cf22401e18309d27d94c817acf201e3bc01cdcbc Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 17 Jul 2024 15:34:11 +0200 Subject: [PATCH 01/82] feat: add marketing pages --- src/app/(marketing)/create-profile/page.tsx | 26 +++++++++++++++++++++ src/app/(marketing)/profile/page.tsx | 6 +++++ 2 files changed, 32 insertions(+) create mode 100644 src/app/(marketing)/create-profile/page.tsx create mode 100644 src/app/(marketing)/profile/page.tsx diff --git a/src/app/(marketing)/create-profile/page.tsx b/src/app/(marketing)/create-profile/page.tsx new file mode 100644 index 0000000000..1f774719de --- /dev/null +++ b/src/app/(marketing)/create-profile/page.tsx @@ -0,0 +1,26 @@ +import { Layout } from "@/components/Layout" +import type { Metadata } from "next" + +export const metadata: Metadata = { + title: "Create profile", +} + +const Page = () => { + return ( + + + + + +
+
+ + + + main content + + ) +} + +// biome-ignore lint/style/noDefaultExport: page route +export default Page diff --git a/src/app/(marketing)/profile/page.tsx b/src/app/(marketing)/profile/page.tsx new file mode 100644 index 0000000000..50f5e2c58a --- /dev/null +++ b/src/app/(marketing)/profile/page.tsx @@ -0,0 +1,6 @@ +const Page = () => { + return <>profile +} + +// biome-ignore lint/style/noDefaultExport: page route +export default Page From 8b0aa82706e838ede219b1f3258eb4981204d949 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 17 Jul 2024 17:39:43 +0200 Subject: [PATCH 02/82] chore: strip layout and Header This commit is to be reverted, stripping happens for faster compilations on dev server --- src/app/layout.tsx | 23 +++++++++++------------ src/v2/components/Header/Header.tsx | 2 -- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3390ae6e06..44a37e613d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,11 +1,9 @@ -import { Providers } from "@/components/Providers" -import { PostHogPageViews } from "@/components/Providers/PostHogPageViews" import { dystopian, inter } from "fonts" import type { Metadata } from "next" -import { type ReactNode, Suspense } from "react" +import { type ReactNode } from "react" import "./globals.css" import { cn } from "@/lib/utils" -import NextTopLoader from "nextjs-toploader" +import { ThemeProvider } from "next-themes" interface RootLayoutProps { children: ReactNode @@ -21,16 +19,17 @@ export default function RootLayout({ children }: RootLayoutProps) { return ( - - - + + {children} - - - - - + ) diff --git a/src/v2/components/Header/Header.tsx b/src/v2/components/Header/Header.tsx index b32aa8c806..13ff82e542 100644 --- a/src/v2/components/Header/Header.tsx +++ b/src/v2/components/Header/Header.tsx @@ -1,12 +1,10 @@ "use client" -import { Account } from "../Account" import { NavMenu } from "./NavMenu" const Header = () => (
-
) From d37f5f3441edb9f64cb6d6da9217835275b0191c Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 17 Jul 2024 17:41:13 +0200 Subject: [PATCH 03/82] feat: add GuilPassInvite --- .../_components/GuildPassInvite.tsx | 25 ++++++++++++++ src/app/(marketing)/create-profile/page.tsx | 33 +++++++++++++++---- src/v2/components/Layout/Layout.tsx | 10 ++++-- 3 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx diff --git a/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx b/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx new file mode 100644 index 0000000000..bf2c1cb0a7 --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx @@ -0,0 +1,25 @@ +import { Button } from "@/components/ui/Button" +import { Card } from "@/components/ui/Card" +import { Input } from "@/components/ui/Input" +import { Label } from "@/components/ui/Label" +import { ArrowRight } from "@phosphor-icons/react/dist/ssr" + +const INVITE_HANDLE_ID = "invite-handle" + +export const GuildPassInvite = () => { + return ( + +
canvas placeholder
+

+ Claim your Guild Pass and begin an epic adventure! +

+ + +

Guild Pass is invite only

+ +
+ ) +} diff --git a/src/app/(marketing)/create-profile/page.tsx b/src/app/(marketing)/create-profile/page.tsx index 1f774719de..fc32a62639 100644 --- a/src/app/(marketing)/create-profile/page.tsx +++ b/src/app/(marketing)/create-profile/page.tsx @@ -1,5 +1,7 @@ import { Layout } from "@/components/Layout" +import svgToTinyDataUri from "mini-svg-data-uri" import type { Metadata } from "next" +import { GuildPassInvite } from "./_components/GuildPassInvite" export const metadata: Metadata = { title: "Create profile", @@ -7,20 +9,37 @@ export const metadata: Metadata = { const Page = () => { return ( - + +
` + )}")`, + }} + /> - - -
-
+ +
+
- main content + + + ) } -// biome-ignore lint/style/noDefaultExport: page route export default Page diff --git a/src/v2/components/Layout/Layout.tsx b/src/v2/components/Layout/Layout.tsx index f8afd81cd0..f0c23b8454 100644 --- a/src/v2/components/Layout/Layout.tsx +++ b/src/v2/components/Layout/Layout.tsx @@ -7,8 +7,12 @@ import { PropsWithChildren, ReactNode, forwardRef } from "react" * Root * -----------------------------------------------------------------------------------------------*/ -const Root = ({ children }: PropsWithChildren) => ( -
{children}
+export interface RootProps extends React.HTMLAttributes {} + +const Root = ({ children, ...props }: RootProps) => ( +
+ {children} +
) /* ------------------------------------------------------------------------------------------------- @@ -81,7 +85,7 @@ const Banner = ({ children, offset = 112, className }: BannerProps) => ( * -----------------------------------------------------------------------------------------------*/ const Main = ({ children }: PropsWithChildren) => ( -
+
{children}
) From 6a35625d2463c328c5308b9e12abd1d21a0dbc35 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 17 Jul 2024 20:18:15 +0200 Subject: [PATCH 04/82] feat: add GuildPassInvite --- package-lock.json | 35 +++ package.json | 2 + .../_components/GuildPassInvite.tsx | 4 +- .../_components/GuildPassPicker.tsx | 162 +++++++++++ .../_components/OnboardingStepper.tsx | 18 ++ src/app/(marketing)/create-profile/atoms.ts | 3 + src/app/(marketing)/create-profile/page.tsx | 16 +- src/v2/components/Layout/Layout.tsx | 2 +- src/v2/components/ui/Carousel.tsx | 254 ++++++++++++++++++ 9 files changed, 484 insertions(+), 12 deletions(-) create mode 100644 src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx create mode 100644 src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx create mode 100644 src/app/(marketing)/create-profile/atoms.ts create mode 100644 src/v2/components/ui/Carousel.tsx diff --git a/package-lock.json b/package-lock.json index 03a67f750b..230034b0cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,6 +65,8 @@ "clsx": "^2.1.1", "color": "^4.2.3", "colorthief": "^2.3.2", + "embla-carousel-autoplay": "^8.1.6", + "embla-carousel-react": "^8.1.6", "events": "^3.3.0", "framer-motion": "^7.10.3", "fuels": "^0.89.1", @@ -19171,6 +19173,39 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/embla-carousel": { + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.1.6.tgz", + "integrity": "sha512-9n7FVsbPAs1KD+JmO84DnEDOZMXPBQbLujjMQqvsBRN2CDWwgZ9hRSNapztdPnyJfzOIxowGmj0BUQ8ACYAPkA==" + }, + "node_modules/embla-carousel-autoplay": { + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.1.6.tgz", + "integrity": "sha512-e5n9f4q+DVeBPiPPT3gwzqpiqfae8aP8fQACS4OZkPFvFLdsVhnWcw+cwtewryP7snWJGKPXEMA1GOjieEKv+w==", + "peerDependencies": { + "embla-carousel": "8.1.6" + } + }, + "node_modules/embla-carousel-react": { + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.1.6.tgz", + "integrity": "sha512-DHxwFzF63yVrU95Eo58E9Xr5b6Y9ul6TTsqb/rtwMi+jXudAmIqN1i9iBxQ73i8jKuUVxll/ziNYMmnWvrdQJQ==", + "dependencies": { + "embla-carousel": "8.1.6", + "embla-carousel-reactive-utils": "8.1.6" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.1.6", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.1.6.tgz", + "integrity": "sha512-Wg+J2YoqLqkaqsXi7fTJaLmXm6BpgDRJ0EfTdvQ4KE/ip5OsUuKGpJsEQDTt4waGXSDyZhIBlfoQtgGJeyYQ1Q==", + "peerDependencies": { + "embla-carousel": "8.1.6" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", diff --git a/package.json b/package.json index 46746390c5..bb3ccc251d 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,8 @@ "clsx": "^2.1.1", "color": "^4.2.3", "colorthief": "^2.3.2", + "embla-carousel-autoplay": "^8.1.6", + "embla-carousel-react": "^8.1.6", "events": "^3.3.0", "framer-motion": "^7.10.3", "fuels": "^0.89.1", diff --git a/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx b/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx index bf2c1cb0a7..d9032bcfa4 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx @@ -8,9 +8,9 @@ const INVITE_HANDLE_ID = "invite-handle" export const GuildPassInvite = () => { return ( - +
canvas placeholder
-

+

Claim your Guild Pass and begin an epic adventure!

diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx new file mode 100644 index 0000000000..e37796cae1 --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -0,0 +1,162 @@ +"use client" + +import { Card } from "@/components/ui/Card" +import { Carousel, CarouselContent, CarouselItem } from "@/components/ui/Carousel" +import { cn } from "@/lib/utils" +import Autoplay from "embla-carousel-autoplay" + +interface Benefit { + title: string + description: string + isAvailable: boolean +} + +const BENEFITS = [ + { + title: "Launch your Guild Profile", + description: "Your onchain profile with achievements and XP level ", + isAvailable: true, + }, + { + title: "Unlock exclusive rewards", + description: "Pass holders can access unique and one-off rewards from guilds", + isAvailable: true, + }, + { + title: "Get early access to Guild features", + description: "Be the first to unlock and experience our newest features", + isAvailable: true, + }, + { + title: "Priority support", + description: + "Get help within hours - even our CEO is answering priority tickets", + isAvailable: true, + }, + { + title: "Manage your personal Guild", + description: + "Special access to gamified features to help creators engage their audience", + isAvailable: false, + }, + { + title: "Alpha Explorer", + description: + "Unlock secret guilds and earn exclusive rewards before they become popular", + isAvailable: false, + }, + { + title: "Be part of Gold community", + description: + "Shape Guild's future - your ideas drive what we build and when we build it", + isAvailable: false, + }, + { + title: "Very top secret stuff", + description: + "There are things we can't tell you just yet - you'll have to see them for yourself", + isAvailable: false, + }, +] as const satisfies Benefit[] + +interface Subscription { + title: string + pricing: string + description: string +} + +const SUBSCRIPTIONS = [ + { + title: "Single Pass", + pricing: "$6 / month", + description: "For the curious, who want to try Guild’s new features", + }, + { + title: "Bundle Pass", + pricing: "$60 / year", + description: "For the professionals, who would benefit from Guild continuously", + }, + { + title: "Lifetime Pass", + pricing: "0.1ETH one time", + description: + "For Guild’s biggest supporters, who are excited for the future of Guild", + }, +] as const satisfies Subscription[] + +export const GuildPassPicker = () => { + return ( + +

+ Choose your pass +

+ + + {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( + +
+
canvas
+
+

{title}

+ + {pricing} + +

+ {description} +

+
+ {i < SUBSCRIPTIONS.length - 1 && ( +
+ )} +
+
+ ))} +
+
+
+

+ Benefits +

+

+ All passes provide the same benefits +

+
+ {BENEFITS.map(({ title, description, isAvailable }) => ( + + {isAvailable || ( +
+ Soon +
+ )} +
+ # +
+
+

{title}

+

{description}

+
+
+ ))} +
+

+ Prices are subject to change in the future +

+
+
+ ) +} diff --git a/src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx b/src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx new file mode 100644 index 0000000000..92b4956723 --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx @@ -0,0 +1,18 @@ +"use client" + +import { useAtom } from "jotai" +import { onboardingProgressionIndexAtom } from "../atoms" +import { GuildPassInvite } from "./GuildPassInvite" +import { GuildPassPicker } from "./GuildPassPicker" + +const progressionPanes = [, ] + +export const OnboardingStepper = () => { + const [onboardingProgressonIndex, setOnboardingProgressionIndex] = useAtom( + onboardingProgressionIndexAtom + ) + + setOnboardingProgressionIndex(1) + + return progressionPanes[onboardingProgressonIndex] +} diff --git a/src/app/(marketing)/create-profile/atoms.ts b/src/app/(marketing)/create-profile/atoms.ts new file mode 100644 index 0000000000..9fd5b4091f --- /dev/null +++ b/src/app/(marketing)/create-profile/atoms.ts @@ -0,0 +1,3 @@ +import { atom } from "jotai" + +export const onboardingProgressionIndexAtom = atom(0) diff --git a/src/app/(marketing)/create-profile/page.tsx b/src/app/(marketing)/create-profile/page.tsx index fc32a62639..06ac164411 100644 --- a/src/app/(marketing)/create-profile/page.tsx +++ b/src/app/(marketing)/create-profile/page.tsx @@ -1,7 +1,7 @@ import { Layout } from "@/components/Layout" import svgToTinyDataUri from "mini-svg-data-uri" import type { Metadata } from "next" -import { GuildPassInvite } from "./_components/GuildPassInvite" +import { OnboardingStepper } from "./_components/OnboardingStepper" export const metadata: Metadata = { title: "Create profile", @@ -11,7 +11,7 @@ const Page = () => { return (
` @@ -20,23 +20,21 @@ const Page = () => { /> - +
- - +
+ +
) diff --git a/src/v2/components/Layout/Layout.tsx b/src/v2/components/Layout/Layout.tsx index f0c23b8454..b6004590a0 100644 --- a/src/v2/components/Layout/Layout.tsx +++ b/src/v2/components/Layout/Layout.tsx @@ -85,7 +85,7 @@ const Banner = ({ children, offset = 112, className }: BannerProps) => ( * -----------------------------------------------------------------------------------------------*/ const Main = ({ children }: PropsWithChildren) => ( -
+
{children}
) diff --git a/src/v2/components/ui/Carousel.tsx b/src/v2/components/ui/Carousel.tsx new file mode 100644 index 0000000000..d72dbbab56 --- /dev/null +++ b/src/v2/components/ui/Carousel.tsx @@ -0,0 +1,254 @@ +"use client" + +import { ArrowLeft, ArrowRight } from "@phosphor-icons/react" +import useEmblaCarousel, { type UseEmblaCarouselType } from "embla-carousel-react" +import * as React from "react" + +import { Button } from "@/components/ui/Button" +import { cn } from "@/lib/utils" + +type CarouselApi = UseEmblaCarouselType[1] +type UseCarouselParameters = Parameters +type CarouselOptions = UseCarouselParameters[0] +type CarouselPlugin = UseCarouselParameters[1] + +type CarouselProps = { + opts?: CarouselOptions + plugins?: CarouselPlugin + orientation?: "horizontal" | "vertical" + setApi?: (api: CarouselApi) => void +} + +type CarouselContextProps = { + carouselRef: ReturnType[0] + api: ReturnType[1] + scrollPrev: () => void + scrollNext: () => void + canScrollPrev: boolean + canScrollNext: boolean +} & CarouselProps + +const CarouselContext = React.createContext(null) + +function useCarousel() { + const context = React.useContext(CarouselContext) + + if (!context) { + throw new Error("useCarousel must be used within a ") + } + + return context +} + +const Carousel = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & CarouselProps +>( + ( + { + orientation = "horizontal", + opts, + setApi, + plugins, + className, + children, + ...props + }, + ref + ) => { + const [carouselRef, api] = useEmblaCarousel( + { + ...opts, + axis: orientation === "horizontal" ? "x" : "y", + }, + plugins + ) + const [canScrollPrev, setCanScrollPrev] = React.useState(false) + const [canScrollNext, setCanScrollNext] = React.useState(false) + + const onSelect = React.useCallback((api: CarouselApi) => { + if (!api) { + return + } + + setCanScrollPrev(api.canScrollPrev()) + setCanScrollNext(api.canScrollNext()) + }, []) + + const scrollPrev = React.useCallback(() => { + api?.scrollPrev() + }, [api]) + + const scrollNext = React.useCallback(() => { + api?.scrollNext() + }, [api]) + + const handleKeyDown = React.useCallback( + (event: React.KeyboardEvent) => { + if (event.key === "ArrowLeft") { + event.preventDefault() + scrollPrev() + } else if (event.key === "ArrowRight") { + event.preventDefault() + scrollNext() + } + }, + [scrollPrev, scrollNext] + ) + + React.useEffect(() => { + if (!api || !setApi) { + return + } + + setApi(api) + }, [api, setApi]) + + React.useEffect(() => { + if (!api) { + return + } + + onSelect(api) + api.on("reInit", onSelect) + api.on("select", onSelect) + + return () => { + api?.off("select", onSelect) + } + }, [api, onSelect]) + + return ( + +
+ {children} +
+
+ ) + } +) +Carousel.displayName = "Carousel" + +const CarouselContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const { carouselRef, orientation } = useCarousel() + + return ( +
+
+
+ ) +}) +CarouselContent.displayName = "CarouselContent" + +const CarouselItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + return ( +
+ ) +}) +CarouselItem.displayName = "CarouselItem" + +const CarouselPrevious = React.forwardRef< + HTMLButtonElement, + React.ComponentProps +>(({ className, variant = "outline", size = "icon", ...props }, ref) => { + const { orientation, scrollPrev, canScrollPrev } = useCarousel() + + return ( + + ) +}) +CarouselPrevious.displayName = "CarouselPrevious" + +const CarouselNext = React.forwardRef< + HTMLButtonElement, + React.ComponentProps +>(({ className, variant = "outline", size = "icon", ...props }, ref) => { + const { orientation, scrollNext, canScrollNext } = useCarousel() + + return ( + + ) +}) +CarouselNext.displayName = "CarouselNext" + +export { + type CarouselApi, + Carousel, + CarouselContent, + CarouselItem, + CarouselPrevious, + CarouselNext, +} From a1bf2fc4c305e8451e662b7603fa619ea1efe5f5 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 17 Jul 2024 20:56:08 +0200 Subject: [PATCH 05/82] feat: add threejs --- package-lock.json | 170 ++++++++++++++++++ package.json | 4 + .../_components/GuildPassInvite.tsx | 5 +- .../_components/GuildPassPicker.tsx | 5 +- .../_components/GuildPassScene.tsx | 33 ++++ 5 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 src/app/(marketing)/create-profile/_components/GuildPassScene.tsx diff --git a/package-lock.json b/package-lock.json index 230034b0cb..e250e80555 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,11 +47,13 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", + "@react-three/fiber": "^8.16.8", "@snyk/protect": "latest", "@t3-oss/env-nextjs": "^0.10.1", "@tanstack/react-query": "^5.26.3", "@tanstack/react-table": "^8.13.2", "@tanstack/react-virtual": "^3.5.0", + "@types/three": "^0.166.0", "@vercel/kv": "^1.0.1", "@vercel/postgres": "^0.7.2", "@visx/curve": "^3.3.0", @@ -99,6 +101,7 @@ "swr": "^2.2.4", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", + "three": "^0.166.1", "usehooks-ts": "^3.1.0", "uuidv7": "^0.6.3", "viem": "^2.17.0", @@ -10545,6 +10548,78 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@react-three/fiber": { + "version": "8.16.8", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", + "integrity": "sha512-Lc8fjATtvQEfSd8d5iKdbpHtRm/aPMeFj7jQvp6TNHfpo8IQTW3wwcE1ZMrGGoUH+w2mnyS+0MK1NLPLnuzGkQ==", + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@react-three/fiber/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, "node_modules/@rgba-image/common": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/@rgba-image/common/-/common-0.1.13.tgz", @@ -12445,6 +12520,11 @@ "node": ">=10.13.0" } }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.2", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.2.tgz", + "integrity": "sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==" + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -12898,6 +12978,14 @@ "@types/react": "*" } }, + "node_modules/@types/react-reconciler": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", + "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.10", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", @@ -12965,6 +13053,23 @@ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "peer": true }, + "node_modules/@types/stats.js": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==" + }, + "node_modules/@types/three": { + "version": "0.166.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.166.0.tgz", + "integrity": "sha512-FHMnpcdhdbdOOIYbfkTkUVpYMW53odxbTRwd0/xJpYnTzEsjnVnondGAvHZb4z06UW0vo6WPVuvH0/9qrxKx7g==", + "dependencies": { + "@tweenjs/tween.js": "~23.1.2", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -12981,6 +13086,11 @@ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true }, + "node_modules/@types/webxr": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.19.tgz", + "integrity": "sha512-4hxA+NwohSgImdTSlPXEqDqqFktNgmTXQ05ff1uWam05tNGroCMp4G+4XVl6qWm1p7GQ/9oD41kAYsSssF6Mzw==" + }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", @@ -22119,6 +22229,25 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/its-fine": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", + "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", + "dependencies": { + "@types/react-reconciler": "^0.28.0" + }, + "peerDependencies": { + "react": ">=18.0" + } + }, + "node_modules/its-fine/node_modules/@types/react-reconciler": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", + "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -24445,6 +24574,11 @@ "node": ">= 8" } }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==" + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -28522,6 +28656,29 @@ "npm": ">=5" } }, + "node_modules/react-reconciler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", + "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.21.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.0.0" + } + }, + "node_modules/react-reconciler/node_modules/scheduler": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -31368,6 +31525,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "peerDependencies": { + "react": ">=17.0" + } + }, "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -31768,6 +31933,11 @@ "real-require": "^0.1.0" } }, + "node_modules/three": { + "version": "0.166.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.166.1.tgz", + "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg==" + }, "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", diff --git a/package.json b/package.json index bb3ccc251d..8346d65f69 100644 --- a/package.json +++ b/package.json @@ -59,11 +59,14 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", + "@react-three/drei": "^9.108.4", + "@react-three/fiber": "^8.16.8", "@snyk/protect": "latest", "@t3-oss/env-nextjs": "^0.10.1", "@tanstack/react-query": "^5.26.3", "@tanstack/react-table": "^8.13.2", "@tanstack/react-virtual": "^3.5.0", + "@types/three": "^0.166.0", "@vercel/kv": "^1.0.1", "@vercel/postgres": "^0.7.2", "@visx/curve": "^3.3.0", @@ -111,6 +114,7 @@ "swr": "^2.2.4", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", + "three": "^0.166.1", "usehooks-ts": "^3.1.0", "uuidv7": "^0.6.3", "viem": "^2.17.0", diff --git a/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx b/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx index d9032bcfa4..ac4cbd4385 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassInvite.tsx @@ -3,13 +3,16 @@ import { Card } from "@/components/ui/Card" import { Input } from "@/components/ui/Input" import { Label } from "@/components/ui/Label" import { ArrowRight } from "@phosphor-icons/react/dist/ssr" +import { GuildPassScene } from "./GuildPassScene" const INVITE_HANDLE_ID = "invite-handle" export const GuildPassInvite = () => { return ( -
canvas placeholder
+
+ +

Claim your Guild Pass and begin an epic adventure!

diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index e37796cae1..c4d8250bf7 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -4,6 +4,7 @@ import { Card } from "@/components/ui/Card" import { Carousel, CarouselContent, CarouselItem } from "@/components/ui/Carousel" import { cn } from "@/lib/utils" import Autoplay from "embla-carousel-autoplay" +import { GuildPassScene } from "./GuildPassScene" interface Benefit { title: string @@ -105,7 +106,9 @@ export const GuildPassPicker = () => { key={title} >
-
canvas
+
+ +

{title}

diff --git a/src/app/(marketing)/create-profile/_components/GuildPassScene.tsx b/src/app/(marketing)/create-profile/_components/GuildPassScene.tsx new file mode 100644 index 0000000000..b4ff94500d --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/GuildPassScene.tsx @@ -0,0 +1,33 @@ +"use client" + +import { Float } from "@react-three/drei" +import { Canvas, ThreeElements } from "@react-three/fiber" +import * as THREE from "three" + +function GuildPass(props: ThreeElements["mesh"]) { + return ( + + + + + ) +} + +export const GuildPassScene = () => { + return ( + + + + + + + + + ) +} From a28c323c191d7bab352791826612400125ad0529 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 13:41:49 +0200 Subject: [PATCH 06/82] chore: fine tune carousel --- .../_components/GuildPassPicker.tsx | 33 ++++++++++--------- .../_components/GuildPassScene.tsx | 4 +-- src/v2/components/ui/Carousel.tsx | 7 +++- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index c4d8250bf7..8adc18c740 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -2,6 +2,7 @@ import { Card } from "@/components/ui/Card" import { Carousel, CarouselContent, CarouselItem } from "@/components/ui/Carousel" +import { Separator } from "@/components/ui/Separator" import { cn } from "@/lib/utils" import Autoplay from "embla-carousel-autoplay" import { GuildPassScene } from "./GuildPassScene" @@ -31,7 +32,7 @@ const BENEFITS = [ { title: "Priority support", description: - "Get help within hours - even our CEO is answering priority tickets", + "Get help within hours — even our CEO is answering priority tickets", isAvailable: true, }, { @@ -49,13 +50,13 @@ const BENEFITS = [ { title: "Be part of Gold community", description: - "Shape Guild's future - your ideas drive what we build and when we build it", + "Shape Guild's future — your ideas drive what we build and when we build it", isAvailable: false, }, { title: "Very top secret stuff", description: - "There are things we can't tell you just yet - you'll have to see them for yourself", + "There are things we can't tell you just yet — you'll have to see them for yourself", isAvailable: false, }, ] as const satisfies Benefit[] @@ -79,7 +80,7 @@ const SUBSCRIPTIONS = [ }, { title: "Lifetime Pass", - pricing: "0.1ETH one time", + pricing: "0.1 ETH one time", description: "For Guild’s biggest supporters, who are excited for the future of Guild", }, @@ -92,45 +93,45 @@ export const GuildPassPicker = () => { Choose your pass - + {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( - +
-
+

{title}

{pricing} -

+

{description}

{i < SUBSCRIPTIONS.length - 1 && ( -
+ )}
))}
-
+

Benefits

-

+

All passes provide the same benefits

@@ -142,7 +143,7 @@ export const GuildPassPicker = () => { key={title} > {isAvailable || ( -
+
Soon
)} diff --git a/src/app/(marketing)/create-profile/_components/GuildPassScene.tsx b/src/app/(marketing)/create-profile/_components/GuildPassScene.tsx index b4ff94500d..589ba3a311 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassScene.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassScene.tsx @@ -7,7 +7,7 @@ import * as THREE from "three" function GuildPass(props: ThreeElements["mesh"]) { return ( - + ) @@ -25,7 +25,7 @@ export const GuildPassScene = () => { intensity={Math.PI} /> - + diff --git a/src/v2/components/ui/Carousel.tsx b/src/v2/components/ui/Carousel.tsx index d72dbbab56..284c1ddaaf 100644 --- a/src/v2/components/ui/Carousel.tsx +++ b/src/v2/components/ui/Carousel.tsx @@ -174,12 +174,17 @@ const CarouselItem = React.forwardRef< HTMLDivElement, React.HTMLAttributes >(({ className, ...props }, ref) => { + const { orientation } = useCarousel() return (
) From f069fc03037f4027ad4447d36b6c2533aeda2f3d Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 14:40:26 +0200 Subject: [PATCH 07/82] feat: add CarouselDotButton --- .../_components/GuildPassPicker.tsx | 38 ++++++++-- src/v2/components/ui/Carousel.tsx | 74 +++++++++++++++++++ 2 files changed, 105 insertions(+), 7 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index 8adc18c740..2ee0ef6780 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -1,10 +1,19 @@ "use client" +import { Button } from "@/components/ui/Button" import { Card } from "@/components/ui/Card" -import { Carousel, CarouselContent, CarouselItem } from "@/components/ui/Carousel" +import { + Carousel, + CarouselApi, + CarouselContent, + CarouselDotButton, + CarouselItem, + useCarouselDotButton, +} from "@/components/ui/Carousel" import { Separator } from "@/components/ui/Separator" import { cn } from "@/lib/utils" import Autoplay from "embla-carousel-autoplay" +import { useRef, useState } from "react" import { GuildPassScene } from "./GuildPassScene" interface Benefit { @@ -87,18 +96,21 @@ const SUBSCRIPTIONS = [ ] as const satisfies Subscription[] export const GuildPassPicker = () => { + const [api, setApi] = useState() + const { selectedIndex, scrollSnaps, onDotButtonClick } = useCarouselDotButton(api) + const carouselPlugins = useRef([ + Autoplay({ delay: 4000, stopOnInteraction: true }), + ]) + return ( - +

Choose your pass

{SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( @@ -115,6 +127,9 @@ export const GuildPassPicker = () => {

{description}

+
{i < SUBSCRIPTIONS.length - 1 && ( { ))} +
+ {scrollSnaps.map((_, index) => ( + onDotButtonClick(index)} + isActive={index === selectedIndex} + /> + ))} +

Benefits diff --git a/src/v2/components/ui/Carousel.tsx b/src/v2/components/ui/Carousel.tsx index 284c1ddaaf..093bd61bc0 100644 --- a/src/v2/components/ui/Carousel.tsx +++ b/src/v2/components/ui/Carousel.tsx @@ -1,6 +1,7 @@ "use client" import { ArrowLeft, ArrowRight } from "@phosphor-icons/react" +import { EmblaCarouselType } from "embla-carousel" import useEmblaCarousel, { type UseEmblaCarouselType } from "embla-carousel-react" import * as React from "react" @@ -249,8 +250,81 @@ const CarouselNext = React.forwardRef< }) CarouselNext.displayName = "CarouselNext" +type UseCarouselDotButton = { + selectedIndex: number + scrollSnaps: number[] + onDotButtonClick: (index: number) => void +} + +export const useCarouselDotButton = ( + api: EmblaCarouselType | undefined +): UseCarouselDotButton => { + const [selectedIndex, setSelectedIndex] = React.useState(0) + const [scrollSnaps, setScrollSnaps] = React.useState([]) + + const onDotButtonClick = React.useCallback( + (index: number) => { + if (!api) return + api.scrollTo(index) + }, + [api] + ) + + const onInit = React.useCallback((api: EmblaCarouselType) => { + setScrollSnaps(api.scrollSnapList()) + }, []) + + const onSelect = React.useCallback((api: EmblaCarouselType) => { + setSelectedIndex(api.selectedScrollSnap()) + }, []) + + React.useEffect(() => { + if (!api) return + + onInit(api) + onSelect(api) + api.on("reInit", onInit).on("reInit", onSelect).on("select", onSelect) + }, [api, onInit, onSelect]) + + return { + selectedIndex, + scrollSnaps, + onDotButtonClick, + } +} + +type PropType = React.ComponentPropsWithRef<"button"> & { + isActive?: boolean +} + +const CarouselDotButton: React.FunctionComponent = ({ + children, + className, + isActive = false, + ...restProps +}) => { + return ( + + ) +} +CarouselDotButton.displayName = "CarouselDotButton" + export { type CarouselApi, + CarouselDotButton, Carousel, CarouselContent, CarouselItem, From 24b3aa7b812b372b58e87bbfa734e4b2a2e1b7ee Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 14:41:36 +0200 Subject: [PATCH 08/82] chore: rename hook --- .../create-profile/_components/GuildPassPicker.tsx | 5 +++-- src/v2/components/ui/Carousel.tsx | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index 2ee0ef6780..1087774d3f 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -97,7 +97,8 @@ const SUBSCRIPTIONS = [ export const GuildPassPicker = () => { const [api, setApi] = useState() - const { selectedIndex, scrollSnaps, onDotButtonClick } = useCarouselDotButton(api) + const { selectedIndex, scrollSnaps, onCarouselDotButtonClick } = + useCarouselDotButton(api) const carouselPlugins = useRef([ Autoplay({ delay: 4000, stopOnInteraction: true }), ]) @@ -146,7 +147,7 @@ export const GuildPassPicker = () => { {scrollSnaps.map((_, index) => ( onDotButtonClick(index)} + onClick={() => onCarouselDotButtonClick(index)} isActive={index === selectedIndex} /> ))} diff --git a/src/v2/components/ui/Carousel.tsx b/src/v2/components/ui/Carousel.tsx index 093bd61bc0..115fb8670b 100644 --- a/src/v2/components/ui/Carousel.tsx +++ b/src/v2/components/ui/Carousel.tsx @@ -262,7 +262,7 @@ export const useCarouselDotButton = ( const [selectedIndex, setSelectedIndex] = React.useState(0) const [scrollSnaps, setScrollSnaps] = React.useState([]) - const onDotButtonClick = React.useCallback( + const onCarouselDotButtonClick = React.useCallback( (index: number) => { if (!api) return api.scrollTo(index) @@ -289,7 +289,7 @@ export const useCarouselDotButton = ( return { selectedIndex, scrollSnaps, - onDotButtonClick, + onCarouselDotButtonClick, } } From c3474140bf2ca27aa8faf1b114823a81db491554 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 14:44:00 +0200 Subject: [PATCH 09/82] fix: update CarouselDotButton type --- src/v2/components/ui/Carousel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v2/components/ui/Carousel.tsx b/src/v2/components/ui/Carousel.tsx index 115fb8670b..c131b51b75 100644 --- a/src/v2/components/ui/Carousel.tsx +++ b/src/v2/components/ui/Carousel.tsx @@ -253,7 +253,7 @@ CarouselNext.displayName = "CarouselNext" type UseCarouselDotButton = { selectedIndex: number scrollSnaps: number[] - onDotButtonClick: (index: number) => void + onCarouselDotButtonClick: (index: number) => void } export const useCarouselDotButton = ( From c70bcb1ecb4b212e9b047086130ad5582d2351fe Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 14:45:05 +0200 Subject: [PATCH 10/82] chore: remove margin bottom from canvas --- .../(marketing)/create-profile/_components/GuildPassPicker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index 1087774d3f..71a0a189b9 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -117,7 +117,7 @@ export const GuildPassPicker = () => { {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => (
-
+
From 6672c59a281535e3cb7a1d96dfa8147e4f791ec8 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 16:16:34 +0200 Subject: [PATCH 11/82] chore: ignore unknown error --- src/components/common/LinkMenuItem.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/common/LinkMenuItem.tsx b/src/components/common/LinkMenuItem.tsx index 0fc6f645eb..d87ee4c1e7 100644 --- a/src/components/common/LinkMenuItem.tsx +++ b/src/components/common/LinkMenuItem.tsx @@ -9,6 +9,7 @@ const LinkMenuItem = ({ icon, children, ...rest }: MenuItemProps & LinkProps) => return ( setHasClicked(true)} icon={hasClicked ? : icon} From 24cc8ced0715962c7d6a7eafe87298e935d4659c Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 17:02:24 +0200 Subject: [PATCH 12/82] chore: add tooltip provider to layout --- src/app/layout.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 44a37e613d..688eb9c4ca 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,6 +2,7 @@ import { dystopian, inter } from "fonts" import type { Metadata } from "next" import { type ReactNode } from "react" import "./globals.css" +import { TooltipProvider } from "@/components/ui/Tooltip" import { cn } from "@/lib/utils" import { ThemeProvider } from "next-themes" @@ -28,7 +29,7 @@ export default function RootLayout({ children }: RootLayoutProps) { enableSystem disableTransitionOnChange > - {children} + {children} From f524ec3d45d0469aefa283c20eca869b0a6abe40 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 17:03:02 +0200 Subject: [PATCH 13/82] chore: attempt to merge picker and checkout card --- .../create-profile/_components/Benefits.tsx | 95 ++++++++++ .../_components/GuildPassPicker.tsx | 179 ++++++++---------- .../_components/OnboardingDriver.tsx | 14 ++ .../_components/OnboardingStepper.tsx | 18 -- src/app/(marketing)/create-profile/page.tsx | 4 +- 5 files changed, 193 insertions(+), 117 deletions(-) create mode 100644 src/app/(marketing)/create-profile/_components/Benefits.tsx create mode 100644 src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx delete mode 100644 src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx diff --git a/src/app/(marketing)/create-profile/_components/Benefits.tsx b/src/app/(marketing)/create-profile/_components/Benefits.tsx new file mode 100644 index 0000000000..2dae2a0216 --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/Benefits.tsx @@ -0,0 +1,95 @@ +import { Card } from "@/components/ui/Card" +import { cn } from "@/lib/utils" + +interface Benefit { + title: string + description: string + isAvailable: boolean +} + +const BENEFITS = [ + { + title: "Launch your Guild Profile", + description: "Your onchain profile with achievements and XP level ", + isAvailable: true, + }, + { + title: "Unlock exclusive rewards", + description: "Pass holders can access unique and one-off rewards from guilds", + isAvailable: true, + }, + { + title: "Get early access to Guild features", + description: "Be the first to unlock and experience our newest features", + isAvailable: true, + }, + { + title: "Priority support", + description: + "Get help within hours — even our CEO is answering priority tickets", + isAvailable: true, + }, + { + title: "Manage your personal Guild", + description: + "Special access to gamified features to help creators engage their audience", + isAvailable: false, + }, + { + title: "Alpha Explorer", + description: + "Unlock secret guilds and earn exclusive rewards before they become popular", + isAvailable: false, + }, + { + title: "Be part of Gold community", + description: + "Shape Guild's future — your ideas drive what we build and when we build it", + isAvailable: false, + }, + { + title: "Very top secret stuff", + description: + "There are things we can't tell you just yet — you'll have to see them for yourself", + isAvailable: false, + }, +] as const satisfies Benefit[] + +export const Benefits = () => { + return ( + <> +

+ Benefits +

+

+ All passes provide the same benefits +

+
+ {BENEFITS.map(({ title, description, isAvailable }) => ( + + {isAvailable || ( +
+ Soon +
+ )} +
+ # +
+
+

{title}

+

{description}

+
+
+ ))} +
+

+ Prices are subject to change in the future +

+ + ) +} diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index 71a0a189b9..709643f91a 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -11,65 +11,14 @@ import { useCarouselDotButton, } from "@/components/ui/Carousel" import { Separator } from "@/components/ui/Separator" +import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/Tooltip" import { cn } from "@/lib/utils" +import { ArrowLeft, Info } from "@phosphor-icons/react" import Autoplay from "embla-carousel-autoplay" -import { useRef, useState } from "react" +import { useEffect, useRef, useState } from "react" +import { Benefits } from "./Benefits" import { GuildPassScene } from "./GuildPassScene" -interface Benefit { - title: string - description: string - isAvailable: boolean -} - -const BENEFITS = [ - { - title: "Launch your Guild Profile", - description: "Your onchain profile with achievements and XP level ", - isAvailable: true, - }, - { - title: "Unlock exclusive rewards", - description: "Pass holders can access unique and one-off rewards from guilds", - isAvailable: true, - }, - { - title: "Get early access to Guild features", - description: "Be the first to unlock and experience our newest features", - isAvailable: true, - }, - { - title: "Priority support", - description: - "Get help within hours — even our CEO is answering priority tickets", - isAvailable: true, - }, - { - title: "Manage your personal Guild", - description: - "Special access to gamified features to help creators engage their audience", - isAvailable: false, - }, - { - title: "Alpha Explorer", - description: - "Unlock secret guilds and earn exclusive rewards before they become popular", - isAvailable: false, - }, - { - title: "Be part of Gold community", - description: - "Shape Guild's future — your ideas drive what we build and when we build it", - isAvailable: false, - }, - { - title: "Very top secret stuff", - description: - "There are things we can't tell you just yet — you'll have to see them for yourself", - isAvailable: false, - }, -] as const satisfies Benefit[] - interface Subscription { title: string pricing: string @@ -97,31 +46,71 @@ const SUBSCRIPTIONS = [ export const GuildPassPicker = () => { const [api, setApi] = useState() + const [activeIndex, setActiveIndex] = useState() + const didUserSelect = activeIndex !== undefined const { selectedIndex, scrollSnaps, onCarouselDotButtonClick } = useCarouselDotButton(api) const carouselPlugins = useRef([ Autoplay({ delay: 4000, stopOnInteraction: true }), ]) + useEffect(() => { + if (!api || activeIndex === undefined) { + return + } + api.scrollTo(activeIndex) + }, [api, activeIndex]) + return ( - -

- Choose your pass -

+ +
+ {activeIndex !== undefined ? ( + + ) : ( +

+ Choose your pass +

+ )} +
{SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( - + setActiveIndex(i)} + >
-

{title}

+

+ {title} +

{pricing} @@ -144,47 +133,43 @@ export const GuildPassPicker = () => {
- {scrollSnaps.map((_, index) => ( + {scrollSnaps.map((_, i) => ( onCarouselDotButtonClick(index)} - isActive={index === selectedIndex} + key={i} + onClick={() => onCarouselDotButtonClick(i)} + isActive={i === selectedIndex} /> ))}
-

- Benefits -

-

- All passes provide the same benefits -

-
- {BENEFITS.map(({ title, description, isAvailable }) => ( - - {isAvailable || ( -
- Soon -
- )} -
- # + {didUserSelect ? ( +
+
+
+ 1. Verification + + + + + + We have to collect your personal details for legal reasons. They + won’t be shared anywhere on the website + +
-
-

{title}

-

{description}

-
- - ))} -
-

- Prices are subject to change in the future -

+ +
+ +
+ 2. Complete payment + +
+
+ ) : ( + + )}
) diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx new file mode 100644 index 0000000000..fcfeb0874f --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -0,0 +1,14 @@ +"use client" + +import { useState } from "react" +import { GuildPassInvite } from "../_components/GuildPassInvite" +import { GuildPassPicker } from "../_components/GuildPassPicker" + +const progressionPanes = [GuildPassInvite, GuildPassPicker] as const + +export const OnboardingDriver = () => { + const [progressionIndex, setProgressionIndex] = useState(1) + const OnboardingCard = progressionPanes[progressionIndex] + + return +} diff --git a/src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx b/src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx deleted file mode 100644 index 92b4956723..0000000000 --- a/src/app/(marketing)/create-profile/_components/OnboardingStepper.tsx +++ /dev/null @@ -1,18 +0,0 @@ -"use client" - -import { useAtom } from "jotai" -import { onboardingProgressionIndexAtom } from "../atoms" -import { GuildPassInvite } from "./GuildPassInvite" -import { GuildPassPicker } from "./GuildPassPicker" - -const progressionPanes = [, ] - -export const OnboardingStepper = () => { - const [onboardingProgressonIndex, setOnboardingProgressionIndex] = useAtom( - onboardingProgressionIndexAtom - ) - - setOnboardingProgressionIndex(1) - - return progressionPanes[onboardingProgressonIndex] -} diff --git a/src/app/(marketing)/create-profile/page.tsx b/src/app/(marketing)/create-profile/page.tsx index 06ac164411..6847818374 100644 --- a/src/app/(marketing)/create-profile/page.tsx +++ b/src/app/(marketing)/create-profile/page.tsx @@ -1,7 +1,7 @@ import { Layout } from "@/components/Layout" import svgToTinyDataUri from "mini-svg-data-uri" import type { Metadata } from "next" -import { OnboardingStepper } from "./_components/OnboardingStepper" +import { OnboardingDriver } from "./_components/OnboardingDriver" export const metadata: Metadata = { title: "Create profile", @@ -33,7 +33,7 @@ const Page = () => {
- +
From bb3ea3437adb13906a7c916971b46c69cae71b9e Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 17:58:34 +0200 Subject: [PATCH 14/82] fix: correctly update the picked pass --- .../_components/GuildPassPicker.tsx | 95 ++++++++++++------- 1 file changed, 63 insertions(+), 32 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index 709643f91a..0d28969634 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -15,7 +15,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/Tooltip import { cn } from "@/lib/utils" import { ArrowLeft, Info } from "@phosphor-icons/react" import Autoplay from "embla-carousel-autoplay" -import { useEffect, useRef, useState } from "react" +import { useRef, useState } from "react" import { Benefits } from "./Benefits" import { GuildPassScene } from "./GuildPassScene" @@ -53,13 +53,13 @@ export const GuildPassPicker = () => { const carouselPlugins = useRef([ Autoplay({ delay: 4000, stopOnInteraction: true }), ]) - - useEffect(() => { - if (!api || activeIndex === undefined) { - return - } - api.scrollTo(activeIndex) - }, [api, activeIndex]) + // useEffect(() => { + // if (!api || activeIndex === undefined) { + // return + // } + // api.scrollTo(activeIndex) + // }, [api, activeIndex]) + console.log(activeIndex, didUserSelect) return ( { )} >
- {activeIndex !== undefined ? ( + {didUserSelect ? (
- + {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( setActiveIndex(i)} > -
+
-

- {title} -

+

{title}

{pricing}

{description}

-
- {i < SUBSCRIPTIONS.length - 1 && ( - - )}
))} -
+
{scrollSnaps.map((_, i) => ( { /> ))}
-
+ +
{didUserSelect ? (
@@ -149,7 +180,7 @@ export const GuildPassPicker = () => { 1. Verification - + We have to collect your personal details for legal reasons. They From e5228909dc36c041d0103355dd16bbe22d66d58b Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 19:02:11 +0200 Subject: [PATCH 15/82] chore: finish picker view --- .../_components/GuildPassPicker.tsx | 105 ++++++++++++------ 1 file changed, 72 insertions(+), 33 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx index 0d28969634..86d72b06ee 100644 --- a/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx +++ b/src/app/(marketing)/create-profile/_components/GuildPassPicker.tsx @@ -23,22 +23,26 @@ interface Subscription { title: string pricing: string description: string + pricingShort: string } const SUBSCRIPTIONS = [ { title: "Single Pass", pricing: "$6 / month", + pricingShort: "$6 / month", description: "For the curious, who want to try Guild’s new features", }, { title: "Bundle Pass", pricing: "$60 / year", + pricingShort: "$60 / year", description: "For the professionals, who would benefit from Guild continuously", }, { title: "Lifetime Pass", pricing: "0.1 ETH one time", + pricingShort: "0.1 ETH", description: "For Guild’s biggest supporters, who are excited for the future of Guild", }, @@ -53,19 +57,12 @@ export const GuildPassPicker = () => { const carouselPlugins = useRef([ Autoplay({ delay: 4000, stopOnInteraction: true }), ]) - // useEffect(() => { - // if (!api || activeIndex === undefined) { - // return - // } - // api.scrollTo(activeIndex) - // }, [api, activeIndex]) - console.log(activeIndex, didUserSelect) return (
@@ -86,7 +83,7 @@ export const GuildPassPicker = () => { )}
{ > {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( - setActiveIndex(i)} - > +
@@ -111,7 +104,11 @@ export const GuildPassPicker = () => {

{description}

-
@@ -121,7 +118,7 @@ export const GuildPassPicker = () => {
@@ -133,15 +130,16 @@ export const GuildPassPicker = () => { /> ))}
+

- + From 7b3d86503d469545bb30a7319b8fc8eac1e438ac Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 21:51:46 +0200 Subject: [PATCH 19/82] chore: add manual control over progression --- .../_components/OnboardingDriver.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index 6794b6f3ec..97fd371a77 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -1,5 +1,6 @@ "use client" +import { ToggleGroup, ToggleGroupItem } from "@/components/ui/ToggleGroup" import { useState } from "react" import { ClaimPass } from "./ClaimPass" import { PurchasePass } from "./PurchasePass" @@ -8,8 +9,22 @@ import { StartProfile } from "./StartProfile" const progressionPanes = [ClaimPass, PurchasePass, StartProfile] as const export const OnboardingDriver = () => { - const [progressionIndex, setProgressionIndex] = useState(2) + const [progressionIndex, setProgressionIndex] = useState(0) const OnboardingCard = progressionPanes[progressionIndex] - return + return ( + <> + setProgressionIndex(Number.parseInt(value))} + > + {progressionPanes.map((pane, index) => ( + {pane.name} + ))} + + + + ) } From 72808187566ece46a5f88fce972ae8124514cf29 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 18 Jul 2024 22:00:04 +0200 Subject: [PATCH 20/82] chore: spacing fix --- .../(marketing)/create-profile/_components/ClaimPass.tsx | 6 +++--- .../create-profile/_components/OnboardingDriver.tsx | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx index 9e29c87ab1..22c61a1bc6 100644 --- a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx +++ b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx @@ -14,11 +14,11 @@ export const ClaimPass = () => {

Claim your Guild Pass and begin an epic adventure!

-
+ ))}
From cf6ba5d7c1aab732f28f8be59e625d3c821932f0 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Fri, 19 Jul 2024 18:35:18 +0200 Subject: [PATCH 27/82] chore: update to external changes --- .../create-profile/_components/ClaimPass.tsx | 58 ++++++++++--- .../_components/PurchasePass.tsx | 2 +- .../_components/StartProfile.tsx | 84 ++++++++++++++----- 3 files changed, 114 insertions(+), 30 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx index b9a62eedd0..9e76c50f6b 100644 --- a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx +++ b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx @@ -1,11 +1,35 @@ import { Button } from "@/components/ui/Button" import { Card } from "@/components/ui/Card" +import { + FormControl, + FormDescription, + FormErrorMessage, + FormField, + FormItem, + FormLabel, +} from "@/components/ui/Form" import { Input } from "@/components/ui/Input" -import { Label } from "@/components/ui/Label" +import { zodResolver } from "@hookform/resolvers/zod" import { ArrowRight } from "@phosphor-icons/react/dist/ssr" +import { FormProvider, useForm } from "react-hook-form" +import { z } from "zod" import { GuildPassScene } from "./GuildPassScene" +const formSchema = z.object({ + inviteHandle: z.string(), +}) + export const ClaimPass = () => { + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + inviteHandle: "", + }, + }) + function onSubmit(values: z.infer) { + console.log(values) + } + return (
@@ -14,15 +38,29 @@ export const ClaimPass = () => {

Claim your Guild Pass and begin an epic adventure!

- -

Guild Pass is invite only

- + + +
+ ( + + Invite handle + + + + Guild Pass is invite only + + + )} + /> + + +
) } diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index 1f0b8415e1..34a0c68de8 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -206,7 +206,7 @@ export const PurchasePass = () => {
- + {SUBSCRIPTIONS[activeIndex].title === "Lifetime Pass" ? (
diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index e6ee1e9a05..902ef6032a 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -1,15 +1,40 @@ import { Avatar } from "@/components/ui/Avatar" import { Button } from "@/components/ui/Button" import { Card } from "@/components/ui/Card" +import { + FormControl, + FormErrorMessage, + FormField, + FormItem, + FormLabel, +} from "@/components/ui/Form" import { Input } from "@/components/ui/Input" -import { Label } from "@/components/ui/Label" +import { zodResolver } from "@hookform/resolvers/zod" import { User } from "@phosphor-icons/react" import { ArrowRight } from "@phosphor-icons/react/dist/ssr" import { AvatarFallback } from "@radix-ui/react-avatar" import { useState } from "react" +import { FormProvider, useForm } from "react-hook-form" +import { z } from "zod" + +const formSchema = z.object({ + name: z.string(), + handle: z.string(), +}) // TODO: use ConnectFarcasterButton export const StartProfile = () => { + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + name: "", + handle: "", + }, + }) + function onSubmit(values: z.infer) { + console.log(values) + } + const [startMethod, setStartMethod] = useState<"farcaster">() return ( @@ -23,23 +48,44 @@ export const StartProfile = () => { {startMethod ? ( - <> - - - - + +
+ ( + + Name + + + + + + )} + /> + ( + + Handle + + + + + + )} + /> + + +
) : ( <> )} From f17e5f523e36dbae6d227314da8cdde65d01b06e Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 23 Jul 2024 13:49:13 +0200 Subject: [PATCH 28/82] upgrade package-lock --- package-lock.json | 404 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 403 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 49e029b3d2..8d9db5b567 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,7 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", + "@react-three/drei": "^9.108.4", "@react-three/fiber": "^8.16.8", "@snyk/protect": "latest", "@t3-oss/env-nextjs": "^0.10.1", @@ -6550,6 +6551,11 @@ "react": ">=16" } }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", + "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" + }, "node_modules/@metamask/eth-json-rpc-provider": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@metamask/eth-json-rpc-provider/-/eth-json-rpc-provider-1.0.1.tgz", @@ -7133,6 +7139,17 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, "node_modules/@motionone/animation": { "version": "10.18.0", "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.18.0.tgz", @@ -10514,6 +10531,11 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@react-spring/rafz": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" + }, "node_modules/@react-spring/shared": { "version": "9.7.3", "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.3.tgz", @@ -10526,6 +10548,69 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@react-spring/three": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.6.1.tgz", + "integrity": "sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/three/node_modules/@react-spring/animated": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", + "dependencies": { + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three/node_modules/@react-spring/core": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", + "dependencies": { + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three/node_modules/@react-spring/shared": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", + "dependencies": { + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three/node_modules/@react-spring/types": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" + }, "node_modules/@react-spring/types": { "version": "9.7.3", "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.3.tgz", @@ -10548,6 +10633,75 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@react-three/drei": { + "version": "9.109.1", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.109.1.tgz", + "integrity": "sha512-tkZW1lpkGW0jg4bb3yiaQgM9gkpf6b2osleQnQu55VC8UFDDMIX+fNB8TTQ9fqhA/lpQ7UszM7XSUGak1xYjvg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", + "@react-spring/three": "~9.6.1", + "@use-gesture/react": "^10.2.24", + "camera-controls": "^2.4.2", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.28", + "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", + "maath": "^0.10.7", + "meshline": "^3.1.6", + "react-composer": "^5.0.3", + "stats-gl": "^2.0.0", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.7.0", + "three-stdlib": "^2.29.9", + "troika-three-text": "^0.49.0", + "tunnel-rat": "^0.1.2", + "utility-types": "^3.10.0", + "uuid": "^9.0.1", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "@react-three/fiber": ">=8.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "three": ">=0.137" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/drei/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@react-three/drei/node_modules/zustand": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", + "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, "node_modules/@react-three/fiber": { "version": "8.16.8", "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.8.tgz", @@ -12723,6 +12877,11 @@ "resolved": "https://registry.npmjs.org/@types/dom-screen-wake-lock/-/dom-screen-wake-lock-1.0.3.tgz", "integrity": "sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==" }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==" + }, "node_modules/@types/emscripten": { "version": "1.39.13", "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", @@ -12912,6 +13071,11 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, "node_modules/@types/papaparse": { "version": "5.3.14", "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.14.tgz", @@ -13130,6 +13294,22 @@ "crypto-js": "^4.2.0" } }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, "node_modules/@vercel/kv": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@vercel/kv/-/kv-1.0.1.tgz", @@ -16210,6 +16390,14 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -16920,6 +17108,14 @@ "node": ">=6" } }, + "node_modules/camera-controls": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.8.5.tgz", + "integrity": "sha512-7VTwRk7Nu1nRKsY7bEt9HVBfKt8DETvzyYhLN4OW26OByBayMDB5fUaNcPI+z++vG23RH5yqn6ZRhZcgLQy2rA==", + "peerDependencies": { + "three": ">=0.126.1" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001642", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", @@ -18086,6 +18282,23 @@ "sha.js": "^2.4.8" } }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -18902,6 +19115,14 @@ "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" }, + "node_modules/detect-gpu": { + "version": "5.0.40", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.40.tgz", + "integrity": "sha512-5v4jDN/ERdZZitD29UiLjV9Q9+lDfw2OhEJACIqnvdWulVZCy2K6EwonZ/VKyo4YMqvSIzGIDmojX3jGL3dLpA==", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -19213,6 +19434,11 @@ "node": ">=8" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -21059,6 +21285,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==" + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -21420,6 +21651,11 @@ "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" }, + "node_modules/hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" + }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -21737,6 +21973,11 @@ "node": ">=16.x" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -22102,6 +22343,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -23016,6 +23262,14 @@ "url": "https://github.com/sponsors/dmonad" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lighthouse-logger": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", @@ -24032,6 +24286,15 @@ "lz-string": "bin/bin.js" } }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", @@ -24574,6 +24837,14 @@ "node": ">= 8" } }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "peerDependencies": { + "three": ">=0.137" + } + }, "node_modules/meshoptimizer": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", @@ -27687,6 +27958,11 @@ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" + }, "node_modules/preact": { "version": "10.22.1", "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", @@ -27892,6 +28168,15 @@ "asap": "~2.0.6" } }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -28374,6 +28659,17 @@ "react-dom": ">=16.8.0" } }, + "node_modules/react-composer": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", + "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-confetti": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", @@ -30050,7 +30346,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -31037,6 +31332,31 @@ "node": ">=8" } }, + "node_modules/stats-gl": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "dependencies": { + "@types/three": "^0.163.0" + } + }, + "node_modules/stats-gl/node_modules/@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -31938,6 +32258,35 @@ "resolved": "https://registry.npmjs.org/three/-/three-0.166.1.tgz", "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg==" }, + "node_modules/three-mesh-bvh": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.6.tgz", + "integrity": "sha512-rCjsnxEqR9r1/C/lCqzGLS67NDty/S/eT6rAJfDvsanrIctTWdNoR4ZOGWewCB13h1QkVo2BpmC0wakj1+0m8A==", + "peerDependencies": { + "three": ">= 0.151.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.30.4", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.30.4.tgz", + "integrity": "sha512-E7sN8UkaorSq2uRZU14AE7wXkdCBa2oFwPkPt92zaecuzrgd98BXkTt+2tFQVF1tPJRvfs7aMZV5dSOq4/vNVg==", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + }, "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -32132,6 +32481,33 @@ "node": ">=8" } }, + "node_modules/troika-three-text": { + "version": "0.49.1", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.49.1.tgz", + "integrity": "sha512-lXGWxgjJP9kw4i4Wh+0k0Q/7cRfS6iOME4knKht/KozPu9GcFA9NnNpRvehIhrUawq9B0ZRw+0oiFHgRO+4Wig==", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.49.0", + "troika-worker-utils": "^0.49.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.49.0.tgz", + "integrity": "sha512-umitFL4cT+Fm/uONmaQEq4oZlyRHWwVClaS6ZrdcueRvwc2w+cpNQ47LlJKJswpqtMFWbEhOLy0TekmcPZOdYA==", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.49.0.tgz", + "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" + }, "node_modules/trough": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", @@ -32271,6 +32647,14 @@ "node": "*" } }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "dependencies": { + "zustand": "^4.3.2" + } + }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", @@ -32925,6 +33309,14 @@ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "engines": { + "node": ">= 4" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -33293,6 +33685,16 @@ "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==" }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", From 3ed20480a3393742a6774adde895299b38b3e64d Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 23 Jul 2024 14:11:04 +0200 Subject: [PATCH 29/82] fix: change banner color in dark mode --- src/app/globals.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/globals.css b/src/app/globals.css index 474ecd15ab..1911253f20 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -167,7 +167,7 @@ --success-subtle: 141 79% 85%; --success-subtle-foreground: var(--success-subtle); - --banner: 240 3% 22%; + --banner: 240 2% 12%; --muted: 240 3% 13%; --muted-foreground: 240 5% 60%; From e7b5e2c73c8161cedb95dbf51d60a97941d1c053 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 23 Jul 2024 14:14:10 +0200 Subject: [PATCH 30/82] cleanup: remove unused atom --- src/app/(marketing)/create-profile/atoms.ts | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 src/app/(marketing)/create-profile/atoms.ts diff --git a/src/app/(marketing)/create-profile/atoms.ts b/src/app/(marketing)/create-profile/atoms.ts deleted file mode 100644 index 9fd5b4091f..0000000000 --- a/src/app/(marketing)/create-profile/atoms.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { atom } from "jotai" - -export const onboardingProgressionIndexAtom = atom(0) From 70907ee737aa1e2f411c0b165500fe44912ff5da Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 23 Jul 2024 14:15:58 +0200 Subject: [PATCH 31/82] cleanup(Carousel): remove `* as React` imports for consistency --- src/v2/components/ui/Carousel.tsx | 175 ++++++++++++++++-------------- 1 file changed, 92 insertions(+), 83 deletions(-) diff --git a/src/v2/components/ui/Carousel.tsx b/src/v2/components/ui/Carousel.tsx index c131b51b75..a75d3bdb7b 100644 --- a/src/v2/components/ui/Carousel.tsx +++ b/src/v2/components/ui/Carousel.tsx @@ -3,10 +3,22 @@ import { ArrowLeft, ArrowRight } from "@phosphor-icons/react" import { EmblaCarouselType } from "embla-carousel" import useEmblaCarousel, { type UseEmblaCarouselType } from "embla-carousel-react" -import * as React from "react" import { Button } from "@/components/ui/Button" import { cn } from "@/lib/utils" +import { + ComponentProps, + ComponentPropsWithRef, + FunctionComponent, + HTMLAttributes, + KeyboardEvent, + createContext, + forwardRef, + useCallback, + useContext, + useEffect, + useState, +} from "react" type CarouselApi = UseEmblaCarouselType[1] type UseCarouselParameters = Parameters @@ -29,10 +41,10 @@ type CarouselContextProps = { canScrollNext: boolean } & CarouselProps -const CarouselContext = React.createContext(null) +const CarouselContext = createContext(null) function useCarousel() { - const context = React.useContext(CarouselContext) + const context = useContext(CarouselContext) if (!context) { throw new Error("useCarousel must be used within a ") @@ -41,9 +53,9 @@ function useCarousel() { return context } -const Carousel = React.forwardRef< +const Carousel = forwardRef< HTMLDivElement, - React.HTMLAttributes & CarouselProps + HTMLAttributes & CarouselProps >( ( { @@ -64,10 +76,10 @@ const Carousel = React.forwardRef< }, plugins ) - const [canScrollPrev, setCanScrollPrev] = React.useState(false) - const [canScrollNext, setCanScrollNext] = React.useState(false) + const [canScrollPrev, setCanScrollPrev] = useState(false) + const [canScrollNext, setCanScrollNext] = useState(false) - const onSelect = React.useCallback((api: CarouselApi) => { + const onSelect = useCallback((api: CarouselApi) => { if (!api) { return } @@ -76,16 +88,16 @@ const Carousel = React.forwardRef< setCanScrollNext(api.canScrollNext()) }, []) - const scrollPrev = React.useCallback(() => { + const scrollPrev = useCallback(() => { api?.scrollPrev() }, [api]) - const scrollNext = React.useCallback(() => { + const scrollNext = useCallback(() => { api?.scrollNext() }, [api]) - const handleKeyDown = React.useCallback( - (event: React.KeyboardEvent) => { + const handleKeyDown = useCallback( + (event: KeyboardEvent) => { if (event.key === "ArrowLeft") { event.preventDefault() scrollPrev() @@ -97,7 +109,7 @@ const Carousel = React.forwardRef< [scrollPrev, scrollNext] ) - React.useEffect(() => { + useEffect(() => { if (!api || !setApi) { return } @@ -105,7 +117,7 @@ const Carousel = React.forwardRef< setApi(api) }, [api, setApi]) - React.useEffect(() => { + useEffect(() => { if (!api) { return } @@ -149,52 +161,50 @@ const Carousel = React.forwardRef< ) Carousel.displayName = "Carousel" -const CarouselContent = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const { carouselRef, orientation } = useCarousel() +const CarouselContent = forwardRef>( + ({ className, ...props }, ref) => { + const { carouselRef, orientation } = useCarousel() - return ( -
+ return ( +
+
+
+ ) + } +) +CarouselContent.displayName = "CarouselContent" + +const CarouselItem = forwardRef>( + ({ className, ...props }, ref) => { + const { orientation } = useCarousel() + return (
-
- ) -}) -CarouselContent.displayName = "CarouselContent" - -const CarouselItem = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => { - const { orientation } = useCarousel() - return ( -
- ) -}) + ) + } +) CarouselItem.displayName = "CarouselItem" -const CarouselPrevious = React.forwardRef< +const CarouselPrevious = forwardRef< HTMLButtonElement, - React.ComponentProps + ComponentProps >(({ className, variant = "outline", size = "icon", ...props }, ref) => { const { orientation, scrollPrev, canScrollPrev } = useCarousel() @@ -221,33 +231,32 @@ const CarouselPrevious = React.forwardRef< }) CarouselPrevious.displayName = "CarouselPrevious" -const CarouselNext = React.forwardRef< - HTMLButtonElement, - React.ComponentProps ->(({ className, variant = "outline", size = "icon", ...props }, ref) => { - const { orientation, scrollNext, canScrollNext } = useCarousel() +const CarouselNext = forwardRef>( + ({ className, variant = "outline", size = "icon", ...props }, ref) => { + const { orientation, scrollNext, canScrollNext } = useCarousel() - return ( - - ) -}) + return ( + + ) + } +) CarouselNext.displayName = "CarouselNext" type UseCarouselDotButton = { @@ -259,10 +268,10 @@ type UseCarouselDotButton = { export const useCarouselDotButton = ( api: EmblaCarouselType | undefined ): UseCarouselDotButton => { - const [selectedIndex, setSelectedIndex] = React.useState(0) - const [scrollSnaps, setScrollSnaps] = React.useState([]) + const [selectedIndex, setSelectedIndex] = useState(0) + const [scrollSnaps, setScrollSnaps] = useState([]) - const onCarouselDotButtonClick = React.useCallback( + const onCarouselDotButtonClick = useCallback( (index: number) => { if (!api) return api.scrollTo(index) @@ -270,15 +279,15 @@ export const useCarouselDotButton = ( [api] ) - const onInit = React.useCallback((api: EmblaCarouselType) => { + const onInit = useCallback((api: EmblaCarouselType) => { setScrollSnaps(api.scrollSnapList()) }, []) - const onSelect = React.useCallback((api: EmblaCarouselType) => { + const onSelect = useCallback((api: EmblaCarouselType) => { setSelectedIndex(api.selectedScrollSnap()) }, []) - React.useEffect(() => { + useEffect(() => { if (!api) return onInit(api) @@ -293,11 +302,11 @@ export const useCarouselDotButton = ( } } -type PropType = React.ComponentPropsWithRef<"button"> & { +type PropType = ComponentPropsWithRef<"button"> & { isActive?: boolean } -const CarouselDotButton: React.FunctionComponent = ({ +const CarouselDotButton: FunctionComponent = ({ children, className, isActive = false, From 334d539c5bee88120f22b472cde0f4eb021760c9 Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Tue, 23 Jul 2024 14:29:14 +0200 Subject: [PATCH 32/82] fix: adjust card sizes --- src/app/(marketing)/create-profile/_components/ClaimPass.tsx | 2 +- src/app/(marketing)/create-profile/_components/StartProfile.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx index 9e76c50f6b..ad5d2a4de9 100644 --- a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx +++ b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx @@ -31,7 +31,7 @@ export const ClaimPass = () => { } return ( - +
diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index 902ef6032a..effbc01f26 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -37,7 +37,7 @@ export const StartProfile = () => { const [startMethod, setStartMethod] = useState<"farcaster">() return ( - +

Start your Guild Profile!

From a754b700b318da317424299546f88025de0314f4 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 16:37:20 +0200 Subject: [PATCH 33/82] feat: add purcase success effect --- .../create-profile/_components/PurchasePass.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index 34a0c68de8..74f6415b91 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -13,6 +13,7 @@ import { import { Separator } from "@/components/ui/Separator" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/Tooltip" import { cn } from "@/lib/utils" +import { DotLottiePlayer } from "@dotlottie/react-player" import { ArrowLeft, Info } from "@phosphor-icons/react" import Autoplay from "embla-carousel-autoplay" import { useRef, useState } from "react" @@ -52,6 +53,7 @@ export const PurchasePass = () => { const [api, setApi] = useState() const [activeIndex, setActiveIndex] = useState() const didUserSelect = activeIndex !== undefined + const [didUserPurchase, setDidUserPurchase] = useState(false) const { selectedIndex, scrollSnaps, onCarouselDotButtonClick } = useCarouselDotButton(api) const carouselPlugins = useRef([ @@ -151,7 +153,15 @@ export const PurchasePass = () => { >
- + {didUserSelect && didUserPurchase ? ( + + ) : ( + + )}
{
- +
From da0013a24973e76406da62f59d58596a4b186962 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 17:08:46 +0200 Subject: [PATCH 34/82] chore: remove focus from button --- .../_components/PurchasePass.tsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index 74f6415b91..7400406274 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -15,6 +15,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/Tooltip import { cn } from "@/lib/utils" import { DotLottiePlayer } from "@dotlottie/react-player" import { ArrowLeft, Info } from "@phosphor-icons/react" +import { ToggleGroup, ToggleGroupItem } from "@radix-ui/react-toggle-group" import Autoplay from "embla-carousel-autoplay" import { useRef, useState } from "react" import { Benefits } from "./Benefits" @@ -133,23 +134,27 @@ export const PurchasePass = () => { ))}
- +
{didUserSelect ? (
From fed694874378f75c01826dc9448116b958150d6a Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 17:36:11 +0200 Subject: [PATCH 35/82] chore: remove hover effect on selected pass --- src/app/(marketing)/create-profile/_components/PurchasePass.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index 7400406274..dcf0a8a619 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -149,7 +149,7 @@ export const PurchasePass = () => { "relative w-full from-accent outline-none hover:bg-gradient-to-t focus-visible:bg-gradient-to-t focus-visible:ring-4 focus-visible:ring-ring", { "-z-10 absolute opacity-0": didUserSelect && activeIndex !== i, - "w-full cursor-auto focus-visible:bg-none focus-visible:ring-0": + "w-full cursor-auto hover:bg-none focus-visible:bg-none focus-visible:ring-0": activeIndex === i, } )} From f58c27e3e1f6cd6c2dde2eaa3bc96f5d9bec71a1 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 17:42:21 +0200 Subject: [PATCH 36/82] fix: make text selectable --- .../(marketing)/create-profile/_components/PurchasePass.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index dcf0a8a619..b8d4307fff 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -146,10 +146,10 @@ export const PurchasePass = () => { value={title} onClick={() => setActiveIndex(i)} className={cn( - "relative w-full from-accent outline-none hover:bg-gradient-to-t focus-visible:bg-gradient-to-t focus-visible:ring-4 focus-visible:ring-ring", + "relative w-full select-none from-accent outline-none hover:bg-gradient-to-t focus-visible:bg-gradient-to-t focus-visible:ring-4 focus-visible:ring-ring", { "-z-10 absolute opacity-0": didUserSelect && activeIndex !== i, - "w-full cursor-auto hover:bg-none focus-visible:bg-none focus-visible:ring-0": + "w-full cursor-auto select-text hover:bg-none focus-visible:bg-none focus-visible:ring-0": activeIndex === i, } )} From b08037aa403aa7ee3bea0f059914103c64c96740 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 18:25:33 +0200 Subject: [PATCH 37/82] fix: remove shadon, update Layout --- .../create-profile/_components/Benefits.tsx | 2 +- src/app/(marketing)/create-profile/page.tsx | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/Benefits.tsx b/src/app/(marketing)/create-profile/_components/Benefits.tsx index ffc4d34bad..26b940dd48 100644 --- a/src/app/(marketing)/create-profile/_components/Benefits.tsx +++ b/src/app/(marketing)/create-profile/_components/Benefits.tsx @@ -70,7 +70,7 @@ export const Benefits = () => { className={cn( "flex items-center gap-4 border-2 border-transparent p-5", { - "bg- relative border-border border-dotted": !isAvailable, + "bg- relative border-border border-dotted shadow-none": !isAvailable, } )} key={title} diff --git a/src/app/(marketing)/create-profile/page.tsx b/src/app/(marketing)/create-profile/page.tsx index 6847818374..b8a072cd39 100644 --- a/src/app/(marketing)/create-profile/page.tsx +++ b/src/app/(marketing)/create-profile/page.tsx @@ -1,4 +1,11 @@ -import { Layout } from "@/components/Layout" +import { + Layout, + LayoutBanner, + LayoutHeader, + LayoutHero, + LayoutMain, +} from "@/components/Layout" +import { LayoutBannerBackground } from "@/components/Layout/Layout" import svgToTinyDataUri from "mini-svg-data-uri" import type { Metadata } from "next" import { OnboardingDriver } from "./_components/OnboardingDriver" @@ -9,7 +16,7 @@ export const metadata: Metadata = { const Page = () => { return ( - +
{ )}")`, }} /> - - - + + + +
{ "radial-gradient(circle at bottom, transparent 5%, hsl(var(--banner)))", }} /> - - - + + +
-
- + + ) } From 27aafce08c709223dde5235dcb83573414d2f169 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 20:57:56 +0200 Subject: [PATCH 38/82] chore: fix invalid tailwind class --- src/app/(marketing)/create-profile/_components/Benefits.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/(marketing)/create-profile/_components/Benefits.tsx b/src/app/(marketing)/create-profile/_components/Benefits.tsx index 26b940dd48..59af8320b8 100644 --- a/src/app/(marketing)/create-profile/_components/Benefits.tsx +++ b/src/app/(marketing)/create-profile/_components/Benefits.tsx @@ -70,7 +70,8 @@ export const Benefits = () => { className={cn( "flex items-center gap-4 border-2 border-transparent p-5", { - "bg- relative border-border border-dotted shadow-none": !isAvailable, + "relative border-border border-dotted bg-transparent shadow-none": + !isAvailable, } )} key={title} From bfbceb30cda2c5866020929917a0733324a12289 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 20:59:39 +0200 Subject: [PATCH 39/82] chore: add missed cn call to Layout --- src/v2/components/Layout/Layout.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/v2/components/Layout/Layout.tsx b/src/v2/components/Layout/Layout.tsx index 9f3d1c07cd..5e8ccaefba 100644 --- a/src/v2/components/Layout/Layout.tsx +++ b/src/v2/components/Layout/Layout.tsx @@ -10,8 +10,8 @@ import { forwardRef } from "react" interface LayoutProps extends React.HTMLAttributes {} -const Layout = ({ children, ...props }: LayoutProps) => ( -
+const Layout = ({ children, className, ...props }: LayoutProps) => ( +
{children}
) From a0b5c65c9caee36d4f0ecbd0307bbdfe25809f63 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 21:46:27 +0200 Subject: [PATCH 40/82] chore: add basic logic to driver --- .../create-profile/_components/ClaimPass.tsx | 4 ++- .../_components/OnboardingDriver.tsx | 31 ++++++++++++++++--- .../_components/PurchasePass.tsx | 3 +- .../_components/StartProfile.tsx | 3 +- .../create-profile/_components/types.ts | 7 +++++ 5 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 src/app/(marketing)/create-profile/_components/types.ts diff --git a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx index ad5d2a4de9..a1d7c9f725 100644 --- a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx +++ b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx @@ -14,12 +14,13 @@ import { ArrowRight } from "@phosphor-icons/react/dist/ssr" import { FormProvider, useForm } from "react-hook-form" import { z } from "zod" import { GuildPassScene } from "./GuildPassScene" +import { OnboardingChain } from "./types" const formSchema = z.object({ inviteHandle: z.string(), }) -export const ClaimPass = () => { +export const ClaimPass: OnboardingChain = ({ dispatchChainAction }) => { const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { @@ -28,6 +29,7 @@ export const ClaimPass = () => { }) function onSubmit(values: z.infer) { console.log(values) + dispatchChainAction("next") } return ( diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index 857d506ddf..650510342f 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -1,16 +1,33 @@ "use client" +import { Button } from "@/components/ui/Button" import { ToggleGroup, ToggleGroupItem } from "@/components/ui/ToggleGroup" import { useState } from "react" import { ClaimPass } from "./ClaimPass" import { PurchasePass } from "./PurchasePass" import { StartProfile } from "./StartProfile" +import { ChainAction, OnboardingChain } from "./types" -const progressionPanes = [ClaimPass, PurchasePass, StartProfile] as const +const progressionChains: OnboardingChain[] = [ + ClaimPass, + PurchasePass, + StartProfile, +] as const export const OnboardingDriver = () => { - const [progressionIndex, setProgressionIndex] = useState(0) - const OnboardingCard = progressionPanes[progressionIndex] + const [progressionIndex, setProgressionIndex] = useState(1) + const OnboardingCard = progressionChains[progressionIndex] + + const dispatchChainAction = (action: ChainAction) => { + if (action === "next" && progressionChains.length > progressionIndex + 1) { + setProgressionIndex((prev) => prev + 1) + return + } + if (action === "previous" && 0 < progressionIndex) { + setProgressionIndex((prev) => prev - 1) + return + } + } return ( <> @@ -22,13 +39,17 @@ export const OnboardingDriver = () => { value && setProgressionIndex(Number.parseInt(value)) } > - {progressionPanes.map((pane, index) => ( + {progressionChains.map((pane, index) => ( {pane.name} ))} - +
+ + +
+ ) } diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index b8d4307fff..df6c9743b9 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -20,6 +20,7 @@ import Autoplay from "embla-carousel-autoplay" import { useRef, useState } from "react" import { Benefits } from "./Benefits" import { GuildPassScene } from "./GuildPassScene" +import { OnboardingChain } from "./types" interface Subscription { title: string @@ -50,7 +51,7 @@ const SUBSCRIPTIONS = [ }, ] as const satisfies Subscription[] -export const PurchasePass = () => { +export const PurchasePass: OnboardingChain = () => { const [api, setApi] = useState() const [activeIndex, setActiveIndex] = useState() const didUserSelect = activeIndex !== undefined diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index effbc01f26..89f2dc803e 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -16,6 +16,7 @@ import { AvatarFallback } from "@radix-ui/react-avatar" import { useState } from "react" import { FormProvider, useForm } from "react-hook-form" import { z } from "zod" +import { OnboardingChain } from "./types" const formSchema = z.object({ name: z.string(), @@ -23,7 +24,7 @@ const formSchema = z.object({ }) // TODO: use ConnectFarcasterButton -export const StartProfile = () => { +export const StartProfile: OnboardingChain = () => { const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { diff --git a/src/app/(marketing)/create-profile/_components/types.ts b/src/app/(marketing)/create-profile/_components/types.ts new file mode 100644 index 0000000000..76aefc8f4c --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/types.ts @@ -0,0 +1,7 @@ +import { ReactNode } from "react" + +export type ChainAction = "next" | "previous" + +export type OnboardingChain = (props: { + dispatchChainAction: (action: ChainAction) => void +}) => ReactNode From e949913047acba420993fec081e7650aa0f73bb9 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 21:52:35 +0200 Subject: [PATCH 41/82] chore: disable autoplay on dot button click --- .../create-profile/_components/PurchasePass.tsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index df6c9743b9..971ecef70b 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -17,7 +17,7 @@ import { DotLottiePlayer } from "@dotlottie/react-player" import { ArrowLeft, Info } from "@phosphor-icons/react" import { ToggleGroup, ToggleGroupItem } from "@radix-ui/react-toggle-group" import Autoplay from "embla-carousel-autoplay" -import { useRef, useState } from "react" +import { useMemo, useState } from "react" import { Benefits } from "./Benefits" import { GuildPassScene } from "./GuildPassScene" import { OnboardingChain } from "./types" @@ -56,11 +56,13 @@ export const PurchasePass: OnboardingChain = () => { const [activeIndex, setActiveIndex] = useState() const didUserSelect = activeIndex !== undefined const [didUserPurchase, setDidUserPurchase] = useState(false) + const [autoplay, setAutoPlay] = useState(true) const { selectedIndex, scrollSnaps, onCarouselDotButtonClick } = useCarouselDotButton(api) - const carouselPlugins = useRef([ - Autoplay({ delay: 4000, stopOnInteraction: true }), - ]) + const carouselPlugins = useMemo( + () => [Autoplay({ delay: 4000, stopOnInteraction: true, active: autoplay })], + [autoplay] + ) return ( { hidden: didUserSelect, })} setApi={setApi} - plugins={carouselPlugins.current} + plugins={carouselPlugins} > {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( @@ -129,7 +131,10 @@ export const PurchasePass: OnboardingChain = () => { {scrollSnaps.map((_, i) => ( onCarouselDotButtonClick(i)} + onClick={() => { + setAutoPlay(false) + onCarouselDotButtonClick(i) + }} isActive={i === selectedIndex} /> ))} From 0005093e096e6c71b7f6b005bd943ff6a67027d1 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 23:48:19 +0200 Subject: [PATCH 42/82] feat: add driver logic --- .../create-profile/_components/Benefits.tsx | 55 +-- .../create-profile/_components/ChoosePass.tsx | 126 +++++++ .../create-profile/_components/ClaimPass.tsx | 2 +- .../_components/OnboardingDriver.tsx | 38 +- .../_components/PurchasePass.tsx | 325 +++++------------- .../_components/StartProfile.tsx | 2 +- .../create-profile/_components/types.ts | 7 - .../(marketing)/create-profile/constants.ts | 78 +++++ src/app/(marketing)/create-profile/types.ts | 16 + 9 files changed, 324 insertions(+), 325 deletions(-) create mode 100644 src/app/(marketing)/create-profile/_components/ChoosePass.tsx delete mode 100644 src/app/(marketing)/create-profile/_components/types.ts create mode 100644 src/app/(marketing)/create-profile/constants.ts create mode 100644 src/app/(marketing)/create-profile/types.ts diff --git a/src/app/(marketing)/create-profile/_components/Benefits.tsx b/src/app/(marketing)/create-profile/_components/Benefits.tsx index 59af8320b8..e9c2fd4a92 100644 --- a/src/app/(marketing)/create-profile/_components/Benefits.tsx +++ b/src/app/(marketing)/create-profile/_components/Benefits.tsx @@ -1,59 +1,6 @@ import { Card } from "@/components/ui/Card" import { cn } from "@/lib/utils" - -interface Benefit { - title: string - description: string - isAvailable: boolean -} - -const BENEFITS = [ - { - title: "Launch your Guild Profile", - description: "Your onchain profile with achievements and XP level ", - isAvailable: true, - }, - { - title: "Unlock exclusive rewards", - description: "Pass holders can access unique and one-off rewards from guilds", - isAvailable: true, - }, - { - title: "Get early access to Guild features", - description: "Be the first to unlock and experience our newest features", - isAvailable: true, - }, - { - title: "Priority support", - description: - "Get help within hours — even our CEO is answering priority tickets", - isAvailable: true, - }, - { - title: "Manage your personal Guild", - description: - "Special access to gamified features to help creators engage their audience", - isAvailable: false, - }, - { - title: "Alpha Explorer", - description: - "Unlock secret guilds and earn exclusive rewards before they become popular", - isAvailable: false, - }, - { - title: "Be part of Gold community", - description: - "Shape Guild's future — your ideas drive what we build and when we build it", - isAvailable: false, - }, - { - title: "Very top secret stuff", - description: - "There are things we can't tell you just yet — you'll have to see them for yourself", - isAvailable: false, - }, -] as const satisfies Benefit[] +import { BENEFITS } from "../constants" export const Benefits = () => { return ( diff --git a/src/app/(marketing)/create-profile/_components/ChoosePass.tsx b/src/app/(marketing)/create-profile/_components/ChoosePass.tsx new file mode 100644 index 0000000000..4d26848166 --- /dev/null +++ b/src/app/(marketing)/create-profile/_components/ChoosePass.tsx @@ -0,0 +1,126 @@ +import { Button } from "@/components/ui/Button" +import { Card } from "@/components/ui/Card" +import { + Carousel, + CarouselApi, + CarouselContent, + CarouselDotButton, + CarouselItem, + useCarouselDotButton, +} from "@/components/ui/Carousel" +import { Separator } from "@/components/ui/Separator" +import { ToggleGroup, ToggleGroupItem } from "@radix-ui/react-toggle-group" +import Autoplay from "embla-carousel-autoplay" +import { useEffect, useMemo, useState } from "react" +import { SUBSCRIPTIONS } from "../constants" +import { OnboardingChain } from "../types" +import { Benefits } from "./Benefits" +import { GuildPassScene } from "./GuildPassScene" + +export const ChoosePass: OnboardingChain = ({ dispatchChainAction }) => { + const [api, setApi] = useState() + const [subscriptionIndex, setSubscriptionIndex] = useState() + const [autoplay, setAutoPlay] = useState(true) + const { selectedIndex, scrollSnaps, onCarouselDotButtonClick } = + useCarouselDotButton(api) + const carouselPlugins = useMemo( + () => [Autoplay({ delay: 4000, stopOnInteraction: true, active: autoplay })], + [autoplay] + ) + useEffect(() => { + if (subscriptionIndex === undefined) return + dispatchChainAction("next", { + chosenSubscription: SUBSCRIPTIONS[subscriptionIndex], + }) + }, [subscriptionIndex]) + + return ( + +

+ Choose your pass +

+ + + {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( + +
+
+ {" "} +
+
+

{title}

+ + {pricing} + +

+ {description} +

+ +
+
+
+ ))} +
+
+
+ {scrollSnaps.map((_, i) => ( + { + setAutoPlay(false) + onCarouselDotButtonClick(i) + }} + isActive={i === selectedIndex} + /> + ))} +
+ + + {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( + setSubscriptionIndex(i)} + className={ + "relative w-full select-none from-accent outline-none hover:bg-gradient-to-t focus-visible:bg-gradient-to-t focus-visible:ring-4 focus-visible:ring-ring" + } + key={title} + > +
+
+ +
+
+

{title}

+ + {pricing} + +

+ {description} +

+
+ {i < SUBSCRIPTIONS.length - 1 && ( + + )} +
+
+ ))} +
+
+ +
+
+ ) +} diff --git a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx index a1d7c9f725..56b92d23ae 100644 --- a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx +++ b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx @@ -13,8 +13,8 @@ import { zodResolver } from "@hookform/resolvers/zod" import { ArrowRight } from "@phosphor-icons/react/dist/ssr" import { FormProvider, useForm } from "react-hook-form" import { z } from "zod" +import { OnboardingChain } from "../types" import { GuildPassScene } from "./GuildPassScene" -import { OnboardingChain } from "./types" const formSchema = z.object({ inviteHandle: z.string(), diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index 650510342f..972d76fc1c 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -3,29 +3,37 @@ import { Button } from "@/components/ui/Button" import { ToggleGroup, ToggleGroupItem } from "@/components/ui/ToggleGroup" import { useState } from "react" +import { SUBSCRIPTIONS } from "../constants" +import { ChainData, DispatchChainAction, OnboardingChain } from "../types" +import { ChoosePass } from "./ChoosePass" import { ClaimPass } from "./ClaimPass" import { PurchasePass } from "./PurchasePass" import { StartProfile } from "./StartProfile" -import { ChainAction, OnboardingChain } from "./types" -const progressionChains: OnboardingChain[] = [ +const chains: OnboardingChain[] = [ ClaimPass, + ChoosePass, PurchasePass, StartProfile, ] as const export const OnboardingDriver = () => { - const [progressionIndex, setProgressionIndex] = useState(1) - const OnboardingCard = progressionChains[progressionIndex] + const [chainIndex, setChainIndex] = useState(0) + // TODO: remove default chosen subscription, as it is only there for debug + // purposes + const [chainData, setChainData] = useState>({ + chosenSubscription: SUBSCRIPTIONS[0], + }) + const OnboardingCard = chains[chainIndex] - const dispatchChainAction = (action: ChainAction) => { - if (action === "next" && progressionChains.length > progressionIndex + 1) { - setProgressionIndex((prev) => prev + 1) + const dispatchChainAction: DispatchChainAction = (action, data) => { + if (data) setChainData((prev) => ({ prev, ...data })) + if (action === "next" && chains.length > chainIndex + 1) { + setChainIndex((prev) => prev + 1) return } - if (action === "previous" && 0 < progressionIndex) { - setProgressionIndex((prev) => prev - 1) - return + if (action === "previous" && 0 < chainIndex) { + setChainIndex((prev) => prev - 1) } } @@ -34,12 +42,10 @@ export const OnboardingDriver = () => { - value && setProgressionIndex(Number.parseInt(value)) - } + value={chainIndex.toString()} + onValueChange={(value) => value && setChainIndex(Number.parseInt(value))} > - {progressionChains.map((pane, index) => ( + {chains.map((pane, index) => ( {pane.name} @@ -49,7 +55,7 @@ export const OnboardingDriver = () => {
- + ) } diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index 971ecef70b..247029adba 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -1,267 +1,100 @@ -"use client" - import { Button } from "@/components/ui/Button" import { Card } from "@/components/ui/Card" -import { - Carousel, - CarouselApi, - CarouselContent, - CarouselDotButton, - CarouselItem, - useCarouselDotButton, -} from "@/components/ui/Carousel" import { Separator } from "@/components/ui/Separator" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/Tooltip" -import { cn } from "@/lib/utils" import { DotLottiePlayer } from "@dotlottie/react-player" import { ArrowLeft, Info } from "@phosphor-icons/react" -import { ToggleGroup, ToggleGroupItem } from "@radix-ui/react-toggle-group" -import Autoplay from "embla-carousel-autoplay" -import { useMemo, useState } from "react" -import { Benefits } from "./Benefits" +import { useState } from "react" +import { OnboardingChain } from "../types" import { GuildPassScene } from "./GuildPassScene" -import { OnboardingChain } from "./types" - -interface Subscription { - title: string - pricing: string - description: string - pricingShort: string -} -const SUBSCRIPTIONS = [ - { - title: "Single Pass", - pricing: "$6 / month", - pricingShort: "$6 / month", - description: "For the curious, who want to try Guild’s new features", - }, - { - title: "Bundle Pass", - pricing: "$60 / year", - pricingShort: "$60 / year", - description: "For the professionals, who would benefit from Guild continuously", - }, - { - title: "Lifetime Pass", - pricing: "0.1 ETH one time", - pricingShort: "0.1 ETH", - description: - "For Guild’s biggest supporters, who are excited for the future of Guild", - }, -] as const satisfies Subscription[] - -export const PurchasePass: OnboardingChain = () => { - const [api, setApi] = useState() - const [activeIndex, setActiveIndex] = useState() - const didUserSelect = activeIndex !== undefined +export const PurchasePass: OnboardingChain = ({ dispatchChainAction, data }) => { const [didUserPurchase, setDidUserPurchase] = useState(false) - const [autoplay, setAutoPlay] = useState(true) - const { selectedIndex, scrollSnaps, onCarouselDotButtonClick } = - useCarouselDotButton(api) - const carouselPlugins = useMemo( - () => [Autoplay({ delay: 4000, stopOnInteraction: true, active: autoplay })], - [autoplay] - ) + if (!data.chosenSubscription) throw new Error("Subscription data was not provided") + + const { title, pricingShort } = data.chosenSubscription return ( - +
- {didUserSelect ? ( - - ) : ( -

- Choose your pass -

- )} -
- - - {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( - -
-
- -
-
-

{title}

- - {pricing} - -

- {description} -

- -
-
-
- ))} -
-
-
- {scrollSnaps.map((_, i) => ( - { - setAutoPlay(false) - onCarouselDotButtonClick(i) - }} - isActive={i === selectedIndex} - /> - ))} +
- - +
+
+ {didUserPurchase ? ( + + ) : ( + + )} +
+
+

{title}

+ + {pricingShort} + +
+
- {didUserSelect ? ( -
-
-
- 1. Verification - - - - - - We have to collect your personal details for legal reasons. They - won’t be shared anywhere on the website - - -
- +
+
+
+ 1. Verification + + + + + + We have to collect your personal details for legal reasons. They + won’t be shared anywhere on the website + +
- + +
+ - {SUBSCRIPTIONS[activeIndex].title === "Lifetime Pass" ? ( -
-
2. Complete payment
-
-
Gas fee
-
0.03 ETH
-
-
-
Total
-
---
-
- - + {title === "Lifetime Pass" ? ( +
+
2. Complete payment
+
+
Gas fee
+
0.03 ETH
- ) : ( -
- 2. Complete payment - +
+
Total
+
---
- )} -
- ) : ( - - )} + + +
+ ) : ( +
+ 2. Complete payment + +
+ )} +
) diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index 89f2dc803e..ecb2facd0c 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -16,7 +16,7 @@ import { AvatarFallback } from "@radix-ui/react-avatar" import { useState } from "react" import { FormProvider, useForm } from "react-hook-form" import { z } from "zod" -import { OnboardingChain } from "./types" +import { OnboardingChain } from "../types" const formSchema = z.object({ name: z.string(), diff --git a/src/app/(marketing)/create-profile/_components/types.ts b/src/app/(marketing)/create-profile/_components/types.ts deleted file mode 100644 index 76aefc8f4c..0000000000 --- a/src/app/(marketing)/create-profile/_components/types.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ReactNode } from "react" - -export type ChainAction = "next" | "previous" - -export type OnboardingChain = (props: { - dispatchChainAction: (action: ChainAction) => void -}) => ReactNode diff --git a/src/app/(marketing)/create-profile/constants.ts b/src/app/(marketing)/create-profile/constants.ts new file mode 100644 index 0000000000..a2f9fe6a8d --- /dev/null +++ b/src/app/(marketing)/create-profile/constants.ts @@ -0,0 +1,78 @@ +export const SUBSCRIPTIONS = [ + { + title: "Single Pass", + pricing: "$6 / month", + pricingShort: "$6 / month", + description: "For the curious, who want to try Guild’s new features", + }, + { + title: "Bundle Pass", + pricing: "$60 / year", + pricingShort: "$60 / year", + description: "For the professionals, who would benefit from Guild continuously", + }, + { + title: "Lifetime Pass", + pricing: "0.1 ETH one time", + pricingShort: "0.1 ETH", + description: + "For Guild’s biggest supporters, who are excited for the future of Guild", + }, +] as const satisfies { + title: string + pricing: string + description: string + pricingShort: string +}[] + +export const BENEFITS = [ + { + title: "Launch your Guild Profile", + description: "Your onchain profile with achievements and XP level ", + isAvailable: true, + }, + { + title: "Unlock exclusive rewards", + description: "Pass holders can access unique and one-off rewards from guilds", + isAvailable: true, + }, + { + title: "Get early access to Guild features", + description: "Be the first to unlock and experience our newest features", + isAvailable: true, + }, + { + title: "Priority support", + description: + "Get help within hours — even our CEO is answering priority tickets", + isAvailable: true, + }, + { + title: "Manage your personal Guild", + description: + "Special access to gamified features to help creators engage their audience", + isAvailable: false, + }, + { + title: "Alpha Explorer", + description: + "Unlock secret guilds and earn exclusive rewards before they become popular", + isAvailable: false, + }, + { + title: "Be part of Gold community", + description: + "Shape Guild's future — your ideas drive what we build and when we build it", + isAvailable: false, + }, + { + title: "Very top secret stuff", + description: + "There are things we can't tell you just yet — you'll have to see them for yourself", + isAvailable: false, + }, +] as const satisfies { + title: string + description: string + isAvailable: boolean +}[] diff --git a/src/app/(marketing)/create-profile/types.ts b/src/app/(marketing)/create-profile/types.ts new file mode 100644 index 0000000000..baf0652fac --- /dev/null +++ b/src/app/(marketing)/create-profile/types.ts @@ -0,0 +1,16 @@ +import { FunctionComponent } from "react" +import { SUBSCRIPTIONS } from "./constants" + +export type ChainAction = "next" | "previous" +export interface ChainData { + chosenSubscription: (typeof SUBSCRIPTIONS)[number] +} +export type DispatchChainAction = ( + action: ChainAction, + data?: Partial +) => void + +export type OnboardingChain = FunctionComponent<{ + dispatchChainAction: DispatchChainAction + data: Partial +}> From 6a14b6b86b68428f04acf543880e34cc974b6fb4 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 23 Jul 2024 23:57:54 +0200 Subject: [PATCH 43/82] chore: rename data to chainData --- .../create-profile/_components/OnboardingDriver.tsx | 5 ++++- .../create-profile/_components/PurchasePass.tsx | 10 +++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index 972d76fc1c..79d757891a 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -55,7 +55,10 @@ export const OnboardingDriver = () => {
- + ) } diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index 247029adba..bef808cbb4 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -8,11 +8,15 @@ import { useState } from "react" import { OnboardingChain } from "../types" import { GuildPassScene } from "./GuildPassScene" -export const PurchasePass: OnboardingChain = ({ dispatchChainAction, data }) => { +export const PurchasePass: OnboardingChain = ({ + dispatchChainAction, + chainData, +}) => { const [didUserPurchase, setDidUserPurchase] = useState(false) - if (!data.chosenSubscription) throw new Error("Subscription data was not provided") + if (!chainData.chosenSubscription) + throw new Error("Subscription data was not provided") - const { title, pricingShort } = data.chosenSubscription + const { title, pricingShort } = chainData.chosenSubscription return ( From 6fa509edc5616e8d9c99d8e22532aa8a95cfeca7 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 00:02:46 +0200 Subject: [PATCH 44/82] fix: spread prev value too --- .../(marketing)/create-profile/_components/OnboardingDriver.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index 79d757891a..cdf772b9d9 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -27,7 +27,7 @@ export const OnboardingDriver = () => { const OnboardingCard = chains[chainIndex] const dispatchChainAction: DispatchChainAction = (action, data) => { - if (data) setChainData((prev) => ({ prev, ...data })) + setChainData((prev) => ({ ...prev, ...data })) if (action === "next" && chains.length > chainIndex + 1) { setChainIndex((prev) => prev + 1) return From f51c5b5068b589e831d633663816197bcf44a72c Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 24 Jul 2024 10:40:41 +0200 Subject: [PATCH 45/82] fix(ChoosePass): disable autoplay & start from the 2nd slide --- .../create-profile/_components/ChoosePass.tsx | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/ChoosePass.tsx b/src/app/(marketing)/create-profile/_components/ChoosePass.tsx index 4d26848166..f6670198ca 100644 --- a/src/app/(marketing)/create-profile/_components/ChoosePass.tsx +++ b/src/app/(marketing)/create-profile/_components/ChoosePass.tsx @@ -10,8 +10,7 @@ import { } from "@/components/ui/Carousel" import { Separator } from "@/components/ui/Separator" import { ToggleGroup, ToggleGroupItem } from "@radix-ui/react-toggle-group" -import Autoplay from "embla-carousel-autoplay" -import { useEffect, useMemo, useState } from "react" +import { useEffect, useState } from "react" import { SUBSCRIPTIONS } from "../constants" import { OnboardingChain } from "../types" import { Benefits } from "./Benefits" @@ -20,13 +19,8 @@ import { GuildPassScene } from "./GuildPassScene" export const ChoosePass: OnboardingChain = ({ dispatchChainAction }) => { const [api, setApi] = useState() const [subscriptionIndex, setSubscriptionIndex] = useState() - const [autoplay, setAutoPlay] = useState(true) const { selectedIndex, scrollSnaps, onCarouselDotButtonClick } = useCarouselDotButton(api) - const carouselPlugins = useMemo( - () => [Autoplay({ delay: 4000, stopOnInteraction: true, active: autoplay })], - [autoplay] - ) useEffect(() => { if (subscriptionIndex === undefined) return dispatchChainAction("next", { @@ -42,7 +36,9 @@ export const ChoosePass: OnboardingChain = ({ dispatchChainAction }) => { {SUBSCRIPTIONS.map(({ title, description, pricing }, i) => ( @@ -76,10 +72,7 @@ export const ChoosePass: OnboardingChain = ({ dispatchChainAction }) => { {scrollSnaps.map((_, i) => ( { - setAutoPlay(false) - onCarouselDotButtonClick(i) - }} + onClick={() => onCarouselDotButtonClick(i)} isActive={i === selectedIndex} /> ))} From 13bd1017ebf6dfedaf1ab1ccb784493c139b21a5 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 12:50:22 +0200 Subject: [PATCH 46/82] fix: rename type --- src/app/(marketing)/create-profile/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(marketing)/create-profile/types.ts b/src/app/(marketing)/create-profile/types.ts index baf0652fac..b30994270e 100644 --- a/src/app/(marketing)/create-profile/types.ts +++ b/src/app/(marketing)/create-profile/types.ts @@ -12,5 +12,5 @@ export type DispatchChainAction = ( export type OnboardingChain = FunctionComponent<{ dispatchChainAction: DispatchChainAction - data: Partial + chainData: Partial }> From a19fbe38aa0c1f03e02fcba263edb9a6789b82dd Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 14:15:43 +0200 Subject: [PATCH 47/82] feat: add emoji images --- public/apple_emojis/bust-in-silhouette.png | Bin 0 -> 12313 bytes public/apple_emojis/compass.png | Bin 0 -> 41146 bytes .../apple_emojis/people-with-bunny-ears.png | Bin 0 -> 26158 bytes public/apple_emojis/sparkles.png | Bin 0 -> 11509 bytes public/apple_emojis/speech-balloon.png | Bin 0 -> 8447 bytes public/apple_emojis/star.png | Bin 0 -> 16097 bytes public/apple_emojis/technologist.png | Bin 0 -> 24907 bytes public/apple_emojis/unlocked.png | Bin 0 -> 17754 bytes .../create-profile/_components/Benefits.tsx | 5 +++-- .../(marketing)/create-profile/constants.ts | 19 ++++++++++++++++++ 10 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 public/apple_emojis/bust-in-silhouette.png create mode 100644 public/apple_emojis/compass.png create mode 100644 public/apple_emojis/people-with-bunny-ears.png create mode 100644 public/apple_emojis/sparkles.png create mode 100644 public/apple_emojis/speech-balloon.png create mode 100644 public/apple_emojis/star.png create mode 100644 public/apple_emojis/technologist.png create mode 100644 public/apple_emojis/unlocked.png diff --git a/public/apple_emojis/bust-in-silhouette.png b/public/apple_emojis/bust-in-silhouette.png new file mode 100644 index 0000000000000000000000000000000000000000..40607d093a1ee82e74fb02b0373dca3ce378f9b2 GIT binary patch literal 12313 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 literal 0 HcmV?d00001 diff --git a/public/apple_emojis/compass.png b/public/apple_emojis/compass.png new file mode 100644 index 0000000000000000000000000000000000000000..e182becd9b4df20b74453b9c7f3e5bcba2ffca4f GIT binary patch literal 41146 zcmV)cK&ZcoP)005u}1^@s6i_d2*005wUNklibv1meahP#uXPKFqnRm5fMuQZ|mTegle~Ilsp z(nu$l!$F$UMViA&j!=M{P6q|~BlSRlTy7UR_}?1w??U{1ji2vw@l|OQ^sB$id-2~~ z9yf)*M0J<_nSMhWWW+z7MQl0BgwCk(-gm-yQUk z#G_#wG`Tj}1Acl)59fx0;aU9ieY}sOola*y-V@jD^ZBW%si~#0spX*G@Be_;a2dbq z9AA?j2nP5Xf)wIwkdM{WNBrae_x1m~0CX4t1SlL%&B@Qp42ASuhs#yWPb%i;bb@J^K;7iIhFkV zHvjuNU-UJv$5p}iQ59fBBzoO)ecGQn0Qs3+cy0dP>2f`ko|a1KsVQDmGgk$4F3?O_iz5sCf z9t`>zF!j7HCA?8*`THf8Q#;M~bc{di8oxcjDjOOK{@DP~!II*On#=jOnHlNH`MEii zl<1|p`bH{akk!`KQB!k^>^1f(je(h*lq9UrEJ&rLm2~TNDKlfkYkZ-f<@m>BM(v3|we-{>Tu()FI0h|m*2BM$8e0;q=AASzVCiw&Y8V2k&e&In) z4J-Vj-#N$o;d{Kvd%FoND#)d|^aPbOV zxptF5STFY!G!7jeSo=g?$Mp0x%FW55q~s*3u4$m#w@awLw(2lH@qW$eIB$N&|2hB? zDFC*#`0(#c#>Ghf^$ds8HO}q!3`j^!OixWtq?D8dN=ahC0elQNh!9+dLsNnf4CWX1 zG8rr^ECv9Df(j7o9(DN{S`t7iA`4$m#lB91h1K8Gx|nQ! z*M@?D;|#`K43tfLAN%<|t2_)wQ#Aih01T_^Oy~ReTI&^WQerMtN5sY`nzxZ?*O2O|Ax1rPvR*i;zR&DZH9FJCK+9=<*iwhEag!;Tbt6?>3rJb_5Qq5r;d)o{9HPJ@iLt}d6pWRnpsjL zu1-!){24!O8z0nK(fvZ|pfam_`FDd^ZFroo=Sc=>V#lIF%4X4BQ(I5Bu3hDIZhn;| z#M8W7{_p?eU;WPoApcST2*B`$^yCekp=*xCUaxmzT556jR64NLMV0>(gwEp~P@ViC`Eyy3zy1 z>N9{KJFY1`5+cyU_v!WUwIz5c0ivJp6~D)4se=);uC=kbnOd4#nuEc>HWr>M7>Min zHRthJA>Q~q0bob~$Y%pmf(;e1-MD$1j-NOUsnU{~n)G)b zx95kv2F*dazYy60h-=30luDxC&ARMACnYCz?%KJS5|dM?w4{W}OUpt&zwbc?-rL{* z?l=Dj0+5Xf=w|pkpR_UlVDNrku!X6~$=x&3k|{kciN&jzH`fIs;zbGZ2KrfNX`;G@ zCf?8%5qZ$Tc%PK6$nVDs%le;3*wp2Alh>=hz)}uj9Hmogn(2E{%w_6@vhYD{x∨ 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

bp6lo^0c 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 R002ovPDHLkV1h1iZfCa{|BnCw literal 0 HcmV?d00001 diff --git a/public/apple_emojis/sparkles.png b/public/apple_emojis/sparkles.png new file mode 100644 index 0000000000000000000000000000000000000000..532afeea06c7bd49f10a7c0799cc0df4ea040b10 GIT binary patch literal 11509 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 YbU_tvt}+Akw2U;X)KSr*-k#3?2gFHn>;M1& literal 0 HcmV?d00001 diff --git a/public/apple_emojis/speech-balloon.png b/public/apple_emojis/speech-balloon.png new file mode 100644 index 0000000000000000000000000000000000000000..4fca65a66e035057aa883e4023f4610f73d220d4 GIT binary patch literal 8447 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 literal 0 HcmV?d00001 diff --git a/public/apple_emojis/technologist.png b/public/apple_emojis/technologist.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9f2f4739dd472838933c6d94645d456fd5b7b5 GIT binary patch literal 24907 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 OMNUMnLSTX}aBgSO5GD%% literal 0 HcmV?d00001 diff --git a/public/apple_emojis/unlocked.png b/public/apple_emojis/unlocked.png new file mode 100644 index 0000000000000000000000000000000000000000..3ef4ff6f3258689d4945907ec24f193185eadf20 GIT binary patch literal 17754 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 literal 0 HcmV?d00001 diff --git a/src/app/(marketing)/create-profile/_components/Benefits.tsx b/src/app/(marketing)/create-profile/_components/Benefits.tsx index e9c2fd4a92..923d5c957a 100644 --- a/src/app/(marketing)/create-profile/_components/Benefits.tsx +++ b/src/app/(marketing)/create-profile/_components/Benefits.tsx @@ -1,5 +1,6 @@ import { Card } from "@/components/ui/Card" import { cn } from "@/lib/utils" +import Image from "next/image" import { BENEFITS } from "../constants" export const Benefits = () => { @@ -12,7 +13,7 @@ export const Benefits = () => { All passes provide the same benefits

- {BENEFITS.map(({ title, description, isAvailable }) => ( + {BENEFITS.map(({ title, description, isAvailable, image }) => ( { { "bg-muted": !isAvailable } )} > - # +

{title}

diff --git a/src/app/(marketing)/create-profile/constants.ts b/src/app/(marketing)/create-profile/constants.ts index a2f9fe6a8d..97d0c0bda3 100644 --- a/src/app/(marketing)/create-profile/constants.ts +++ b/src/app/(marketing)/create-profile/constants.ts @@ -1,3 +1,13 @@ +import { StaticImageData } from "next/image" +import bustInSilhouette from "/public/apple_emojis/bust-in-silhouette.png" +import compass from "/public/apple_emojis/compass.png" +import peopleWithBunnyEars from "/public/apple_emojis/people-with-bunny-ears.png" +import sparkles from "/public/apple_emojis/sparkles.png" +import speechBalloon from "/public/apple_emojis/speech-balloon.png" +import star from "/public/apple_emojis/star.png" +import technologist from "/public/apple_emojis/technologist.png" +import unlocked from "/public/apple_emojis/unlocked.png" + export const SUBSCRIPTIONS = [ { title: "Single Pass", @@ -30,49 +40,58 @@ export const BENEFITS = [ title: "Launch your Guild Profile", description: "Your onchain profile with achievements and XP level ", isAvailable: true, + image: star, }, { title: "Unlock exclusive rewards", description: "Pass holders can access unique and one-off rewards from guilds", isAvailable: true, + image: bustInSilhouette, }, { title: "Get early access to Guild features", description: "Be the first to unlock and experience our newest features", isAvailable: true, + image: unlocked, }, { title: "Priority support", description: "Get help within hours — even our CEO is answering priority tickets", isAvailable: true, + image: speechBalloon, }, { title: "Manage your personal Guild", description: "Special access to gamified features to help creators engage their audience", isAvailable: false, + image: technologist, }, { title: "Alpha Explorer", description: "Unlock secret guilds and earn exclusive rewards before they become popular", isAvailable: false, + image: compass, }, { title: "Be part of Gold community", description: "Shape Guild's future — your ideas drive what we build and when we build it", isAvailable: false, + image: peopleWithBunnyEars, }, { title: "Very top secret stuff", description: "There are things we can't tell you just yet — you'll have to see them for yourself", isAvailable: false, + image: sparkles, }, ] as const satisfies { title: string description: string isAvailable: boolean + image: StaticImageData }[] From 52576e3b2a69a03d6e9e2f7c54a01b197e50d523 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 14:18:46 +0200 Subject: [PATCH 48/82] revert: add layout and header back --- src/app/layout.tsx | 25 ++++++++++++------------- src/v2/components/Header/Header.tsx | 2 ++ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 688eb9c4ca..4cbb71700e 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,10 +1,11 @@ +import { Providers } from "@/components/Providers" +import { PostHogPageViews } from "@/components/Providers/PostHogPageViews" import { dystopian, inter } from "fonts" import type { Metadata } from "next" -import { type ReactNode } from "react" +import { type ReactNode, Suspense } from "react" import "./globals.css" -import { TooltipProvider } from "@/components/ui/Tooltip" import { cn } from "@/lib/utils" -import { ThemeProvider } from "next-themes" +import NextTopLoader from "nextjs-toploader" interface RootLayoutProps { children: ReactNode @@ -20,17 +21,15 @@ export default function RootLayout({ children }: RootLayoutProps) { return ( - - - {children} - + + + {children} + + + + + ) diff --git a/src/v2/components/Header/Header.tsx b/src/v2/components/Header/Header.tsx index 13ff82e542..b32aa8c806 100644 --- a/src/v2/components/Header/Header.tsx +++ b/src/v2/components/Header/Header.tsx @@ -1,10 +1,12 @@ "use client" +import { Account } from "../Account" import { NavMenu } from "./NavMenu" const Header = () => (
+
) From 378416c32ed3f4d0cb9bab41fe6ed73bb110474d Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 14:21:16 +0200 Subject: [PATCH 49/82] chore: remove accidental line terminator --- src/app/layout.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4cbb71700e..3390ae6e06 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -23,6 +23,7 @@ export default function RootLayout({ children }: RootLayoutProps) { + {children} From 4ffc831309a7db1c9f34a33d90c7d9c2b2a684ed Mon Sep 17 00:00:00 2001 From: BrickheadJohnny Date: Wed, 24 Jul 2024 14:58:17 +0200 Subject: [PATCH 50/82] wip: prepare components for animations --- .../create-profile/_components/ChoosePass.tsx | 5 +- .../create-profile/_components/ClaimPass.tsx | 5 +- .../_components/OnboardingDriver.tsx | 54 +++++++++++++------ .../_components/PurchasePass.tsx | 7 ++- .../_components/StartProfile.tsx | 5 +- src/v2/components/ui/Card.tsx | 12 ++--- 6 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/ChoosePass.tsx b/src/app/(marketing)/create-profile/_components/ChoosePass.tsx index f6670198ca..0cd5e96d4c 100644 --- a/src/app/(marketing)/create-profile/_components/ChoosePass.tsx +++ b/src/app/(marketing)/create-profile/_components/ChoosePass.tsx @@ -1,5 +1,4 @@ import { Button } from "@/components/ui/Button" -import { Card } from "@/components/ui/Card" import { Carousel, CarouselApi, @@ -29,7 +28,7 @@ export const ChoosePass: OnboardingChain = ({ dispatchChainAction }) => { }, [subscriptionIndex]) return ( - +

Choose your pass

@@ -114,6 +113,6 @@ export const ChoosePass: OnboardingChain = ({ dispatchChainAction }) => {
- +
) } diff --git a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx index 56b92d23ae..6f105ac7cb 100644 --- a/src/app/(marketing)/create-profile/_components/ClaimPass.tsx +++ b/src/app/(marketing)/create-profile/_components/ClaimPass.tsx @@ -1,5 +1,4 @@ import { Button } from "@/components/ui/Button" -import { Card } from "@/components/ui/Card" import { FormControl, FormDescription, @@ -33,7 +32,7 @@ export const ClaimPass: OnboardingChain = ({ dispatchChainAction }) => { } return ( - +
@@ -63,6 +62,6 @@ export const ClaimPass: OnboardingChain = ({ dispatchChainAction }) => { - +
) } diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index cdf772b9d9..bcebaccfb3 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -1,7 +1,8 @@ "use client" import { Button } from "@/components/ui/Button" -import { ToggleGroup, ToggleGroupItem } from "@/components/ui/ToggleGroup" +import { cardClassName } from "@/components/ui/Card" +import { cn } from "@/lib/utils" import { useState } from "react" import { SUBSCRIPTIONS } from "../constants" import { ChainData, DispatchChainAction, OnboardingChain } from "../types" @@ -39,26 +40,45 @@ export const OnboardingDriver = () => { return ( <> - value && setChainIndex(Number.parseInt(value))} - > - {chains.map((pane, index) => ( - - {pane.name} - - ))} -
- + +
+ {/* + */} + + {/* + */} +
) } diff --git a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx index bef808cbb4..f9dfe5598f 100644 --- a/src/app/(marketing)/create-profile/_components/PurchasePass.tsx +++ b/src/app/(marketing)/create-profile/_components/PurchasePass.tsx @@ -1,5 +1,4 @@ import { Button } from "@/components/ui/Button" -import { Card } from "@/components/ui/Card" import { Separator } from "@/components/ui/Separator" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/Tooltip" import { DotLottiePlayer } from "@dotlottie/react-player" @@ -19,11 +18,11 @@ export const PurchasePass: OnboardingChain = ({ const { title, pricingShort } = chainData.chosenSubscription return ( - +
-
+
) } diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index ecb2facd0c..9ce230cbb0 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -1,6 +1,5 @@ import { Avatar } from "@/components/ui/Avatar" import { Button } from "@/components/ui/Button" -import { Card } from "@/components/ui/Card" import { FormControl, FormErrorMessage, @@ -38,7 +37,7 @@ export const StartProfile: OnboardingChain = () => { const [startMethod, setStartMethod] = useState<"farcaster">() return ( - +

Start your Guild Profile!

@@ -98,6 +97,6 @@ export const StartProfile: OnboardingChain = () => { )} - +
) } diff --git a/src/v2/components/ui/Card.tsx b/src/v2/components/ui/Card.tsx index 6d8d28bac6..ffdbb82e21 100644 --- a/src/v2/components/ui/Card.tsx +++ b/src/v2/components/ui/Card.tsx @@ -1,16 +1,12 @@ import { cn } from "@/lib/utils" import { HTMLAttributes, forwardRef } from "react" +export const cardClassName = + "overflow-hidden rounded-2xl bg-card text-card-foreground shadow-md" + const Card = forwardRef>( ({ className, ...props }, ref) => ( -
+
) ) Card.displayName = "Card" From ff00865cdc3d230d51425c5ed726929e261a5b2b Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 15:11:09 +0200 Subject: [PATCH 51/82] feat: add farcaster button --- .../create-profile/_components/StartProfile.tsx | 14 +++++++++++--- src/app/globals.css | 7 ++++--- .../AccountModal/components/FarcasterProfile.tsx | 9 +++++++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index ecb2facd0c..f4d13e0493 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -1,3 +1,4 @@ +import { ConnectFarcasterButton } from "@/components/Account/components/AccountModal/components/FarcasterProfile" import { Avatar } from "@/components/ui/Avatar" import { Button } from "@/components/ui/Button" import { Card } from "@/components/ui/Card" @@ -16,6 +17,7 @@ import { AvatarFallback } from "@radix-ui/react-avatar" import { useState } from "react" import { FormProvider, useForm } from "react-hook-form" import { z } from "zod" +import FarcasterImage from "/src/static/socialIcons/farcaster.svg" import { OnboardingChain } from "../types" const formSchema = z.object({ @@ -89,9 +91,15 @@ export const StartProfile: OnboardingChain = () => { ) : ( <> - + setStartMethod("farcaster")} + > + + Connect farcaster + + From 30f4c243b87d87d64c872098e15bfb602e33dce0 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 15:14:32 +0200 Subject: [PATCH 52/82] chore: reposition driver buttons --- .../(marketing)/create-profile/_components/OnboardingDriver.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index bcebaccfb3..6ea78f674c 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -40,7 +40,7 @@ export const OnboardingDriver = () => { return ( <> -
+
From a99315542e6933c7a40ae217e55b2ccc28ba55c9 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 24 Jul 2024 16:24:08 +0200 Subject: [PATCH 53/82] feat: add destructive to button and required to label --- .../_components/StartProfile.tsx | 29 +++++++++++++++---- src/v2/components/ui/Form.tsx | 13 ++++++--- src/v2/components/ui/Input.tsx | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index 96df0b0828..d06f6758ff 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -20,8 +20,22 @@ import FarcasterImage from "/src/static/socialIcons/farcaster.svg" import { OnboardingChain } from "../types" const formSchema = z.object({ - name: z.string(), - handle: z.string(), + name: z.string().max(100, { message: "Name cannot exceed 100 characters" }), + username: z + .string() + .min(1, { message: "Handle is required" }) + .max(100, { message: "Handle cannot exceed 100 characters" }) + .superRefine((value, ctx) => { + const pattern = /^[\w\-.]+$/ + const isValid = pattern.test(value) + if (!isValid) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + "Handle must only contain either alphanumeric, hyphen, underscore or dot characters", + }) + } + }), }) // TODO: use ConnectFarcasterButton @@ -30,9 +44,11 @@ export const StartProfile: OnboardingChain = () => { resolver: zodResolver(formSchema), defaultValues: { name: "", - handle: "", + username: "", }, + mode: "onTouched", }) + function onSubmit(values: z.infer) { console.log(values) } @@ -67,12 +83,12 @@ export const StartProfile: OnboardingChain = () => { /> ( - Handle + Handle - + @@ -83,6 +99,7 @@ export const StartProfile: OnboardingChain = () => { type="submit" colorScheme="success" onClick={() => setStartMethod(undefined)} + disabled={!form.formState.isValid} > Start my profile diff --git a/src/v2/components/ui/Form.tsx b/src/v2/components/ui/Form.tsx index 849886a5bc..1507d95916 100644 --- a/src/v2/components/ui/Form.tsx +++ b/src/v2/components/ui/Form.tsx @@ -90,16 +90,21 @@ FormItem.displayName = "FormItem" const FormLabel = forwardRef< ElementRef, ComponentPropsWithoutRef ->(({ className, ...props }, ref) => { +>(({ className, children, ...props }, ref) => { const { formItemId } = useFormField() return ( ) }) FormLabel.displayName = "FormLabel" @@ -150,7 +155,7 @@ const FormErrorMessage = forwardRef< const [debounceBody] = useDebounceValue(body, 200) return ( - +

Date: Tue, 30 Jul 2024 16:12:28 +0200 Subject: [PATCH 54/82] feat: add container to StartProfile (#1411) * feat: add container to StartProfile * feat: add avatar to form * feat: add avatar upload and error message * feat: add confetti effect on create profile * feat: add sfx to confetti * feat: add farcaster autofill, fix submit by avatar * docs: rename credits file * feat: redirect on profile creation * chore: replace route instead push * fix: address farcaster linking * chore: update zod message * fix: make avatar size properly image, disable * fix: align code to suggestions * feat: reset onboarding if not signed in --- next.config.js | 3 + package-lock.json | 27 ++ package.json | 1 + public/sfx/CREDITS.md | 1 + public/sfx/confetti-party-popper.mp3 | Bin 0 -> 142251 bytes .../_components/OnboardingDriver.tsx | 17 +- .../_components/StartProfile.tsx | 262 ++++++++++++------ .../_hooks/useCreateProfile.tsx | 43 +++ src/app/(marketing)/create-profile/layout.tsx | 8 + src/app/(marketing)/create-profile/schemas.ts | 36 +++ src/v2/components/Confetti.tsx | 103 +++++++ tailwind.config.ts | 7 +- 12 files changed, 415 insertions(+), 93 deletions(-) create mode 100644 public/sfx/CREDITS.md create mode 100644 public/sfx/confetti-party-popper.mp3 create mode 100644 src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx create mode 100644 src/app/(marketing)/create-profile/layout.tsx create mode 100644 src/app/(marketing)/create-profile/schemas.ts create mode 100644 src/v2/components/Confetti.tsx diff --git a/next.config.js b/next.config.js index 35ce1a0ae6..f04d1cc35c 100644 --- a/next.config.js +++ b/next.config.js @@ -88,6 +88,9 @@ const nextConfig = { { hostname: "og.link3.to", }, + { + hostname: "imagedelivery.net" + } ], contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;", }, diff --git a/package-lock.json b/package-lock.json index b2a93fab0a..adb2ce8cd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -87,6 +87,7 @@ "qrcode.react": "^3.1.0", "randombytes": "^2.1.0", "react": "^18.2.0", + "react-canvas-confetti": "^2.0.7", "react-device-detect": "^2.2.2", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", @@ -12688,6 +12689,11 @@ "@types/node": "*" } }, + "node_modules/@types/canvas-confetti": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@types/canvas-confetti/-/canvas-confetti-1.6.4.tgz", + "integrity": "sha512-fNyZ/Fdw/Y92X0vv7B+BD6ysHL4xVU5dJcgzgxLdGbn8O3PezZNIJpml44lKM0nsGur+o/6+NZbZeNTt00U1uA==" + }, "node_modules/@types/color": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.6.tgz", @@ -16945,6 +16951,15 @@ } ] }, + "node_modules/canvas-confetti": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/canvas-confetti/-/canvas-confetti-1.9.3.tgz", + "integrity": "sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==", + "funding": { + "type": "donate", + "url": "https://www.paypal.me/kirilvatev" + } + }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", @@ -27809,6 +27824,18 @@ "react": ">=16.4.1" } }, + "node_modules/react-canvas-confetti": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/react-canvas-confetti/-/react-canvas-confetti-2.0.7.tgz", + "integrity": "sha512-DIj44O35TPAwJkUSIZqWdVsgAMHtVf8h7YNmnr3jF3bn5mG+d7Rh9gEcRmdJfYgRzh6K+MAGujwUoIqQyLnMJw==", + "dependencies": { + "@types/canvas-confetti": "^1.6.4", + "canvas-confetti": "^1.9.2" + }, + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-clientside-effect": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", diff --git a/package.json b/package.json index eb472e9b2d..174d6c0003 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,7 @@ "qrcode.react": "^3.1.0", "randombytes": "^2.1.0", "react": "^18.2.0", + "react-canvas-confetti": "^2.0.7", "react-device-detect": "^2.2.2", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", diff --git a/public/sfx/CREDITS.md b/public/sfx/CREDITS.md new file mode 100644 index 0000000000..4360cc7535 --- /dev/null +++ b/public/sfx/CREDITS.md @@ -0,0 +1 @@ +"./confetti-party-popper.mp3" : Attribution 4.0 International (CC BY 4.0) - Vilkas Sound diff --git a/public/sfx/confetti-party-popper.mp3 b/public/sfx/confetti-party-popper.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..068fae791f8268af71c2f14ffaaeed7fa82b14cd GIT binary patch literal 142251 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

{G&RR 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 J@Bi@z{uhpt&I14d literal 0 HcmV?d00001 diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index 6ea78f674c..03891c3f7d 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -1,9 +1,12 @@ "use client" +import { walletSelectorModalAtom } from "@/components/Providers/atoms" +import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Button } from "@/components/ui/Button" import { cardClassName } from "@/components/ui/Card" import { cn } from "@/lib/utils" -import { useState } from "react" +import { useSetAtom } from "jotai" +import { useEffect, useState } from "react" import { SUBSCRIPTIONS } from "../constants" import { ChainData, DispatchChainAction, OnboardingChain } from "../types" import { ChoosePass } from "./ChoosePass" @@ -19,7 +22,17 @@ const chains: OnboardingChain[] = [ ] as const export const OnboardingDriver = () => { - const [chainIndex, setChainIndex] = useState(0) + const [chainIndex, setChainIndex] = useState(3) + const { address } = useWeb3ConnectionManager() + const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) + + useEffect(() => { + if (!address) { + setChainIndex(0) + setIsWalletSelectorModalOpen(true) + } + }, [address, setIsWalletSelectorModalOpen]) + // TODO: remove default chosen subscription, as it is only there for debug // purposes const [chainData, setChainData] = useState>({ diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index d06f6758ff..7eba4f6bbf 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -1,5 +1,7 @@ +"use client" + import { ConnectFarcasterButton } from "@/components/Account/components/AccountModal/components/FarcasterProfile" -import { Avatar } from "@/components/ui/Avatar" +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/Avatar" import { Button } from "@/components/ui/Button" import { FormControl, @@ -9,39 +11,50 @@ import { FormLabel, } from "@/components/ui/Form" import { Input } from "@/components/ui/Input" +import { useToast } from "@/components/ui/hooks/useToast" +import { cn } from "@/lib/utils" import { zodResolver } from "@hookform/resolvers/zod" -import { User } from "@phosphor-icons/react" +import { Spinner, UploadSimple, User } from "@phosphor-icons/react" import { ArrowRight } from "@phosphor-icons/react/dist/ssr" -import { AvatarFallback } from "@radix-ui/react-avatar" -import { useState } from "react" +import useUser from "components/[guild]/hooks/useUser" +import useDropzone from "hooks/useDropzone" +import usePinata from "hooks/usePinata" +import { useEffect, useState } from "react" import { FormProvider, useForm } from "react-hook-form" import { z } from "zod" import FarcasterImage from "/src/static/socialIcons/farcaster.svg" +import { useCreateProfile } from "../_hooks/useCreateProfile" +import { profileSchema } from "../schemas" import { OnboardingChain } from "../types" -const formSchema = z.object({ - name: z.string().max(100, { message: "Name cannot exceed 100 characters" }), - username: z - .string() - .min(1, { message: "Handle is required" }) - .max(100, { message: "Handle cannot exceed 100 characters" }) - .superRefine((value, ctx) => { - const pattern = /^[\w\-.]+$/ - const isValid = pattern.test(value) - if (!isValid) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: - "Handle must only contain either alphanumeric, hyphen, underscore or dot characters", - }) - } - }), -}) +enum CreateMethod { + FillByFarcaster, + FromBlank, +} -// TODO: use ConnectFarcasterButton export const StartProfile: OnboardingChain = () => { - const form = useForm>({ - resolver: zodResolver(formSchema), + const { farcasterProfiles = [] } = useUser() + const farcasterProfile = farcasterProfiles.at(0) + const [method, setMethod] = useState( + farcasterProfile ? CreateMethod.FillByFarcaster : undefined + ) + const { toast } = useToast() + + useEffect(() => { + if (!farcasterProfile) return + setMethod(CreateMethod.FillByFarcaster) + form.setValue( + "name", + farcasterProfile.username ?? form.getValues()?.name ?? "", + { shouldValidate: true } + ) + form.setValue("profileImageUrl", farcasterProfile.avatar, { + shouldValidate: true, + }) + }, [farcasterProfile]) + + const form = useForm>({ + resolver: zodResolver(profileSchema), defaultValues: { name: "", username: "", @@ -49,79 +62,148 @@ export const StartProfile: OnboardingChain = () => { mode: "onTouched", }) - function onSubmit(values: z.infer) { - console.log(values) + const createProfile = useCreateProfile() + async function onSubmit(values: z.infer) { + createProfile.onSubmit(values) + } + + const { isUploading, onUpload } = usePinata({ + control: form.control, + fieldToSetOnSuccess: "profileImageUrl", + onError: (error) => { + toast({ + variant: "error", + title: "Failed to upload file", + description: error, + }) + }, + }) + + const [uploadProgress, setUploadProgress] = useState(0) + const { isDragActive, getRootProps } = useDropzone({ + multiple: false, + noClick: false, + onDrop: (acceptedFiles) => { + if (!acceptedFiles[0]) return + onUpload({ + data: [acceptedFiles[0]], + onProgress: setUploadProgress, + }) + }, + onError: (error) => { + toast({ + variant: "error", + title: `Failed to upload file`, + description: error.message, + }) + }, + }) + + let avatarFallBackIcon = + if (isDragActive) { + avatarFallBackIcon = + } else if (isUploading || (uploadProgress !== 0 && uploadProgress !== 1)) { + avatarFallBackIcon = } - const [startMethod, setStartMethod] = useState<"farcaster">() return ( -

+

Start your Guild Profile!

- - - - - - {startMethod ? ( - -
- ( - - Name - - - - - - )} - /> - ( - - Handle - - - - - - )} - /> - - -
- ) : ( - <> - setStartMethod("farcaster")} - > - - Connect farcaster - + +
+ ( + + )} + /> - - - )} + {method === undefined ? ( + <> + + + Connect farcaster + + + + ) : ( + <> + ( + + Name + + + + + + )} + /> + ( + + Handle + + + + + + )} + /> + + + )} + +
) } diff --git a/src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx b/src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx new file mode 100644 index 0000000000..00e9e36800 --- /dev/null +++ b/src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx @@ -0,0 +1,43 @@ +import { useConfetti } from "@/components/Confetti" +import { useToast } from "@/components/ui/hooks/useToast" +import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" +import { useRouter } from "next/navigation" +import fetcher from "utils/fetcher" +import { z } from "zod" +import { profileSchema } from "../schemas" + +export const useCreateProfile = () => { + const router = useRouter() + const { toast } = useToast() + const { confettiPlayer } = useConfetti() + + const createProfile = async (signedValidation: SignedValidation) => + fetcher(`/v2/profiles`, { + method: "POST", + ...signedValidation, + }) + + const submitWithSign = useSubmitWithSign(createProfile, { + onSuccess: (response) => { + toast({ + variant: "success", + title: "Successfully created profile", + }) + confettiPlayer.current("Confetti from left and right") + // @ts-ignore: TODO: either acquire types from backend, or type them here + router.replace(`/profile/${response.username}`) + }, + onError: (response) => { + toast({ + variant: "error", + title: "Failed to create profile", + description: response.error, + }) + }, + }) + return { + ...submitWithSign, + onSubmit: (payload: z.infer) => + submitWithSign.onSubmit(payload), + } +} diff --git a/src/app/(marketing)/create-profile/layout.tsx b/src/app/(marketing)/create-profile/layout.tsx new file mode 100644 index 0000000000..64efbb26a2 --- /dev/null +++ b/src/app/(marketing)/create-profile/layout.tsx @@ -0,0 +1,8 @@ +import { ConfettiProvider } from "@/components/Confetti" +import { PropsWithChildren } from "react" + +const Layout = ({ children }: PropsWithChildren) => { + return {children} +} + +export default Layout diff --git a/src/app/(marketing)/create-profile/schemas.ts b/src/app/(marketing)/create-profile/schemas.ts new file mode 100644 index 0000000000..9f3607e7fa --- /dev/null +++ b/src/app/(marketing)/create-profile/schemas.ts @@ -0,0 +1,36 @@ +import { z } from "zod" +export const profileSchema = z.object({ + name: z + .string() + .max(100, { message: "Name cannot exceed 100 characters" }) + .optional(), + username: z + .string() + .min(1, { message: "Handle is required" }) + .max(100, { message: "Handle cannot exceed 100 characters" }) + .superRefine((value, ctx) => { + const pattern = /^[\w\-.]+$/ + const isValid = pattern.test(value) + if (!isValid) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: + "Handle must only contain either alphanumeric, hyphen, underscore or dot characters", + }) + } + }), + bio: z + .string() + .max(1000, { message: "Bio cannot exceed 1000 characters" }) + .optional(), + profileImageUrl: z + .string() + .url({ message: "Profile image must be a valid URL" }) + .max(500, { message: "Profile image URL cannot exceed 500 characters" }) + .optional(), + backgroundImageUrl: z + .string() + .url({ message: "Background image must be a valid URL" }) + .max(500, { message: "Profile image URL cannot exceed 500 characters" }) + .optional(), +}) diff --git a/src/v2/components/Confetti.tsx b/src/v2/components/Confetti.tsx new file mode 100644 index 0000000000..8adade2920 --- /dev/null +++ b/src/v2/components/Confetti.tsx @@ -0,0 +1,103 @@ +"use client" + +import { + MutableRefObject, + PropsWithChildren, + createContext, + useContext, + useRef, +} from "react" +import ReactCanvasConfetti from "react-canvas-confetti/dist" +import { TCanvasConfettiInstance } from "react-canvas-confetti/dist/types" + +const doubleConfetti = (confetti: TCanvasConfettiInstance) => { + const count = 200 + const defaultsPerBarrage: confetti.Options[] = [ + { + origin: { x: -0.05 }, + angle: 50, + }, + { + origin: { x: 1.05 }, + angle: 130, + }, + ] as const + + const fire = (particleRatio: number, opts: confetti.Options) => { + confetti({ + ...opts, + particleCount: Math.floor(count * particleRatio), + }) + } + + for (const defaults of defaultsPerBarrage) { + fire(0.25, { + spread: 26, + startVelocity: 55, + ...defaults, + }) + fire(0.2, { + spread: 60, + ...defaults, + }) + fire(0.35, { + spread: 100, + decay: 0.91, + scalar: 0.8, + ...defaults, + }) + fire(0.1, { + spread: 120, + startVelocity: 25, + decay: 0.92, + scalar: 1.2, + ...defaults, + }) + fire(0.1, { + spread: 120, + startVelocity: 45, + ...defaults, + }) + } +} + +const ConfettiContext = createContext>( + {} as MutableRefObject +) + +export const useConfetti = () => { + return { confettiPlayer: useContext(ConfettiContext) } +} + +type ConfettiType = "Confetti from left and right" +type ConfettiPlayer = (type: ConfettiType) => void + +export const ConfettiProvider = ({ children }: PropsWithChildren) => { + const confettiRef = useRef(() => { + return + }) + const audioRef = useRef(null) + const onInitHandler = ({ confetti }: { confetti: TCanvasConfettiInstance }) => { + const confettiClosure: ConfettiPlayer = (type) => { + if (type === "Confetti from left and right") { + doubleConfetti(confetti) + audioRef.current?.play() + } + } + confettiRef.current = confettiClosure + } + return ( + + {children} + + + ) +} diff --git a/tailwind.config.ts b/tailwind.config.ts index d1c2ec5783..e61c386c36 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -155,6 +155,10 @@ const config = { }, }, keyframes: { + wiggle: { + '0%, 100%': { transform: 'rotate(-3deg)' }, + '50%': { transform: 'rotate(3deg)' }, + }, "accordion-down": { from: { height: "0" }, to: { height: "var(--radix-accordion-content-height)" }, @@ -177,6 +181,7 @@ const config = { }, }, animation: { + wiggle: 'wiggle 1s ease-in-out infinite', "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", "caret-blink": "caret-blink 1.25s ease-out infinite", @@ -189,7 +194,7 @@ const config = { modal: "1400", popover: "1500", toast: "1700", - tooltip: "1800", + tooltip: "1800", } }, }, From b0e35b07595db51d5b37531de245ef51e469dc32 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Tue, 30 Jul 2024 16:23:41 +0200 Subject: [PATCH 55/82] chore: rename handle to username --- .../create-profile/_components/StartProfile.tsx | 2 +- src/app/(marketing)/create-profile/schemas.ts | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index 7eba4f6bbf..dc9adf1958 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -183,7 +183,7 @@ export const StartProfile: OnboardingChain = () => { name="username" render={({ field }) => ( - Handle + Username diff --git a/src/app/(marketing)/create-profile/schemas.ts b/src/app/(marketing)/create-profile/schemas.ts index 9f3607e7fa..d4d8757a70 100644 --- a/src/app/(marketing)/create-profile/schemas.ts +++ b/src/app/(marketing)/create-profile/schemas.ts @@ -1,3 +1,4 @@ +// TODO: replace these with the incoming backend validators import { z } from "zod" export const profileSchema = z.object({ name: z @@ -6,8 +7,8 @@ export const profileSchema = z.object({ .optional(), username: z .string() - .min(1, { message: "Handle is required" }) - .max(100, { message: "Handle cannot exceed 100 characters" }) + .min(1, { message: "Username is required" }) + .max(100, { message: "Username cannot exceed 100 characters" }) .superRefine((value, ctx) => { const pattern = /^[\w\-.]+$/ const isValid = pattern.test(value) @@ -15,7 +16,7 @@ export const profileSchema = z.object({ ctx.addIssue({ code: z.ZodIssueCode.custom, message: - "Handle must only contain either alphanumeric, hyphen, underscore or dot characters", + "Username must only contain either alphanumeric, hyphen, underscore or dot characters", }) } }), From 7484737c21d6fddbb0f4c2bccfdb2657d434d23f Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 31 Jul 2024 17:31:44 +0200 Subject: [PATCH 56/82] chore: replace local profile types --- .../(marketing)/create-profile/_components/StartProfile.tsx | 6 +++--- src/app/(marketing)/create-profile/schemas.ts | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index dc9adf1958..10530b5759 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -13,6 +13,7 @@ import { import { Input } from "@/components/ui/Input" import { useToast } from "@/components/ui/hooks/useToast" import { cn } from "@/lib/utils" +import { Schemas } from "@guildxyz/types" import { zodResolver } from "@hookform/resolvers/zod" import { Spinner, UploadSimple, User } from "@phosphor-icons/react" import { ArrowRight } from "@phosphor-icons/react/dist/ssr" @@ -21,7 +22,6 @@ import useDropzone from "hooks/useDropzone" import usePinata from "hooks/usePinata" import { useEffect, useState } from "react" import { FormProvider, useForm } from "react-hook-form" -import { z } from "zod" import FarcasterImage from "/src/static/socialIcons/farcaster.svg" import { useCreateProfile } from "../_hooks/useCreateProfile" import { profileSchema } from "../schemas" @@ -53,7 +53,7 @@ export const StartProfile: OnboardingChain = () => { }) }, [farcasterProfile]) - const form = useForm>({ + const form = useForm({ resolver: zodResolver(profileSchema), defaultValues: { name: "", @@ -63,7 +63,7 @@ export const StartProfile: OnboardingChain = () => { }) const createProfile = useCreateProfile() - async function onSubmit(values: z.infer) { + async function onSubmit(values: Schemas["ProfileCreation"]) { createProfile.onSubmit(values) } diff --git a/src/app/(marketing)/create-profile/schemas.ts b/src/app/(marketing)/create-profile/schemas.ts index d4d8757a70..b5676e5b87 100644 --- a/src/app/(marketing)/create-profile/schemas.ts +++ b/src/app/(marketing)/create-profile/schemas.ts @@ -1,4 +1,3 @@ -// TODO: replace these with the incoming backend validators import { z } from "zod" export const profileSchema = z.object({ name: z From 01a20d6c6ebe5e56a9ed1920e43d15913dea4a8e Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Wed, 31 Jul 2024 19:05:57 +0200 Subject: [PATCH 57/82] refactor: move profileSchema into validations --- src/app/(marketing)/create-profile/_components/StartProfile.tsx | 2 +- src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx | 2 +- .../schemas.ts => v2/lib/validations/profileSchema.ts} | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) rename src/{app/(marketing)/create-profile/schemas.ts => v2/lib/validations/profileSchema.ts} (99%) diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index 10530b5759..06df6890d0 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -13,6 +13,7 @@ import { import { Input } from "@/components/ui/Input" import { useToast } from "@/components/ui/hooks/useToast" import { cn } from "@/lib/utils" +import { profileSchema } from "@/lib/validations/profileSchema" import { Schemas } from "@guildxyz/types" import { zodResolver } from "@hookform/resolvers/zod" import { Spinner, UploadSimple, User } from "@phosphor-icons/react" @@ -24,7 +25,6 @@ import { useEffect, useState } from "react" import { FormProvider, useForm } from "react-hook-form" import FarcasterImage from "/src/static/socialIcons/farcaster.svg" import { useCreateProfile } from "../_hooks/useCreateProfile" -import { profileSchema } from "../schemas" import { OnboardingChain } from "../types" enum CreateMethod { diff --git a/src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx b/src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx index 00e9e36800..664f6fbf89 100644 --- a/src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx +++ b/src/app/(marketing)/create-profile/_hooks/useCreateProfile.tsx @@ -1,10 +1,10 @@ import { useConfetti } from "@/components/Confetti" import { useToast } from "@/components/ui/hooks/useToast" +import { profileSchema } from "@/lib/validations/profileSchema" import { SignedValidation, useSubmitWithSign } from "hooks/useSubmit" import { useRouter } from "next/navigation" import fetcher from "utils/fetcher" import { z } from "zod" -import { profileSchema } from "../schemas" export const useCreateProfile = () => { const router = useRouter() diff --git a/src/app/(marketing)/create-profile/schemas.ts b/src/v2/lib/validations/profileSchema.ts similarity index 99% rename from src/app/(marketing)/create-profile/schemas.ts rename to src/v2/lib/validations/profileSchema.ts index b5676e5b87..db17dd94c1 100644 --- a/src/app/(marketing)/create-profile/schemas.ts +++ b/src/v2/lib/validations/profileSchema.ts @@ -1,4 +1,5 @@ import { z } from "zod" + export const profileSchema = z.object({ name: z .string() From eaf52fc1e1d3063a1aaf68578943f2fa02cd261e Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Thu, 1 Aug 2024 21:36:46 +0200 Subject: [PATCH 58/82] chore: remove walletselectormodal popup --- .../create-profile/_components/OnboardingDriver.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx index 03891c3f7d..59dccc928c 100644 --- a/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx +++ b/src/app/(marketing)/create-profile/_components/OnboardingDriver.tsx @@ -1,11 +1,8 @@ "use client" - -import { walletSelectorModalAtom } from "@/components/Providers/atoms" import { useWeb3ConnectionManager } from "@/components/Web3ConnectionManager/hooks/useWeb3ConnectionManager" import { Button } from "@/components/ui/Button" import { cardClassName } from "@/components/ui/Card" import { cn } from "@/lib/utils" -import { useSetAtom } from "jotai" import { useEffect, useState } from "react" import { SUBSCRIPTIONS } from "../constants" import { ChainData, DispatchChainAction, OnboardingChain } from "../types" @@ -24,14 +21,12 @@ const chains: OnboardingChain[] = [ export const OnboardingDriver = () => { const [chainIndex, setChainIndex] = useState(3) const { address } = useWeb3ConnectionManager() - const setIsWalletSelectorModalOpen = useSetAtom(walletSelectorModalAtom) useEffect(() => { if (!address) { setChainIndex(0) - setIsWalletSelectorModalOpen(true) } - }, [address, setIsWalletSelectorModalOpen]) + }, [address]) // TODO: remove default chosen subscription, as it is only there for debug // purposes From 28793dcc627aa0bf584ce509c444b18e9764f222 Mon Sep 17 00:00:00 2001 From: Dominik Stumpf Date: Fri, 2 Aug 2024 11:22:42 +0200 Subject: [PATCH 59/82] fix(turbopack): avoid server relative imports --- .../create-profile/_components/StartProfile.tsx | 6 ++++-- src/app/(marketing)/create-profile/constants.ts | 16 ++++++++-------- tsconfig.json | 3 ++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/app/(marketing)/create-profile/_components/StartProfile.tsx b/src/app/(marketing)/create-profile/_components/StartProfile.tsx index 06df6890d0..51062345e4 100644 --- a/src/app/(marketing)/create-profile/_components/StartProfile.tsx +++ b/src/app/(marketing)/create-profile/_components/StartProfile.tsx @@ -1,5 +1,6 @@ "use client" +import FarcasterImage from "@/../static/socialIcons/farcaster.svg" import { ConnectFarcasterButton } from "@/components/Account/components/AccountModal/components/FarcasterProfile" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/Avatar" import { Button } from "@/components/ui/Button" @@ -23,7 +24,6 @@ import useDropzone from "hooks/useDropzone" import usePinata from "hooks/usePinata" import { useEffect, useState } from "react" import { FormProvider, useForm } from "react-hook-form" -import FarcasterImage from "/src/static/socialIcons/farcaster.svg" import { useCreateProfile } from "../_hooks/useCreateProfile" import { OnboardingChain } from "../types" @@ -152,7 +152,9 @@ export const StartProfile: OnboardingChain = () => { size="md" disabled={!!farcasterProfile} > - +
+ +
Connect farcaster
+ +
+
+ ) +} + +export default NotFound diff --git a/src/app/(marketing)/profile/[username]/page.tsx b/src/app/(marketing)/profile/[username]/page.tsx new file mode 100644 index 0000000000..69239ef3ec --- /dev/null +++ b/src/app/(marketing)/profile/[username]/page.tsx @@ -0,0 +1,159 @@ +import { Header } from "@/components/Header" +import { + Layout, + LayoutBanner, + LayoutFooter, + LayoutHero, + LayoutMain, +} from "@/components/Layout" +import { SWRProvider } from "@/components/SWRProvider" +import { Anchor } from "@/components/ui/Anchor" +import { Guild, Role, Schemas } from "@guildxyz/types" +import { ArrowRight } from "@phosphor-icons/react/dist/ssr" +import { ActivityLogAction } from "components/[guild]/activity/constants" +import { env } from "env" +import Image from "next/image" +import { notFound, redirect } from "next/navigation" +import { Profile } from "../_components/Profile" +import { ProfileColorBanner } from "../_components/ProfileColorBanner" + +const api = env.NEXT_PUBLIC_API + +async function ssrFetcher(...args: Parameters) { + return (await fetch(...args)).json() as T +} + +const fetchPublicProfileData = async ({ username }: { username: string }) => { + const activitiesRequest = new URL(`v2/profiles/${username}/activity`, api) + const contributionsRequest = new URL(`v2/profiles/${username}/contributions`, api) + const profileRequest = new URL(`v2/profiles/${username}`, api) + const profileResponse = await fetch(profileRequest, { + next: { + tags: ["profile"], + revalidate: 3600, + }, + }) + + if (profileResponse.status === 404) notFound() + if (!profileResponse.ok) redirect("/error") + + const profile = (await profileResponse.json()) as Schemas["Profile"] + const contributions = await ssrFetcher( + contributionsRequest, + { + next: { + tags: ["contributions"], + revalidate: 3600, + }, + } + ) + const activities = await ssrFetcher(activitiesRequest, { + next: { + tags: ["contributions"], + revalidate: 60, + }, + }) + const roleRequests = contributions.map( + ({ roleId, guildId }) => new URL(`v2/guilds/${guildId}/roles/${roleId}`, api) + ) + const guildRequests = contributions.map( + ({ guildId }) => new URL(`v2/guilds/${guildId}`, api) + ) + const guilds = await Promise.all( + guildRequests.map((req) => + ssrFetcher(req, { + next: { + revalidate: 3 * 3600, + }, + }) + ) + ) + const roles = await Promise.all( + roleRequests.map((req) => + ssrFetcher(req, { + next: { + revalidate: 3 * 3600, + }, + }) + ) + ) + const guildsZipped = Object.fromEntries( + guildRequests.map(({ pathname }, i) => [pathname, guilds[i]]) + ) + const rolesZipped = Object.fromEntries( + roleRequests.map(({ pathname }, i) => [pathname, roles[i]]) + ) + return { + profile, + fallback: { + [activitiesRequest.pathname]: activities, + [profileRequest.pathname]: profile, + [contributionsRequest.pathname]: contributions, + ...guildsZipped, + ...rolesZipped, + }, + } +} + +const Page = async ({ params: { username } }: { params: { username: string } }) => { + const { fallback, profile } = await fetchPublicProfileData({ username }) + + const isBgColor = profile.backgroundImageUrl?.startsWith("#") + + return ( + + + +
+ + {isBgColor ? ( + + ) : ( + profile.backgroundImageUrl && ( + profile background image + ) + )} +
+ + + + + + +

+ Guild Profiles are currently in invite only early access, only available + to{" "} + + Subscribers + + +

+
+ + + ) +} + +// biome-ignore lint/style/noDefaultExport: page route +export default Page diff --git a/src/app/(marketing)/profile/_components/CardWithGuildLabel.tsx b/src/app/(marketing)/profile/_components/CardWithGuildLabel.tsx new file mode 100644 index 0000000000..aa221d9494 --- /dev/null +++ b/src/app/(marketing)/profile/_components/CardWithGuildLabel.tsx @@ -0,0 +1,41 @@ +import { CheckMark } from "@/components/CheckMark" +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/Avatar" +import { Card } from "@/components/ui/Card" +import { Guild } from "@guildxyz/types" +import { PropsWithChildren } from "react" + +export const CardWithGuildLabel = ({ + guild, + children, +}: PropsWithChildren<{ guild: Guild }>) => { + return ( + +
+
+ + + + +
+ {guild.name} +
+ +
+
+
+ {children} +
+
+ ) +} diff --git a/src/app/(marketing)/profile/_components/ContributionCard.tsx b/src/app/(marketing)/profile/_components/ContributionCard.tsx new file mode 100644 index 0000000000..08347d0bde --- /dev/null +++ b/src/app/(marketing)/profile/_components/ContributionCard.tsx @@ -0,0 +1,16 @@ +"use client" + +import { Guild, Role, Schemas } from "@guildxyz/types" +import useSWRImmutable from "swr/immutable" +import { ContributionCardView } from "./ContributionCardView" + +export const ContributionCard = ({ + contribution, +}: { contribution: Schemas["Contribution"] }) => { + const guild = useSWRImmutable(`/v2/guilds/${contribution.guildId}`) + const role = useSWRImmutable( + `/v2/guilds/${contribution.guildId}/roles/${contribution.roleId}` + ) + if (!role.data || !guild.data) return + return +} diff --git a/src/app/(marketing)/profile/_components/ContributionCardView.tsx b/src/app/(marketing)/profile/_components/ContributionCardView.tsx new file mode 100644 index 0000000000..a2db59727d --- /dev/null +++ b/src/app/(marketing)/profile/_components/ContributionCardView.tsx @@ -0,0 +1,44 @@ +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/Avatar" +import { AvatarGroup } from "@/components/ui/AvatarGroup" +import { Separator } from "@/components/ui/Separator" +import { Guild, Role } from "@guildxyz/types" +import { Users } from "@phosphor-icons/react/dist/ssr" +import { CardWithGuildLabel } from "./CardWithGuildLabel" + +export const ContributionCardView = ({ + guild, + role, +}: { guild: Guild; role: Role }) => { + return ( + +
+ + + + +
+
+ TOP ROLE +
+

+ {role.name} +

+
+ +

+ Only {((role.memberCount / guild.memberCount) * 100).toFixed(1)}% of + members have this role +

+
+
+
+ +
+ COLLECTION: +
+ +
+
+
+ ) +} diff --git a/src/app/(marketing)/profile/_components/EditContributions.tsx b/src/app/(marketing)/profile/_components/EditContributions.tsx new file mode 100644 index 0000000000..e428d5c431 --- /dev/null +++ b/src/app/(marketing)/profile/_components/EditContributions.tsx @@ -0,0 +1,249 @@ +"use client" + +import { Avatar, AvatarImage } from "@/components/ui/Avatar" +import { Button } from "@/components/ui/Button" +import { Card } from "@/components/ui/Card" +import { + Dialog, + DialogBody, + DialogCloseButton, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/Dialog" +import { Label } from "@/components/ui/Label" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/Select" +import { useToast } from "@/components/ui/hooks/useToast" +import { useYourGuilds } from "@/hooks/useYourGuilds" +import { Guild, MembershipResult, Role, Schemas } from "@guildxyz/types" +import { X } from "@phosphor-icons/react" +import { PencilSimple } from "@phosphor-icons/react" +import { AvatarFallback } from "@radix-ui/react-avatar" +import { DialogDescription } from "@radix-ui/react-dialog" +import { useState } from "react" +import useSWRImmutable from "swr/immutable" +import { useContributions } from "../_hooks/useContributions" +import { useCreateContribution } from "../_hooks/useCreateContribution" +import { useDeleteContribution } from "../_hooks/useDeleteContribution" +import { useMemberships } from "../_hooks/useMemberships" +import { useUpdateContribution } from "../_hooks/useUpdateContribution" +import { CardWithGuildLabel } from "./CardWithGuildLabel" + +const EditContributionCard = ({ + contribution, +}: { contribution: Schemas["Contribution"] }) => { + const { data: guild } = useSWRImmutable( + `/v2/guilds/${contribution.guildId}` + ) + const memberships = useMemberships() + const editContribution = useUpdateContribution({ contributionId: contribution.id }) + const deleteContribution = useDeleteContribution({ + contributionId: contribution.id, + }) + if (!guild || !memberships.data) return + const roleIds = memberships.data.find( + (membership) => membership.guildId === guild.id + )?.roleIds + + return ( + +
+ + + +
+
+ ) +} + +export const EditContributions = () => { + const contributions = useContributions() + const memberships = useMemberships() + const [guildId, setGuildId] = useState("") + const [roleId, setRoleId] = useState("") + const { toast } = useToast() + + const { data: baseGuilds } = useYourGuilds() + const guilds = baseGuilds?.filter(({ tags }) => tags.includes("VERIFIED")) + + const roleIds = memberships.data?.find( + (membership) => membership.guildId.toString() === guildId + )?.roleIds + const createContribution = useCreateContribution() + + return ( + + + + + + + Edit top contributions + + + + +
+ {contributions.data?.slice(0, 3).map((contribution) => ( + + ))} +
+
+

+ Add contribution +

+ +
+ + +
+
+ + +
+ +
+
+
+
+
+ ) +} + +const GuildSelectItem = ({ guildId }: Pick) => { + const { data } = useSWRImmutable(`/v2/guilds/${guildId}`) + if (!data) return + return ( + +
+ + + + + {data.name} +
+
+ ) +} + +const RoleSelectItem = ({ + roleId, + guildId, +}: Pick & { + roleId: MembershipResult["roleIds"][number] +}) => { + const { data: data } = useSWRImmutable( + `/v2/guilds/${guildId}/roles/${roleId}` + ) + if (!data) return + return ( + +
+ + + + + {data.name} +
+
+ ) +} diff --git a/src/app/(marketing)/profile/_components/EditProfile/EditProfile.tsx b/src/app/(marketing)/profile/_components/EditProfile/EditProfile.tsx new file mode 100644 index 0000000000..79ae4d22ca --- /dev/null +++ b/src/app/(marketing)/profile/_components/EditProfile/EditProfile.tsx @@ -0,0 +1,219 @@ +"use client" + +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/Avatar" +import { Button } from "@/components/ui/Button" +import { Card } from "@/components/ui/Card" +import { + Dialog, + DialogBody, + DialogCloseButton, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/Dialog" +import { + FormControl, + FormErrorMessage, + FormField, + FormItem, + FormLabel, +} from "@/components/ui/Form" +import { Input } from "@/components/ui/Input" +import { Separator } from "@/components/ui/Separator" +import { Textarea } from "@/components/ui/Textarea" +import { toast } from "@/components/ui/hooks/useToast" +import { useDisclosure } from "@/hooks/useDisclosure" +import { cn } from "@/lib/utils" +import { Schemas, schemas } from "@guildxyz/types" +import { zodResolver } from "@hookform/resolvers/zod" +import { Pencil, User } from "@phosphor-icons/react" +import useDropzone from "hooks/useDropzone" +import usePinata from "hooks/usePinata" +import { useState } from "react" +import { FormProvider, useForm } from "react-hook-form" +import { useDeleteProfile } from "../../_hooks/useDeleteProfile" +import { useProfile } from "../../_hooks/useProfile" +import { useUpdateProfile } from "../../_hooks/useUpdateProfile" +import { EditProfileBanner } from "./EditProfileBanner" + +export const EditProfile = () => { + const { data: profile } = useProfile() + const form = useForm({ + resolver: zodResolver(schemas.ProfileUpdateSchema), + defaultValues: { + ...schemas.ProfileUpdateSchema.parse(profile), + }, + mode: "onTouched", + }) + const disclosure = useDisclosure() + const editProfile = useUpdateProfile() + + async function onSubmit(values: Schemas["Profile"]) { + await editProfile.onSubmit(schemas.ProfileUpdateSchema.parse(values)) + if (editProfile.error) return + disclosure.onClose() + } + + const { isUploading, onUpload } = usePinata({ + control: form.control, + fieldToSetOnSuccess: "profileImageUrl", + onError: (error) => { + toast({ + variant: "error", + title: "Failed to upload file", + description: error, + }) + }, + }) + + const [uploadProgress, setUploadProgress] = useState(0) + const { isDragActive, getRootProps } = useDropzone({ + multiple: false, + noClick: false, + onDrop: (acceptedFiles) => { + if (!acceptedFiles[0]) return + onUpload({ + data: [acceptedFiles[0]], + onProgress: setUploadProgress, + }) + }, + onError: (error) => { + toast({ + variant: "error", + title: `Failed to upload file`, + description: error.message, + }) + }, + }) + + const deleteProfile = useDeleteProfile() + + return ( + + + + + + + + + + Edit profile + + + +
+ + ( + + )} + /> +
+ + ( + + Name + + + + + + )} + /> + ( + + Username + + + + + + )} + /> + ( + + Bio + +