From 33db34c3d03336a66e24ad8631e2415fc0b07ca3 Mon Sep 17 00:00:00 2001 From: Izan Gil <66965250+SrIzan10@users.noreply.github.com> Date: Sat, 21 Dec 2024 00:45:36 +0100 Subject: [PATCH] feat: github issue creation --- package.json | 1 + src/app/(protected)/project/[id]/page.tsx | 5 +- .../GithubIssueCreate/GithubIssueCreate.tsx | 72 +++++++++++++++++++ .../app/UniversalForm/UniversalForm.tsx | 27 ++++--- src/components/app/UniversalForm/types.ts | 3 +- src/components/app/UniversalForm/zod.ts | 7 ++ src/components/ui/checkbox.tsx | 30 ++++++++ src/components/ui/textarea.tsx | 22 ++++++ src/lib/forms/actions.ts | 56 ++++++++++++++- yarn.lock | 19 +++++ 10 files changed, 229 insertions(+), 13 deletions(-) create mode 100644 src/components/app/GithubIssueCreate/GithubIssueCreate.tsx create mode 100644 src/components/ui/checkbox.tsx create mode 100644 src/components/ui/textarea.tsx diff --git a/package.json b/package.json index f7025c2..e2fd004 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@octokit/core": "^6.1.2", "@prisma/client": "^6.0.1", "@radix-ui/react-avatar": "^1.0.4", + "@radix-ui/react-checkbox": "^1.1.3", "@radix-ui/react-dialog": "^1.1.4", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-label": "^2.1.1", diff --git a/src/app/(protected)/project/[id]/page.tsx b/src/app/(protected)/project/[id]/page.tsx index 6c10a9e..7d0247d 100644 --- a/src/app/(protected)/project/[id]/page.tsx +++ b/src/app/(protected)/project/[id]/page.tsx @@ -21,6 +21,7 @@ import { } from '@/components/ui/breadcrumb'; import { Eye, Github } from 'lucide-react'; import FeedbackView from '@/components/app/FeedbackView/FeedbackView'; +import GithubIssueCreate from '@/components/app/GithubIssueCreate/GithubIssueCreate'; // TODO: refactor to maybe append the no feedback message to the table div export default async function Page({ params }: { params: Promise<{ id: string }> }) { @@ -100,9 +101,7 @@ export default async function Page({ params }: { params: Promise<{ id: string }> {project.github && ( - + )} diff --git a/src/components/app/GithubIssueCreate/GithubIssueCreate.tsx b/src/components/app/GithubIssueCreate/GithubIssueCreate.tsx new file mode 100644 index 0000000..ed0b485 --- /dev/null +++ b/src/components/app/GithubIssueCreate/GithubIssueCreate.tsx @@ -0,0 +1,72 @@ +'use client'; + +import { Button } from '@/components/ui/button'; +import { Checkbox } from '@/components/ui/checkbox'; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog'; +import type { Feedback, Project } from '@prisma/client'; +import { Github } from 'lucide-react'; +import { UniversalForm } from '../UniversalForm/UniversalForm'; +import { githubCreateIssue } from '@/lib/forms/actions'; +import React from 'react'; + +export default function GithubIssueCreate(props: Props) { + const [open, setOpen] = React.useState(false); + return ( + + + + + + + Create Github issue + + setOpen(false)} + /> + + + ); +} + +interface Props { + project: Project; + feedback: Feedback; +} diff --git a/src/components/app/UniversalForm/UniversalForm.tsx b/src/components/app/UniversalForm/UniversalForm.tsx index 08e24b6..9329b81 100644 --- a/src/components/app/UniversalForm/UniversalForm.tsx +++ b/src/components/app/UniversalForm/UniversalForm.tsx @@ -17,6 +17,7 @@ import { z } from 'zod'; import type { UniversalFormProps } from './types'; import { customDataSchema, + githubIssueCreateSchema, githubSettingsSchema, githubTestIssueSchema, projectSettingsSchema, @@ -27,6 +28,7 @@ import { useActionState } from 'react'; import React from 'react'; import { toast } from 'sonner'; import { createSchema } from '@/lib/forms/zod'; +import { Textarea } from '@/components/ui/textarea'; export const schemaDb = [ { name: 'projectSettings', zod: projectSettingsSchema }, @@ -35,6 +37,7 @@ export const schemaDb = [ { name: 'create', zod: createSchema }, { name: 'githubSettings', zod: githubSettingsSchema }, { name: 'githubTestIssue', zod: githubTestIssueSchema }, + { name: 'githubIssueCreate', zod: githubIssueCreateSchema }, ] as const; export function UniversalForm({ @@ -58,7 +61,7 @@ export function UniversalForm({ const initialValues = React.useMemo(() => { const values: Record = {}; fields.forEach((field) => { - values[field.name] = field.value ?? ''; // Use empty string as fallback + values[field.name] = field.value ?? ''; // Use empty string as fallback }); return { ...values, ...defaultValues }; }, [fields, defaultValues]); @@ -89,12 +92,20 @@ export function UniversalForm({ {field.type !== 'hidden' && {field.label}} - + {field.textArea ? ( +