From 75e229b35e751368bbb648c1a7a7bd7f180a68db Mon Sep 17 00:00:00 2001
From: Gram Liu <gram.liu226@gmail.com>
Date: Mon, 4 Dec 2023 22:05:55 -0800
Subject: [PATCH] Load project framework and options on canvas

---
 .../projects/[projectId]/canvas/layout.tsx    |  7 ++-
 .../app/projects/[projectId]/canvas/page.tsx  | 45 ++++++-------------
 packages/database/prisma/schema.prisma        | 11 +++--
 3 files changed, 25 insertions(+), 38 deletions(-)

diff --git a/apps/web/app/projects/[projectId]/canvas/layout.tsx b/apps/web/app/projects/[projectId]/canvas/layout.tsx
index 3dfb6b8..665b8e7 100644
--- a/apps/web/app/projects/[projectId]/canvas/layout.tsx
+++ b/apps/web/app/projects/[projectId]/canvas/layout.tsx
@@ -1,6 +1,7 @@
 import { auth } from "@clerk/nextjs";
 import { prisma } from "database";
 import { TitledHeader } from "~/components/header";
+import CanvasPage from "./page";
 
 interface Props {
   params: {
@@ -10,7 +11,6 @@ interface Props {
 }
 
 export default async function CanvasLayout({
-  children,
   params: { projectId },
 }: Props) {
   const { userId } = auth();
@@ -20,6 +20,9 @@ export default async function CanvasLayout({
       where: {
         id: projectId,
       },
+      include: {
+        repository: true,
+      },
     }),
     prisma.project.findMany({
       where: {
@@ -43,7 +46,7 @@ export default async function CanvasLayout({
         optionsPlaceholder="No projects found"
         selectedOption={currentProject.id}
       />
-      {children}
+      <CanvasPage project={currentProject} />
     </main>
   );
 }
diff --git a/apps/web/app/projects/[projectId]/canvas/page.tsx b/apps/web/app/projects/[projectId]/canvas/page.tsx
index f9e0056..0d30822 100644
--- a/apps/web/app/projects/[projectId]/canvas/page.tsx
+++ b/apps/web/app/projects/[projectId]/canvas/page.tsx
@@ -9,39 +9,17 @@ import {
   TabsList,
   TabsTrigger,
   Toaster,
-  useToast
+  useToast,
 } from "@ui/components";
 import Canvas from "@ui/components/canvas";
 import IconLabel from "@ui/components/icon-label";
 import clsx from "clsx";
-import {
-  GitBranchIcon,
-  GithubIcon,
-  Loader2
-} from "lucide-react";
+import { Project, Repository } from "database";
+import { GitBranchIcon, GithubIcon, Loader2 } from "lucide-react";
 import { useEffect, useReducer, useState } from "react";
 import { CopyBlock, nord } from "react-code-blocks";
 import { convertEditorToCode } from "~/lib/editorToCode";
 
-const projects = [
-  {
-    label: "My Journal",
-    value: "my_journal",
-  },
-  {
-    label: "Portfolio Website",
-    value: "portfolio_website",
-  },
-  {
-    label: "Sandbox",
-    value: "sandbox",
-  },
-];
-const repo = "gramliu/custom-journal";
-const branch = "main";
-const framework = "Next.js";
-const options = ["App Router"];
-
 interface ReducerState {
   [key: string]: string;
 }
@@ -63,12 +41,12 @@ function reducer(state: ReducerState, action: ReducerAction): ReducerState {
 }
 
 interface Props {
-  params: {
-    projectId: string;
+  project: Project & {
+    repository: Repository;
   };
 }
 
-export default function CanvasPage({ params: { projectId } }: Props) {
+export default function CanvasPage({ project }: Props) {
   const [editor, setEditor] = useState<Editor>();
   const [standaloneCode, setStandaloneCode] = useState<string>();
   const [loading, setLoading] = useState<boolean>(false);
@@ -109,10 +87,13 @@ export default function CanvasPage({ params: { projectId } }: Props) {
             "flex flex-col justify-self-center items-start gap-2"
           )}
         >
-          <IconLabel icon={<GithubIcon />} label={repo} />
+          <IconLabel
+            icon={<GithubIcon />}
+            label={project.repository.fullName}
+          />
           <div className="flex flex-row gap-2">
-            <Badge variant="secondary">{framework}</Badge>
-            {options.map((option) => (
+            <Badge variant="secondary">{project.framework}</Badge>
+            {project.frameworkOptions.map((option) => (
               <Badge variant="outline" key={`option_${option}`}>
                 {option}
               </Badge>
@@ -125,7 +106,7 @@ export default function CanvasPage({ params: { projectId } }: Props) {
             "flex flex-col justify-self-center items-start gap-2"
           )}
         >
-          <IconLabel icon={<GitBranchIcon />} label={branch} />
+          <IconLabel icon={<GitBranchIcon />} label={project.branch} />
         </div>
       </section>
       {/* Panels */}
diff --git a/packages/database/prisma/schema.prisma b/packages/database/prisma/schema.prisma
index 2d391b5..00218c8 100644
--- a/packages/database/prisma/schema.prisma
+++ b/packages/database/prisma/schema.prisma
@@ -1,5 +1,5 @@
 generator client {
-  provider      = "prisma-client-js"
+  provider = "prisma-client-js"
 }
 
 datasource db {
@@ -44,13 +44,16 @@ model Page {
 model Project {
   id String @id @map("_id")
 
-  userId       String
-  name         String
-  
+  userId String
+  name   String
+
   repositoryId String     @unique
   repository   Repository @relation(fields: [repositoryId], references: [id])
   branch       String
 
+  framework        String
+  frameworkOptions String[]
+
   createdAt DateTime @default(now())
   updatedAt DateTime @updatedAt
 }