diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx index 8f4ec5bbcaf..b18edbc6c73 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/cloud/layout.tsx @@ -60,7 +60,7 @@ function TransactionsLayout(props: { - + diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/EngineFooterCard.stories.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/EngineFooterCard.stories.tsx index c4d3b3f55c2..8c3058da6fe 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/EngineFooterCard.stories.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/EngineFooterCard.stories.tsx @@ -5,8 +5,8 @@ const meta = { title: "Engine/EngineFooterCard", component: EngineFooterCard, args: { - team_slug: "demo-team", - project_slug: "demo-project", + teamSlug: "demo-team", + projectSlug: "demo-project", }, decorators: [ (Story) => ( @@ -20,26 +20,8 @@ const meta = { export default meta; type Story = StoryObj; -export const Growth: Story = { - args: { - teamPlan: "growth", - }, -}; +export const Growth: Story = {}; -export const Accelerate: Story = { - args: { - teamPlan: "accelerate", - }, -}; +export const Scale: Story = {}; -export const Scale: Story = { - args: { - teamPlan: "scale", - }, -}; - -export const Pro: Story = { - args: { - teamPlan: "pro", - }, -}; +export const Pro: Story = {}; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/_components.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/_components.tsx index 237d482b273..e8bd59005a6 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/_components.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/_components.tsx @@ -1,4 +1,3 @@ -import type { Team } from "@/api/team"; import { Button } from "@/components/ui/button"; import { TrackedLinkTW } from "@/components/ui/tracked-link"; import { ArrowRightIcon, DownloadIcon, ExternalLinkIcon } from "lucide-react"; @@ -75,15 +74,14 @@ function EngineInfoSection(props: { team_slug: string; project_slug: string }) { } export function EngineFooterCard(props: { - teamPlan: Team["billingPlan"]; - team_slug: string; - project_slug: string; + teamSlug: string; + projectSlug: string; }) { return (
); diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.stories.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.stories.tsx index b5f703bcfa5..550563a8028 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.stories.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.stories.tsx @@ -1,5 +1,6 @@ import type { EngineInstance } from "@3rdweb-sdk/react/hooks/useEngine"; import type { Meta, StoryObj } from "@storybook/react"; +import { teamStub } from "../../../../../../../../../../stories/stubs"; import { EngineInstancesTableUI } from "./engine-instances-table"; const meta: Meta = { @@ -109,7 +110,7 @@ export const NoInstancesProPlan: Story = { args: { instances: [], engineLinkPrefix: "/team/test/engine", - teamPlan: "pro", + team: teamStub("1", "pro"), }, }; @@ -117,7 +118,7 @@ export const NoInstancesGrowthPlan: Story = { args: { instances: [], engineLinkPrefix: "/team/test/engine", - teamPlan: "growth", + team: teamStub("2", "growth"), }, }; @@ -127,7 +128,7 @@ export const NoInstancesAcceleratePlan: Story = { args: { instances: [], engineLinkPrefix: "/team/test/engine", - teamPlan: "accelerate", + team: teamStub("3", "accelerate"), }, }; diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.tsx index de58eae9213..9d2fdc6c635 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-instances-table.tsx @@ -1,6 +1,7 @@ "use client"; import type { Team } from "@/api/team"; +import { CheckoutButton } from "@/components/billing"; import { Spinner } from "@/components/ui/Spinner/Spinner"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Badge, type BadgeProps } from "@/components/ui/badge"; @@ -10,9 +11,20 @@ import { Dialog, DialogContent, DialogDescription, + DialogFooter, DialogHeader, DialogTitle, + DialogTrigger, } from "@/components/ui/dialog"; +import { + Drawer, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, + DrawerTrigger, +} from "@/components/ui/drawer"; import { DropdownMenu, DropdownMenuContent, @@ -28,6 +40,7 @@ import { FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; +import {} from "@/components/ui/popover"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Table, @@ -39,6 +52,7 @@ import { TableRow, } from "@/components/ui/table"; import { Textarea } from "@/components/ui/textarea"; +import { useIsMobile } from "@/hooks/use-mobile"; import { useDashboardRouter } from "@/lib/DashboardRouter"; import { cn } from "@/lib/utils"; import { @@ -56,9 +70,13 @@ import { useTrack } from "hooks/analytics/useTrack"; import { CheckIcon, CircleAlertIcon, + DatabaseIcon, + InfinityIcon, InfoIcon, PencilIcon, + ShieldCheckIcon, Trash2Icon, + WalletIcon, } from "lucide-react"; import { MoreHorizontalIcon } from "lucide-react"; import { ArrowRightIcon } from "lucide-react"; @@ -80,20 +98,18 @@ type RemovedEngineFromDashboard = ( ) => Promise; export function EngineInstancesTable(props: { - teamSlug: string; + team: Team; projectSlug: string; instances: EngineInstance[]; engineLinkPrefix: string; - teamPlan: Team["billingPlan"]; }) { const router = useDashboardRouter(); return ( { await deleteCloudHostedEngine(params); @@ -111,28 +127,116 @@ export function EngineInstancesTable(props: { ); } +function DedicatedEngineSubscriptionButton(props: { team: Team }) { + const [open, setOpen] = useState(false); + const isMobile = useIsMobile(); + + const trigger = ( + + ); + + const title = ( +
+
+ +
+ Dedicated Engine +
+ ); + + const content = ( +
+
    +
  • + + Isolated environment +
  • +
  • + + EOA or Smart Wallets +
  • +
  • + + No usage limits or charges +
  • +
+
+ ); + + if (isMobile) { + return ( + + {trigger} + + + {title} + + Instantly deploy a dedicated engine instance for your team. + + + {content} + + + Deploy Now · $299 / month + + + + + ); + } + + return ( + + {trigger} + + + {title} + + Instantly deploy a dedicated engine instance for your team. + + + {content} + + + Deploy Now · $299 / month + + + + + ); +} + export function EngineInstancesTableUI(props: { instances: EngineInstance[]; engineLinkPrefix: string; deleteCloudHostedEngine: DeletedCloudHostedEngine; editEngineInstance: EditedEngineInstance; removeEngineFromDashboard: RemovedEngineFromDashboard; - teamPlan: Team["billingPlan"]; - teamSlug: string; + team: Team; projectSlug: string; }) { return ( -
-

- Engine Instances -

+
+
+

+ Engine Instances +

+ +
{props.instances.length === 0 ? ( - + ) : ( @@ -147,7 +251,7 @@ export function EngineInstancesTableUI(props: { {props.instances.map((instance) => ( - {props.teamPlan !== "accelerate" && props.teamPlan !== "scale" && ( - <> -
-
-
- + <> +
+
+
+ + + +
+
+
+ + {selectedTab === "self-hosted" && ( +
+

+ Self-Hosted Engine +

+

+ Add engine instance running on your own infrastructure. +

+
+
+ )} -
- - {selectedTab === "self-hosted" && ( -
-

- Self-Hosted Engine -

-

- Add engine instance running on your own infrastructure. -

-
-
- -
-
- )} - - {selectedTab === "cloud-hosted" && ( -
-

- Managed Engine -

-

- Contact us to add a managed engine instance to your team.{" "} -
We recommend using Engine Cloud in most cases -

-
-
- -
+ {selectedTab === "cloud-hosted" && ( +
+

Managed Engine

+

+ Deploy a managed engine instance to your team.
We + recommend using Engine Cloud in most cases. +

+
+
+
- )} -
+
+ )} +
-
- Need help getting started?
- - View documentation - -
- - )} +
+ Need help getting started?
+ + View documentation + +
+
); } diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-list.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-list.tsx index 7460dfb51e2..a60621b5b35 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-list.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/overview/engine-list.tsx @@ -4,28 +4,25 @@ import { EngineFooterCard } from "../_components"; import { EngineInstancesTable } from "./engine-instances-table"; export const EngineInstancesList = (props: { - team_slug: string; - project_slug: string; + team: Team; + projectSlug: string; instances: EngineInstance[]; - teamPlan: Team["billingPlan"]; }) => { - const engineLinkPrefix = `/team/${props.team_slug}/${props.project_slug}/engine/dedicated`; + const engineLinkPrefix = `/team/${props.team.slug}/${props.projectSlug}/engine/dedicated`; return (
); diff --git a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/page.tsx b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/page.tsx index dd50842de06..2834e6a3485 100644 --- a/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/page.tsx +++ b/apps/dashboard/src/app/(app)/team/[team_slug]/[project_slug]/(sidebar)/engine/dedicated/(general)/page.tsx @@ -47,10 +47,9 @@ export default async function Page(props: { return ( ); }