From 9a2c89547b7948dcb758904bbe52b31c3c849e99 Mon Sep 17 00:00:00 2001 From: wass08 Date: Wed, 18 Feb 2026 10:26:57 +0900 Subject: [PATCH] feedback feature --- apps/editor/components/editor/index.tsx | 6 +- apps/editor/components/feedback-dialog.tsx | 105 ++++++++++++++++++ .../community/components/community-hub.tsx | 43 +++---- .../components/new-project-dialog.tsx | 70 +----------- .../community/lib/feedback/actions.ts | 32 ++++++ packages/db/src/schema/feedback/feedback.ts | 15 +++ packages/db/src/schema/index.ts | 3 + .../20240218000001_create_feedback_table.sql | 24 ++++ 8 files changed, 209 insertions(+), 89 deletions(-) create mode 100644 apps/editor/components/feedback-dialog.tsx create mode 100644 apps/editor/features/community/lib/feedback/actions.ts create mode 100644 packages/db/src/schema/feedback/feedback.ts create mode 100644 packages/db/supabase/migrations/20240218000001_create_feedback_table.sql diff --git a/apps/editor/components/editor/index.tsx b/apps/editor/components/editor/index.tsx index 2416d0e1..61759c9e 100644 --- a/apps/editor/components/editor/index.tsx +++ b/apps/editor/components/editor/index.tsx @@ -10,6 +10,7 @@ import { useAuth } from '@/features/community/lib/auth/hooks' import { ZoneSystem } from '../systems/zone/zone-system' import { ToolManager } from '../tools/tool-manager' import { ActionMenu } from '../ui/action-menu' +import { FeedbackDialog } from '../feedback-dialog' import { PascalRadio } from '../pascal-radio' import { PanelManager } from '../ui/panels/panel-manager' import { HelperManager } from '../ui/helpers/helper-manager' @@ -56,10 +57,13 @@ export default function Editor({ projectId }: EditorProps) { {/* Top-right controls */} -
+
+
+ +
diff --git a/apps/editor/components/feedback-dialog.tsx b/apps/editor/components/feedback-dialog.tsx new file mode 100644 index 00000000..4b659bb4 --- /dev/null +++ b/apps/editor/components/feedback-dialog.tsx @@ -0,0 +1,105 @@ +'use client' + +import { MessageSquare } from 'lucide-react' +import { useState } from 'react' +import { submitFeedback } from '@/features/community/lib/feedback/actions' +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@/components/ui/primitives/dialog' +import { Button } from '@/components/ui/primitives/button' + +export function FeedbackDialog() { + const [open, setOpen] = useState(false) + const [message, setMessage] = useState('') + const [isSubmitting, setIsSubmitting] = useState(false) + const [error, setError] = useState(null) + const [sent, setSent] = useState(false) + + const handleOpen = () => { + setOpen(true) + setSent(false) + setError(null) + setMessage('') + } + + const handleClose = () => { + if (isSubmitting) return + setOpen(false) + } + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + setError(null) + setIsSubmitting(true) + const result = await submitFeedback(message) + setIsSubmitting(false) + if (result.success) { + setSent(true) + setTimeout(() => setOpen(false), 1500) + } else { + setError(result.error) + } + } + + return ( + <> + + + + + + Send Feedback + We'd love to hear your thoughts + + + {sent ? ( +

+ Thanks for your feedback! +

+ ) : ( +
+
+ +