diff --git a/apps/dashboard/src/components/homepage/sections/PricingCard.tsx b/apps/dashboard/src/@/components/blocks/pricing-card.tsx similarity index 81% rename from apps/dashboard/src/components/homepage/sections/PricingCard.tsx rename to apps/dashboard/src/@/components/blocks/pricing-card.tsx index f03eb7fb003..e293ab0b570 100644 --- a/apps/dashboard/src/components/homepage/sections/PricingCard.tsx +++ b/apps/dashboard/src/@/components/blocks/pricing-card.tsx @@ -1,13 +1,14 @@ import type { Team } from "@/api/team"; +import { CheckoutButton } from "@/components/billing"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; +import { ToolTipLabel } from "@/components/ui/tooltip"; import { TrackedLinkTW } from "@/components/ui/tracked-link"; import { cn } from "@/lib/utils"; +import { CheckIcon, CircleDollarSignIcon } from "lucide-react"; import type React from "react"; import { TEAM_PLANS } from "utils/pricing"; -import { CheckoutButton } from "../../../@/components/billing"; import { remainingDays } from "../../../utils/date-utils"; -import { FeatureItem } from "./FeatureItem"; type ButtonProps = React.ComponentProps; @@ -154,3 +155,30 @@ export const PricingCard: React.FC = ({ ); }; + +type FeatureItemProps = { + text: string | string[]; +}; + +function FeatureItem({ text }: FeatureItemProps) { + const titleStr = Array.isArray(text) ? text[0] : text; + + return ( +
+ + {Array.isArray(text) ? ( +
+

+ {titleStr}{" "} + {text[1]} +

+ + + +
+ ) : ( +

{titleStr}

+ )} +
+ ); +} diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx index fc1e308ba62..af8d09fc6f7 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/(chainPage)/components/client/FaucetButton.tsx @@ -23,7 +23,7 @@ import { toUnits } from "thirdweb"; import type { ChainMetadata } from "thirdweb/chains"; import { useActiveAccount, useWalletBalance } from "thirdweb/react"; import { z } from "zod"; -import { isOnboardingComplete } from "../../../../../../login/isOnboardingRequired"; +import { isOnboardingComplete } from "../../../../../../login/onboarding/isOnboardingRequired"; function formatTime(seconds: number) { const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" }); diff --git a/apps/dashboard/src/app/account/settings/getAccount.ts b/apps/dashboard/src/app/account/settings/getAccount.ts index 9746c08b6a6..96c505650a9 100644 --- a/apps/dashboard/src/app/account/settings/getAccount.ts +++ b/apps/dashboard/src/app/account/settings/getAccount.ts @@ -1,8 +1,8 @@ import { API_SERVER_URL } from "@/constants/env"; import type { Account } from "@3rdweb-sdk/react/hooks/useApi"; import { getAuthToken } from "../../api/lib/getAuthToken"; -import { isOnboardingComplete } from "../../login/isOnboardingRequired"; import { loginRedirect } from "../../login/loginRedirect"; +import { isOnboardingComplete } from "../../login/onboarding/isOnboardingRequired"; /** * Just get the account object without enforcing onboarding. diff --git a/apps/dashboard/src/app/login/LoginPage.tsx b/apps/dashboard/src/app/login/LoginPage.tsx index 652e71dce36..2121d552ada 100644 --- a/apps/dashboard/src/app/login/LoginPage.tsx +++ b/apps/dashboard/src/app/login/LoginPage.tsx @@ -15,10 +15,10 @@ import { ClientOnly } from "../../components/ClientOnly/ClientOnly"; import { ThirdwebMiniLogo } from "../components/ThirdwebMiniLogo"; import { getSDKTheme } from "../components/sdk-component-theme"; import { doLogin, doLogout, getLoginPayload, isLoggedIn } from "./auth-actions"; -import { isOnboardingComplete } from "./isOnboardingRequired"; +import { isOnboardingComplete } from "./onboarding/isOnboardingRequired"; const LazyOnboardingUI = lazy( - () => import("../../components/onboarding/on-boarding-ui.client"), + () => import("./onboarding/on-boarding-ui.client"), ); const wallets = [ diff --git a/apps/dashboard/src/components/settings/Account/AccountForm.tsx b/apps/dashboard/src/app/login/onboarding/AccountForm.tsx similarity index 100% rename from apps/dashboard/src/components/settings/Account/AccountForm.tsx rename to apps/dashboard/src/app/login/onboarding/AccountForm.tsx diff --git a/apps/dashboard/src/components/onboarding/ChoosePlan.tsx b/apps/dashboard/src/app/login/onboarding/ChoosePlan.tsx similarity index 95% rename from apps/dashboard/src/components/onboarding/ChoosePlan.tsx rename to apps/dashboard/src/app/login/onboarding/ChoosePlan.tsx index e6c936cb800..37c99c3bbcb 100644 --- a/apps/dashboard/src/components/onboarding/ChoosePlan.tsx +++ b/apps/dashboard/src/app/login/onboarding/ChoosePlan.tsx @@ -1,6 +1,7 @@ "use client"; + +import { PricingCard } from "@/components/blocks/pricing-card"; import { Button } from "@/components/ui/button"; -import { PricingCard } from "components/homepage/sections/PricingCard"; import { ArrowRightIcon } from "lucide-react"; import { TitleAndDescription } from "./Title"; diff --git a/apps/dashboard/src/components/onboarding/ConfirmEmail.tsx b/apps/dashboard/src/app/login/onboarding/ConfirmEmail.tsx similarity index 98% rename from apps/dashboard/src/components/onboarding/ConfirmEmail.tsx rename to apps/dashboard/src/app/login/onboarding/ConfirmEmail.tsx index b05b3e4089e..d26d0cdeb97 100644 --- a/apps/dashboard/src/components/onboarding/ConfirmEmail.tsx +++ b/apps/dashboard/src/app/login/onboarding/ConfirmEmail.tsx @@ -1,3 +1,6 @@ +"use client"; + +import type { Team } from "@/api/team"; import { Spinner } from "@/components/ui/Spinner/Spinner"; import { Button } from "@/components/ui/button"; import { @@ -13,10 +16,6 @@ import { } from "@3rdweb-sdk/react/hooks/useApi"; import { useLoggedInUser } from "@3rdweb-sdk/react/hooks/useLoggedInUser"; import { zodResolver } from "@hookform/resolvers/zod"; -import { - type EmailConfirmationValidationSchema, - emailConfirmationValidationSchema, -} from "components/settings/Account/validations"; import { useTrack } from "hooks/analytics/useTrack"; import { useTxNotifications } from "hooks/useTxNotifications"; import { REGEXP_ONLY_DIGITS_AND_CHARS } from "input-otp"; @@ -24,8 +23,11 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { shortenString } from "utils/usedapp-external"; -import type { Team } from "../../@/api/team"; import { TitleAndDescription } from "./Title"; +import { + type EmailConfirmationValidationSchema, + emailConfirmationValidationSchema, +} from "./validations"; interface OnboardingConfirmEmailProps { email: string; diff --git a/apps/dashboard/src/components/onboarding/General.tsx b/apps/dashboard/src/app/login/onboarding/General.tsx similarity index 94% rename from apps/dashboard/src/components/onboarding/General.tsx rename to apps/dashboard/src/app/login/onboarding/General.tsx index 19c03bb11ec..c34833d2648 100644 --- a/apps/dashboard/src/components/onboarding/General.tsx +++ b/apps/dashboard/src/app/login/onboarding/General.tsx @@ -1,11 +1,13 @@ +"use client"; + import { Spinner } from "@/components/ui/Spinner/Spinner"; import { Button } from "@/components/ui/button"; import type { Account } from "@3rdweb-sdk/react/hooks/useApi"; import { useMutation } from "@tanstack/react-query"; -import { AccountForm } from "components/settings/Account/AccountForm"; import { useState } from "react"; import { useActiveWallet, useDisconnect } from "thirdweb/react"; -import { doLogout } from "../../app/login/auth-actions"; +import { doLogout } from "../auth-actions"; +import { AccountForm } from "./AccountForm"; import { TitleAndDescription } from "./Title"; type OnboardingGeneralProps = { diff --git a/apps/dashboard/src/components/onboarding/LinkWallet.tsx b/apps/dashboard/src/app/login/onboarding/LinkWallet.tsx similarity index 99% rename from apps/dashboard/src/components/onboarding/LinkWallet.tsx rename to apps/dashboard/src/app/login/onboarding/LinkWallet.tsx index eee6c629a1a..b597bbf69fb 100644 --- a/apps/dashboard/src/components/onboarding/LinkWallet.tsx +++ b/apps/dashboard/src/app/login/onboarding/LinkWallet.tsx @@ -1,3 +1,5 @@ +"use client"; + import { Spinner } from "@/components/ui/Spinner/Spinner"; import { Button } from "@/components/ui/button"; import { TrackedLinkTW } from "@/components/ui/tracked-link"; diff --git a/apps/dashboard/src/components/onboarding/Title.tsx b/apps/dashboard/src/app/login/onboarding/Title.tsx similarity index 99% rename from apps/dashboard/src/components/onboarding/Title.tsx rename to apps/dashboard/src/app/login/onboarding/Title.tsx index 83c72061b04..ada9d091722 100644 --- a/apps/dashboard/src/components/onboarding/Title.tsx +++ b/apps/dashboard/src/app/login/onboarding/Title.tsx @@ -1,4 +1,5 @@ import type { JSX } from "react"; + type TitleAndDescriptionProps = { heading: string | JSX.Element; description: string | JSX.Element; diff --git a/apps/dashboard/src/app/login/isOnboardingRequired.ts b/apps/dashboard/src/app/login/onboarding/isOnboardingRequired.ts similarity index 100% rename from apps/dashboard/src/app/login/isOnboardingRequired.ts rename to apps/dashboard/src/app/login/onboarding/isOnboardingRequired.ts diff --git a/apps/dashboard/src/components/onboarding/on-boarding-ui.client.tsx b/apps/dashboard/src/app/login/onboarding/on-boarding-ui.client.tsx similarity index 93% rename from apps/dashboard/src/components/onboarding/on-boarding-ui.client.tsx rename to apps/dashboard/src/app/login/onboarding/on-boarding-ui.client.tsx index 5f2aa774a33..3efa11aef41 100644 --- a/apps/dashboard/src/components/onboarding/on-boarding-ui.client.tsx +++ b/apps/dashboard/src/app/login/onboarding/on-boarding-ui.client.tsx @@ -1,15 +1,22 @@ "use client"; +import type { Team } from "@/api/team"; import { cn } from "@/lib/utils"; import type { Account } from "@3rdweb-sdk/react/hooks/useApi"; +import { useTrack } from "hooks/analytics/useTrack"; import { useState } from "react"; -import { useTrack } from "../../hooks/analytics/useTrack"; import { OnboardingChoosePlan } from "./ChoosePlan"; import { OnboardingConfirmEmail } from "./ConfirmEmail"; import { OnboardingGeneral } from "./General"; import { OnboardingLinkWallet } from "./LinkWallet"; -import type { OnboardingScreen } from "./types"; import { useSkipOnboarding } from "./useSkipOnboarding"; +type OnboardingScreen = + | { id: "onboarding" } + | { id: "linking" } + | { id: "confirming" } + | { id: "confirmLinking" } + | { id: "plan"; team: Team }; + function OnboardingUI(props: { account: Account; onComplete: () => void; diff --git a/apps/dashboard/src/components/onboarding/useSkipOnboarding.tsx b/apps/dashboard/src/app/login/onboarding/useSkipOnboarding.tsx similarity index 92% rename from apps/dashboard/src/components/onboarding/useSkipOnboarding.tsx rename to apps/dashboard/src/app/login/onboarding/useSkipOnboarding.tsx index eb0928d309d..19af64728c8 100644 --- a/apps/dashboard/src/components/onboarding/useSkipOnboarding.tsx +++ b/apps/dashboard/src/app/login/onboarding/useSkipOnboarding.tsx @@ -1,5 +1,7 @@ +"use client"; + import { useUpdateAccount } from "@3rdweb-sdk/react/hooks/useApi"; -import { useTrack } from "../../hooks/analytics/useTrack"; +import { useTrack } from "hooks/analytics/useTrack"; export function useSkipOnboarding() { const mutation = useUpdateAccount(); diff --git a/apps/dashboard/src/components/settings/Account/validations.ts b/apps/dashboard/src/app/login/onboarding/validations.ts similarity index 100% rename from apps/dashboard/src/components/settings/Account/validations.ts rename to apps/dashboard/src/app/login/onboarding/validations.ts diff --git a/apps/dashboard/src/app/login/page.tsx b/apps/dashboard/src/app/login/page.tsx index e0d75c47b27..f8850979f5f 100644 --- a/apps/dashboard/src/app/login/page.tsx +++ b/apps/dashboard/src/app/login/page.tsx @@ -1,7 +1,7 @@ import { redirect } from "next/navigation"; import { getRawAccount } from "../account/settings/getAccount"; import { LoginAndOnboardingPage } from "./LoginPage"; -import { isOnboardingComplete } from "./isOnboardingRequired"; +import { isOnboardingComplete } from "./onboarding/isOnboardingRequired"; export default async function Page(props: { searchParams: Promise<{ diff --git a/apps/dashboard/src/components/homepage/sections/FeatureItem.tsx b/apps/dashboard/src/components/homepage/sections/FeatureItem.tsx deleted file mode 100644 index 6f70f6a58f6..00000000000 --- a/apps/dashboard/src/components/homepage/sections/FeatureItem.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { ToolTipLabel } from "@/components/ui/tooltip"; -import { CheckIcon, CircleDollarSignIcon } from "lucide-react"; - -type FeatureItemProps = { - text: string | string[]; -}; - -export function FeatureItem({ text }: FeatureItemProps) { - const titleStr = Array.isArray(text) ? text[0] : text; - - return ( -
- - {Array.isArray(text) ? ( -
-

- {titleStr}{" "} - {text[1]} -

- - - -
- ) : ( -

{titleStr}

- )} -
- ); -} diff --git a/apps/dashboard/src/components/onboarding/types.ts b/apps/dashboard/src/components/onboarding/types.ts deleted file mode 100644 index b9980313a10..00000000000 --- a/apps/dashboard/src/components/onboarding/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Team } from "../../@/api/team"; - -export type OnboardingScreen = - | { id: "onboarding" } - | { id: "linking" } - | { id: "confirming" } - | { id: "confirmLinking" } - | { id: "plan"; team: Team }; diff --git a/apps/dashboard/src/components/settings/Account/Billing/Pricing.tsx b/apps/dashboard/src/components/settings/Account/Billing/Pricing.tsx index 0c3d0ebe79c..70ad0960a90 100644 --- a/apps/dashboard/src/components/settings/Account/Billing/Pricing.tsx +++ b/apps/dashboard/src/components/settings/Account/Billing/Pricing.tsx @@ -1,5 +1,5 @@ import type { Team } from "@/api/team"; -import { PricingCard } from "components/homepage/sections/PricingCard"; +import { PricingCard } from "@/components/blocks/pricing-card"; import { useMemo } from "react"; import { getValidTeamPlan } from "../../../../app/team/components/TeamHeader/getValidTeamPlan";