From 01b8063d682fd2340c3559810eb84500be7f1b60 Mon Sep 17 00:00:00 2001 From: Travis Fischer Date: Tue, 17 Jun 2025 07:00:51 +0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/readme.md | 1 + apps/web/src/app/about/page.tsx | 128 +++++++++--------- apps/web/src/app/app/app-index.tsx | 81 +++++++++++ apps/web/src/app/app/page.tsx | 70 +--------- ...roject-index.tsx => app-project-index.tsx} | 16 ++- .../[namespace]/[project-name]/page.tsx | 4 +- apps/web/src/app/page.tsx | 6 +- 7 files changed, 164 insertions(+), 142 deletions(-) create mode 100644 apps/web/src/app/app/app-index.tsx rename apps/web/src/app/app/projects/[namespace]/[project-name]/{project-index.tsx => app-project-index.tsx} (78%) diff --git a/apps/web/readme.md b/apps/web/readme.md index caf02438..450e500a 100644 --- a/apps/web/readme.md +++ b/apps/web/readme.md @@ -2,3 +2,4 @@ - better auth error handling - display validation errors in auth forms +- race condition on login; sometimes doesn't actually login diff --git a/apps/web/src/app/about/page.tsx b/apps/web/src/app/about/page.tsx index 097d4c78..93123642 100644 --- a/apps/web/src/app/about/page.tsx +++ b/apps/web/src/app/about/page.tsx @@ -5,81 +5,79 @@ import styles from './styles.module.css' export default function AboutPage() { return ( <> -
+

About

-
-

Our Mission

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do - eiusmod tempor incididunt ut labore et dolore magna aliqua. - Ut enim ad minim veniam, quis nostrud exercitation ullamco - laboris nisi ut aliquip ex ea commodo consequat. -

+

Our Mission

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. +

-

Our Story

-

- Duis aute irure dolor in reprehenderit in voluptate velit esse - cillum dolore eu fugiat nulla pariatur. - Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum. -

+

Our Story

+

+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum + dolore eu fugiat nulla pariatur. + Excepteur sint occaecat cupidatat non proident, sunt in culpa + qui officia deserunt mollit anim id est laborum. +

-

Our Values

-

- Sed ut perspiciatis unde omnis iste natus error sit voluptatem - accusantium doloremque laudantium, totam rem aperiam, eaque ipsa - quae ab illo inventore veritatis et quasi architecto beatae vitae - dicta sunt explicabo. -

+

Our Values

+

+ Sed ut perspiciatis unde omnis iste natus error sit voluptatem + accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae + ab illo inventore veritatis et quasi architecto beatae vitae dicta + sunt explicabo. +

-

Our Team

-

- Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut - fugit, sed quia consequuntur magni dolores eos qui ratione - voluptatem sequi nesciunt. -

+

Our Team

+

+ Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut + fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem + sequi nesciunt. +

-

Our Technology

-

- At vero eos et accusamus et iusto odio dignissimos ducimus qui - blanditiis praesentium voluptatum deleniti atque corrupti quos - dolores et quas molestias excepturi sint occaecati cupiditate - non provident. -

+

Our Technology

+

+ At vero eos et accusamus et iusto odio dignissimos ducimus qui + blanditiis praesentium voluptatum deleniti atque corrupti quos dolores + et quas molestias excepturi sint occaecati cupiditate non + provident. +

-

Our Impact

-

- Similique sunt in culpa qui officia deserunt mollitia animi, id est - laborum et dolorum fuga. - Et harum quidem rerum facilis est et expedita distinctio. - Nam libero tempore, cum soluta nobis est eligendi optio. -

+

Our Impact

+

+ Similique sunt in culpa qui officia deserunt mollitia animi, id est + laborum et dolorum fuga. + Et harum quidem rerum facilis est et expedita distinctio. Nam + libero tempore, cum soluta nobis est eligendi optio. +

-

Our Future

-

- Temporibus autem quibusdam et aut officiis debitis aut rerum - necessitatibus saepe eveniet ut et voluptates repudiandae sint et - molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente - delectus. -

+

Our Future

+

+ Temporibus autem quibusdam et aut officiis debitis aut rerum + necessitatibus saepe eveniet ut et voluptates repudiandae sint et + molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente + delectus. +

-

Our Community

-

- Ut aut reiciendis voluptatibus maiores alias consequatur aut - perferendis doloribus asperiores repellat. Sed ut perspiciatis unde - omnis iste natus error sit voluptatem accusantium doloremque - laudantium. -

+

Our Community

+

+ Ut aut reiciendis voluptatibus maiores alias consequatur aut + perferendis doloribus asperiores repellat. Sed ut perspiciatis unde + omnis iste natus error sit voluptatem accusantium doloremque + laudantium. +

-

Our Commitment

-

- Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse - quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat - quo voluptas nulla pariatur?{' '} - Excepteur sint occaecat cupidatat non proident. -

-
+

Our Commitment

+

+ Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse + quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo + voluptas nulla pariatur?{' '} + Excepteur sint occaecat cupidatat non proident. +

) diff --git a/apps/web/src/app/app/app-index.tsx b/apps/web/src/app/app/app-index.tsx new file mode 100644 index 00000000..13c97daa --- /dev/null +++ b/apps/web/src/app/app/app-index.tsx @@ -0,0 +1,81 @@ +'use client' + +import { useQuery } from '@tanstack/react-query' +import Link from 'next/link' + +import { useAuthenticatedAgentic } from '@/components/agentic-provider' +import { LoadingIndicator } from '@/components/loading-indicator' +import { toastError } from '@/lib/notifications' + +export function AppIndex() { + const ctx = useAuthenticatedAgentic() + const { + data: projects, + isLoading, + isError + } = useQuery({ + queryKey: ['projects'], + queryFn: () => + ctx?.api + .listProjects({ populate: ['lastPublishedDeployment'] }) + .catch((err: any) => { + void toastError(err, { label: 'Failed to fetch projects' }) + throw err + }), + enabled: !!ctx + }) + + return ( + <> +
+

+ Dashboard +

+ + {!ctx || isLoading ? ( + + ) : ( +
+

Your Projects

+ + {isError ? ( +

Error fetching projects

+ ) : !projects?.length ? ( +

+ No projects found. Create your first project to get started! +

+ ) : ( +
+ {projects.map((project) => ( + +

{project.name}

+ +

+ {project.identifier} +

+ + {project.lastPublishedDeployment && ( +

+ Last published:{' '} + {project.lastPublishedDeployment.version || + project.lastPublishedDeployment.hash} +

+ )} + + ))} +
+ )} +
+ )} +
+ + ) +} diff --git a/apps/web/src/app/app/page.tsx b/apps/web/src/app/app/page.tsx index b1825666..ba9d5c9f 100644 --- a/apps/web/src/app/app/page.tsx +++ b/apps/web/src/app/app/page.tsx @@ -1,71 +1,5 @@ -'use client' - -import { useQuery } from '@tanstack/react-query' -import Link from 'next/link' - -import { useAuthenticatedAgentic } from '@/components/agentic-provider' -import { LoadingIndicator } from '@/components/loading-indicator' +import { AppIndex } from './app-index' export default function AppIndexPage() { - const ctx = useAuthenticatedAgentic() - const { data: projects, isLoading } = useQuery({ - queryKey: ['projects'], - queryFn: () => - ctx?.api - .listProjects({ populate: ['lastPublishedDeployment'] }) - .catch(() => []), - enabled: !!ctx - }) - - return ( - <> -
-

- Dashboard -

- - {!ctx || isLoading ? ( - - ) : ( -
-

Your Projects

- - {!projects?.length ? ( -

- No projects found. Create your first project to get started! -

- ) : ( -
- {projects?.map((project) => ( - -

{project.name}

- -

- {project.identifier} -

- - {project.lastPublishedDeployment && ( -

- Last published:{' '} - {project.lastPublishedDeployment.version || - project.lastPublishedDeployment.hash} -

- )} - - ))} -
- )} -
- )} -
- - ) + return } diff --git a/apps/web/src/app/app/projects/[namespace]/[project-name]/project-index.tsx b/apps/web/src/app/app/projects/[namespace]/[project-name]/app-project-index.tsx similarity index 78% rename from apps/web/src/app/app/projects/[namespace]/[project-name]/project-index.tsx rename to apps/web/src/app/app/projects/[namespace]/[project-name]/app-project-index.tsx index 7f262e60..14ee2b53 100644 --- a/apps/web/src/app/app/projects/[namespace]/[project-name]/project-index.tsx +++ b/apps/web/src/app/app/projects/[namespace]/[project-name]/app-project-index.tsx @@ -6,14 +6,18 @@ import { useAuthenticatedAgentic } from '@/components/agentic-provider' import { LoadingIndicator } from '@/components/loading-indicator' import { toastError } from '@/lib/notifications' -export default function ProjectIndex({ +export function AppProjectIndex({ projectIdentifier }: { projectIdentifier: string }) { const ctx = useAuthenticatedAgentic() - const { data: project, isLoading } = useQuery({ - queryKey: [`project:${projectIdentifier}`], + const { + data: project, + isLoading, + isError + } = useQuery({ + queryKey: ['project', projectIdentifier], queryFn: () => ctx?.api .getProjectByIdentifier({ @@ -32,8 +36,12 @@ export default function ProjectIndex({ return (
- {!ctx || !project || isLoading ? ( + {!ctx || isLoading ? ( + ) : isError ? ( +

Error fetching project

+ ) : !project ? ( +

Project "{projectIdentifier}" not found

) : ( <>

+ return } catch (err: any) { void toastError(err, { label: 'Invalid project identifier' }) diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 3f22247b..595765f4 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -4,11 +4,11 @@ export default function IndexPage() { return ( <>
-

+

Agentic MCP Gateway

-
+
An API gateway built exclusively for AI agents.
@@ -16,7 +16,7 @@ export default function IndexPage() {
-

How it works

+

How it works

TODO