fix(frontend): Change `/store*` url to `/marketplace*` (#9119)
We have branded it as "Marketplace", so the URL shouldn't be "store". ### Changes 🏗️ - Change frontend URLs from `/store*` to `/marketplace*` - No API route changes to minimize bugs (follow up: https://github.com/Significant-Gravitas/AutoGPT/issues/9118)dev
parent
56612f16cf
commit
800625c952
|
@ -310,9 +310,9 @@ class UserCredit(UserCreditBase):
|
||||||
],
|
],
|
||||||
mode="payment",
|
mode="payment",
|
||||||
success_url=settings.config.platform_base_url
|
success_url=settings.config.platform_base_url
|
||||||
+ "/store/credits?topup=success",
|
+ "/marketplace/credits?topup=success",
|
||||||
cancel_url=settings.config.platform_base_url
|
cancel_url=settings.config.platform_base_url
|
||||||
+ "/store/credits?topup=cancel",
|
+ "/marketplace/credits?topup=cancel",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create pending transaction
|
# Create pending transaction
|
||||||
|
|
|
@ -196,7 +196,7 @@ async def manage_payment_method(
|
||||||
) -> dict[str, str]:
|
) -> dict[str, str]:
|
||||||
session = stripe.billing_portal.Session.create(
|
session = stripe.billing_portal.Session.create(
|
||||||
customer=await get_stripe_customer_id(user_id),
|
customer=await get_stripe_customer_id(user_id),
|
||||||
return_url=settings.config.platform_base_url + "/store/credits",
|
return_url=settings.config.platform_base_url + "/marketplace/credits",
|
||||||
)
|
)
|
||||||
if not session:
|
if not session:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
|
|
|
@ -49,7 +49,7 @@ export default async function RootLayout({
|
||||||
links={[
|
links={[
|
||||||
{
|
{
|
||||||
name: "Marketplace",
|
name: "Marketplace",
|
||||||
href: "/store",
|
href: "/marketplace",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Library",
|
name: "Library",
|
||||||
|
@ -66,7 +66,7 @@ export default async function RootLayout({
|
||||||
{
|
{
|
||||||
icon: IconType.Edit,
|
icon: IconType.Edit,
|
||||||
text: "Edit profile",
|
text: "Edit profile",
|
||||||
href: "/store/profile",
|
href: "/marketplace/profile",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
@ -75,7 +75,7 @@ export default async function RootLayout({
|
||||||
{
|
{
|
||||||
icon: IconType.LayoutDashboard,
|
icon: IconType.LayoutDashboard,
|
||||||
text: "Creator Dashboard",
|
text: "Creator Dashboard",
|
||||||
href: "/store/dashboard",
|
href: "/marketplace/dashboard",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: IconType.UploadCloud,
|
icon: IconType.UploadCloud,
|
||||||
|
@ -88,7 +88,7 @@ export default async function RootLayout({
|
||||||
{
|
{
|
||||||
icon: IconType.Settings,
|
icon: IconType.Settings,
|
||||||
text: "Settings",
|
text: "Settings",
|
||||||
href: "/store/settings",
|
href: "/marketplace/settings",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
@ -5,13 +5,13 @@ export default function Layout({ children }: { children: React.ReactNode }) {
|
||||||
const sidebarLinkGroups = [
|
const sidebarLinkGroups = [
|
||||||
{
|
{
|
||||||
links: [
|
links: [
|
||||||
{ text: "Creator Dashboard", href: "/store/dashboard" },
|
{ text: "Creator Dashboard", href: "/marketplace/dashboard" },
|
||||||
{ text: "Agent dashboard", href: "/store/agent-dashboard" },
|
{ text: "Agent dashboard", href: "/marketplace/agent-dashboard" },
|
||||||
{ text: "Credits", href: "/store/credits" },
|
{ text: "Credits", href: "/marketplace/credits" },
|
||||||
{ text: "Integrations", href: "/store/integrations" },
|
{ text: "Integrations", href: "/marketplace/integrations" },
|
||||||
{ text: "API Keys", href: "/store/api_keys" },
|
{ text: "API Keys", href: "/marketplace/api_keys" },
|
||||||
{ text: "Profile", href: "/store/profile" },
|
{ text: "Profile", href: "/marketplace/profile" },
|
||||||
{ text: "Settings", href: "/store/settings" },
|
{ text: "Settings", href: "/marketplace/settings" },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
|
@ -45,10 +45,10 @@ export default async function Page({
|
||||||
});
|
});
|
||||||
|
|
||||||
const breadcrumbs = [
|
const breadcrumbs = [
|
||||||
{ name: "Store", link: "/store" },
|
{ name: "Store", link: "/marketplace" },
|
||||||
{
|
{
|
||||||
name: agent.creator,
|
name: agent.creator,
|
||||||
link: `/store/creator/${encodeURIComponent(agent.creator)}`,
|
link: `/marketplace/creator/${encodeURIComponent(agent.creator)}`,
|
||||||
},
|
},
|
||||||
{ name: agent.agent_name, link: "#" },
|
{ name: agent.agent_name, link: "#" },
|
||||||
];
|
];
|
|
@ -47,7 +47,7 @@ export default async function Page({
|
||||||
<main className="mt-5 px-4">
|
<main className="mt-5 px-4">
|
||||||
<BreadCrumbs
|
<BreadCrumbs
|
||||||
items={[
|
items={[
|
||||||
{ name: "Store", link: "/store" },
|
{ name: "Store", link: "/marketplace" },
|
||||||
{ name: creator.name, link: "#" },
|
{ name: creator.name, link: "#" },
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
|
@ -1,7 +1,179 @@
|
||||||
"use client";
|
import * as React from "react";
|
||||||
|
import { HeroSection } from "@/components/agptui/composite/HeroSection";
|
||||||
|
import {
|
||||||
|
FeaturedSection,
|
||||||
|
FeaturedAgent,
|
||||||
|
} from "@/components/agptui/composite/FeaturedSection";
|
||||||
|
import {
|
||||||
|
AgentsSection,
|
||||||
|
Agent,
|
||||||
|
} from "@/components/agptui/composite/AgentsSection";
|
||||||
|
import { BecomeACreator } from "@/components/agptui/BecomeACreator";
|
||||||
|
import {
|
||||||
|
FeaturedCreators,
|
||||||
|
FeaturedCreator,
|
||||||
|
} from "@/components/agptui/composite/FeaturedCreators";
|
||||||
|
import { Separator } from "@/components/ui/separator";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
import {
|
||||||
|
StoreAgentsResponse,
|
||||||
|
CreatorsResponse,
|
||||||
|
} from "@/lib/autogpt-server-api/types";
|
||||||
|
import BackendAPI from "@/lib/autogpt-server-api";
|
||||||
|
|
||||||
import { redirect } from "next/navigation";
|
async function getStoreData() {
|
||||||
|
try {
|
||||||
|
const api = new BackendAPI();
|
||||||
|
|
||||||
export default function Page() {
|
// Add error handling and default values
|
||||||
redirect("/store");
|
let featuredAgents: StoreAgentsResponse = {
|
||||||
|
agents: [],
|
||||||
|
pagination: {
|
||||||
|
total_items: 0,
|
||||||
|
total_pages: 0,
|
||||||
|
current_page: 0,
|
||||||
|
page_size: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
let topAgents: StoreAgentsResponse = {
|
||||||
|
agents: [],
|
||||||
|
pagination: {
|
||||||
|
total_items: 0,
|
||||||
|
total_pages: 0,
|
||||||
|
current_page: 0,
|
||||||
|
page_size: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
let featuredCreators: CreatorsResponse = {
|
||||||
|
creators: [],
|
||||||
|
pagination: {
|
||||||
|
total_items: 0,
|
||||||
|
total_pages: 0,
|
||||||
|
current_page: 0,
|
||||||
|
page_size: 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
[featuredAgents, topAgents, featuredCreators] = await Promise.all([
|
||||||
|
api.getStoreAgents({ featured: true }),
|
||||||
|
api.getStoreAgents({ sorted_by: "runs" }),
|
||||||
|
api.getStoreCreators({ featured: true, sorted_by: "num_agents" }),
|
||||||
|
]);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching store data:", error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
featuredAgents,
|
||||||
|
topAgents,
|
||||||
|
featuredCreators,
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error in getStoreData:", error);
|
||||||
|
return {
|
||||||
|
featuredAgents: {
|
||||||
|
agents: [],
|
||||||
|
pagination: {
|
||||||
|
total_items: 0,
|
||||||
|
total_pages: 0,
|
||||||
|
current_page: 0,
|
||||||
|
page_size: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
topAgents: {
|
||||||
|
agents: [],
|
||||||
|
pagination: {
|
||||||
|
total_items: 0,
|
||||||
|
total_pages: 0,
|
||||||
|
current_page: 0,
|
||||||
|
page_size: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
featuredCreators: {
|
||||||
|
creators: [],
|
||||||
|
pagination: {
|
||||||
|
total_items: 0,
|
||||||
|
total_pages: 0,
|
||||||
|
current_page: 0,
|
||||||
|
page_size: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIX: Correct metadata
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Marketplace - NextGen AutoGPT",
|
||||||
|
description: "Find and use AI Agents created by our community",
|
||||||
|
applicationName: "NextGen AutoGPT Store",
|
||||||
|
authors: [{ name: "AutoGPT Team" }],
|
||||||
|
keywords: [
|
||||||
|
"AI agents",
|
||||||
|
"automation",
|
||||||
|
"artificial intelligence",
|
||||||
|
"AutoGPT",
|
||||||
|
"marketplace",
|
||||||
|
],
|
||||||
|
robots: {
|
||||||
|
index: true,
|
||||||
|
follow: true,
|
||||||
|
},
|
||||||
|
openGraph: {
|
||||||
|
title: "Marketplace - NextGen AutoGPT",
|
||||||
|
description: "Find and use AI Agents created by our community",
|
||||||
|
type: "website",
|
||||||
|
siteName: "NextGen AutoGPT Store",
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: "/images/store-og.png",
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: "NextGen AutoGPT Store",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
twitter: {
|
||||||
|
card: "summary_large_image",
|
||||||
|
title: "Marketplace - NextGen AutoGPT",
|
||||||
|
description: "Find and use AI Agents created by our community",
|
||||||
|
images: ["/images/store-twitter.png"],
|
||||||
|
},
|
||||||
|
icons: {
|
||||||
|
icon: "/favicon.ico",
|
||||||
|
shortcut: "/favicon-16x16.png",
|
||||||
|
apple: "/apple-touch-icon.png",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default async function Page({}: {}) {
|
||||||
|
// Get data server-side
|
||||||
|
const { featuredAgents, topAgents, featuredCreators } = await getStoreData();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="mx-auto w-screen max-w-[1360px]">
|
||||||
|
<main className="px-4">
|
||||||
|
<HeroSection />
|
||||||
|
<FeaturedSection
|
||||||
|
featuredAgents={featuredAgents.agents as FeaturedAgent[]}
|
||||||
|
/>
|
||||||
|
<Separator />
|
||||||
|
<AgentsSection
|
||||||
|
sectionTitle="Top Agents"
|
||||||
|
agents={topAgents.agents as Agent[]}
|
||||||
|
/>
|
||||||
|
<Separator />
|
||||||
|
<FeaturedCreators
|
||||||
|
featuredCreators={featuredCreators.creators as FeaturedCreator[]}
|
||||||
|
/>
|
||||||
|
<Separator />
|
||||||
|
<BecomeACreator
|
||||||
|
title="Become a Creator"
|
||||||
|
description="Join our ever-growing community of hackers and tinkerers"
|
||||||
|
buttonText="Become a Creator"
|
||||||
|
/>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,5 +3,5 @@
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
redirect("/store");
|
redirect("/marketplace");
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ export async function signup(values: z.infer<typeof signupFormSchema>) {
|
||||||
}
|
}
|
||||||
console.log("Signed up");
|
console.log("Signed up");
|
||||||
revalidatePath("/", "layout");
|
revalidatePath("/", "layout");
|
||||||
redirect("/store/profile");
|
redirect("/marketplace/profile");
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,181 +0,0 @@
|
||||||
import * as React from "react";
|
|
||||||
import { HeroSection } from "@/components/agptui/composite/HeroSection";
|
|
||||||
import {
|
|
||||||
FeaturedSection,
|
|
||||||
FeaturedAgent,
|
|
||||||
} from "@/components/agptui/composite/FeaturedSection";
|
|
||||||
import {
|
|
||||||
AgentsSection,
|
|
||||||
Agent,
|
|
||||||
} from "@/components/agptui/composite/AgentsSection";
|
|
||||||
import { BecomeACreator } from "@/components/agptui/BecomeACreator";
|
|
||||||
import {
|
|
||||||
FeaturedCreators,
|
|
||||||
FeaturedCreator,
|
|
||||||
} from "@/components/agptui/composite/FeaturedCreators";
|
|
||||||
import { Separator } from "@/components/ui/separator";
|
|
||||||
import { Metadata } from "next";
|
|
||||||
import {
|
|
||||||
StoreAgentsResponse,
|
|
||||||
CreatorsResponse,
|
|
||||||
} from "@/lib/autogpt-server-api/types";
|
|
||||||
import BackendAPI from "@/lib/autogpt-server-api";
|
|
||||||
|
|
||||||
export const dynamic = "force-dynamic";
|
|
||||||
|
|
||||||
async function getStoreData() {
|
|
||||||
try {
|
|
||||||
const api = new BackendAPI();
|
|
||||||
|
|
||||||
// Add error handling and default values
|
|
||||||
let featuredAgents: StoreAgentsResponse = {
|
|
||||||
agents: [],
|
|
||||||
pagination: {
|
|
||||||
total_items: 0,
|
|
||||||
total_pages: 0,
|
|
||||||
current_page: 0,
|
|
||||||
page_size: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
let topAgents: StoreAgentsResponse = {
|
|
||||||
agents: [],
|
|
||||||
pagination: {
|
|
||||||
total_items: 0,
|
|
||||||
total_pages: 0,
|
|
||||||
current_page: 0,
|
|
||||||
page_size: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
let featuredCreators: CreatorsResponse = {
|
|
||||||
creators: [],
|
|
||||||
pagination: {
|
|
||||||
total_items: 0,
|
|
||||||
total_pages: 0,
|
|
||||||
current_page: 0,
|
|
||||||
page_size: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
[featuredAgents, topAgents, featuredCreators] = await Promise.all([
|
|
||||||
api.getStoreAgents({ featured: true }),
|
|
||||||
api.getStoreAgents({ sorted_by: "runs" }),
|
|
||||||
api.getStoreCreators({ featured: true, sorted_by: "num_agents" }),
|
|
||||||
]);
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error fetching store data:", error);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
featuredAgents,
|
|
||||||
topAgents,
|
|
||||||
featuredCreators,
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error in getStoreData:", error);
|
|
||||||
return {
|
|
||||||
featuredAgents: {
|
|
||||||
agents: [],
|
|
||||||
pagination: {
|
|
||||||
total_items: 0,
|
|
||||||
total_pages: 0,
|
|
||||||
current_page: 0,
|
|
||||||
page_size: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
topAgents: {
|
|
||||||
agents: [],
|
|
||||||
pagination: {
|
|
||||||
total_items: 0,
|
|
||||||
total_pages: 0,
|
|
||||||
current_page: 0,
|
|
||||||
page_size: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
featuredCreators: {
|
|
||||||
creators: [],
|
|
||||||
pagination: {
|
|
||||||
total_items: 0,
|
|
||||||
total_pages: 0,
|
|
||||||
current_page: 0,
|
|
||||||
page_size: 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIX: Correct metadata
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: "Marketplace - NextGen AutoGPT",
|
|
||||||
description: "Find and use AI Agents created by our community",
|
|
||||||
applicationName: "NextGen AutoGPT Store",
|
|
||||||
authors: [{ name: "AutoGPT Team" }],
|
|
||||||
keywords: [
|
|
||||||
"AI agents",
|
|
||||||
"automation",
|
|
||||||
"artificial intelligence",
|
|
||||||
"AutoGPT",
|
|
||||||
"marketplace",
|
|
||||||
],
|
|
||||||
robots: {
|
|
||||||
index: true,
|
|
||||||
follow: true,
|
|
||||||
},
|
|
||||||
openGraph: {
|
|
||||||
title: "Marketplace - NextGen AutoGPT",
|
|
||||||
description: "Find and use AI Agents created by our community",
|
|
||||||
type: "website",
|
|
||||||
siteName: "NextGen AutoGPT Store",
|
|
||||||
images: [
|
|
||||||
{
|
|
||||||
url: "/images/store-og.png",
|
|
||||||
width: 1200,
|
|
||||||
height: 630,
|
|
||||||
alt: "NextGen AutoGPT Store",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
twitter: {
|
|
||||||
card: "summary_large_image",
|
|
||||||
title: "Marketplace - NextGen AutoGPT",
|
|
||||||
description: "Find and use AI Agents created by our community",
|
|
||||||
images: ["/images/store-twitter.png"],
|
|
||||||
},
|
|
||||||
icons: {
|
|
||||||
icon: "/favicon.ico",
|
|
||||||
shortcut: "/favicon-16x16.png",
|
|
||||||
apple: "/apple-touch-icon.png",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default async function Page({}: {}) {
|
|
||||||
// Get data server-side
|
|
||||||
const { featuredAgents, topAgents, featuredCreators } = await getStoreData();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="mx-auto w-screen max-w-[1360px]">
|
|
||||||
<main className="px-4">
|
|
||||||
<HeroSection />
|
|
||||||
<FeaturedSection
|
|
||||||
featuredAgents={featuredAgents.agents as FeaturedAgent[]}
|
|
||||||
/>
|
|
||||||
<Separator />
|
|
||||||
<AgentsSection
|
|
||||||
sectionTitle="Top Agents"
|
|
||||||
agents={topAgents.agents as Agent[]}
|
|
||||||
/>
|
|
||||||
<Separator />
|
|
||||||
<FeaturedCreators
|
|
||||||
featuredCreators={featuredCreators.creators as FeaturedCreator[]}
|
|
||||||
/>
|
|
||||||
<Separator />
|
|
||||||
<BecomeACreator
|
|
||||||
title="Become a Creator"
|
|
||||||
description="Join our ever-growing community of hackers and tinkerers"
|
|
||||||
buttonText="Become a Creator"
|
|
||||||
/>
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
|
@ -105,7 +105,7 @@ export const AgentInfo: React.FC<AgentInfoProps> = ({
|
||||||
by
|
by
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
href={`/store/creator/${encodeURIComponent(creator)}`}
|
href={`/marketplace/creator/${encodeURIComponent(creator)}`}
|
||||||
className="font-geist text-base font-medium text-neutral-800 hover:underline dark:text-neutral-200 sm:text-lg lg:text-xl"
|
className="font-geist text-base font-medium text-neutral-800 hover:underline dark:text-neutral-200 sm:text-lg lg:text-xl"
|
||||||
>
|
>
|
||||||
{creator}
|
{creator}
|
||||||
|
|
|
@ -28,7 +28,7 @@ export const NavbarLink = ({ name, href }: NavbarLinkProps) => {
|
||||||
: ""
|
: ""
|
||||||
} flex items-center justify-start gap-3`}
|
} flex items-center justify-start gap-3`}
|
||||||
>
|
>
|
||||||
{href === "/store" && (
|
{href === "/marketplace" && (
|
||||||
<IconShoppingCart
|
<IconShoppingCart
|
||||||
className={`h-6 w-6 ${activeLink === href ? "text-white dark:text-black" : ""}`}
|
className={`h-6 w-6 ${activeLink === href ? "text-white dark:text-black" : ""}`}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -36,7 +36,7 @@ export const SearchBar: React.FC<SearchBarProps> = ({
|
||||||
if (searchQuery.trim()) {
|
if (searchQuery.trim()) {
|
||||||
// Encode the search term and navigate to the desired path
|
// Encode the search term and navigate to the desired path
|
||||||
const encodedTerm = encodeURIComponent(searchQuery);
|
const encodedTerm = encodeURIComponent(searchQuery);
|
||||||
router.push(`/store/search?searchTerm=${encodedTerm}`);
|
router.push(`/marketplace/search?searchTerm=${encodedTerm}`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
<div className="h-full w-full rounded-2xl bg-zinc-200 dark:bg-zinc-800">
|
<div className="h-full w-full rounded-2xl bg-zinc-200 dark:bg-zinc-800">
|
||||||
<div className="inline-flex h-[264px] flex-col items-start justify-start gap-6 p-3">
|
<div className="inline-flex h-[264px] flex-col items-start justify-start gap-6 p-3">
|
||||||
<Link
|
<Link
|
||||||
href="/store/dashboard"
|
href="/marketplace/dashboard"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconDashboardLayout className="h-6 w-6" />
|
<IconDashboardLayout className="h-6 w-6" />
|
||||||
|
@ -56,7 +56,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</Link>
|
</Link>
|
||||||
{stripeAvailable && (
|
{stripeAvailable && (
|
||||||
<Link
|
<Link
|
||||||
href="/store/credits"
|
href="/marketplace/credits"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconCoin className="h-6 w-6" />
|
<IconCoin className="h-6 w-6" />
|
||||||
|
@ -66,7 +66,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
<Link
|
<Link
|
||||||
href="/store/integrations"
|
href="/marketplace/integrations"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconIntegrations className="h-6 w-6" />
|
<IconIntegrations className="h-6 w-6" />
|
||||||
|
@ -75,7 +75,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/store/api_keys"
|
href="/marketplace/api_keys"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<KeyIcon className="h-6 w-6" />
|
<KeyIcon className="h-6 w-6" />
|
||||||
|
@ -84,7 +84,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/store/profile"
|
href="/marketplace/profile"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconProfile className="h-6 w-6" />
|
<IconProfile className="h-6 w-6" />
|
||||||
|
@ -93,7 +93,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/store/settings"
|
href="/marketplace/settings"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconSliders className="h-6 w-6" />
|
<IconSliders className="h-6 w-6" />
|
||||||
|
@ -110,7 +110,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
<div className="h-full w-full rounded-2xl bg-zinc-200 dark:bg-zinc-800">
|
<div className="h-full w-full rounded-2xl bg-zinc-200 dark:bg-zinc-800">
|
||||||
<div className="inline-flex h-[264px] flex-col items-start justify-start gap-6 p-3">
|
<div className="inline-flex h-[264px] flex-col items-start justify-start gap-6 p-3">
|
||||||
<Link
|
<Link
|
||||||
href="/store/dashboard"
|
href="/marketplace/dashboard"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconDashboardLayout className="h-6 w-6" />
|
<IconDashboardLayout className="h-6 w-6" />
|
||||||
|
@ -120,7 +120,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</Link>
|
</Link>
|
||||||
{stripeAvailable && (
|
{stripeAvailable && (
|
||||||
<Link
|
<Link
|
||||||
href="/store/credits"
|
href="/marketplace/credits"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconCoin className="h-6 w-6" />
|
<IconCoin className="h-6 w-6" />
|
||||||
|
@ -130,7 +130,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</Link>
|
</Link>
|
||||||
)}
|
)}
|
||||||
<Link
|
<Link
|
||||||
href="/store/integrations"
|
href="/marketplace/integrations"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconIntegrations className="h-6 w-6" />
|
<IconIntegrations className="h-6 w-6" />
|
||||||
|
@ -139,7 +139,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/store/api_keys"
|
href="/marketplace/api_keys"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<KeyIcon className="h-6 w-6" strokeWidth={1} />
|
<KeyIcon className="h-6 w-6" strokeWidth={1} />
|
||||||
|
@ -148,7 +148,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/store/profile"
|
href="/marketplace/profile"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconProfile className="h-6 w-6" />
|
<IconProfile className="h-6 w-6" />
|
||||||
|
@ -157,7 +157,7 @@ export const Sidebar: React.FC<SidebarProps> = ({ linkGroups }) => {
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
<Link
|
<Link
|
||||||
href="/store/settings"
|
href="/marketplace/settings"
|
||||||
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
className="inline-flex w-full items-center gap-2.5 rounded-xl px-3 py-3 text-neutral-800 hover:bg-neutral-800 hover:text-white dark:text-neutral-200 dark:hover:bg-neutral-700 dark:hover:text-white"
|
||||||
>
|
>
|
||||||
<IconSliders className="h-6 w-6" />
|
<IconSliders className="h-6 w-6" />
|
||||||
|
|
|
@ -39,7 +39,7 @@ export const AgentsSection: React.FC<AgentsSectionProps> = ({
|
||||||
|
|
||||||
const handleCardClick = (creator: string, slug: string) => {
|
const handleCardClick = (creator: string, slug: string) => {
|
||||||
router.push(
|
router.push(
|
||||||
`/store/agent/${encodeURIComponent(creator)}/${encodeURIComponent(slug)}`,
|
`/marketplace/agent/${encodeURIComponent(creator)}/${encodeURIComponent(slug)}`,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ export const FeaturedCreators: React.FC<FeaturedCreatorsProps> = ({
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const handleCardClick = (creator: string) => {
|
const handleCardClick = (creator: string) => {
|
||||||
router.push(`/store/creator/${encodeURIComponent(creator)}`);
|
router.push(`/marketplace/creator/${encodeURIComponent(creator)}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Only show first 4 creators
|
// Only show first 4 creators
|
||||||
|
|
|
@ -43,7 +43,7 @@ export const FeaturedSection: React.FC<FeaturedSectionProps> = ({
|
||||||
|
|
||||||
const handleCardClick = (creator: string, slug: string) => {
|
const handleCardClick = (creator: string, slug: string) => {
|
||||||
router.push(
|
router.push(
|
||||||
`/store/agent/${encodeURIComponent(creator)}/${encodeURIComponent(slug)}`,
|
`/marketplace/agent/${encodeURIComponent(creator)}/${encodeURIComponent(slug)}`,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ export const HeroSection: React.FC = () => {
|
||||||
|
|
||||||
function onFilterChange(selectedFilters: string[]) {
|
function onFilterChange(selectedFilters: string[]) {
|
||||||
const encodedTerm = encodeURIComponent(selectedFilters.join(", "));
|
const encodedTerm = encodeURIComponent(selectedFilters.join(", "));
|
||||||
router.push(`/store/search?searchTerm=${encodedTerm}`);
|
router.push(`/marketplace/search?searchTerm=${encodedTerm}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -260,7 +260,7 @@ export const PublishAgentPopout: React.FC<PublishAgentPopoutProps> = ({
|
||||||
onClose={handleClose}
|
onClose={handleClose}
|
||||||
onDone={handleClose}
|
onDone={handleClose}
|
||||||
onViewProgress={() => {
|
onViewProgress={() => {
|
||||||
router.push("/store/dashboard");
|
router.push("/marketplace/dashboard");
|
||||||
handleClose();
|
handleClose();
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -24,7 +24,7 @@ export function NavBarButtons({ className }: { className?: string }) {
|
||||||
icon: <BsBoxes />,
|
icon: <BsBoxes />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
href: "/store",
|
href: "/marketplace",
|
||||||
text: "Marketplace",
|
text: "Marketplace",
|
||||||
icon: <IconMarketplace />,
|
icon: <IconMarketplace />,
|
||||||
},
|
},
|
||||||
|
|
|
@ -5,9 +5,9 @@ import { NextResponse, type NextRequest } from "next/server";
|
||||||
const PROTECTED_PAGES = [
|
const PROTECTED_PAGES = [
|
||||||
"/monitor",
|
"/monitor",
|
||||||
"/build",
|
"/build",
|
||||||
"/store/profile",
|
"/marketplace/profile",
|
||||||
"/store/settings",
|
"/marketplace/settings",
|
||||||
"/store/dashboard",
|
"/marketplace/dashboard",
|
||||||
];
|
];
|
||||||
const ADMIN_PAGES = ["/admin"];
|
const ADMIN_PAGES = ["/admin"];
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ export async function updateSession(request: NextRequest) {
|
||||||
ADMIN_PAGES.some((page) => request.nextUrl.pathname.startsWith(`${page}`))
|
ADMIN_PAGES.some((page) => request.nextUrl.pathname.startsWith(`${page}`))
|
||||||
) {
|
) {
|
||||||
// no user, potentially respond by redirecting the user to the login page
|
// no user, potentially respond by redirecting the user to the login page
|
||||||
url.pathname = `/store`;
|
url.pathname = `/marketplace`;
|
||||||
return NextResponse.redirect(url);
|
return NextResponse.redirect(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ test.describe("Authentication", () => {
|
||||||
test("user can login successfully", async ({ page, loginPage, testUser }) => {
|
test("user can login successfully", async ({ page, loginPage, testUser }) => {
|
||||||
await page.goto("/login");
|
await page.goto("/login");
|
||||||
await loginPage.login(testUser.email, testUser.password);
|
await loginPage.login(testUser.email, testUser.password);
|
||||||
await test.expect(page).toHaveURL("/store");
|
await test.expect(page).toHaveURL("/marketplace");
|
||||||
await test
|
await test
|
||||||
.expect(page.getByTestId("profile-popout-menu-trigger"))
|
.expect(page.getByTestId("profile-popout-menu-trigger"))
|
||||||
.toBeVisible();
|
.toBeVisible();
|
||||||
|
@ -19,7 +19,7 @@ test.describe("Authentication", () => {
|
||||||
await page.goto("/login");
|
await page.goto("/login");
|
||||||
await loginPage.login(testUser.email, testUser.password);
|
await loginPage.login(testUser.email, testUser.password);
|
||||||
|
|
||||||
await test.expect(page).toHaveURL("/store");
|
await test.expect(page).toHaveURL("/marketplace");
|
||||||
|
|
||||||
// Click on the profile menu trigger to open popout
|
// Click on the profile menu trigger to open popout
|
||||||
await page.getByTestId("profile-popout-menu-trigger").click();
|
await page.getByTestId("profile-popout-menu-trigger").click();
|
||||||
|
@ -43,7 +43,7 @@ test.describe("Authentication", () => {
|
||||||
}) => {
|
}) => {
|
||||||
await page.goto("/login");
|
await page.goto("/login");
|
||||||
await loginPage.login(testUser.email, testUser.password);
|
await loginPage.login(testUser.email, testUser.password);
|
||||||
await test.expect(page).toHaveURL("/store");
|
await test.expect(page).toHaveURL("/marketplace");
|
||||||
// Click on the profile menu trigger to open popout
|
// Click on the profile menu trigger to open popout
|
||||||
await page.getByTestId("profile-popout-menu-trigger").click();
|
await page.getByTestId("profile-popout-menu-trigger").click();
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ test.describe("Authentication", () => {
|
||||||
|
|
||||||
await test.expect(page).toHaveURL("/login");
|
await test.expect(page).toHaveURL("/login");
|
||||||
await loginPage.login(testUser.email, testUser.password);
|
await loginPage.login(testUser.email, testUser.password);
|
||||||
await test.expect(page).toHaveURL("/store");
|
await test.expect(page).toHaveURL("/marketplace");
|
||||||
await test
|
await test
|
||||||
.expect(page.getByTestId("profile-popout-menu-trigger"))
|
.expect(page.getByTestId("profile-popout-menu-trigger"))
|
||||||
.toBeVisible();
|
.toBeVisible();
|
||||||
|
|
|
@ -10,7 +10,7 @@ test.describe("Profile", () => {
|
||||||
// Start each test with login using worker auth
|
// Start each test with login using worker auth
|
||||||
await page.goto("/login");
|
await page.goto("/login");
|
||||||
await loginPage.login(testUser.email, testUser.password);
|
await loginPage.login(testUser.email, testUser.password);
|
||||||
await test.expect(page).toHaveURL("/store");
|
await test.expect(page).toHaveURL("/marketplace");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("user can view their profile information", async ({
|
test("user can view their profile information", async ({
|
||||||
|
|
Loading…
Reference in New Issue