From 07ae990c95acb01fc1f87dd3cf72515359594ff7 Mon Sep 17 00:00:00 2001 From: shiva raj badu Date: Mon, 16 Feb 2026 23:20:11 +0545 Subject: [PATCH] feat: Add dashboard layout, components, and templates page with loading states --- .../(dashboard)/Components/DashboardNav.tsx | 0 .../Components/DashboardSidebar.tsx | 13 - .../dashboard/components/DashboardPage.tsx | 2 +- .../dashboard/components/EmptyState.tsx | 0 .../dashboard/components/Header.tsx | 0 .../dashboard/components/PresentationCard.tsx | 0 .../dashboard/components/PresentationGrid.tsx | 0 .../components/PresentationListItem.tsx | 0 .../(dashboard)/dashboard/loading.tsx | 0 .../(dashboard)/dashboard/page.tsx | 0 .../(dashboard)/dashboard/types.ts | 0 .../(dashboard)/layout.tsx | 0 .../settings/SettingPage.tsx | 35 +- .../{ => (dashboard)}/settings/loading.tsx | 0 .../{ => (dashboard)}/settings/page.tsx | 0 .../components/CreateCustomTemplate.tsx | 4 +- .../templates/components/TemplatePanel.tsx | 79 ++- .../(dashboard)/templates/loading.tsx | 0 .../(dashboard)/templates/page.tsx | 0 .../components/APIKeyWarning.tsx | 2 +- .../components/LoadingSpinner.tsx | 2 +- .../custom-template/page.tsx | 2 +- .../components/DocumentPreviewPage.tsx | 2 +- .../(presentation-generator)/outline/page.tsx | 2 +- .../template-preview/[slug]/page.tsx | 2 +- .../template-preview/page.tsx | 2 +- .../upload/loading.tsx | 2 +- .../(presentation-generator)/upload/page.tsx | 2 +- .../components/ImageSelectionConfig.tsx | 357 ++++++++++++ servers/nextjs/components/LLMSelection.tsx | 545 +++++------------- servers/nextjs/components/OpenAIConfig.tsx | 311 +++++----- 31 files changed, 741 insertions(+), 623 deletions(-) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/Components/DashboardNav.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/Components/DashboardSidebar.tsx (95%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/components/DashboardPage.tsx (92%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/components/EmptyState.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/components/Header.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/components/PresentationCard.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/components/PresentationGrid.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/components/PresentationListItem.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/loading.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/page.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/dashboard/types.ts (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/layout.tsx (100%) rename servers/nextjs/app/(presentation-generator)/{ => (dashboard)}/settings/SettingPage.tsx (91%) rename servers/nextjs/app/(presentation-generator)/{ => (dashboard)}/settings/loading.tsx (100%) rename servers/nextjs/app/(presentation-generator)/{ => (dashboard)}/settings/page.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/templates/components/CreateCustomTemplate.tsx (94%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/templates/components/TemplatePanel.tsx (80%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/templates/loading.tsx (100%) rename servers/nextjs/app/{ => (presentation-generator)}/(dashboard)/templates/page.tsx (100%) create mode 100644 servers/nextjs/components/ImageSelectionConfig.tsx diff --git a/servers/nextjs/app/(dashboard)/Components/DashboardNav.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/Components/DashboardNav.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/Components/DashboardNav.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/Components/DashboardNav.tsx diff --git a/servers/nextjs/app/(dashboard)/Components/DashboardSidebar.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/Components/DashboardSidebar.tsx similarity index 95% rename from servers/nextjs/app/(dashboard)/Components/DashboardSidebar.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/Components/DashboardSidebar.tsx index cacbda1f..1629603e 100644 --- a/servers/nextjs/app/(dashboard)/Components/DashboardSidebar.tsx +++ b/servers/nextjs/app/(presentation-generator)/(dashboard)/Components/DashboardSidebar.tsx @@ -26,19 +26,6 @@ const DashboardSidebar = () => { const pathname = usePathname(); const activeTab = pathname.split("?")[0].split("/").pop(); const router = useRouter(); - const [mounted, setMounted] = React.useState(false); - const [profileMenuOpen, setProfileMenuOpen] = React.useState(false); - - - React.useEffect(() => { - setMounted(true); - }, []); - - - const handleMenuNavigate = (href: string) => { - setProfileMenuOpen(false); - router.push(href); - }; diff --git a/servers/nextjs/app/(dashboard)/dashboard/components/DashboardPage.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/DashboardPage.tsx similarity index 92% rename from servers/nextjs/app/(dashboard)/dashboard/components/DashboardPage.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/DashboardPage.tsx index be70803b..210fe07f 100644 --- a/servers/nextjs/app/(dashboard)/dashboard/components/DashboardPage.tsx +++ b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/DashboardPage.tsx @@ -3,7 +3,7 @@ import React, { useState, useEffect } from "react"; import { DashboardApi } from "@/app/(presentation-generator)/services/api/dashboard"; -import { PresentationGrid } from "@/app/(dashboard)/dashboard/components/PresentationGrid"; +import { PresentationGrid } from "@/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationGrid"; diff --git a/servers/nextjs/app/(dashboard)/dashboard/components/EmptyState.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/EmptyState.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/components/EmptyState.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/EmptyState.tsx diff --git a/servers/nextjs/app/(dashboard)/dashboard/components/Header.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/Header.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/components/Header.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/Header.tsx diff --git a/servers/nextjs/app/(dashboard)/dashboard/components/PresentationCard.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationCard.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/components/PresentationCard.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationCard.tsx diff --git a/servers/nextjs/app/(dashboard)/dashboard/components/PresentationGrid.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationGrid.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/components/PresentationGrid.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationGrid.tsx diff --git a/servers/nextjs/app/(dashboard)/dashboard/components/PresentationListItem.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationListItem.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/components/PresentationListItem.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/components/PresentationListItem.tsx diff --git a/servers/nextjs/app/(dashboard)/dashboard/loading.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/loading.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/loading.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/loading.tsx diff --git a/servers/nextjs/app/(dashboard)/dashboard/page.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/page.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/page.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/page.tsx diff --git a/servers/nextjs/app/(dashboard)/dashboard/types.ts b/servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/types.ts similarity index 100% rename from servers/nextjs/app/(dashboard)/dashboard/types.ts rename to servers/nextjs/app/(presentation-generator)/(dashboard)/dashboard/types.ts diff --git a/servers/nextjs/app/(dashboard)/layout.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/layout.tsx similarity index 100% rename from servers/nextjs/app/(dashboard)/layout.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/layout.tsx diff --git a/servers/nextjs/app/(presentation-generator)/settings/SettingPage.tsx b/servers/nextjs/app/(presentation-generator)/(dashboard)/settings/SettingPage.tsx similarity index 91% rename from servers/nextjs/app/(presentation-generator)/settings/SettingPage.tsx rename to servers/nextjs/app/(presentation-generator)/(dashboard)/settings/SettingPage.tsx index 5a9f04b6..33e2a808 100644 --- a/servers/nextjs/app/(presentation-generator)/settings/SettingPage.tsx +++ b/servers/nextjs/app/(presentation-generator)/(dashboard)/settings/SettingPage.tsx @@ -11,7 +11,7 @@ import { } from "@/utils/providerUtils"; import { useRouter, usePathname } from "next/navigation"; import LLMProviderSelection from "@/components/LLMSelection"; -import Header from "../../(dashboard)/dashboard/components/Header"; +import Header from "../dashboard/components/Header"; import { LLMConfig } from "@/types/llm_config"; import { trackEvent, MixpanelEvent } from "@/utils/mixpanel"; @@ -153,29 +153,32 @@ const SettingsPage = () => { } return ( -
-
-
- {/* LLM Selection Component */} -
- -
+
+ +
+ + +
{/* Fixed Bottom Button */}
-
+
+ ))} */} +
+
+ ); + } + + if (llmConfig.IMAGE_PROVIDER === "gpt-image-1.5") { + return ( +
+ +
+ + {/* {GPT_IMAGE_1_5_QUALITY_OPTIONS.map((option) => ( + + ))} */} +
+
+ ); + } + + return null; +}; + +const ImageSelectionConfig = ({ isImageGenerationDisabled, openImageProviderSelect, setOpenImageProviderSelect, llmConfig, input_field_changed, getApiKeyValue, handleApiKeyInputChange }: { isImageGenerationDisabled: boolean, openImageProviderSelect: boolean, setOpenImageProviderSelect: (open: boolean) => void, llmConfig: LLMConfig, input_field_changed: (value: string, field: string) => void, getApiKeyValue: (field: string) => string, handleApiKeyInputChange: (field: string, value: string) => void }) => { + return ( +
+
+
+

Image Generation Settings

+

+ Choosing where images come from. +

+
+
+ + + {!isImageGenerationDisabled && ( + <> + {/* Image Provider Selection */} +
+ +
+ + + + + + + + + No provider found. + + {Object.values(IMAGE_PROVIDERS).map( + (provider, index) => ( + { + input_field_changed(value, "image_provider"); + setOpenImageProviderSelect(false); + }} + > + +
+
+
+ + {provider.label} + +
+ + {provider.description} + +
+
+
+ ) + )} +
+
+
+
+
+
+
+ + {renderQualitySelector(llmConfig, input_field_changed)} + + {/* Dynamic API Key Input for Image Provider */} + {llmConfig.IMAGE_PROVIDER && + IMAGE_PROVIDERS[llmConfig.IMAGE_PROVIDER] && + (() => { + const provider = IMAGE_PROVIDERS[llmConfig.IMAGE_PROVIDER]; + + // Show info message when using same API key as main provider + if ( + provider.value === "dall-e-3" && + llmConfig.LLM === "openai" + ) { + return <>; + } + + if ( + provider.value === "gpt-image-1.5" && + llmConfig.LLM === "openai" + ) { + return <>; + } + + if ( + provider.value === "gemini_flash" && + llmConfig.LLM === "google" + ) { + return <>; + } + + if ( + provider.value === "nanobanana_pro" && + llmConfig.LLM === "google" + ) { + return <>; + } + + // Show ComfyUI configuration + if (provider.value === "comfyui") { + return ( +
+
+ +
+ { + input_field_changed( + e.target.value, + "comfyui_url" + ); + }} + /> +
+

+ + Use your machine IP address (not localhost) when + running in Docker +

+
+
+ +
+