diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ad8102d8..8f6e1f60 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -343,6 +343,22 @@ async fn create_workspace( emit_and_return(&window, "created_model", created_workspace) } +#[tauri::command] +async fn create_environment( + workspace_id: &str, + name: &str, + window: Window, + db_instance: State<'_, Mutex>>, +) -> Result { + let pool = &*db_instance.lock().await; + let data: HashMap = HashMap::new(); + let created_environment = models::create_environment(workspace_id, name, data, pool) + .await + .expect("Failed to create environment"); + + emit_and_return(&window, "created_model", created_environment) +} + #[tauri::command] async fn create_request( workspace_id: &str, @@ -639,6 +655,7 @@ fn main() { }) }) .invoke_handler(tauri::generate_handler![ + create_environment, create_request, create_workspace, delete_all_responses, diff --git a/src-web/components/App.tsx b/src-web/components/App.tsx index fc6f84f1..8160ce47 100644 --- a/src-web/components/App.tsx +++ b/src-web/components/App.tsx @@ -5,7 +5,6 @@ import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import { HelmetProvider } from 'react-helmet-async'; import { AppRouter } from './AppRouter'; -import { DialogProvider } from './DialogContext'; const queryClient = new QueryClient({ logger: undefined, @@ -24,12 +23,10 @@ export function App() { - {/**/} - diff --git a/src-web/components/AppRouter.tsx b/src-web/components/AppRouter.tsx index eda8655a..e2d1c2f0 100644 --- a/src-web/components/AppRouter.tsx +++ b/src-web/components/AppRouter.tsx @@ -6,6 +6,7 @@ import { GlobalHooks } from './GlobalHooks'; import RouteError from './RouteError'; import Workspace from './Workspace'; import Workspaces from './Workspaces'; +import { DialogProvider } from './DialogContext'; const router = createBrowserRouter([ { @@ -59,9 +60,9 @@ function WorkspaceOrRedirect() { function Layout() { return ( - <> + - + ); } diff --git a/src-web/components/DialogContext.tsx b/src-web/components/DialogContext.tsx index 5b0f1021..cc89d00d 100644 --- a/src-web/components/DialogContext.tsx +++ b/src-web/components/DialogContext.tsx @@ -1,6 +1,8 @@ import React, { createContext, useContext, useMemo, useState } from 'react'; import type { DialogProps } from './core/Dialog'; import { Dialog } from './core/Dialog'; +import { useActiveWorkspace } from '../hooks/useActiveWorkspace'; +import { useActiveWorkspaceId } from '../hooks/useActiveWorkspaceId'; type DialogEntry = { id: string; @@ -54,9 +56,11 @@ export const DialogProvider = ({ children }: { children: React.ReactNode }) => { function DialogInstance({ id, render, ...props }: DialogEntry) { const { actions } = useContext(DialogContext); + const children = render({ hide: () => actions.hide(id) }); + console.log("ACITEV WORKSPAXCE ID 2", useActiveWorkspaceId()); return ( actions.hide(id)} {...props}> - {render({ hide: () => actions.hide(id) })} + {children} ); } diff --git a/src-web/components/EnvironmentEditDialog.tsx b/src-web/components/EnvironmentEditDialog.tsx new file mode 100644 index 00000000..50261475 --- /dev/null +++ b/src-web/components/EnvironmentEditDialog.tsx @@ -0,0 +1,69 @@ +import { useState } from 'react'; +import { useCreateEnvironment } from '../hooks/useCreateEnvironment'; +import { useEnvironments } from '../hooks/useEnvironments'; +import { usePrompt } from '../hooks/usePrompt'; +import { useUpdateEnvironment } from '../hooks/useUpdateEnvironment'; +import type { Environment } from '../lib/models'; +import { Button } from './core/Button'; +import { Editor } from './core/Editor'; +import classnames from 'classnames'; + +export const EnvironmentEditDialog = function () { + const prompt = usePrompt(); + const environments = useEnvironments(); + const createEnvironment = useCreateEnvironment(); + const [activeEnvironment, setActiveEnvironment] = useState(null); + + return ( +
+ + {activeEnvironment != null && } +
+ ); +}; + +const EnvironmentEditor = function ({ environment }: { environment: Environment }) { + const updateEnvironment = useUpdateEnvironment(environment.id); + return ( + { + try { + updateEnvironment.mutate({ data: JSON.parse(data) }); + } catch (err) { + // That's okay + } + }} + /> + ); +}; diff --git a/src-web/components/Overlay.tsx b/src-web/components/Overlay.tsx index 0751ad97..2efd2bb1 100644 --- a/src-web/components/Overlay.tsx +++ b/src-web/components/Overlay.tsx @@ -40,7 +40,7 @@ export function Overlay({ zIndex = 30, open, onClose, portalName, children }: Pr {children} - )} + )} ); } diff --git a/src-web/components/WorkspaceHeader.tsx b/src-web/components/WorkspaceHeader.tsx index 860d46fb..f4589a51 100644 --- a/src-web/components/WorkspaceHeader.tsx +++ b/src-web/components/WorkspaceHeader.tsx @@ -9,17 +9,13 @@ import { SidebarActions } from './SidebarActions'; import { WorkspaceActionsDropdown } from './WorkspaceActionsDropdown'; import { Button } from './core/Button'; import { useDialog } from './DialogContext'; -import { useEnvironments } from '../hooks/useEnvironments'; -import type { Environment } from '../lib/models'; -import { Editor } from './core/Editor'; -import { useUpdateEnvironment } from '../hooks/useUpdateEnvironment'; +import { EnvironmentEditDialog } from './EnvironmentEditDialog'; interface Props { className?: string; } export const WorkspaceHeader = memo(function WorkspaceHeader({ className }: Props) { - const environments = useEnvironments(); const activeRequest = useActiveRequest(); const dialog = useDialog(); @@ -35,14 +31,8 @@ export const WorkspaceHeader = memo(function WorkspaceHeader({ className }: Prop