From bac70bbd23a2a2d6adb963a97eb3e6c879ea769a Mon Sep 17 00:00:00 2001 From: "serafim.eth" Date: Wed, 2 Apr 2025 15:29:51 +0300 Subject: [PATCH 001/143] mark old files --- apps/web/app/{import => import-old}/page.client.tsx | 6 +++--- apps/web/app/{import => import-old}/page.tsx | 0 apps/web/app/{publish => publish-old}/demo/page.tsx | 0 apps/web/app/{publish => publish-old}/page.tsx | 0 apps/web/app/{publish => publish-old}/template/page.tsx | 0 .../{import => import-old}/components/import-form.tsx | 0 .../{import => import-old}/components/import-header.tsx | 0 .../{import => import-old}/components/url-input.tsx | 0 .../features/{publish => publish-old}/components/alerts.tsx | 0 .../{publish => publish-old}/components/code-editor.tsx | 0 .../components/delete-demo-dialog.tsx | 0 .../components/edit-code-file-card.tsx | 0 .../components/first-stap-layout.tsx | 0 .../components/forms/component-details-form.tsx | 0 .../components/forms/component-form.tsx | 0 .../{publish => publish-old}/components/forms/demo-form.tsx | 0 .../components/preview-with-tabs.tsx | 0 .../{publish => publish-old}/components/preview.tsx | 0 .../{publish => publish-old}/components/publish-header.tsx | 0 .../{publish => publish-old}/components/success-dialog.tsx | 0 .../{publish => publish-old}/config/editor-themes.ts | 0 .../features/{publish => publish-old}/config/utils.ts | 0 .../hooks/use-code-inputs-auto-focus.ts | 0 .../features/{publish => publish-old}/hooks/use-hooks.tsx | 0 .../features/{publish => publish-old}/hooks/use-is-admin.ts | 0 .../hooks/use-is-check-slug-available.ts | 0 .../{publish => publish-old}/hooks/use-name-slug-form.ts | 0 .../{publish => publish-old}/hooks/use-publish-as.ts | 0 .../{publish => publish-old}/hooks/use-r2-upload.ts | 0 .../{publish => publish-old}/hooks/use-template-draft.ts | 0 .../hooks/use-template-media-upload.ts | 0 .../hooks/use-template-video-dropzone.ts | 0 .../{publish => publish-old}/hooks/use-video-dropzone.ts | 0 .../features/{publish => publish-old}/publish-layout.tsx | 0 .../template/publish-template-form.tsx | 0 .../features/{publish => publish-old}/template/schema.ts | 0 .../template/template-details-form.tsx | 0 apps/web/lib/queries.ts | 2 +- 38 files changed, 4 insertions(+), 4 deletions(-) rename apps/web/app/{import => import-old}/page.client.tsx (98%) rename apps/web/app/{import => import-old}/page.tsx (100%) rename apps/web/app/{publish => publish-old}/demo/page.tsx (100%) rename apps/web/app/{publish => publish-old}/page.tsx (100%) rename apps/web/app/{publish => publish-old}/template/page.tsx (100%) rename apps/web/components/features/{import => import-old}/components/import-form.tsx (100%) rename apps/web/components/features/{import => import-old}/components/import-header.tsx (100%) rename apps/web/components/features/{import => import-old}/components/url-input.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/alerts.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/code-editor.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/delete-demo-dialog.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/edit-code-file-card.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/first-stap-layout.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/forms/component-details-form.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/forms/component-form.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/forms/demo-form.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/preview-with-tabs.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/preview.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/publish-header.tsx (100%) rename apps/web/components/features/{publish => publish-old}/components/success-dialog.tsx (100%) rename apps/web/components/features/{publish => publish-old}/config/editor-themes.ts (100%) rename apps/web/components/features/{publish => publish-old}/config/utils.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-code-inputs-auto-focus.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-hooks.tsx (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-is-admin.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-is-check-slug-available.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-name-slug-form.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-publish-as.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-r2-upload.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-template-draft.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-template-media-upload.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-template-video-dropzone.ts (100%) rename apps/web/components/features/{publish => publish-old}/hooks/use-video-dropzone.ts (100%) rename apps/web/components/features/{publish => publish-old}/publish-layout.tsx (100%) rename apps/web/components/features/{publish => publish-old}/template/publish-template-form.tsx (100%) rename apps/web/components/features/{publish => publish-old}/template/schema.ts (100%) rename apps/web/components/features/{publish => publish-old}/template/template-details-form.tsx (100%) diff --git a/apps/web/app/import/page.client.tsx b/apps/web/app/import-old/page.client.tsx similarity index 98% rename from apps/web/app/import/page.client.tsx rename to apps/web/app/import-old/page.client.tsx index a8dd70b5..89a7cd8d 100644 --- a/apps/web/app/import/page.client.tsx +++ b/apps/web/app/import-old/page.client.tsx @@ -11,9 +11,9 @@ import { extractAmbigiousRegistryDependencies, extractNPMDependencies, } from "@/lib/parsers" -import { UrlInput } from "@/components/features/import/components/url-input" -import { ImportForm } from "@/components/features/import/components/import-form" -import { ImportHeader } from "@/components/features/import/components/import-header" +import { UrlInput } from "@/components/features/import-old/components/url-input" +import { ImportForm } from "@/components/features/import-old/components/import-form" +import { ImportHeader } from "@/components/features/import-old/components/import-header" import { SuccessDialog } from "@/components/features/publish/components/success-dialog" import { useRouter } from "next/navigation" import { useUser } from "@clerk/nextjs" diff --git a/apps/web/app/import/page.tsx b/apps/web/app/import-old/page.tsx similarity index 100% rename from apps/web/app/import/page.tsx rename to apps/web/app/import-old/page.tsx diff --git a/apps/web/app/publish/demo/page.tsx b/apps/web/app/publish-old/demo/page.tsx similarity index 100% rename from apps/web/app/publish/demo/page.tsx rename to apps/web/app/publish-old/demo/page.tsx diff --git a/apps/web/app/publish/page.tsx b/apps/web/app/publish-old/page.tsx similarity index 100% rename from apps/web/app/publish/page.tsx rename to apps/web/app/publish-old/page.tsx diff --git a/apps/web/app/publish/template/page.tsx b/apps/web/app/publish-old/template/page.tsx similarity index 100% rename from apps/web/app/publish/template/page.tsx rename to apps/web/app/publish-old/template/page.tsx diff --git a/apps/web/components/features/import/components/import-form.tsx b/apps/web/components/features/import-old/components/import-form.tsx similarity index 100% rename from apps/web/components/features/import/components/import-form.tsx rename to apps/web/components/features/import-old/components/import-form.tsx diff --git a/apps/web/components/features/import/components/import-header.tsx b/apps/web/components/features/import-old/components/import-header.tsx similarity index 100% rename from apps/web/components/features/import/components/import-header.tsx rename to apps/web/components/features/import-old/components/import-header.tsx diff --git a/apps/web/components/features/import/components/url-input.tsx b/apps/web/components/features/import-old/components/url-input.tsx similarity index 100% rename from apps/web/components/features/import/components/url-input.tsx rename to apps/web/components/features/import-old/components/url-input.tsx diff --git a/apps/web/components/features/publish/components/alerts.tsx b/apps/web/components/features/publish-old/components/alerts.tsx similarity index 100% rename from apps/web/components/features/publish/components/alerts.tsx rename to apps/web/components/features/publish-old/components/alerts.tsx diff --git a/apps/web/components/features/publish/components/code-editor.tsx b/apps/web/components/features/publish-old/components/code-editor.tsx similarity index 100% rename from apps/web/components/features/publish/components/code-editor.tsx rename to apps/web/components/features/publish-old/components/code-editor.tsx diff --git a/apps/web/components/features/publish/components/delete-demo-dialog.tsx b/apps/web/components/features/publish-old/components/delete-demo-dialog.tsx similarity index 100% rename from apps/web/components/features/publish/components/delete-demo-dialog.tsx rename to apps/web/components/features/publish-old/components/delete-demo-dialog.tsx diff --git a/apps/web/components/features/publish/components/edit-code-file-card.tsx b/apps/web/components/features/publish-old/components/edit-code-file-card.tsx similarity index 100% rename from apps/web/components/features/publish/components/edit-code-file-card.tsx rename to apps/web/components/features/publish-old/components/edit-code-file-card.tsx diff --git a/apps/web/components/features/publish/components/first-stap-layout.tsx b/apps/web/components/features/publish-old/components/first-stap-layout.tsx similarity index 100% rename from apps/web/components/features/publish/components/first-stap-layout.tsx rename to apps/web/components/features/publish-old/components/first-stap-layout.tsx diff --git a/apps/web/components/features/publish/components/forms/component-details-form.tsx b/apps/web/components/features/publish-old/components/forms/component-details-form.tsx similarity index 100% rename from apps/web/components/features/publish/components/forms/component-details-form.tsx rename to apps/web/components/features/publish-old/components/forms/component-details-form.tsx diff --git a/apps/web/components/features/publish/components/forms/component-form.tsx b/apps/web/components/features/publish-old/components/forms/component-form.tsx similarity index 100% rename from apps/web/components/features/publish/components/forms/component-form.tsx rename to apps/web/components/features/publish-old/components/forms/component-form.tsx diff --git a/apps/web/components/features/publish/components/forms/demo-form.tsx b/apps/web/components/features/publish-old/components/forms/demo-form.tsx similarity index 100% rename from apps/web/components/features/publish/components/forms/demo-form.tsx rename to apps/web/components/features/publish-old/components/forms/demo-form.tsx diff --git a/apps/web/components/features/publish/components/preview-with-tabs.tsx b/apps/web/components/features/publish-old/components/preview-with-tabs.tsx similarity index 100% rename from apps/web/components/features/publish/components/preview-with-tabs.tsx rename to apps/web/components/features/publish-old/components/preview-with-tabs.tsx diff --git a/apps/web/components/features/publish/components/preview.tsx b/apps/web/components/features/publish-old/components/preview.tsx similarity index 100% rename from apps/web/components/features/publish/components/preview.tsx rename to apps/web/components/features/publish-old/components/preview.tsx diff --git a/apps/web/components/features/publish/components/publish-header.tsx b/apps/web/components/features/publish-old/components/publish-header.tsx similarity index 100% rename from apps/web/components/features/publish/components/publish-header.tsx rename to apps/web/components/features/publish-old/components/publish-header.tsx diff --git a/apps/web/components/features/publish/components/success-dialog.tsx b/apps/web/components/features/publish-old/components/success-dialog.tsx similarity index 100% rename from apps/web/components/features/publish/components/success-dialog.tsx rename to apps/web/components/features/publish-old/components/success-dialog.tsx diff --git a/apps/web/components/features/publish/config/editor-themes.ts b/apps/web/components/features/publish-old/config/editor-themes.ts similarity index 100% rename from apps/web/components/features/publish/config/editor-themes.ts rename to apps/web/components/features/publish-old/config/editor-themes.ts diff --git a/apps/web/components/features/publish/config/utils.ts b/apps/web/components/features/publish-old/config/utils.ts similarity index 100% rename from apps/web/components/features/publish/config/utils.ts rename to apps/web/components/features/publish-old/config/utils.ts diff --git a/apps/web/components/features/publish/hooks/use-code-inputs-auto-focus.ts b/apps/web/components/features/publish-old/hooks/use-code-inputs-auto-focus.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-code-inputs-auto-focus.ts rename to apps/web/components/features/publish-old/hooks/use-code-inputs-auto-focus.ts diff --git a/apps/web/components/features/publish/hooks/use-hooks.tsx b/apps/web/components/features/publish-old/hooks/use-hooks.tsx similarity index 100% rename from apps/web/components/features/publish/hooks/use-hooks.tsx rename to apps/web/components/features/publish-old/hooks/use-hooks.tsx diff --git a/apps/web/components/features/publish/hooks/use-is-admin.ts b/apps/web/components/features/publish-old/hooks/use-is-admin.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-is-admin.ts rename to apps/web/components/features/publish-old/hooks/use-is-admin.ts diff --git a/apps/web/components/features/publish/hooks/use-is-check-slug-available.ts b/apps/web/components/features/publish-old/hooks/use-is-check-slug-available.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-is-check-slug-available.ts rename to apps/web/components/features/publish-old/hooks/use-is-check-slug-available.ts diff --git a/apps/web/components/features/publish/hooks/use-name-slug-form.ts b/apps/web/components/features/publish-old/hooks/use-name-slug-form.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-name-slug-form.ts rename to apps/web/components/features/publish-old/hooks/use-name-slug-form.ts diff --git a/apps/web/components/features/publish/hooks/use-publish-as.ts b/apps/web/components/features/publish-old/hooks/use-publish-as.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-publish-as.ts rename to apps/web/components/features/publish-old/hooks/use-publish-as.ts diff --git a/apps/web/components/features/publish/hooks/use-r2-upload.ts b/apps/web/components/features/publish-old/hooks/use-r2-upload.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-r2-upload.ts rename to apps/web/components/features/publish-old/hooks/use-r2-upload.ts diff --git a/apps/web/components/features/publish/hooks/use-template-draft.ts b/apps/web/components/features/publish-old/hooks/use-template-draft.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-template-draft.ts rename to apps/web/components/features/publish-old/hooks/use-template-draft.ts diff --git a/apps/web/components/features/publish/hooks/use-template-media-upload.ts b/apps/web/components/features/publish-old/hooks/use-template-media-upload.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-template-media-upload.ts rename to apps/web/components/features/publish-old/hooks/use-template-media-upload.ts diff --git a/apps/web/components/features/publish/hooks/use-template-video-dropzone.ts b/apps/web/components/features/publish-old/hooks/use-template-video-dropzone.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-template-video-dropzone.ts rename to apps/web/components/features/publish-old/hooks/use-template-video-dropzone.ts diff --git a/apps/web/components/features/publish/hooks/use-video-dropzone.ts b/apps/web/components/features/publish-old/hooks/use-video-dropzone.ts similarity index 100% rename from apps/web/components/features/publish/hooks/use-video-dropzone.ts rename to apps/web/components/features/publish-old/hooks/use-video-dropzone.ts diff --git a/apps/web/components/features/publish/publish-layout.tsx b/apps/web/components/features/publish-old/publish-layout.tsx similarity index 100% rename from apps/web/components/features/publish/publish-layout.tsx rename to apps/web/components/features/publish-old/publish-layout.tsx diff --git a/apps/web/components/features/publish/template/publish-template-form.tsx b/apps/web/components/features/publish-old/template/publish-template-form.tsx similarity index 100% rename from apps/web/components/features/publish/template/publish-template-form.tsx rename to apps/web/components/features/publish-old/template/publish-template-form.tsx diff --git a/apps/web/components/features/publish/template/schema.ts b/apps/web/components/features/publish-old/template/schema.ts similarity index 100% rename from apps/web/components/features/publish/template/schema.ts rename to apps/web/components/features/publish-old/template/schema.ts diff --git a/apps/web/components/features/publish/template/template-details-form.tsx b/apps/web/components/features/publish-old/template/template-details-form.tsx similarity index 100% rename from apps/web/components/features/publish/template/template-details-form.tsx rename to apps/web/components/features/publish-old/template/template-details-form.tsx diff --git a/apps/web/lib/queries.ts b/apps/web/lib/queries.ts index da4940cc..916d3cfa 100644 --- a/apps/web/lib/queries.ts +++ b/apps/web/lib/queries.ts @@ -5,7 +5,7 @@ import { useQueryClient, useQuery, } from "@tanstack/react-query" -import { makeSlugFromName } from "@/components/features/publish/hooks/use-is-check-slug-available" +import { makeSlugFromName } from "@/components/features/publish-old/hooks/use-is-check-slug-available" import { SupabaseClient, createClient } from "@supabase/supabase-js" import { useClerkSupabaseClient } from "@/lib/clerk" import { useUser } from "@clerk/nextjs" From 197bdf62d75abd822419ad31d4d65ca9267082db Mon Sep 17 00:00:00 2001 From: "serafim.eth" Date: Wed, 2 Apr 2025 16:26:46 +0300 Subject: [PATCH 002/143] init --- .../[component_slug]/page.client.tsx | 2 +- .../web/app/studio/[username]/page.client.tsx | 205 +++++++ apps/web/app/studio/[username]/page.tsx | 110 ++++ apps/web/app/studio/page.client.tsx | 168 ++++++ apps/web/app/studio/page.tsx | 46 ++ .../features/studio/analytics/analytics.tsx | 346 ++++++++++++ .../features/studio/content/content-table.tsx | 283 ++++++++++ .../studio/layout/component-publish-form.tsx | 139 +++++ .../studio/layout/dashboard-layout.tsx | 57 ++ .../features/studio/layout/header.tsx | 103 ++++ .../features/studio/layout/sidebar.tsx | 165 ++++++ .../studio/monetization/monetization.tsx | 496 ++++++++++++++++ .../features/studio/settings/settings.tsx | 528 ++++++++++++++++++ apps/web/components/icons/index.tsx | 18 +- apps/web/components/ui/header.client.tsx | 40 +- package.json | 3 +- pnpm-lock.yaml | 220 ++++++++ 17 files changed, 2919 insertions(+), 10 deletions(-) create mode 100644 apps/web/app/studio/[username]/page.client.tsx create mode 100644 apps/web/app/studio/[username]/page.tsx create mode 100644 apps/web/app/studio/page.client.tsx create mode 100644 apps/web/app/studio/page.tsx create mode 100644 apps/web/components/features/studio/analytics/analytics.tsx create mode 100644 apps/web/components/features/studio/content/content-table.tsx create mode 100644 apps/web/components/features/studio/layout/component-publish-form.tsx create mode 100644 apps/web/components/features/studio/layout/dashboard-layout.tsx create mode 100644 apps/web/components/features/studio/layout/header.tsx create mode 100644 apps/web/components/features/studio/layout/sidebar.tsx create mode 100644 apps/web/components/features/studio/monetization/monetization.tsx create mode 100644 apps/web/components/features/studio/settings/settings.tsx diff --git a/apps/web/app/[username]/[component_slug]/page.client.tsx b/apps/web/app/[username]/[component_slug]/page.client.tsx index 7f0228af..1584f7ef 100644 --- a/apps/web/app/[username]/[component_slug]/page.client.tsx +++ b/apps/web/app/[username]/[component_slug]/page.client.tsx @@ -54,7 +54,7 @@ import { BookmarkButton } from "@/components/ui/bookmark-button" import { ThemeToggle } from "../../../components/ui/theme-toggle" import { ComponentPagePreview } from "../../../components/features/component-page/component-preview" import { EditComponentDialog } from "../../../components/ui/edit-component-dialog" -import { usePublishAs } from "../../../components/features/publish/hooks/use-publish-as" +import { usePublishAs } from "../../../components/features/publish-old/hooks/use-publish-as" import { Icons } from "@/components/icons" import { CopyPromptDialog } from "@/components/ui/copy-prompt-dialog" diff --git a/apps/web/app/studio/[username]/page.client.tsx b/apps/web/app/studio/[username]/page.client.tsx new file mode 100644 index 00000000..687ff006 --- /dev/null +++ b/apps/web/app/studio/[username]/page.client.tsx @@ -0,0 +1,205 @@ +"use client" + +import { useState } from "react" +import { Header } from "@/components/ui/header.client" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { Button } from "@/components/ui/button" +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog" +import { PlusCircle, ArrowLeft } from "lucide-react" +import { formatDistanceToNow } from "date-fns" +import { Textarea } from "@/components/ui/textarea" +import { useClerkSupabaseClient } from "@/lib/clerk" +import { toast } from "sonner" +import { useRouter } from "next/navigation" +import { Tables } from "@/types/supabase" +import { UserAvatar } from "@/components/ui/user-avatar" +import Link from "next/link" +import { User } from "@/types/global" + +type Component = Tables<"components"> + +interface StudioUsernameClientProps { + user: User + components: Component[] + isAdmin: boolean + isOwnProfile: boolean +} + +export function StudioUsernameClient({ + user, + components, + isAdmin, + isOwnProfile, +}: StudioUsernameClientProps) { + const [isPublishOpen, setIsPublishOpen] = useState(false) + const [componentCode, setComponentCode] = useState("") + const [isPublishing, setIsPublishing] = useState(false) + const supabase = useClerkSupabaseClient() + const router = useRouter() + + const handlePublish = async () => { + if (!componentCode.trim()) { + toast.error("Please enter component code") + return + } + + setIsPublishing(true) + try { + // Here you would add the logic to parse and validate the component code + // Then save it to the database + const { error } = await supabase.from("components").insert({ + code: componentCode, + name: "New Component", // Required field + component_names: {}, // Required field + component_slug: "new-component", // Required field + preview_url: "https://placeholder.com", // Required field + user_id: user.id, // Use the target user ID + direct_registry_dependencies: {}, // Required field + demo_direct_registry_dependencies: {}, // Required field + }) + + if (error) throw error + + toast.success("Component published successfully") + setIsPublishOpen(false) + router.refresh() + } catch (error) { + toast.error("Failed to publish component") + console.error("Error publishing component:", error) + } finally { + setIsPublishing(false) + } + } + + return ( + <> +
+
+
+ + + +
+ +
+

+ {user.display_name || user.name || user.username}'s Studio +

+

+ @{user.display_username || user.username} +

+
+
+ + {(isOwnProfile || isAdmin) && ( + + + + + + + Publish New Component + + Paste your component code below. Make sure it follows our + guidelines and includes all necessary imports. + + +
+