mirror of
https://github.com/rowboatlabs/rowboat.git
synced 2026-05-12 08:42:38 +02:00
fix project naming issues on frontend
This commit is contained in:
parent
abbc2f0d2a
commit
9b7894dcd4
6 changed files with 6 additions and 68 deletions
|
|
@ -1,57 +1,12 @@
|
|||
'use client';
|
||||
|
||||
import { Project } from "@/src/entities/models/project";
|
||||
import { useEffect, useState } from "react";
|
||||
import { z } from "zod";
|
||||
import { listProjects } from "../actions/project.actions";
|
||||
import { BuildAssistantSection } from "./components/build-assistant-section";
|
||||
|
||||
|
||||
export default function App() {
|
||||
const [projects, setProjects] = useState<z.infer<typeof Project>[]>([]);
|
||||
const [defaultName, setDefaultName] = useState('Assistant 1');
|
||||
|
||||
|
||||
const getNextAssistantNumber = (projects: z.infer<typeof Project>[]) => {
|
||||
const untitledProjects = projects
|
||||
.map(p => p.name)
|
||||
.filter(name => name.startsWith('Assistant '))
|
||||
.map(name => {
|
||||
const num = parseInt(name.replace('Assistant ', ''));
|
||||
return isNaN(num) ? 0 : num;
|
||||
});
|
||||
|
||||
if (untitledProjects.length === 0) return 1;
|
||||
return Math.max(...untitledProjects) + 1;
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
let ignore = false;
|
||||
|
||||
async function fetchProjects() {
|
||||
const projects = await listProjects();
|
||||
if (!ignore) {
|
||||
const sortedProjects = [...projects].sort((a, b) =>
|
||||
new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()
|
||||
);
|
||||
|
||||
setProjects(sortedProjects);
|
||||
const nextNumber = getNextAssistantNumber(sortedProjects);
|
||||
const newDefaultName = `Assistant ${nextNumber}`;
|
||||
setDefaultName(newDefaultName);
|
||||
}
|
||||
}
|
||||
|
||||
fetchProjects();
|
||||
|
||||
return () => {
|
||||
ignore = true;
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-white dark:bg-gray-900">
|
||||
<BuildAssistantSection defaultName={defaultName} />
|
||||
<BuildAssistantSection />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -19,13 +19,9 @@ import Link from 'next/link';
|
|||
|
||||
|
||||
|
||||
interface BuildAssistantSectionProps {
|
||||
defaultName: string;
|
||||
}
|
||||
|
||||
const ITEMS_PER_PAGE = 6;
|
||||
|
||||
export function BuildAssistantSection({ defaultName }: BuildAssistantSectionProps) {
|
||||
export function BuildAssistantSection() {
|
||||
const [userPrompt, setUserPrompt] = useState('');
|
||||
const [isCreating, setIsCreating] = useState(false);
|
||||
const [promptError, setPromptError] = useState<string | null>(null);
|
||||
|
|
@ -83,8 +79,8 @@ export function BuildAssistantSection({ defaultName }: BuildAssistantSectionProp
|
|||
};
|
||||
|
||||
// Handle template selection
|
||||
const handleTemplateSelect = async (templateId: string, templateName: string) => {
|
||||
await createProjectFromTemplate(templateId, templateName, router);
|
||||
const handleTemplateSelect = async (templateId: string) => {
|
||||
await createProjectFromTemplate(templateId, router);
|
||||
};
|
||||
|
||||
const fetchProjects = async () => {
|
||||
|
|
@ -111,7 +107,6 @@ export function BuildAssistantSection({ defaultName }: BuildAssistantSectionProp
|
|||
setIsCreating(true);
|
||||
try {
|
||||
await createProjectWithOptions({
|
||||
name: defaultName,
|
||||
prompt: userPrompt.trim(),
|
||||
router,
|
||||
onError: (error) => {
|
||||
|
|
@ -153,7 +148,6 @@ export function BuildAssistantSection({ defaultName }: BuildAssistantSectionProp
|
|||
|
||||
// Create project from imported JSON
|
||||
await createProjectFromJsonWithOptions({
|
||||
name: defaultName,
|
||||
workflowJson: text,
|
||||
router,
|
||||
onError: (error) => {
|
||||
|
|
@ -395,7 +389,7 @@ export function BuildAssistantSection({ defaultName }: BuildAssistantSectionProp
|
|||
{templates.map((template) => (
|
||||
<button
|
||||
key={template.id}
|
||||
onClick={() => handleTemplateSelect(template.id, template.name)}
|
||||
onClick={() => handleTemplateSelect(template.id)}
|
||||
className="block p-4 border border-gray-200 dark:border-gray-700 rounded-xl hover:border-blue-300 dark:hover:border-blue-600 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-all group hover:shadow-md text-left"
|
||||
>
|
||||
<div className="space-y-2">
|
||||
|
|
|
|||
|
|
@ -170,7 +170,6 @@ export function CreateProject({ defaultName, onOpenProjectPane, isProjectPaneOpe
|
|||
setAutoCreateLoading(true);
|
||||
try {
|
||||
await createProjectWithOptions({
|
||||
name: 'New Assistant', // Default name for auto-creation
|
||||
template: urlTemplate || undefined,
|
||||
prompt: urlPrompt || undefined,
|
||||
router,
|
||||
|
|
@ -281,7 +280,6 @@ export function CreateProject({ defaultName, onOpenProjectPane, isProjectPaneOpe
|
|||
if (importedJson) {
|
||||
// Use imported JSON
|
||||
await createProjectFromJsonWithOptions({
|
||||
name,
|
||||
workflowJson: importedJson,
|
||||
router,
|
||||
onError: (error) => {
|
||||
|
|
@ -297,7 +295,6 @@ export function CreateProject({ defaultName, onOpenProjectPane, isProjectPaneOpe
|
|||
}
|
||||
|
||||
await createProjectWithOptions({
|
||||
name,
|
||||
template: urlTemplate || undefined,
|
||||
prompt: customPrompt,
|
||||
router,
|
||||
|
|
@ -312,7 +309,6 @@ export function CreateProject({ defaultName, onOpenProjectPane, isProjectPaneOpe
|
|||
|
||||
async function handleSubmitWithTemplate(template: string) {
|
||||
await createProjectWithOptions({
|
||||
name,
|
||||
template,
|
||||
router,
|
||||
onError: (error) => {
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ export function TemplatesSection({}: TemplatesSectionProps) {
|
|||
|
||||
// Handle template selection
|
||||
const handleTemplateSelect = async (templateId: string, templateName: string) => {
|
||||
await createProjectFromTemplate(templateId, templateName, router);
|
||||
await createProjectFromTemplate(templateId, router);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
|
|
|
|||
|
|
@ -75,7 +75,6 @@ export default function Sidebar({ projectId, useAuth, collapsed = false, onToggl
|
|||
setIsCreatingAssistant(true);
|
||||
try {
|
||||
await createProjectWithOptions({
|
||||
name: assistantName || 'New Assistant',
|
||||
prompt: assistantPrompt,
|
||||
router,
|
||||
onSuccess: () => {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
import { createProject, createProjectFromWorkflowJson } from "@/app/actions/project.actions";
|
||||
|
||||
export interface CreateProjectOptions {
|
||||
name: string;
|
||||
template?: string;
|
||||
prompt?: string;
|
||||
router: any; // NextJS router instance
|
||||
|
|
@ -12,7 +11,6 @@ export interface CreateProjectOptions {
|
|||
}
|
||||
|
||||
export interface CreateProjectFromJsonOptions {
|
||||
name: string;
|
||||
workflowJson: string;
|
||||
router: any; // NextJS router instance
|
||||
onSuccess?: (projectId: string) => void;
|
||||
|
|
@ -25,7 +23,6 @@ export interface CreateProjectFromJsonOptions {
|
|||
export async function createProjectWithOptions(options: CreateProjectOptions): Promise<void> {
|
||||
try {
|
||||
const formData = new FormData();
|
||||
formData.append('name', options.name);
|
||||
|
||||
if (options.template) {
|
||||
formData.append('template', options.template);
|
||||
|
|
@ -71,7 +68,6 @@ export async function createProjectWithOptions(options: CreateProjectOptions): P
|
|||
export async function createProjectFromJsonWithOptions(options: CreateProjectFromJsonOptions): Promise<void> {
|
||||
try {
|
||||
const formData = new FormData();
|
||||
formData.append('name', options.name);
|
||||
formData.append('workflowJson', options.workflowJson);
|
||||
|
||||
const response = await createProjectFromWorkflowJson(formData);
|
||||
|
|
@ -108,12 +104,10 @@ export async function createProjectFromJsonWithOptions(options: CreateProjectFro
|
|||
*/
|
||||
export async function createProjectFromTemplate(
|
||||
templateId: string,
|
||||
templateName: string,
|
||||
router: any,
|
||||
onError?: (error: any) => void
|
||||
): Promise<void> {
|
||||
return createProjectWithOptions({
|
||||
name: templateName,
|
||||
template: templateId,
|
||||
router,
|
||||
onError
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue