返回 DeepSeek-Reasonix
useProjectCreation.tsx
根目录 / desktop / frontend / src / components / useProjectCreation.tsx
1 import { lazy, Suspense, useState, type ReactNode } from "react";
2 import type { ToastContextValue } from "../lib/toast";
3
4 const BlankProjectFlow = lazy(() => import("./BlankProjectFlow").then((module) => ({ default: module.BlankProjectFlow })));
5 const RemoteConnectWizard = lazy(() => import("./RemoteConnectWizardEntry").then((module) => ({ default: module.RemoteConnectWizard })));
6
7 export function useProjectCreation({
8 onAddProject,
9 onRefresh,
10 showToast,
11 }: {
12 onAddProject: (path?: string) => Promise<void>;
13 onRefresh: () => Promise<void>;
14 showToast: ToastContextValue["showToast"];
15 }): {
16 addingProject: boolean;
17 handleAddProject: () => Promise<void>;
18 openBlankProjectFlow: () => void;
19 blankProjectFlow: ReactNode;
20 openRemoteConnectFlow: () => void;
21 remoteConnectFlow: ReactNode;
22 } {
23 const [addingProject, setAddingProject] = useState(false);
24 const [blankProjectFlowOpen, setBlankProjectFlowOpen] = useState(false);
25 const [remoteFlowOpen, setRemoteFlowOpen] = useState(false);
26 const handleAddProject = async () => {
27 if (addingProject) return;
28 setAddingProject(true);
29 try {
30 await onAddProject();
31 await onRefresh();
32 } catch (err) {
33 showToast(err instanceof Error ? err.message : String(err), "error");
34 } finally {
35 setAddingProject(false);
36 }
37 };
38 return {
39 addingProject,
40 handleAddProject,
41 openBlankProjectFlow: () => setBlankProjectFlowOpen(true),
42 blankProjectFlow: blankProjectFlowOpen ? (
43 <Suspense fallback={null}>
44 <BlankProjectFlow
45 onOpenProject={onAddProject}
46 onRefresh={onRefresh}
47 onClose={() => setBlankProjectFlowOpen(false)}
48 />
49 </Suspense>
50 ) : null,
51 openRemoteConnectFlow: () => setRemoteFlowOpen(true),
52 remoteConnectFlow: remoteFlowOpen ? (
53 <Suspense fallback={null}>
54 <RemoteConnectWizard
55 onRefresh={onRefresh}
56 onClose={() => setRemoteFlowOpen(false)}
57 onMerged={(message) => showToast(message, "info")}
58 />
59 </Suspense>
60 ) : null,
61 };
62 }
63
63 lines Plain Text