From fc8cfabacb6b7cfbe2537de06a6ee40145186ffe Mon Sep 17 00:00:00 2001 From: -Puter <22245429+puterhimself@users.noreply.github.com> Date: Fri, 31 Jul 2026 18:53:04 +0530 Subject: [PATCH] refactor projects page --- .../components/projects/context-editor.tsx | 69 +++ .../components/projects/empty-projects.tsx | 15 + .../projects/github-connect-button.tsx | 36 ++ .../src/components/projects/loading-state.tsx | 7 + .../src/components/projects/project-card.tsx | 31 ++ .../src/components/projects/projects-page.tsx | 465 ------------------ .../components/projects/provider-section.tsx | 37 ++ .../projects/puter-connect-form.tsx | 80 +++ .../projects/repository-section.tsx | 15 + .../projects/repository-selector.tsx | 91 ++++ apps/web/src/routes/app/projects/page.tsx | 120 ++++- package.json | 18 +- 12 files changed, 508 insertions(+), 476 deletions(-) create mode 100644 apps/web/src/components/projects/context-editor.tsx create mode 100644 apps/web/src/components/projects/empty-projects.tsx create mode 100644 apps/web/src/components/projects/github-connect-button.tsx create mode 100644 apps/web/src/components/projects/loading-state.tsx create mode 100644 apps/web/src/components/projects/project-card.tsx delete mode 100644 apps/web/src/components/projects/projects-page.tsx create mode 100644 apps/web/src/components/projects/provider-section.tsx create mode 100644 apps/web/src/components/projects/puter-connect-form.tsx create mode 100644 apps/web/src/components/projects/repository-section.tsx create mode 100644 apps/web/src/components/projects/repository-selector.tsx diff --git a/apps/web/src/components/projects/context-editor.tsx b/apps/web/src/components/projects/context-editor.tsx new file mode 100644 index 0000000..839e9c0 --- /dev/null +++ b/apps/web/src/components/projects/context-editor.tsx @@ -0,0 +1,69 @@ +import { api } from "@code/backend/convex/_generated/api"; +import type { Id } from "@code/backend/convex/_generated/dataModel"; +import { Button } from "@code/ui/components/button"; +import { useMutation, useQuery } from "convex/react"; +import { LoaderCircle } from "lucide-react"; +import { useState } from "react"; + +export const ContextEditor = ({ + projectId, +}: { + readonly projectId: Id<"projects">; +}) => { + const instructions = useQuery(api.projects.getInstructions, { + projectId, + }); + const updateInstructions = useMutation(api.projects.updateInstructions); + const [draft, setDraft] = useState(); + const [saving, setSaving] = useState(false); + + const currentDraft = draft ?? instructions ?? ""; + const dirty = draft !== undefined && draft !== (instructions ?? ""); + + const save = async () => { + if (!dirty || saving) { + return; + } + setSaving(true); + try { + await updateInstructions({ + instructions: draft ?? "", + projectId, + }); + setDraft(undefined); + } finally { + setSaving(false); + } + }; + + return ( +
+ +